diff --git a/.gitignore b/.gitignore index 3ec8cfc..018ed8c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,6 @@ Packs_DB .migrations_done nonpacks/staticfiles/ nonpacks/media/ +nonpacks/static/vanilla/entity_index.json *.log AGENTS/ diff --git a/nonpacks/library/management/commands/refresh_vanilla_index.py b/nonpacks/library/management/commands/refresh_vanilla_index.py index 0053e01..6b8d4c0 100644 --- a/nonpacks/library/management/commands/refresh_vanilla_index.py +++ b/nonpacks/library/management/commands/refresh_vanilla_index.py @@ -4,7 +4,7 @@ from library.vanilla_textures import refresh_vanilla_index class Command(BaseCommand): - help = 'Rebuild the vanilla entity-texture index (media/vanilla/entity_index.json).' + help = 'Rebuild the vanilla entity-texture index (static/vanilla/entity_index.json).' def handle(self, *args, **options): index = refresh_vanilla_index() diff --git a/nonpacks/library/urls.py b/nonpacks/library/urls.py index d3abc59..6aaefe9 100644 --- a/nonpacks/library/urls.py +++ b/nonpacks/library/urls.py @@ -15,7 +15,6 @@ urlpatterns = [ path('packs//versions//download/', views.version_download, name='version_download'), path('packs//versions//files//download/', views.version_file_download, name='version_file_download'), path('packs//versions//asset/', views.pack_asset, name='pack_asset'), - path('vanilla/', views.vanilla_asset, name='vanilla_asset'), path('packs//guide///', views.guide_doc, name='guide_doc'), path('packs//gallery/upload/', views.asset_upload, name='asset_upload'), path('packs//gallery//thumb/', views.asset_thumbnail, name='asset_thumbnail'), diff --git a/nonpacks/library/vanilla_textures.py b/nonpacks/library/vanilla_textures.py index 1fc9a64..7629a39 100644 --- a/nonpacks/library/vanilla_textures.py +++ b/nonpacks/library/vanilla_textures.py @@ -1,9 +1,10 @@ """Build the vanilla entity-texture index for the model viewer. -Scans ``MEDIA_ROOT/vanilla/entity/`` (extracted from a Minecraft client jar) -and writes ``MEDIA_ROOT/vanilla/entity_index.json`` mapping each entity name to -the best "base skin" relative path, so the renderer can fall back to real -vanilla textures for models that have no pack textures of their own. +Scans ``static/vanilla/entity/`` (extracted from a Minecraft client jar, +tracked in git) and writes ``static/vanilla/entity_index.json`` mapping each +entity name to the best "base skin" relative path, so the renderer can fall +back to real vanilla textures for models that have no pack textures of their +own. """ import json import os @@ -13,6 +14,11 @@ from django.conf import settings ENTITY_ROOT = 'entity' INDEX_NAME = 'entity_index.json' + +def vanilla_dir(): + """The tracked static directory holding the vanilla texture set.""" + return os.path.join(settings.BASE_DIR, 'static', 'vanilla') + # Entity names whose vanilla layout differs from the model-name convention. ALIASES = { 'polar_bear': 'bear/polarbear.png', @@ -50,12 +56,32 @@ _LAYER_KEYWORDS = ( '_fur', '_shell', '_crackiness', ) +# Entities whose base skin is one of several fur/colour variants. The preview +# picks one at random so the model matches the variety the pack shows in-game. +VARIANTS = { + 'wolf': [ + 'wolf/wolf.png', 'wolf/wolf_ashen.png', 'wolf/wolf_black.png', + 'wolf/wolf_chestnut.png', 'wolf/wolf_rusty.png', 'wolf/wolf_snowy.png', + 'wolf/wolf_spotted.png', 'wolf/wolf_striped.png', 'wolf/wolf_woods.png', + ], + 'fox': ['fox/fox.png', 'fox/snow_fox.png'], + 'cat': [ + 'cat/tabby.png', 'cat/black.png', 'cat/red.png', 'cat/siamese.png', + 'cat/british_shorthair.png', 'cat/calico.png', 'cat/persian.png', + 'cat/ragdoll.png', 'cat/white.png', 'cat/jellie.png', 'cat/all_black.png', + ], + 'cow': [ + 'cow/temperate_cow.png', 'cow/cold_cow.png', 'cow/warm_cow.png', + 'cow/red_mooshroom.png', 'cow/brown_mooshroom.png', + ], +} + def _base_candidates(entity): """Return (entity, [candidate relative paths]) in priority order.""" if entity in ALIASES: return entity, [ALIASES[entity]] - root = os.path.join(settings.MEDIA_ROOT, 'vanilla', ENTITY_ROOT) + root = os.path.join(vanilla_dir(), ENTITY_ROOT) top = os.path.join(root, entity + '.png') if os.path.isfile(top): return entity, [entity + '.png'] @@ -77,8 +103,8 @@ def _base_candidates(entity): def refresh_vanilla_index(): - """Rebuild the entity → base-skin map from the extracted vanilla set.""" - root = os.path.join(settings.MEDIA_ROOT, 'vanilla', ENTITY_ROOT) + """Rebuild the entity → {default, variants} skin map from the vanilla set.""" + root = os.path.join(vanilla_dir(), ENTITY_ROOT) if not os.path.isdir(root): raise FileNotFoundError(f'{root} missing — extract vanilla entity textures first') @@ -87,21 +113,25 @@ def refresh_vanilla_index(): rel = os.path.join(root, entry) if entry.endswith('.png'): entity = entry[:-4] - if not index.get(entity): - index[entity] = entry + index.setdefault(entity, {'default': entry, 'variants': [entry]}) continue if not os.path.isdir(rel): continue entity = entry _, candidates = _base_candidates(entity) - if candidates and not index.get(entity): - index[entity] = candidates[0] + if candidates and entity not in index: + index[entity] = {'default': candidates[0], 'variants': [candidates[0]]} for entity, rel in ALIASES.items(): - if not index.get(entity): - index[entity] = rel + if entity not in index: + index[entity] = {'default': rel, 'variants': [rel]} - out = os.path.join(settings.MEDIA_ROOT, 'vanilla', INDEX_NAME) + for entity, variants in VARIANTS.items(): + if entity in index and variants: + index[entity]['default'] = variants[0] + index[entity]['variants'] = variants + + out = os.path.join(vanilla_dir(), INDEX_NAME) with open(out, 'w') as f: json.dump(index, f, indent=1, sort_keys=True) return index diff --git a/nonpacks/library/views.py b/nonpacks/library/views.py index 5c17adf..5c6e9bc 100644 --- a/nonpacks/library/views.py +++ b/nonpacks/library/views.py @@ -423,19 +423,6 @@ def api_packs_latest(request, namespace, pack_id): }) -def vanilla_asset(request, asset_path): - """Serve a bundled Minecraft vanilla resource (e.g. entity textures) — gated.""" - if not asset_path or asset_path.startswith('/') or '..' in asset_path.split('/'): - raise Http404 - full = Path(settings.MEDIA_ROOT) / 'vanilla' / asset_path - if not full.is_file(): - raise Http404 - content_type = mimetypes.guess_type(asset_path)[0] or 'application/octet-stream' - response = HttpResponse(full.read_bytes(), content_type=content_type) - response['Cache-Control'] = 'public, max-age=86400' - return response - - def guide_doc(request, slug, version_id, file_uuid): """Render one markdown guide document server-side (used by the switcher).""" version = get_object_or_404( diff --git a/nonpacks/static/css/style.css b/nonpacks/static/css/style.css index cdb949c..ed37ffc 100644 --- a/nonpacks/static/css/style.css +++ b/nonpacks/static/css/style.css @@ -3268,3 +3268,64 @@ a.deletelink { color: var(--md-sys-color-on-error-container, #7f1d1d); font-size: 0.68rem; } + +/* Full-screen Blockbench preview overlay */ +.bb-overlay { + position: fixed; + inset: 0; + z-index: 5000; + background: #121418; + display: flex; + flex-direction: column; +} +.bb-overlay[hidden] { display: none; } +.bb-overlay-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + padding: 0.5rem 1rem; + background: #1a1d24; + color: #e6e6e6; + border-bottom: 1px solid #2a2e38; + flex: 0 0 auto; +} +.bb-overlay-title { + font-weight: 600; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.bb-overlay-close { + background: none; + border: none; + color: #e6e6e6; + font-size: 1.25rem; + cursor: pointer; + padding: 0.25rem 0.6rem; + border-radius: 6px; +} +.bb-overlay-close:hover { background: #2a2e38; } +.bb-overlay-status { + position: absolute; + top: 3.1rem; + left: 50%; + transform: translateX(-50%); + z-index: 10; + padding: 0.35rem 0.9rem; + border-radius: 999px; + background: rgba(0, 0, 0, 0.65); + color: #fff; + font-size: 0.8rem; + pointer-events: none; + max-width: 80%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.bb-frame { + flex: 1 1 auto; + width: 100%; + border: none; + background: #121418; +} diff --git a/nonpacks/static/js/geo_builder.js b/nonpacks/static/js/geo_builder.js deleted file mode 100644 index 6b83c42..0000000 --- a/nonpacks/static/js/geo_builder.js +++ /dev/null @@ -1,291 +0,0 @@ -// Pure geometry math for GeckoLib/Blockbench geo.json models. -// No Three.js dependency — shared by model_viewer.js (browser) and unit tests (Node). -// -// Transforms follow the GeckoLib convention: each bone contributes -// local = T(pivot) · R(bone.rotation) · T(−pivot) -// and cubes are authored in model space (origin at feet, Y up). -// `build()` flattens the bone tree into world-space cubes, avoiding the -// nested-pivot double-counting that broke naive group-based renderers. -(function (global, factory) { - if (typeof module !== 'undefined' && module.exports) { - module.exports = factory(); - } else { - global.GeoBuilder = factory(); - } -})(typeof self !== 'undefined' ? self : this, function () { - 'use strict'; - - var DEG = Math.PI / 180; - - // ---------- minimal 4x4 matrix helpers (column-major, Three.js order) ---------- - function identity() { - return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; - } - - function multiply(a, b) { - var out = new Array(16); - for (var c = 0; c < 4; c++) { - for (var r = 0; r < 4; r++) { - out[c * 4 + r] = - a[0 * 4 + r] * b[c * 4 + 0] + - a[1 * 4 + r] * b[c * 4 + 1] + - a[2 * 4 + r] * b[c * 4 + 2] + - a[3 * 4 + r] * b[c * 4 + 3]; - } - } - return out; - } - - function translation(x, y, z) { - return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1]; - } - - function rotationXYZ(rx, ry, rz) { - var cx = Math.cos(rx), sx = Math.sin(rx); - var cy = Math.cos(ry), sy = Math.sin(ry); - var cz = Math.cos(rz), sz = Math.sin(rz); - // R = Rz * Ry * Rx (matches Three.js Euler 'XYZ' default order) - var r = identity(); - r[0] = cy * cz; - r[1] = cy * sz; - r[2] = -sy; - r[4] = sx * sy * cz - cx * sz; - r[5] = sx * sy * sz + cx * cz; - r[6] = sx * cy; - r[8] = cx * sy * cz + sx * sz; - r[9] = cx * sy * sz - sx * cz; - r[10] = cx * cy; - return r; - } - - function transformPoint(m, p) { - var x = p[0], y = p[1], z = p[2]; - var w = m[3] * x + m[7] * y + m[11] * z + m[15]; - return [ - (m[0] * x + m[4] * y + m[8] * z + m[12]) / w, - (m[1] * x + m[5] * y + m[9] * z + m[13]) / w, - (m[2] * x + m[6] * y + m[10] * z + m[14]) / w, - ]; - } - - // ---------- box UV ---------- - // Minecraft "box UV" face rects (u, v, w, h) in texture pixels. - function boxUVRects(uv, size) { - var u = uv[0], v = uv[1]; - var x = size[0], y = size[1], z = size[2]; - return { - top: [u + z, v, x, z], - bottom: [u + z + x, v, x, z], - north: [u + z, v + z, x, y], - south: [u + z + x, v + z, x, y], - east: [u, v + z, z, y], - west: [u + z + x + z, v + z, z, y], - }; - } - - // Blockbench per-face UV: {north:{uv:[u,v], uv_size:[w,h]}, ...} with - // up/down for top/bottom. Negative uv_size mirrors that face (180° flip). - function perFaceRects(uv) { - var map = { top: 'up', bottom: 'down', north: 'north', south: 'south', east: 'east', west: 'west' }; - var rects = {}; - for (var face in map) { - var p = uv[map[face]]; - if (!p || !Array.isArray(p.uv)) { - rects[face] = [0, 0, 0, 0]; - continue; - } - var w = (p.uv_size && p.uv_size[0]) || 0; - var h = (p.uv_size && p.uv_size[1]) || 0; - rects[face] = [p.uv[0], p.uv[1], w, h]; - } - return rects; - } - - // Build one cube as a BufferGeometry-compatible mesh: - // 24 positions (6 faces x 4 corners), 24 UVs, 36 indices, outward winding. - function cubeGeometry(size, uv, tw, th) { - var hx = size[0] / 2, hy = size[1] / 2, hz = size[2] / 2; - var rects = Array.isArray(uv) ? boxUVRects(uv, size) : perFaceRects(uv); - var order = ['east', 'west', 'top', 'bottom', 'south', 'north']; - var outward = { - east: [1, 0, 0], west: [-1, 0, 0], - top: [0, 1, 0], bottom: [0, -1, 0], - south: [0, 0, 1], north: [0, 0, -1], - }; - - var positions = []; - var uvs = []; - var indices = []; - var v = 0; - - function pushFace(face, corners) { - var a = corners[0], b = corners[1], c = corners[2]; - var abx = b[0] - a[0], aby = b[1] - a[1], abz = b[2] - a[2]; - var acx = c[0] - a[0], acy = c[1] - a[1], acz = c[2] - a[2]; - var nx = aby * acz - abz * acy; - var ny = abz * acx - abx * acz; - var nz = abx * acy - aby * acx; - var out = outward[face]; - if (nx * out[0] + ny * out[1] + nz * out[2] < 0) { - var tmp = corners[1]; - corners[1] = corners[2]; - corners[2] = tmp; - } - for (var i = 0; i < 4; i++) { - var cor = corners[i]; - positions.push(cor[0], cor[1], cor[2]); - uvs.push(cor[3], cor[4]); - } - indices.push(v, v + 1, v + 2, v, v + 2, v + 3); - v += 4; - } - - for (var i = 0; i < order.length; i++) { - var face = order[i]; - var rect = rects[face]; - var u0 = rect[0] / tw, u1 = (rect[0] + rect[2]) / tw; - var vTop = 1 - (rect[1] + rect[3]) / th; - var vBot = 1 - rect[1] / th; - var cs; - if (face === 'east') { - cs = [ - [hx, hy, -hz, u1, vTop], [hx, hy, hz, u0, vTop], - [hx, -hy, hz, u0, vBot], [hx, -hy, -hz, u1, vBot], - ]; - } else if (face === 'west') { - cs = [ - [-hx, hy, hz, u1, vTop], [-hx, hy, -hz, u0, vTop], - [-hx, -hy, -hz, u0, vBot], [-hx, -hy, hz, u1, vBot], - ]; - } else if (face === 'top') { - cs = [ - [-hx, hy, hz, u0, vTop], [hx, hy, hz, u1, vTop], - [hx, hy, -hz, u1, vBot], [-hx, hy, -hz, u0, vBot], - ]; - } else if (face === 'bottom') { - cs = [ - [-hx, -hy, -hz, u0, vTop], [hx, -hy, -hz, u1, vTop], - [hx, -hy, hz, u1, vBot], [-hx, -hy, hz, u0, vBot], - ]; - } else if (face === 'south') { - cs = [ - [hx, hy, hz, u0, vTop], [-hx, hy, hz, u1, vTop], - [-hx, -hy, hz, u1, vBot], [hx, -hy, hz, u0, vBot], - ]; - } else { // north - cs = [ - [-hx, hy, -hz, u0, vTop], [hx, hy, -hz, u1, vTop], - [hx, -hy, -hz, u1, vBot], [-hx, -hy, -hz, u0, vBot], - ]; - } - pushFace(face, cs); - } - - return { positions: positions, uvs: uvs, indices: indices }; - } - - // ---------- model build ---------- - // Resource locations like "needsofnature:textures/entity/x.png" resolve to - // the zip member "assets/needsofnature/textures/entity/x.png". - function resourceToMember(resource) { - resource = String(resource); - if (resource.indexOf(':') !== -1) { - var p = resource.split(':'); - return 'assets/' + p.shift() + '/' + p.join(':'); - } - if (resource.indexOf('assets/') === 0) return resource; - return 'assets/' + resource; - } - - // Returns { cubes: [{matrix, size, uv, texture}], texture_width, texture_height } - function build(geo) { - var geometry = ((geo['minecraft:geometry'] || [])[0]) || null; - if (!geometry) return { cubes: [], texture_width: 64, texture_height: 64 }; - var tw = (geometry.description && geometry.description.texture_width) || 64; - var th = (geometry.description && geometry.description.texture_height) || 64; - var textures = {}; - for (var k in (geo['afw_bone_textures'] || {})) { - textures[k] = resourceToMember(geo['afw_bone_textures'][k]); - } - var defaultTex = null; - for (var k in textures) { defaultTex = textures[k]; break; } - - var bones = {}; - (geometry.bones || []).forEach(function (b) { bones[b.name] = b; }); - - var cubes = []; - function walk(name, parentMatrix) { - var bone = bones[name]; - if (!bone) return; - var pivot = bone.pivot || [0, 0, 0]; - // Bedrock/GeckoLib rotations are opposite the Three.js default - // direction, so negate the Euler angles (identity models unaffected). - var rot = (bone.rotation || [0, 0, 0]).map(function (d) { return -d * DEG; }); - var local = multiply( - translation(pivot[0], pivot[1], pivot[2]), - multiply( - rotationXYZ(rot[0], rot[1], rot[2]), - translation(-pivot[0], -pivot[1], -pivot[2]) - ) - ); - var world = multiply(parentMatrix, local); - var tex = textures[name] || defaultTex; - - (bone.cubes || []).forEach(function (c) { - var origin = c.origin || [0, 0, 0]; - var size = c.size || [1, 1, 1]; - var cRot = (c.rotation || [0, 0, 0]).map(function (d) { return -d * DEG; }); - var hasRot = !!(c.rotation && (c.rotation[0] || c.rotation[1] || c.rotation[2])); - // Blockbench cubes rotate around their own pivot (fall back to origin). - var cPivot = hasRot ? (c.pivot || origin) : origin; - var center = [ - origin[0] + size[0] / 2, - origin[1] + size[1] / 2, - origin[2] + size[2] / 2, - ]; - var cubeWorld = multiply( - world, - multiply( - translation(cPivot[0], cPivot[1], cPivot[2]), - multiply( - rotationXYZ(cRot[0], cRot[1], cRot[2]), - multiply( - translation(-cPivot[0], -cPivot[1], -cPivot[2]), - translation(center[0], center[1], center[2]) - ) - ) - ) - ); - cubes.push({ - matrix: cubeWorld, - size: size, - uv: c.uv || [0, 0], - texture: tex, - }); - }); - - for (var child in bones) { - if (bones[child].parent === name) walk(child, world); - } - } - - for (var root in bones) { - if (!bones[root].parent) walk(root, identity()); - } - - return { cubes: cubes, texture_width: tw, texture_height: th }; - } - - return { - build: build, - cubeGeometry: cubeGeometry, - boxUVRects: boxUVRects, - perFaceRects: perFaceRects, - resourceToMember: resourceToMember, - transformPoint: transformPoint, - identity: identity, - translation: translation, - rotationXYZ: rotationXYZ, - multiply: multiply, - }; -}); diff --git a/nonpacks/static/js/model_viewer.js b/nonpacks/static/js/model_viewer.js deleted file mode 100644 index 81dfdd4..0000000 --- a/nonpacks/static/js/model_viewer.js +++ /dev/null @@ -1,254 +0,0 @@ -// GeoJSON model viewer for the Models/Textures tab. Uses the shared GeoBuilder -// geometry math (bone transforms + box/per-face UV) and renders world-space -// cubes with Three.js. Textures are served through the gated pack_asset and -// vanilla_asset endpoints, resolved per cube: -// 1. afw_bone_textures (pack member), composited over the vanilla entity -// skin when one exists (NoN `*_features` overlays sit on the vanilla base) -// 2. the model's default pack skin (server-matched) -// 3. the bundled vanilla entity skin -// 4. gray -(function () { - let renderer = null; - let scene = null; - let camera = null; - let meshRoot = null; - let rafId = null; - const textureLoader = new THREE.TextureLoader(); - const materialCache = {}; - let vanillaIndex = null; - let vanillaIndexPromise = null; - - function assetUrl(baseUrl, member) { - return baseUrl.replace('ASSET', member); - } - - function entityNameFromMember(member) { - let base = member.slice(member.lastIndexOf('/') + 1); - if (base.endsWith('.geo.json')) base = base.slice(0, -'.geo.json'.length); - for (const suffix of ['.mf', '.fm', '.m', '.f', '.g']) { - if (base.endsWith(suffix)) { base = base.slice(0, -suffix.length); break; } - } - return base; - } - - function buildGeometry(size, uv, tw, th) { - const g = GeoBuilder.cubeGeometry(size, uv, tw, th); - const geometry = new THREE.BufferGeometry(); - geometry.setAttribute('position', new THREE.Float32BufferAttribute(g.positions, 3)); - geometry.setAttribute('uv', new THREE.Float32BufferAttribute(g.uvs, 2)); - geometry.setIndex(g.indices); - geometry.computeVertexNormals(); - return geometry; - } - - function fetchVanillaIndex(opts) { - if (vanillaIndexPromise) return vanillaIndexPromise; - if (!opts.vanillaBaseUrl) { - vanillaIndexPromise = Promise.resolve({}); - } else { - vanillaIndexPromise = fetch(assetUrl(opts.vanillaBaseUrl, 'entity_index.json')) - .then(r => r.ok ? r.json() : {}) - .catch(() => ({})); - } - return vanillaIndexPromise; - } - - function vanillaSkinUrl(opts, index, entity) { - const rel = (index && index[entity]) || null; - return rel ? assetUrl(opts.vanillaBaseUrl, 'entity/' + rel) : null; - } - - // desc: { url, vanillaUrl } — url is the pack/overlay member, vanillaUrl the - // base skin to composite it over (when available). - function resolveTexture(cube, entity, opts, index) { - if (cube.texture) { - return { - url: assetUrl(opts.baseUrl, cube.texture), - vanillaUrl: vanillaSkinUrl(opts, index, entity), - }; - } - if (opts.defaultTexture) { - return { url: assetUrl(opts.baseUrl, opts.defaultTexture), vanillaUrl: null }; - } - const rel = (index && index[entity]) || null; - if (rel) { - return { url: null, vanillaUrl: vanillaSkinUrl(opts, index, entity) }; - } - return null; - } - - function loadImage(url) { - return new Promise((resolve, reject) => { - const img = new Image(); - img.crossOrigin = 'anonymous'; - img.onload = () => resolve(img); - img.onerror = () => reject(new Error('img')); - img.src = url; - }); - } - - async function prepareMaterial(desc, tw, th) { - const key = (desc.url || '') + '|' + (desc.vanillaUrl || ''); - if (materialCache[key]) return materialCache[key]; - - let texture = null; - if (desc.url && desc.vanillaUrl) { - try { - const [overlay, base] = await Promise.all([loadImage(desc.url), loadImage(desc.vanillaUrl)]); - const canvas = document.createElement('canvas'); - canvas.width = tw; - canvas.height = th; - const ctx = canvas.getContext('2d'); - ctx.drawImage(base, 0, 0, tw, th); - ctx.drawImage(overlay, 0, 0, tw, th); - texture = new THREE.CanvasTexture(canvas); - } catch (e) { - texture = null; - } - } - const singleUrl = texture ? null : (desc.url || desc.vanillaUrl); - if (singleUrl) texture = textureLoader.load(singleUrl); - - let material; - if (texture) { - texture.wrapS = THREE.ClampToEdgeWrapping; - texture.wrapT = THREE.ClampToEdgeWrapping; - material = new THREE.MeshStandardMaterial({ map: texture, roughness: 0.9, metalness: 0.0 }); - if (singleUrl) { - textureLoader.load(singleUrl, undefined, undefined, () => { - if (material.map) material.map.dispose(); - material.map = null; - material.color.setHex(0x9a9a9a); - material.needsUpdate = true; - }); - } - } else { - material = new THREE.MeshStandardMaterial({ color: 0x9a9a9a, roughness: 0.9 }); - } - materialCache[key] = material; - return material; - } - - function disposeObject(obj) { - obj.traverse((node) => { - if (node.geometry) node.geometry.dispose(); - }); - for (const key in materialCache) { - if (materialCache[key].map) materialCache[key].map.dispose(); - materialCache[key].dispose(); - } - for (const key in materialCache) delete materialCache[key]; - } - - function render(member, container, opts) { - if (renderer) dispose(); - const width = container.clientWidth || 480; - const height = container.clientHeight || 480; - - scene = new THREE.Scene(); - scene.background = new THREE.Color(0x1e1e2e); - camera = new THREE.PerspectiveCamera(50, width / height, 0.1, 2000); - camera.position.set(0, 20, 60); - camera.lookAt(0, 12, 0); - - renderer = new THREE.WebGLRenderer({ antialias: true, preserveDrawingBuffer: true }); - renderer.setSize(width, height); - renderer.setPixelRatio(window.devicePixelRatio || 1); - container.appendChild(renderer.domElement); - - scene.add(new THREE.AmbientLight(0xffffff, 0.6)); - const key = new THREE.DirectionalLight(0xffffff, 0.9); - key.position.set(30, 60, 30); - scene.add(key); - const fill = new THREE.DirectionalLight(0xffffff, 0.3); - fill.position.set(-30, 20, -30); - scene.add(fill); - - meshRoot = new THREE.Group(); - scene.add(meshRoot); - - const entity = entityNameFromMember(member); - fetch(assetUrl(opts.baseUrl, member), { headers: { 'Accept': 'application/json' } }) - .then(r => { if (!r.ok) throw new Error('http'); return r.json(); }) - .then(geo => Promise.all([geo, fetchVanillaIndex(opts)])) - .then(([geo, index]) => { - const built = GeoBuilder.build(geo); - if (!built.cubes.length) throw new Error('no cubes'); - const tw = built.texture_width, th = built.texture_height; - const jobs = built.cubes.map((cube) => { - const desc = resolveTexture(cube, entity, opts, index); - return desc ? prepareMaterial(desc, tw, th) : Promise.resolve(null); - }); - return Promise.all(jobs).then((materials) => ({ built, materials })); - }) - .then(({ built, materials }) => { - for (let i = 0; i < built.cubes.length; i++) { - const cube = built.cubes[i]; - const geometry = buildGeometry(cube.size, cube.uv, built.texture_width, built.texture_height); - let material = materials[i]; - if (!material) { - material = new THREE.MeshStandardMaterial({ color: 0x9a9a9a, roughness: 0.9 }); - } - const mesh = new THREE.Mesh(geometry, material); - mesh.matrix = new THREE.Matrix4().fromArray(cube.matrix); - mesh.matrixAutoUpdate = false; - meshRoot.add(mesh); - } - - const box = new THREE.Box3().setFromObject(meshRoot); - const center = box.getCenter(new THREE.Vector3()); - const size = box.getSize(new THREE.Vector3()); - const radius = Math.max(size.x, size.y, size.z) / 2 || 10; - meshRoot.position.sub(center); - camera.position.set(radius * 2.2, radius * 1.6, radius * 2.6); - camera.near = radius / 10; - camera.far = radius * 40; - camera.updateProjectionMatrix(); - camera.lookAt(0, 0, 0); - }) - .catch(() => { - container.innerHTML = '

Could not load this model.

'; - }); - - let isDragging = false; - let lastX = 0, lastY = 0; - renderer.domElement.addEventListener('mousedown', (e) => { - isDragging = true; lastX = e.clientX; lastY = e.clientY; - }); - window.addEventListener('mouseup', () => { isDragging = false; }); - window.addEventListener('mousemove', (e) => { - if (!isDragging || !meshRoot) return; - const dx = e.clientX - lastX, dy = e.clientY - lastY; - lastX = e.clientX; lastY = e.clientY; - meshRoot.rotation.y += dx * 0.01; - meshRoot.rotation.x += dy * 0.01; - }); - renderer.domElement.addEventListener('wheel', (e) => { - e.preventDefault(); - camera.position.multiplyScalar(e.deltaY > 0 ? 1.06 : 0.94); - }, { passive: false }); - - function animate() { - rafId = requestAnimationFrame(animate); - renderer.render(scene, camera); - } - animate(); - } - - function dispose() { - if (rafId) { cancelAnimationFrame(rafId); rafId = null; } - if (renderer) { - if (meshRoot) disposeObject(meshRoot); - renderer.dispose(); - if (renderer.domElement && renderer.domElement.parentNode) { - renderer.domElement.parentNode.removeChild(renderer.domElement); - } - } - renderer = null; - scene = null; - camera = null; - meshRoot = null; - } - - window.PacksModelViewer = { render: render, dispose: dispose }; -})(); diff --git a/nonpacks/static/js/packs_preview.js b/nonpacks/static/js/packs_preview.js new file mode 100644 index 0000000..3cae9ce --- /dev/null +++ b/nonpacks/static/js/packs_preview.js @@ -0,0 +1,240 @@ +// packs_preview.js — opens a model in the vendored Blockbench app inside a +// full-screen overlay. The geo JSON is loaded via the gated pack_asset +// endpoint and the texture images are resolved from afw_bone_textures (or the +// vanilla entity skin fallback) and handed to Blockbench; the bundled +// GeckoLib + Multi Actor Animator plugins handle applying them. +(function () { + let overlay = null; + let iframe = null; + let busy = false; + + const BB_URL = '/static/vendor/blockbench/index.html'; + + function ensureOverlay() { + if (overlay) return overlay; + overlay = document.createElement('div'); + overlay.className = 'bb-overlay'; + overlay.innerHTML = + '
' + + '' + + '' + + '
' + + '
'; + overlay.addEventListener('click', (e) => { if (e.target === overlay) close(); }); + overlay.querySelector('#bb-overlay-close').addEventListener('click', close); + document.body.appendChild(overlay); + return overlay; + } + + function setStatus(text) { + const el = document.querySelector('#bb-overlay-status'); + if (el) el.textContent = text || ''; + } + + function close() { + if (!overlay) return; + overlay.hidden = true; + if (iframe) { iframe.remove(); iframe = null; } + } + + function assetUrl(baseUrl, member) { + return baseUrl.replace('ASSET', member); + } + + function entityNameFromMember(member) { + let base = member.slice(member.lastIndexOf('/') + 1); + if (base.endsWith('.geo.json')) base = base.slice(0, -'.geo.json'.length); + for (const s of ['.mf', '.fm', '.m', '.f', '.g']) { + if (base.endsWith(s)) { base = base.slice(0, -s.length); break; } + } + return base; + } + + function resourceToMember(resource) { + resource = String(resource); + if (resource.indexOf(':') !== -1) { + const p = resource.split(':'); + return 'assets/' + p.shift() + '/' + p.join(':'); + } + if (resource.startsWith('assets/')) return resource; + return 'assets/' + resource; + } + + function loadImage(url) { + return new Promise((resolve, reject) => { + const img = new Image(); + img.onload = () => resolve(img); + img.onerror = () => reject(new Error('Could not load ' + url)); + img.src = url; + }); + } + + function imageDataUrl(img) { + const c = document.createElement('canvas'); + c.width = img.naturalWidth; + c.height = img.naturalHeight; + c.getContext('2d').drawImage(img, 0, 0); + return c.toDataURL('image/png'); + } + + async function fetchGeo(member, baseUrl) { + const r = await fetch(assetUrl(baseUrl, member), { headers: { 'Accept': 'application/json' } }); + if (!r.ok) throw new Error('Could not load the model file'); + return r.json(); + } + + async function fetchVanillaIndex(vanillaBaseUrl) { + try { + const r = await fetch(assetUrl(vanillaBaseUrl, 'entity_index.json')); + return r.ok ? await r.json() : {}; + } catch (e) { + return {}; + } + } + + // Resolve the textures to hand to Blockbench: the pack's _features + // overlay(s) plus the vanilla entity skin (a random fur/colour variant when + // the mob has several). Blockbench + the bundled plugins UV-wrap and apply + // them, so we don't worry about per-bone assignment here. + async function resolveTextures(geo, entity, opts, index) { + const featureTextures = []; + const baseTextures = []; + const afw = geo['afw_bone_textures'] || {}; + + // 1. Feature overlays — from afw_bone_textures, or the conventional + // assets//textures/entity//_features.png path. + const members = []; + let namespace = 'needsofnature'; + for (const k in afw) { + const m = resourceToMember(afw[k]); + if (members.indexOf(m) === -1) members.push(m); + const colon = String(afw[k]).indexOf(':'); + if (colon > 0) namespace = String(afw[k]).slice(0, colon); + } + if (!members.length && entity) { + members.push('assets/' + namespace + '/textures/entity/' + entity + '/' + entity + '_features.png'); + } + for (const m of members) { + try { + const img = await loadImage(assetUrl(opts.baseUrl, m)); + featureTextures.push({ name: m.split('/').pop(), dataUrl: imageDataUrl(img) }); + } catch (e) { + console.warn('packs: skip feature texture', m, e); + } + } + + // 2. Vanilla base skin — a random variant when several exist, else the + // server-matched pack skin, else none. + let rel = null; + const ent = index && index[entity]; + if (ent) { + const variants = ent.variants || (typeof ent === 'string' ? [ent] : [ent.default]); + if (variants && variants.length) rel = variants[Math.floor(Math.random() * variants.length)]; + } + if (rel) { + try { + const img = await loadImage(assetUrl(opts.vanillaBaseUrl, 'entity/' + rel)); + baseTextures.push({ name: rel.split('/').pop(), dataUrl: imageDataUrl(img) }); + } catch (e) { + console.warn('packs: skip vanilla skin', e); + } + } else if (opts.defaultTexture) { + try { + const img = await loadImage(assetUrl(opts.baseUrl, opts.defaultTexture)); + baseTextures.push({ name: opts.defaultTexture.split('/').pop(), dataUrl: imageDataUrl(img) }); + } catch (e) { + console.warn('packs: skip default texture', e); + } + } + // The vanilla/base texture must always be loaded first, then features. + // Wide player models additionally always load L1Z0's custom skins + // alongside the default Steve skin (tracked in static/player_skins/). + if (entity === 'player') { + for (const name of ['destroyed_skin.png', 'russian_goat.png']) { + try { + const img = await loadImage('/static/player_skins/' + name); + baseTextures.push({ name: name, dataUrl: imageDataUrl(img) }); + } catch (e) { + console.warn('packs: skip player skin', name, e); + } + } + } + return baseTextures.concat(featureTextures); + } + + async function open(btn) { + const member = btn.dataset.member; + const name = btn.dataset.name || member; + const opts = { baseUrl: btn.dataset.baseUrl, vanillaBaseUrl: btn.dataset.vanillaBaseUrl, defaultTexture: btn.dataset.defaultTexture || null }; + if (!member || !opts.baseUrl || busy) return; + busy = true; + + const overlayEl = ensureOverlay(); + overlayEl.hidden = false; + document.querySelector('#bb-overlay-title').textContent = name; + setStatus('Starting Blockbench…'); + + if (iframe) iframe.remove(); + iframe = document.createElement('iframe'); + iframe.className = 'bb-frame'; + iframe.src = BB_URL; + overlayEl.appendChild(iframe); + + const ready = await new Promise((resolve) => { + let done = false; + const finish = (ok) => { + if (done) return; + done = true; + window.removeEventListener('message', onMsg); + clearTimeout(timer); + resolve(ok); + }; + const timer = setTimeout(() => finish(false), 45000); + const onMsg = (e) => { + if (e.origin !== window.location.origin) return; + if (e.data && e.data.type === 'packs-bb-ready') finish(true); + }; + window.addEventListener('message', onMsg); + }); + + if (!ready) { + setStatus('Blockbench failed to start.'); + busy = false; + return; + } + + setStatus('Loading model…'); + try { + const [geo, index] = await Promise.all([ + fetchGeo(member, opts.baseUrl), + fetchVanillaIndex(opts.vanillaBaseUrl), + ]); + const entity = entityNameFromMember(member); + const textures = await resolveTextures(geo, entity, opts, index); + iframe.contentWindow.postMessage({ + type: 'packs-open-model', + geo: geo, + name: name, + textures: textures, + }, window.location.origin); + setStatus('Applying textures…'); + } catch (e) { + setStatus('Could not load model: ' + e.message); + } + busy = false; + } + + window.addEventListener('message', (e) => { + if (e.origin !== window.location.origin) return; + if (!e.data) return; + if (e.data.type === 'packs-model-open') { + setStatus('Ready — drag to orbit, scroll to zoom.'); + } else if (e.data.type === 'packs-model-error') { + setStatus('Model error: ' + (e.data.error || '')); + } else if (e.data.type === 'packs-plugin-error') { + setStatus('Plugin error: ' + (e.data.error || '')); + } + }); + + window.PacksPreview = { open: open, close: close }; +})(); diff --git a/nonpacks/static/js/tests/fixtures/polar_bear.geo.json b/nonpacks/static/js/tests/fixtures/polar_bear.geo.json deleted file mode 100644 index 872cdff..0000000 --- a/nonpacks/static/js/tests/fixtures/polar_bear.geo.json +++ /dev/null @@ -1 +0,0 @@ -{"afw_bone_textures": {"d2": "needsofnature:textures/entity/polar_bear/polar_bear_features.png", "d3": "needsofnature:textures/entity/polar_bear/polar_bear_features.png", "d4": "needsofnature:textures/entity/polar_bear/polar_bear_features.png"}, "format_version": "1.12.0", "minecraft:geometry": [{"description": {"identifier": "geometry.unknown", "texture_width": 128, "texture_height": 64, "visible_bounds_width": 4, "visible_bounds_height": 3.5, "visible_bounds_offset": [0, 1.25, 0]}, "bones": [{"name": "root", "pivot": [0, 0, 0]}, {"name": "polar_bear", "parent": "root", "pivot": [0, 0, 0]}, {"name": "frontbody", "parent": "polar_bear", "pivot": [0, 17, -1.25]}, {"name": "head", "parent": "frontbody", "pivot": [0, 16.2, -16.8], "cubes": [{"origin": [-4.55, 13, -24.7], "size": [9.1, 9.1, 9.1], "uv": {"north": {"uv": [7, 7], "uv_size": [7, 7]}, "east": {"uv": [0, 7], "uv_size": [7, 7]}, "south": {"uv": [21, 7], "uv_size": [7, 7]}, "west": {"uv": [14, 7], "uv_size": [7, 7]}, "up": {"uv": [7, 0], "uv_size": [7, 7]}, "down": {"uv": [14, 7], "uv_size": [7, -7]}}}, {"origin": [-3.25, 13, -28.6], "size": [6.5, 3.9, 3.9], "uv": {"north": {"uv": [3, 47], "uv_size": [5, 3]}, "east": {"uv": [0, 47], "uv_size": [3, 3]}, "south": {"uv": [11, 47], "uv_size": [5, 3]}, "west": {"uv": [8, 47], "uv_size": [3, 3]}, "up": {"uv": [3, 44], "uv_size": [5, 3]}, "down": {"uv": [8, 47], "uv_size": [5, -3]}}}, {"origin": [3.25, 20.8, -22.1], "size": [2.6, 2.6, 1.3], "uv": {"north": {"uv": [27, 1], "uv_size": [2, 2]}, "east": {"uv": [26, 1], "uv_size": [1, 2]}, "south": {"uv": [30, 1], "uv_size": [2, 2]}, "west": {"uv": [29, 1], "uv_size": [1, 2]}, "up": {"uv": [27, 0], "uv_size": [2, 1]}, "down": {"uv": [29, 1], "uv_size": [2, -1]}}}, {"origin": [-5.85, 20.8, -22.1], "size": [2.6, 2.6, 1.3], "uv": {"north": {"uv": [27, 1], "uv_size": [2, 2]}, "east": {"uv": [26, 1], "uv_size": [1, 2]}, "south": {"uv": [30, 1], "uv_size": [2, 2]}, "west": {"uv": [29, 1], "uv_size": [1, 2]}, "up": {"uv": [27, 0], "uv_size": [2, 1]}, "down": {"uv": [29, 1], "uv_size": [2, -1]}}}]}, {"name": "body", "parent": "frontbody", "pivot": [-2.6, 19.5, 15.6], "rotation": [90, 0, 0], "cubes": [{"origin": [-7.8, 36.4, 6.5], "size": [15.6, 15.6, 13], "uv": {"north": {"uv": [49, 10], "uv_size": [12, 12]}, "east": {"uv": [39, 10], "uv_size": [10, 12]}, "south": {"uv": [71, 10], "uv_size": [12, 12]}, "west": {"uv": [61, 10], "uv_size": [10, 12]}, "up": {"uv": [49, 0], "uv_size": [12, 10]}, "down": {"uv": [61, 10], "uv_size": [12, -10]}}}]}, {"name": "leg3", "parent": "frontbody", "pivot": [4.55, 13, -10.4], "cubes": [{"origin": [1.95, 0, -13], "size": [5.2, 13, 7.8], "uv": {"north": {"uv": [56, 46], "uv_size": [4, 10]}, "east": {"uv": [50, 46], "uv_size": [6, 10]}, "south": {"uv": [66, 46], "uv_size": [4, 10]}, "west": {"uv": [60, 46], "uv_size": [6, 10]}, "up": {"uv": [56, 40], "uv_size": [4, 6]}, "down": {"uv": [60, 46], "uv_size": [4, -6]}}}]}, {"name": "leg4", "parent": "frontbody", "pivot": [-4.55, 13, -10.4], "cubes": [{"origin": [-7.15, 0, -13], "size": [5.2, 13, 7.8], "uv": {"north": {"uv": [56, 46], "uv_size": [4, 10]}, "east": {"uv": [50, 46], "uv_size": [6, 10]}, "south": {"uv": [66, 46], "uv_size": [4, 10]}, "west": {"uv": [60, 46], "uv_size": [6, 10]}, "up": {"uv": [56, 40], "uv_size": [4, 6]}, "down": {"uv": [60, 46], "uv_size": [4, -6]}}}]}, {"name": "backbody", "parent": "polar_bear", "pivot": [0, 17, -1.25]}, {"name": "body2", "parent": "backbody", "pivot": [0, 0, 0], "cubes": [{"origin": [-9.1, 22.1, 41.6], "size": [18.2, 18.2, 14.3], "pivot": [0, 3.9, 35.1], "rotation": [90, 0, 0], "uv": {"north": {"uv": [11, 30], "uv_size": [14, 14]}, "east": {"uv": [0, 30], "uv_size": [11, 14]}, "south": {"uv": [36, 30], "uv_size": [14, 14]}, "west": {"uv": [25, 30], "uv_size": [11, 14]}, "up": {"uv": [11, 19], "uv_size": [14, 11]}, "down": {"uv": [25, 30], "uv_size": [14, -11]}}}]}, {"name": "d", "parent": "body2", "pivot": [0, 9.75, 9.1], "rotation": [20, 0, 0], "cubes": [{"origin": [-1.3, 8.45, 7.8], "size": [2.6, 2.6, 2.6], "uv": {"north": {"uv": [16, 33], "uv_size": [2, 2]}, "east": {"uv": [14, 33], "uv_size": [2, 2]}, "south": {"uv": [20, 33], "uv_size": [2, 2]}, "west": {"uv": [18, 33], "uv_size": [2, 2]}, "up": {"uv": [16, 31], "uv_size": [2, 2]}, "down": {"uv": [18, 33], "uv_size": [2, -2]}}}]}, {"name": "d2", "parent": "d", "pivot": [0, 9.425, 8.775], "cubes": [{"origin": [-1.15, 8.275, 5.025], "size": [2.3, 2.3, 4.9], "inflate": -0.5, "uv": {"north": {"uv": [8, 60], "uv_size": [4, 4]}, "east": {"uv": [0, 60], "uv_size": [8, 4]}, "south": {"uv": [20, 60], "uv_size": [4, 4]}, "west": {"uv": [12, 60], "uv_size": [8, 4]}, "up": {"uv": [8, 52], "uv_size": [4, 8]}, "down": {"uv": [12, 60], "uv_size": [4, -8]}}}]}, {"name": "d3", "parent": "d2", "pivot": [0, 9.425, 5.525], "cubes": [{"origin": [-1.12, 8.305, 2.78], "size": [2.24, 2.24, 3.54], "inflate": -0.6, "uv": {"north": {"uv": [30, 60], "uv_size": [4, 4]}, "east": {"uv": [24, 60], "uv_size": [6, 4]}, "south": {"uv": [40, 60], "uv_size": [4, 4]}, "west": {"uv": [34, 60], "uv_size": [6, 4]}, "up": {"uv": [30, 54], "uv_size": [4, 6]}, "down": {"uv": [34, 60], "uv_size": [4, -6]}}}]}, {"name": "d4", "parent": "d3", "pivot": [0, 9.425, 3.25], "rotation": [-7.5, 0, 0], "cubes": [{"origin": [-0.5675, 8.8575, 2.0325], "size": [1.135, 1.135, 2.435], "inflate": -0.275, "uv": {"north": {"uv": [48, 62], "uv_size": [2, 2]}, "east": {"uv": [44, 62], "uv_size": [4, 2]}, "south": {"uv": [54, 62], "uv_size": [2, 2]}, "west": {"uv": [50, 62], "uv_size": [4, 2]}, "up": {"uv": [48, 58], "uv_size": [2, 4]}, "down": {"uv": [50, 62], "uv_size": [2, -4]}}}]}, {"name": "leg1", "parent": "backbody", "pivot": [5.85, 13, 7.8], "cubes": [{"origin": [3.25, 0, 5.2], "size": [5.2, 13, 10.4], "uv": {"north": {"uv": [58, 30], "uv_size": [4, 10]}, "east": {"uv": [50, 30], "uv_size": [8, 10]}, "south": {"uv": [70, 30], "uv_size": [4, 10]}, "west": {"uv": [62, 30], "uv_size": [8, 10]}, "up": {"uv": [58, 22], "uv_size": [4, 8]}, "down": {"uv": [62, 30], "uv_size": [4, -8]}}}]}, {"name": "leg2", "parent": "backbody", "pivot": [-5.85, 13, 7.8], "cubes": [{"origin": [-8.45, 0, 5.2], "size": [5.2, 13, 10.4], "uv": {"north": {"uv": [58, 30], "uv_size": [4, 10]}, "east": {"uv": [50, 30], "uv_size": [8, 10]}, "south": {"uv": [70, 30], "uv_size": [4, 10]}, "west": {"uv": [62, 30], "uv_size": [8, 10]}, "up": {"uv": [58, 22], "uv_size": [4, 8]}, "down": {"uv": [62, 30], "uv_size": [4, -8]}}}]}]}]} \ No newline at end of file diff --git a/nonpacks/static/js/tests/fixtures/wolf.geo.json b/nonpacks/static/js/tests/fixtures/wolf.geo.json deleted file mode 100644 index b627be1..0000000 --- a/nonpacks/static/js/tests/fixtures/wolf.geo.json +++ /dev/null @@ -1,172 +0,0 @@ -{ - "afw_bone_textures": { - "cylinder": "needsofnature:textures/entity/wolf/wolf_features.png", - "bulb": "needsofnature:textures/entity/wolf/wolf_features.png" - }, - "format_version": "1.12.0", - "minecraft:geometry": [ - { - "description": { - "identifier": "geometry.unknown", - "texture_width": 64, - "texture_height": 32, - "visible_bounds_width": 3, - "visible_bounds_height": 2.5, - "visible_bounds_offset": [0, 0.75, 0] - }, - "bones": [ - { - "name": "root", - "pivot": [0, 0, 0] - }, - { - "name": "wolf", - "parent": "root", - "pivot": [-1, 10.5, -7] - }, - { - "name": "frontbody", - "parent": "wolf", - "pivot": [-1, 10.5, -7] - }, - { - "name": "head", - "parent": "frontbody", - "pivot": [-1, 10.5, -7], - "cubes": [ - {"origin": [-4, 7.5, -9], "size": [6, 6, 4], "uv": [0, 0]}, - {"origin": [-4, 13.5, -7], "size": [2, 2, 1], "uv": [16, 14]}, - {"origin": [0, 13.5, -7], "size": [2, 2, 1], "uv": [16, 14]}, - {"origin": [-2.5, 7.51563, -12], "size": [3, 3, 4], "uv": [0, 10]} - ] - }, - { - "name": "mane", - "parent": "frontbody", - "pivot": [-1, 10, 2], - "rotation": [90, 0, 0], - "cubes": [ - {"origin": [-5, 12, -1], "size": [8, 6, 7], "uv": [21, 0]} - ] - }, - { - "name": "leg3", - "parent": "frontbody", - "pivot": [-2.5, 8, -4], - "cubes": [ - {"origin": [-3.5, 0, -5], "size": [2, 8, 2], "uv": [0, 18]} - ] - }, - { - "name": "leg4", - "parent": "frontbody", - "pivot": [0.5, 8, -4], - "cubes": [ - {"origin": [-0.5, 0, -5], "size": [2, 8, 2], "uv": [0, 18]} - ] - }, - { - "name": "body", - "parent": "frontbody", - "pivot": [0, 10, 2], - "rotation": [90, 0, 0], - "cubes": [ - {"origin": [-4, 3, -1], "size": [6, 9, 6], "uv": [18, 14]} - ] - }, - { - "name": "d", - "parent": "body", - "pivot": [-1, 5, -0.2], - "rotation": [30.36119, -40.78947, -20.94102], - "cubes": [ - {"origin": [-2, 4, -1.2], "size": [2, 3, 2], "uv": [20, 22]} - ] - }, - { - "name": "cylinder", - "parent": "d", - "pivot": [-1.48996, 6.28701, -0.48996], - "cubes": [ - { - "origin": [-1.98996, 6.28701, -1.18996], - "size": [1, 5, 1], - "inflate": -0.1, - "uv": { - "north": {"uv": [52, 9], "uv_size": [3, 15]}, - "east": {"uv": [49, 9], "uv_size": [3, 15]}, - "south": {"uv": [58, 9], "uv_size": [3, 15]}, - "west": {"uv": [55, 9], "uv_size": [3, 15]}, - "up": {"uv": [52, 6], "uv_size": [3, 3]}, - "down": {"uv": [55, 9], "uv_size": [3, -3]} - } - }, - { - "origin": [-2.08996, 10.68701, -1.28996], - "size": [1, 1, 1], - "inflate": -0.3, - "uv": { - "north": {"uv": [54, 4], "uv_size": [2, 2]}, - "east": {"uv": [52, 4], "uv_size": [2, 2]}, - "south": {"uv": [58, 4], "uv_size": [2, 2]}, - "west": {"uv": [56, 4], "uv_size": [2, 2]}, - "up": {"uv": [54, 2], "uv_size": [2, 2]}, - "down": {"uv": [56, 4], "uv_size": [2, -2]} - } - } - ] - }, - { - "name": "bulb", - "parent": "cylinder", - "pivot": [-1.51197, 8.36355, -0.68726], - "rotation": [0, -47.5, 0], - "cubes": [ - { - "origin": [-2.26197, 7.86355, -1.73726], - "size": [1.25, 1, 2.1], - "uv": { - "north": {"uv": [52, 28], "uv_size": [3, 2]}, - "east": {"uv": [48, 28], "uv_size": [4, 2]}, - "south": {"uv": [59, 28], "uv_size": [3, 2]}, - "west": {"uv": [55, 28], "uv_size": [4, 2]}, - "up": {"uv": [52, 24], "uv_size": [3, 4]}, - "down": {"uv": [55, 28], "uv_size": [3, -4]} - } - } - ] - }, - { - "name": "backbody", - "parent": "wolf", - "pivot": [0, 10, 2] - }, - { - "name": "leg1", - "parent": "backbody", - "pivot": [-2.5, 8, 7], - "cubes": [ - {"origin": [-3.5, 0, 6], "size": [2, 8, 2], "uv": [0, 18]} - ] - }, - { - "name": "leg2", - "parent": "backbody", - "pivot": [0.5, 8, 7], - "cubes": [ - {"origin": [-0.5, 0, 6], "size": [2, 8, 2], "uv": [0, 18]} - ] - }, - { - "name": "tail", - "parent": "backbody", - "pivot": [-1, 12, 8], - "rotation": [55, 0, 0], - "cubes": [ - {"origin": [-2, 4, 7], "size": [2, 8, 2], "uv": [9, 18]} - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/nonpacks/static/js/tests/fixtures/zombie.geo.json b/nonpacks/static/js/tests/fixtures/zombie.geo.json deleted file mode 100644 index 195e1e2..0000000 --- a/nonpacks/static/js/tests/fixtures/zombie.geo.json +++ /dev/null @@ -1,113 +0,0 @@ -{ - "format_version": "1.12.0", - "afw_bone_textures": { - "body": "needsofnature:textures/entity/zombie/zombie.png", - "leftleg": "needsofnature:textures/entity/zombie/zombie.png", - "rightleg": "needsofnature:textures/entity/zombie/zombie.png", - "d": "needsofnature:textures/entity/zombie/zombie.png" - }, - "minecraft:geometry": [ - { - "description": { - "identifier": "geometry.unknown", - "texture_width": 64, - "texture_height": 64, - "visible_bounds_width": 2, - "visible_bounds_height": 3.5, - "visible_bounds_offset": [0, 1.25, 0] - }, - "bones": [ - { - "name": "root", - "pivot": [0, 0, 0] - }, - { - "name": "zombie", - "parent": "root", - "pivot": [0, 0, 0] - }, - { - "name": "waist", - "parent": "zombie", - "pivot": [0, 12, 0] - }, - { - "name": "head", - "parent": "waist", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [0, 0]} - ] - }, - { - "name": "headwear", - "parent": "waist", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 24, -4], "size": [8, 8, 8], "inflate": 0.5, "uv": [32, 0]} - ] - }, - { - "name": "body", - "parent": "waist", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]} - ] - }, - { - "name": "d", - "parent": "body", - "pivot": [0, 12, 0], - "cubes": [ - {"origin": [-1, 10.75, -6], "size": [2, 2, 5], "inflate": -0.3, "uv": [17, 8]} - ] - }, - { - "name": "leftarm", - "parent": "waist", - "pivot": [5, 22, 0], - "mirror": true, - "cubes": [ - {"origin": [4, 12, -2], "size": [4, 12, 4], "uv": [40, 16]} - ] - }, - { - "name": "propleft", - "parent": "leftarm", - "pivot": [6, 12, 0] - }, - { - "name": "rightarm", - "parent": "waist", - "pivot": [-5, 22, 0], - "cubes": [ - {"origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 16]} - ] - }, - { - "name": "propright", - "parent": "rightarm", - "pivot": [-6, 12, 0] - }, - { - "name": "leftleg", - "parent": "zombie", - "pivot": [1.9, 12, 0], - "mirror": true, - "cubes": [ - {"origin": [0, 0, -2], "size": [4, 12, 4], "uv": [0, 16]} - ] - }, - { - "name": "rightleg", - "parent": "zombie", - "pivot": [-1.9, 12, 0], - "cubes": [ - {"origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 16]} - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/nonpacks/static/js/tests/geo_builder.test.js b/nonpacks/static/js/tests/geo_builder.test.js deleted file mode 100644 index 303fb9b..0000000 --- a/nonpacks/static/js/tests/geo_builder.test.js +++ /dev/null @@ -1,234 +0,0 @@ -// Unit tests for geo_builder.js — run with: node static/js/tests/geo_builder.test.js -// No framework: asserts, prints a summary, exits non-zero on failure. -'use strict'; - -const path = require('path'); -const GeoBuilder = require(path.join(__dirname, '..', 'geo_builder.js')); - -const zombie = require(path.join(__dirname, 'fixtures', 'zombie.geo.json')); - -let failures = 0; -let checks = 0; - -function approx(a, b, tol = 1e-6) { - return Math.abs(a - b) <= tol; -} - -function assertVec(actual, expected, label, tol = 1e-6) { - checks++; - const ok = approx(actual[0], expected[0], tol) && approx(actual[1], expected[1], tol) && approx(actual[2], expected[2], tol); - if (!ok) { - failures++; - console.error(`FAIL ${label}: got [${actual.map(v => v.toFixed(4)).join(', ')}] expected [${expected.join(', ')}]`); - } -} - -function assert(cond, label) { - checks++; - if (!cond) { failures++; console.error(`FAIL ${label}`); } -} - -function worldCenter(matrix) { - return GeoBuilder.transformPoint(matrix, [0, 0, 0]); -} - -// ---------- 1. Real zombie model (nested hierarchy, identity rotations) ---------- -const built = GeoBuilder.build(zombie); -const tw = built.texture_width, th = built.texture_height; - -assert(built.cubes.length === 8, `zombie cube count (got ${built.cubes.length})`); - -const centers = built.cubes.map(c => ({ c, center: worldCenter(c.matrix) })); - -function cubeNear(center) { - return centers.filter(({ center: c }) => - approx(c[0], center[0], 1e-6) && approx(c[1], center[1], 1e-6) && approx(c[2], center[2], 1e-6) - ).map(x => x.c); -} - -assert(cubeNear([0, 28, 0]).length >= 2, 'head + headwear at (0,28,0)'); // head & headwear -assert(cubeNear([0, 18, 0]).length === 1, 'body at (0,18,0)'); -assert(cubeNear([6, 18, 0]).length === 1, 'leftarm at (6,18,0)'); -assert(cubeNear([-6, 18, 0]).length === 1, 'rightarm at (-6,18,0)'); -assert(cubeNear([2, 6, 0]).length === 1, 'leftleg at (2,6,0)'); -assert(cubeNear([-2, 6, 0]).length === 1, 'rightleg at (-2,6,0)'); -assert(cubeNear([0, 11.75, -3.5]).length === 1, 'd at (0,11.75,-3.5)'); - -// Head = the (0,28,0) cube with uv [0,0]; headwear has uv [32,0]. -const headCube = cubeNear([0, 28, 0]).find(c => c.uv[0] === 0 && c.uv[1] === 0); -assert(!!headCube, 'head cube identified'); -if (headCube) { - // Head north face (last face) must sample the vanilla (8..16, 8..16) region. - const geo = GeoBuilder.cubeGeometry(headCube.size, headCube.uv, tw, th); - const northStart = 5 * 8; // face order: east,west,top,bottom,south,north - let minU = 2, maxU = -1, minV = 2, maxV = -1; - for (let i = 0; i < 8; i += 2) { - minU = Math.min(minU, geo.uvs[northStart + i]); - maxU = Math.max(maxU, geo.uvs[northStart + i]); - minV = Math.min(minV, geo.uvs[northStart + i + 1]); - maxV = Math.max(maxV, geo.uvs[northStart + i + 1]); - } - assert(approx(minU, 8 / 64) && approx(maxU, 16 / 64), `head north U in (8..16)/64 (got ${minU.toFixed(3)}..${maxU.toFixed(3)})`); - assert(approx(minV, 1 - 16 / 64) && approx(maxV, 1 - 8 / 64), `head north V in [0.75,0.875] (got ${minV.toFixed(3)}..${maxV.toFixed(3)})`); -} - -// All UVs within [0,1]. -let allInRange = true; -for (const { c } of centers) { - const g = GeoBuilder.cubeGeometry(c.size, c.uv, tw, th); - for (const u of g.uvs) if (u < 0 || u > 1) { allInRange = false; break; } -} -assert(allInRange, 'all UVs within [0,1]'); - -// Unmapped bones default to the pack's main texture (resource location -// converted to the zip member path). -assert(headCube.texture === 'assets/needsofnature/textures/entity/zombie/zombie.png', 'head uses default texture'); -assert(GeoBuilder.resourceToMember('needsofnature:textures/entity/zombie/zombie.png') === 'assets/needsofnature/textures/entity/zombie/zombie.png', 'resource location converted to member'); -assert(GeoBuilder.resourceToMember('assets/needsofnature/textures/x.png') === 'assets/needsofnature/textures/x.png', 'already-member unchanged'); -assert(GeoBuilder.resourceToMember('textures/plain.png') === 'assets/textures/plain.png', 'bare path prefixed'); - -// ---------- 2. Synthetic rotated bone: Rz(-90°) around pivot (0,10,0) ---------- -// Rotations are negated to match the Bedrock/GeckoLib direction. -const rotated = { - 'minecraft:geometry': [{ - description: { identifier: 'geometry.t', texture_width: 64, texture_height: 64 }, - bones: [{ - name: 'waist', pivot: [0, 10, 0], rotation: [0, 0, 90], - cubes: [{ origin: [0, 10, 0], size: [2, 2, 2], uv: [0, 0] }], - }], - }], -}; -const rotBuilt = GeoBuilder.build(rotated); -assert(rotBuilt.cubes.length === 1, 'rotated model has one cube'); -// cube center = origin + size/2 = (1,11,1); Rz(-90) around pivot (0,10,0): -// rel (1,1,1) -> (1,-1,1) -> +pivot = (1,9,1) -const rotCenter = worldCenter(rotBuilt.cubes[0].matrix); -assertVec(rotCenter, [1, 9, 1], 'rotated cube center around pivot (expect (1,9,1))'); - -// ---------- 3. Nested pivot with rotation ---------- -const nested = { - 'minecraft:geometry': [{ - description: { identifier: 'geometry.n', texture_width: 64, texture_height: 64 }, - bones: [ - { name: 'root', pivot: [0, 0, 0] }, - { name: 'waist', pivot: [0, 12, 0], parent: 'root', rotation: [0, 0, 0] }, - { name: 'head', pivot: [0, 24, 0], parent: 'waist', - cubes: [{ origin: [-4, 24, -4], size: [8, 8, 8], uv: [0, 0] }] }, - ], - }], -}; -const nestedBuilt = GeoBuilder.build(nested); -assertVec(worldCenter(nestedBuilt.cubes[0].matrix), [0, 28, 0], 'nested pivot head center (expect (0,28,0))'); - -// ---------- 4. Real wolf model: rotated bones must produce a quadruped layout ---------- -const wolf = require(path.join(__dirname, 'fixtures', 'wolf.geo.json')); -const wolfBuilt = GeoBuilder.build(wolf); -const wolfCenters = wolfBuilt.cubes.map(c => ({ c, center: worldCenter(c.matrix) })); - -const wBody = wolfCenters.find(({ c }) => c.size[0] === 8 && c.size[1] === 6 && c.size[2] === 7); -assert(!!wBody, 'wolf body cube found'); -if (wBody) { - // Body high (y~10.5) and in the front half (z<2). Under the old rotation - // sign the body landed at the back (z=7) — this catches the regression. - assertVec(wBody.center, [-1, 10.5, -3], 'wolf body center (expect (-1,10.5,-3))'); -} - -const wHead = wolfCenters.find(({ c }) => c.size[0] === 6 && c.size[1] === 6 && c.size[2] === 4); -assert(!!wHead, 'wolf head cube found'); -if (wHead) { - assertVec(wHead.center, [-1, 10.5, -7], 'wolf head center (expect (-1,10.5,-7))'); -} - -// 4 legs (size 2x8x2 cubes whose y is near the ground). -const wLegs = wolfCenters.filter(({ c, center }) => c.size[0] === 2 && c.size[1] === 8 && c.size[2] === 2 && center[1] < 6); -assert(wLegs.length === 4, `wolf has 4 legs near the ground (got ${wLegs.length})`); -wLegs.forEach(({ center }) => assert(approx(center[1], 4.0, 0.2), `leg at ground level y=${center[1].toFixed(1)}`)); - -// Tail: the cube with the largest |z|, behind the body. -let wTail = wolfCenters[0]; -for (const w of wolfCenters) { - if (Math.abs(w.center[2]) > Math.abs(wTail.center[2])) wTail = w; -} -assert(wTail.center[2] > 8, `wolf tail behind body (z=${wTail.center[2].toFixed(1)})`); -assert(wBody && wTail.center[2] > wBody.center[2], 'tail z > body z'); - -// ---------- 5. Real polar bear: cube-level pivot + rotation ---------- -// The polar bear's rear torso cube has its own pivot/rotation; rotating around -// the cube origin (not its pivot) sent it flying to z≈48. Regression test. -const polar = require(path.join(__dirname, 'fixtures', 'polar_bear.geo.json')); -const polarBuilt = GeoBuilder.build(polar); -const polarCubes = polarBuilt.cubes.map(c => ({ c, center: worldCenter(c.matrix) })); -const pRear = polarCubes.find(({ c }) => c.size[0] === 18.2 && c.size[1] === 18.2 && c.size[2] === 14.3); -assert(!!pRear, 'polar bear rear torso cube found'); -if (pRear) { - assertVec(pRear.center, [0, 17.55, 7.8], 'polar bear rear torso center (expect (0,17.55,7.8))'); -} -const pFront = polarCubes.find(({ c }) => c.size[0] === 15.6 && c.size[1] === 15.6 && c.size[2] === 13); -if (pFront) { - // Rear torso sits behind and at the same height as the front torso. - assert(pRear.center[2] > pFront.center[2], 'rear torso behind front torso'); - assert(approx(pRear.center[1], pFront.center[1], 1.5), 'rear + front torso at similar height'); -} - -// ---------- 6. Per-face UV (Blockbench) cubes produce finite, in-range UVs ---------- -// Real per-face cube from the default pack phantom model (down face is flipped -// via negative uv_size). -const perFace = { - 'minecraft:geometry': [{ - description: { identifier: 'geometry.pf', texture_width: 64, texture_height: 64 }, - bones: [{ - name: 'd2', - cubes: [{ - origin: [0, 0, 0], size: [4, 8, 4], - uv: { - north: { uv: [8, 40], uv_size: [4, 8] }, - east: { uv: [0, 40], uv_size: [4, 8] }, - south: { uv: [12, 40], uv_size: [4, 8] }, - west: { uv: [4, 40], uv_size: [4, 8] }, - up: { uv: [4, 36], uv_size: [4, 4] }, - down: { uv: [8, 40], uv_size: [4, -4] }, - }, - }], - }], - }], -}; -const pfBuilt = GeoBuilder.build(perFace); -const pfCube = pfBuilt.cubes[0]; -assert(pfCube && typeof pfCube.uv === 'object', 'per-face cube passed through build()'); -if (pfCube) { - const g = GeoBuilder.cubeGeometry(pfCube.size, pfCube.uv, 64, 64); - assert(g.uvs.length === 48, 'per-face geometry emits 24 UVs (48 floats)'); - let allFinite = true, allIn01 = true; - for (const u of g.uvs) { - if (!Number.isFinite(u)) allFinite = false; - if (u < 0 || u > 1) allIn01 = false; - } - assert(allFinite, 'per-face UVs are finite (no NaN)'); - assert(allIn01, 'per-face UVs within [0,1]'); - // south face = index 4 in face order [east,west,top,bottom,south,north]: - // rect [12,40,4,8] -> U 12/64..16/64, V flipped: 1-(40+8)/64 .. 1-40/64. - const southStart = 4 * 8; - let minU = 2, maxU = -1, minV = 2, maxV = -1; - for (let i = 0; i < 8; i += 2) { - minU = Math.min(minU, g.uvs[southStart + i]); - maxU = Math.max(maxU, g.uvs[southStart + i]); - minV = Math.min(minV, g.uvs[southStart + i + 1]); - maxV = Math.max(maxV, g.uvs[southStart + i + 1]); - } - assert(approx(minU, 12 / 64) && approx(maxU, 16 / 64), `per-face south U in (12..16)/64 (got ${minU.toFixed(3)}..${maxU.toFixed(3)})`); - assert(approx(minV, 1 - 48 / 64) && approx(maxV, 1 - 40 / 64), `per-face south V in [0.25,0.375] (got ${minV.toFixed(3)}..${maxV.toFixed(3)})`); -} - -// ---------- 7. Per-face rects: negative uv_size mirrors (down face) ---------- -const rects = GeoBuilder.perFaceRects(perFace['minecraft:geometry'][0].bones[0].cubes[0].uv); -assert(rects.bottom[3] === -4, 'negative uv_size preserved for down face'); -assert(rects.top[3] === 4 && rects.south[2] === 4, 'positive faces keep size'); -assert(Array.isArray(GeoBuilder.boxUVRects([0, 0], [4, 8, 4]).south), 'boxUVRects still array-based'); - -// ---------- summary ---------- -if (failures === 0) { - console.log(`geo_builder tests OK (${checks} checks)`); -} else { - console.error(`${failures}/${checks} checks FAILED`); - process.exit(1); -} diff --git a/nonpacks/static/player_skins/destroyed_skin.png b/nonpacks/static/player_skins/destroyed_skin.png new file mode 100644 index 0000000..7dc0aab Binary files /dev/null and b/nonpacks/static/player_skins/destroyed_skin.png differ diff --git a/nonpacks/static/player_skins/russian_goat.png b/nonpacks/static/player_skins/russian_goat.png new file mode 100644 index 0000000..9cf5c39 Binary files /dev/null and b/nonpacks/static/player_skins/russian_goat.png differ diff --git a/nonpacks/static/vanilla/entity/allay/allay.png b/nonpacks/static/vanilla/entity/allay/allay.png new file mode 100644 index 0000000..f67afbe Binary files /dev/null and b/nonpacks/static/vanilla/entity/allay/allay.png differ diff --git a/nonpacks/static/vanilla/entity/armadillo.png b/nonpacks/static/vanilla/entity/armadillo.png new file mode 100644 index 0000000..8d65a12 Binary files /dev/null and b/nonpacks/static/vanilla/entity/armadillo.png differ diff --git a/nonpacks/static/vanilla/entity/armorstand/wood.png b/nonpacks/static/vanilla/entity/armorstand/wood.png new file mode 100644 index 0000000..a5dedc8 Binary files /dev/null and b/nonpacks/static/vanilla/entity/armorstand/wood.png differ diff --git a/nonpacks/static/vanilla/entity/axolotl/axolotl_blue.png b/nonpacks/static/vanilla/entity/axolotl/axolotl_blue.png new file mode 100644 index 0000000..0074b66 Binary files /dev/null and b/nonpacks/static/vanilla/entity/axolotl/axolotl_blue.png differ diff --git a/nonpacks/static/vanilla/entity/axolotl/axolotl_cyan.png b/nonpacks/static/vanilla/entity/axolotl/axolotl_cyan.png new file mode 100644 index 0000000..5f66f95 Binary files /dev/null and b/nonpacks/static/vanilla/entity/axolotl/axolotl_cyan.png differ diff --git a/nonpacks/static/vanilla/entity/axolotl/axolotl_gold.png b/nonpacks/static/vanilla/entity/axolotl/axolotl_gold.png new file mode 100644 index 0000000..c8abd9b Binary files /dev/null and b/nonpacks/static/vanilla/entity/axolotl/axolotl_gold.png differ diff --git a/nonpacks/static/vanilla/entity/axolotl/axolotl_lucy.png b/nonpacks/static/vanilla/entity/axolotl/axolotl_lucy.png new file mode 100644 index 0000000..473b1a4 Binary files /dev/null and b/nonpacks/static/vanilla/entity/axolotl/axolotl_lucy.png differ diff --git a/nonpacks/static/vanilla/entity/axolotl/axolotl_wild.png b/nonpacks/static/vanilla/entity/axolotl/axolotl_wild.png new file mode 100644 index 0000000..a91dbb4 Binary files /dev/null and b/nonpacks/static/vanilla/entity/axolotl/axolotl_wild.png differ diff --git a/nonpacks/static/vanilla/entity/banner/base.png b/nonpacks/static/vanilla/entity/banner/base.png new file mode 100644 index 0000000..2d4d631 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/base.png differ diff --git a/nonpacks/static/vanilla/entity/banner/border.png b/nonpacks/static/vanilla/entity/banner/border.png new file mode 100644 index 0000000..490a8ff Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/border.png differ diff --git a/nonpacks/static/vanilla/entity/banner/bricks.png b/nonpacks/static/vanilla/entity/banner/bricks.png new file mode 100644 index 0000000..6bb6e4e Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/bricks.png differ diff --git a/nonpacks/static/vanilla/entity/banner/circle.png b/nonpacks/static/vanilla/entity/banner/circle.png new file mode 100644 index 0000000..eb449ec Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/circle.png differ diff --git a/nonpacks/static/vanilla/entity/banner/creeper.png b/nonpacks/static/vanilla/entity/banner/creeper.png new file mode 100644 index 0000000..3f07a04 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/creeper.png differ diff --git a/nonpacks/static/vanilla/entity/banner/cross.png b/nonpacks/static/vanilla/entity/banner/cross.png new file mode 100644 index 0000000..74203a6 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/cross.png differ diff --git a/nonpacks/static/vanilla/entity/banner/curly_border.png b/nonpacks/static/vanilla/entity/banner/curly_border.png new file mode 100644 index 0000000..d52ef8a Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/curly_border.png differ diff --git a/nonpacks/static/vanilla/entity/banner/diagonal_left.png b/nonpacks/static/vanilla/entity/banner/diagonal_left.png new file mode 100644 index 0000000..60fb165 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/diagonal_left.png differ diff --git a/nonpacks/static/vanilla/entity/banner/diagonal_right.png b/nonpacks/static/vanilla/entity/banner/diagonal_right.png new file mode 100644 index 0000000..66bed17 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/diagonal_right.png differ diff --git a/nonpacks/static/vanilla/entity/banner/diagonal_up_left.png b/nonpacks/static/vanilla/entity/banner/diagonal_up_left.png new file mode 100644 index 0000000..ab1cedd Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/diagonal_up_left.png differ diff --git a/nonpacks/static/vanilla/entity/banner/diagonal_up_right.png b/nonpacks/static/vanilla/entity/banner/diagonal_up_right.png new file mode 100644 index 0000000..a2ed6c1 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/diagonal_up_right.png differ diff --git a/nonpacks/static/vanilla/entity/banner/flow.png b/nonpacks/static/vanilla/entity/banner/flow.png new file mode 100644 index 0000000..5060a16 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/flow.png differ diff --git a/nonpacks/static/vanilla/entity/banner/flower.png b/nonpacks/static/vanilla/entity/banner/flower.png new file mode 100644 index 0000000..24e1061 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/flower.png differ diff --git a/nonpacks/static/vanilla/entity/banner/globe.png b/nonpacks/static/vanilla/entity/banner/globe.png new file mode 100644 index 0000000..cc17e27 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/globe.png differ diff --git a/nonpacks/static/vanilla/entity/banner/gradient.png b/nonpacks/static/vanilla/entity/banner/gradient.png new file mode 100644 index 0000000..9a37395 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/gradient.png differ diff --git a/nonpacks/static/vanilla/entity/banner/gradient_up.png b/nonpacks/static/vanilla/entity/banner/gradient_up.png new file mode 100644 index 0000000..3786ac5 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/gradient_up.png differ diff --git a/nonpacks/static/vanilla/entity/banner/guster.png b/nonpacks/static/vanilla/entity/banner/guster.png new file mode 100644 index 0000000..b7c83ec Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/guster.png differ diff --git a/nonpacks/static/vanilla/entity/banner/half_horizontal.png b/nonpacks/static/vanilla/entity/banner/half_horizontal.png new file mode 100644 index 0000000..6da6138 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/half_horizontal.png differ diff --git a/nonpacks/static/vanilla/entity/banner/half_horizontal_bottom.png b/nonpacks/static/vanilla/entity/banner/half_horizontal_bottom.png new file mode 100644 index 0000000..6fb3e21 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/half_horizontal_bottom.png differ diff --git a/nonpacks/static/vanilla/entity/banner/half_vertical.png b/nonpacks/static/vanilla/entity/banner/half_vertical.png new file mode 100644 index 0000000..e8f4220 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/half_vertical.png differ diff --git a/nonpacks/static/vanilla/entity/banner/half_vertical_right.png b/nonpacks/static/vanilla/entity/banner/half_vertical_right.png new file mode 100644 index 0000000..ec20dac Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/half_vertical_right.png differ diff --git a/nonpacks/static/vanilla/entity/banner/mojang.png b/nonpacks/static/vanilla/entity/banner/mojang.png new file mode 100644 index 0000000..4214a07 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/mojang.png differ diff --git a/nonpacks/static/vanilla/entity/banner/piglin.png b/nonpacks/static/vanilla/entity/banner/piglin.png new file mode 100644 index 0000000..d32ec41 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/piglin.png differ diff --git a/nonpacks/static/vanilla/entity/banner/rhombus.png b/nonpacks/static/vanilla/entity/banner/rhombus.png new file mode 100644 index 0000000..84ba534 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/rhombus.png differ diff --git a/nonpacks/static/vanilla/entity/banner/skull.png b/nonpacks/static/vanilla/entity/banner/skull.png new file mode 100644 index 0000000..fc286db Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/skull.png differ diff --git a/nonpacks/static/vanilla/entity/banner/small_stripes.png b/nonpacks/static/vanilla/entity/banner/small_stripes.png new file mode 100644 index 0000000..cfb9d57 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/small_stripes.png differ diff --git a/nonpacks/static/vanilla/entity/banner/square_bottom_left.png b/nonpacks/static/vanilla/entity/banner/square_bottom_left.png new file mode 100644 index 0000000..7cb3fd0 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/square_bottom_left.png differ diff --git a/nonpacks/static/vanilla/entity/banner/square_bottom_right.png b/nonpacks/static/vanilla/entity/banner/square_bottom_right.png new file mode 100644 index 0000000..440efbb Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/square_bottom_right.png differ diff --git a/nonpacks/static/vanilla/entity/banner/square_top_left.png b/nonpacks/static/vanilla/entity/banner/square_top_left.png new file mode 100644 index 0000000..6cac5ce Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/square_top_left.png differ diff --git a/nonpacks/static/vanilla/entity/banner/square_top_right.png b/nonpacks/static/vanilla/entity/banner/square_top_right.png new file mode 100644 index 0000000..3d1565d Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/square_top_right.png differ diff --git a/nonpacks/static/vanilla/entity/banner/straight_cross.png b/nonpacks/static/vanilla/entity/banner/straight_cross.png new file mode 100644 index 0000000..da90a83 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/straight_cross.png differ diff --git a/nonpacks/static/vanilla/entity/banner/stripe_bottom.png b/nonpacks/static/vanilla/entity/banner/stripe_bottom.png new file mode 100644 index 0000000..805c62b Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/stripe_bottom.png differ diff --git a/nonpacks/static/vanilla/entity/banner/stripe_center.png b/nonpacks/static/vanilla/entity/banner/stripe_center.png new file mode 100644 index 0000000..5096e7b Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/stripe_center.png differ diff --git a/nonpacks/static/vanilla/entity/banner/stripe_downleft.png b/nonpacks/static/vanilla/entity/banner/stripe_downleft.png new file mode 100644 index 0000000..796ea04 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/stripe_downleft.png differ diff --git a/nonpacks/static/vanilla/entity/banner/stripe_downright.png b/nonpacks/static/vanilla/entity/banner/stripe_downright.png new file mode 100644 index 0000000..346d0c9 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/stripe_downright.png differ diff --git a/nonpacks/static/vanilla/entity/banner/stripe_left.png b/nonpacks/static/vanilla/entity/banner/stripe_left.png new file mode 100644 index 0000000..8d6212f Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/stripe_left.png differ diff --git a/nonpacks/static/vanilla/entity/banner/stripe_middle.png b/nonpacks/static/vanilla/entity/banner/stripe_middle.png new file mode 100644 index 0000000..ce2000e Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/stripe_middle.png differ diff --git a/nonpacks/static/vanilla/entity/banner/stripe_right.png b/nonpacks/static/vanilla/entity/banner/stripe_right.png new file mode 100644 index 0000000..d435d5e Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/stripe_right.png differ diff --git a/nonpacks/static/vanilla/entity/banner/stripe_top.png b/nonpacks/static/vanilla/entity/banner/stripe_top.png new file mode 100644 index 0000000..4a4cc28 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/stripe_top.png differ diff --git a/nonpacks/static/vanilla/entity/banner/triangle_bottom.png b/nonpacks/static/vanilla/entity/banner/triangle_bottom.png new file mode 100644 index 0000000..5dc7398 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/triangle_bottom.png differ diff --git a/nonpacks/static/vanilla/entity/banner/triangle_top.png b/nonpacks/static/vanilla/entity/banner/triangle_top.png new file mode 100644 index 0000000..ea0e2b0 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/triangle_top.png differ diff --git a/nonpacks/static/vanilla/entity/banner/triangles_bottom.png b/nonpacks/static/vanilla/entity/banner/triangles_bottom.png new file mode 100644 index 0000000..b194c2d Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/triangles_bottom.png differ diff --git a/nonpacks/static/vanilla/entity/banner/triangles_top.png b/nonpacks/static/vanilla/entity/banner/triangles_top.png new file mode 100644 index 0000000..7d7d682 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner/triangles_top.png differ diff --git a/nonpacks/static/vanilla/entity/banner_base.png b/nonpacks/static/vanilla/entity/banner_base.png new file mode 100644 index 0000000..21dd7e4 Binary files /dev/null and b/nonpacks/static/vanilla/entity/banner_base.png differ diff --git a/nonpacks/static/vanilla/entity/bat.png b/nonpacks/static/vanilla/entity/bat.png new file mode 100644 index 0000000..7af22be Binary files /dev/null and b/nonpacks/static/vanilla/entity/bat.png differ diff --git a/nonpacks/static/vanilla/entity/beacon_beam.png b/nonpacks/static/vanilla/entity/beacon_beam.png new file mode 100644 index 0000000..cb43fee Binary files /dev/null and b/nonpacks/static/vanilla/entity/beacon_beam.png differ diff --git a/nonpacks/static/vanilla/entity/bear/polarbear.png b/nonpacks/static/vanilla/entity/bear/polarbear.png new file mode 100644 index 0000000..938928a Binary files /dev/null and b/nonpacks/static/vanilla/entity/bear/polarbear.png differ diff --git a/nonpacks/static/vanilla/entity/bed/black.png b/nonpacks/static/vanilla/entity/bed/black.png new file mode 100644 index 0000000..2fcf761 Binary files /dev/null and b/nonpacks/static/vanilla/entity/bed/black.png differ diff --git a/nonpacks/static/vanilla/entity/bed/blue.png b/nonpacks/static/vanilla/entity/bed/blue.png new file mode 100644 index 0000000..a6ac300 Binary files /dev/null and b/nonpacks/static/vanilla/entity/bed/blue.png differ diff --git a/nonpacks/static/vanilla/entity/bed/brown.png b/nonpacks/static/vanilla/entity/bed/brown.png new file mode 100644 index 0000000..0e7b6b9 Binary files /dev/null and b/nonpacks/static/vanilla/entity/bed/brown.png differ diff --git a/nonpacks/static/vanilla/entity/bed/cyan.png b/nonpacks/static/vanilla/entity/bed/cyan.png new file mode 100644 index 0000000..c0d5e60 Binary files /dev/null and b/nonpacks/static/vanilla/entity/bed/cyan.png differ diff --git a/nonpacks/static/vanilla/entity/bed/gray.png b/nonpacks/static/vanilla/entity/bed/gray.png new file mode 100644 index 0000000..b7062e5 Binary files /dev/null and b/nonpacks/static/vanilla/entity/bed/gray.png differ diff --git a/nonpacks/static/vanilla/entity/bed/green.png b/nonpacks/static/vanilla/entity/bed/green.png new file mode 100644 index 0000000..8a389fd Binary files /dev/null and b/nonpacks/static/vanilla/entity/bed/green.png differ diff --git a/nonpacks/static/vanilla/entity/bed/light_blue.png b/nonpacks/static/vanilla/entity/bed/light_blue.png new file mode 100644 index 0000000..ebaa2d2 Binary files /dev/null and b/nonpacks/static/vanilla/entity/bed/light_blue.png differ diff --git a/nonpacks/static/vanilla/entity/bed/light_gray.png b/nonpacks/static/vanilla/entity/bed/light_gray.png new file mode 100644 index 0000000..8c31270 Binary files /dev/null and b/nonpacks/static/vanilla/entity/bed/light_gray.png differ diff --git a/nonpacks/static/vanilla/entity/bed/lime.png b/nonpacks/static/vanilla/entity/bed/lime.png new file mode 100644 index 0000000..dae5ff1 Binary files /dev/null and b/nonpacks/static/vanilla/entity/bed/lime.png differ diff --git a/nonpacks/static/vanilla/entity/bed/magenta.png b/nonpacks/static/vanilla/entity/bed/magenta.png new file mode 100644 index 0000000..dc5411f Binary files /dev/null and b/nonpacks/static/vanilla/entity/bed/magenta.png differ diff --git a/nonpacks/static/vanilla/entity/bed/orange.png b/nonpacks/static/vanilla/entity/bed/orange.png new file mode 100644 index 0000000..9cfe65f Binary files /dev/null and b/nonpacks/static/vanilla/entity/bed/orange.png differ diff --git a/nonpacks/static/vanilla/entity/bed/pink.png b/nonpacks/static/vanilla/entity/bed/pink.png new file mode 100644 index 0000000..6de2e91 Binary files /dev/null and b/nonpacks/static/vanilla/entity/bed/pink.png differ diff --git a/nonpacks/static/vanilla/entity/bed/purple.png b/nonpacks/static/vanilla/entity/bed/purple.png new file mode 100644 index 0000000..1a9010b Binary files /dev/null and b/nonpacks/static/vanilla/entity/bed/purple.png differ diff --git a/nonpacks/static/vanilla/entity/bed/red.png b/nonpacks/static/vanilla/entity/bed/red.png new file mode 100644 index 0000000..8ff0fb2 Binary files /dev/null and b/nonpacks/static/vanilla/entity/bed/red.png differ diff --git a/nonpacks/static/vanilla/entity/bed/white.png b/nonpacks/static/vanilla/entity/bed/white.png new file mode 100644 index 0000000..4b8e15c Binary files /dev/null and b/nonpacks/static/vanilla/entity/bed/white.png differ diff --git a/nonpacks/static/vanilla/entity/bed/yellow.png b/nonpacks/static/vanilla/entity/bed/yellow.png new file mode 100644 index 0000000..b23994c Binary files /dev/null and b/nonpacks/static/vanilla/entity/bed/yellow.png differ diff --git a/nonpacks/static/vanilla/entity/bee/bee.png b/nonpacks/static/vanilla/entity/bee/bee.png new file mode 100644 index 0000000..6a02d8f Binary files /dev/null and b/nonpacks/static/vanilla/entity/bee/bee.png differ diff --git a/nonpacks/static/vanilla/entity/bee/bee_angry.png b/nonpacks/static/vanilla/entity/bee/bee_angry.png new file mode 100644 index 0000000..910866c Binary files /dev/null and b/nonpacks/static/vanilla/entity/bee/bee_angry.png differ diff --git a/nonpacks/static/vanilla/entity/bee/bee_angry_nectar.png b/nonpacks/static/vanilla/entity/bee/bee_angry_nectar.png new file mode 100644 index 0000000..6a4912c Binary files /dev/null and b/nonpacks/static/vanilla/entity/bee/bee_angry_nectar.png differ diff --git a/nonpacks/static/vanilla/entity/bee/bee_nectar.png b/nonpacks/static/vanilla/entity/bee/bee_nectar.png new file mode 100644 index 0000000..c881b6a Binary files /dev/null and b/nonpacks/static/vanilla/entity/bee/bee_nectar.png differ diff --git a/nonpacks/static/vanilla/entity/bee/bee_stinger.png b/nonpacks/static/vanilla/entity/bee/bee_stinger.png new file mode 100644 index 0000000..2e04a1f Binary files /dev/null and b/nonpacks/static/vanilla/entity/bee/bee_stinger.png differ diff --git a/nonpacks/static/vanilla/entity/bell/bell_body.png b/nonpacks/static/vanilla/entity/bell/bell_body.png new file mode 100644 index 0000000..12d7795 Binary files /dev/null and b/nonpacks/static/vanilla/entity/bell/bell_body.png differ diff --git a/nonpacks/static/vanilla/entity/blaze.png b/nonpacks/static/vanilla/entity/blaze.png new file mode 100644 index 0000000..1a8070a Binary files /dev/null and b/nonpacks/static/vanilla/entity/blaze.png differ diff --git a/nonpacks/static/vanilla/entity/boat/acacia.png b/nonpacks/static/vanilla/entity/boat/acacia.png new file mode 100644 index 0000000..7f3dc29 Binary files /dev/null and b/nonpacks/static/vanilla/entity/boat/acacia.png differ diff --git a/nonpacks/static/vanilla/entity/boat/bamboo.png b/nonpacks/static/vanilla/entity/boat/bamboo.png new file mode 100644 index 0000000..9cfd26a Binary files /dev/null and b/nonpacks/static/vanilla/entity/boat/bamboo.png differ diff --git a/nonpacks/static/vanilla/entity/boat/birch.png b/nonpacks/static/vanilla/entity/boat/birch.png new file mode 100644 index 0000000..17d79cd Binary files /dev/null and b/nonpacks/static/vanilla/entity/boat/birch.png differ diff --git a/nonpacks/static/vanilla/entity/boat/cherry.png b/nonpacks/static/vanilla/entity/boat/cherry.png new file mode 100644 index 0000000..727471f Binary files /dev/null and b/nonpacks/static/vanilla/entity/boat/cherry.png differ diff --git a/nonpacks/static/vanilla/entity/boat/dark_oak.png b/nonpacks/static/vanilla/entity/boat/dark_oak.png new file mode 100644 index 0000000..88c4ecf Binary files /dev/null and b/nonpacks/static/vanilla/entity/boat/dark_oak.png differ diff --git a/nonpacks/static/vanilla/entity/boat/jungle.png b/nonpacks/static/vanilla/entity/boat/jungle.png new file mode 100644 index 0000000..b978b96 Binary files /dev/null and b/nonpacks/static/vanilla/entity/boat/jungle.png differ diff --git a/nonpacks/static/vanilla/entity/boat/mangrove.png b/nonpacks/static/vanilla/entity/boat/mangrove.png new file mode 100644 index 0000000..4c5df10 Binary files /dev/null and b/nonpacks/static/vanilla/entity/boat/mangrove.png differ diff --git a/nonpacks/static/vanilla/entity/boat/oak.png b/nonpacks/static/vanilla/entity/boat/oak.png new file mode 100644 index 0000000..3fecbba Binary files /dev/null and b/nonpacks/static/vanilla/entity/boat/oak.png differ diff --git a/nonpacks/static/vanilla/entity/boat/pale_oak.png b/nonpacks/static/vanilla/entity/boat/pale_oak.png new file mode 100644 index 0000000..3d8dd4a Binary files /dev/null and b/nonpacks/static/vanilla/entity/boat/pale_oak.png differ diff --git a/nonpacks/static/vanilla/entity/boat/spruce.png b/nonpacks/static/vanilla/entity/boat/spruce.png new file mode 100644 index 0000000..667ca06 Binary files /dev/null and b/nonpacks/static/vanilla/entity/boat/spruce.png differ diff --git a/nonpacks/static/vanilla/entity/breeze/breeze.png b/nonpacks/static/vanilla/entity/breeze/breeze.png new file mode 100644 index 0000000..5438021 Binary files /dev/null and b/nonpacks/static/vanilla/entity/breeze/breeze.png differ diff --git a/nonpacks/static/vanilla/entity/breeze/breeze_eyes.png b/nonpacks/static/vanilla/entity/breeze/breeze_eyes.png new file mode 100644 index 0000000..25e0d32 Binary files /dev/null and b/nonpacks/static/vanilla/entity/breeze/breeze_eyes.png differ diff --git a/nonpacks/static/vanilla/entity/breeze/breeze_wind.png b/nonpacks/static/vanilla/entity/breeze/breeze_wind.png new file mode 100644 index 0000000..a22936b Binary files /dev/null and b/nonpacks/static/vanilla/entity/breeze/breeze_wind.png differ diff --git a/nonpacks/static/vanilla/entity/camel/camel.png b/nonpacks/static/vanilla/entity/camel/camel.png new file mode 100644 index 0000000..6e73500 Binary files /dev/null and b/nonpacks/static/vanilla/entity/camel/camel.png differ diff --git a/nonpacks/static/vanilla/entity/camel/camel_husk.png b/nonpacks/static/vanilla/entity/camel/camel_husk.png new file mode 100644 index 0000000..31332ff Binary files /dev/null and b/nonpacks/static/vanilla/entity/camel/camel_husk.png differ diff --git a/nonpacks/static/vanilla/entity/cat/all_black.png b/nonpacks/static/vanilla/entity/cat/all_black.png new file mode 100644 index 0000000..1a8ee36 Binary files /dev/null and b/nonpacks/static/vanilla/entity/cat/all_black.png differ diff --git a/nonpacks/static/vanilla/entity/cat/black.png b/nonpacks/static/vanilla/entity/cat/black.png new file mode 100644 index 0000000..f414ca6 Binary files /dev/null and b/nonpacks/static/vanilla/entity/cat/black.png differ diff --git a/nonpacks/static/vanilla/entity/cat/british_shorthair.png b/nonpacks/static/vanilla/entity/cat/british_shorthair.png new file mode 100644 index 0000000..df7c95a Binary files /dev/null and b/nonpacks/static/vanilla/entity/cat/british_shorthair.png differ diff --git a/nonpacks/static/vanilla/entity/cat/calico.png b/nonpacks/static/vanilla/entity/cat/calico.png new file mode 100644 index 0000000..f9b469a Binary files /dev/null and b/nonpacks/static/vanilla/entity/cat/calico.png differ diff --git a/nonpacks/static/vanilla/entity/cat/cat_collar.png b/nonpacks/static/vanilla/entity/cat/cat_collar.png new file mode 100644 index 0000000..566dca5 Binary files /dev/null and b/nonpacks/static/vanilla/entity/cat/cat_collar.png differ diff --git a/nonpacks/static/vanilla/entity/cat/jellie.png b/nonpacks/static/vanilla/entity/cat/jellie.png new file mode 100644 index 0000000..bb8e264 Binary files /dev/null and b/nonpacks/static/vanilla/entity/cat/jellie.png differ diff --git a/nonpacks/static/vanilla/entity/cat/ocelot.png b/nonpacks/static/vanilla/entity/cat/ocelot.png new file mode 100644 index 0000000..4002a13 Binary files /dev/null and b/nonpacks/static/vanilla/entity/cat/ocelot.png differ diff --git a/nonpacks/static/vanilla/entity/cat/persian.png b/nonpacks/static/vanilla/entity/cat/persian.png new file mode 100644 index 0000000..4082625 Binary files /dev/null and b/nonpacks/static/vanilla/entity/cat/persian.png differ diff --git a/nonpacks/static/vanilla/entity/cat/ragdoll.png b/nonpacks/static/vanilla/entity/cat/ragdoll.png new file mode 100644 index 0000000..60d0865 Binary files /dev/null and b/nonpacks/static/vanilla/entity/cat/ragdoll.png differ diff --git a/nonpacks/static/vanilla/entity/cat/red.png b/nonpacks/static/vanilla/entity/cat/red.png new file mode 100644 index 0000000..6f36c40 Binary files /dev/null and b/nonpacks/static/vanilla/entity/cat/red.png differ diff --git a/nonpacks/static/vanilla/entity/cat/siamese.png b/nonpacks/static/vanilla/entity/cat/siamese.png new file mode 100644 index 0000000..3f472ec Binary files /dev/null and b/nonpacks/static/vanilla/entity/cat/siamese.png differ diff --git a/nonpacks/static/vanilla/entity/cat/tabby.png b/nonpacks/static/vanilla/entity/cat/tabby.png new file mode 100644 index 0000000..237a3ba Binary files /dev/null and b/nonpacks/static/vanilla/entity/cat/tabby.png differ diff --git a/nonpacks/static/vanilla/entity/cat/white.png b/nonpacks/static/vanilla/entity/cat/white.png new file mode 100644 index 0000000..92726ea Binary files /dev/null and b/nonpacks/static/vanilla/entity/cat/white.png differ diff --git a/nonpacks/static/vanilla/entity/chest/christmas.png b/nonpacks/static/vanilla/entity/chest/christmas.png new file mode 100644 index 0000000..8a4a0af Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/christmas.png differ diff --git a/nonpacks/static/vanilla/entity/chest/christmas_left.png b/nonpacks/static/vanilla/entity/chest/christmas_left.png new file mode 100644 index 0000000..4f893fc Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/christmas_left.png differ diff --git a/nonpacks/static/vanilla/entity/chest/christmas_right.png b/nonpacks/static/vanilla/entity/chest/christmas_right.png new file mode 100644 index 0000000..3338682 Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/christmas_right.png differ diff --git a/nonpacks/static/vanilla/entity/chest/copper.png b/nonpacks/static/vanilla/entity/chest/copper.png new file mode 100644 index 0000000..1f4285b Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/copper.png differ diff --git a/nonpacks/static/vanilla/entity/chest/copper_exposed.png b/nonpacks/static/vanilla/entity/chest/copper_exposed.png new file mode 100644 index 0000000..a424213 Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/copper_exposed.png differ diff --git a/nonpacks/static/vanilla/entity/chest/copper_exposed_left.png b/nonpacks/static/vanilla/entity/chest/copper_exposed_left.png new file mode 100644 index 0000000..6371768 Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/copper_exposed_left.png differ diff --git a/nonpacks/static/vanilla/entity/chest/copper_exposed_right.png b/nonpacks/static/vanilla/entity/chest/copper_exposed_right.png new file mode 100644 index 0000000..9c6ec21 Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/copper_exposed_right.png differ diff --git a/nonpacks/static/vanilla/entity/chest/copper_left.png b/nonpacks/static/vanilla/entity/chest/copper_left.png new file mode 100644 index 0000000..c54de70 Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/copper_left.png differ diff --git a/nonpacks/static/vanilla/entity/chest/copper_oxidized.png b/nonpacks/static/vanilla/entity/chest/copper_oxidized.png new file mode 100644 index 0000000..3ab1e63 Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/copper_oxidized.png differ diff --git a/nonpacks/static/vanilla/entity/chest/copper_oxidized_left.png b/nonpacks/static/vanilla/entity/chest/copper_oxidized_left.png new file mode 100644 index 0000000..bfccc89 Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/copper_oxidized_left.png differ diff --git a/nonpacks/static/vanilla/entity/chest/copper_oxidized_right.png b/nonpacks/static/vanilla/entity/chest/copper_oxidized_right.png new file mode 100644 index 0000000..7e158cb Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/copper_oxidized_right.png differ diff --git a/nonpacks/static/vanilla/entity/chest/copper_right.png b/nonpacks/static/vanilla/entity/chest/copper_right.png new file mode 100644 index 0000000..376550b Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/copper_right.png differ diff --git a/nonpacks/static/vanilla/entity/chest/copper_weathered.png b/nonpacks/static/vanilla/entity/chest/copper_weathered.png new file mode 100644 index 0000000..2ebaf27 Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/copper_weathered.png differ diff --git a/nonpacks/static/vanilla/entity/chest/copper_weathered_left.png b/nonpacks/static/vanilla/entity/chest/copper_weathered_left.png new file mode 100644 index 0000000..18d68be Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/copper_weathered_left.png differ diff --git a/nonpacks/static/vanilla/entity/chest/copper_weathered_right.png b/nonpacks/static/vanilla/entity/chest/copper_weathered_right.png new file mode 100644 index 0000000..4aca115 Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/copper_weathered_right.png differ diff --git a/nonpacks/static/vanilla/entity/chest/ender.png b/nonpacks/static/vanilla/entity/chest/ender.png new file mode 100644 index 0000000..16025ae Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/ender.png differ diff --git a/nonpacks/static/vanilla/entity/chest/normal.png b/nonpacks/static/vanilla/entity/chest/normal.png new file mode 100644 index 0000000..88afac2 Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/normal.png differ diff --git a/nonpacks/static/vanilla/entity/chest/normal_left.png b/nonpacks/static/vanilla/entity/chest/normal_left.png new file mode 100644 index 0000000..1552192 Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/normal_left.png differ diff --git a/nonpacks/static/vanilla/entity/chest/normal_right.png b/nonpacks/static/vanilla/entity/chest/normal_right.png new file mode 100644 index 0000000..efe18c1 Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/normal_right.png differ diff --git a/nonpacks/static/vanilla/entity/chest/trapped.png b/nonpacks/static/vanilla/entity/chest/trapped.png new file mode 100644 index 0000000..ef78b7e Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/trapped.png differ diff --git a/nonpacks/static/vanilla/entity/chest/trapped_left.png b/nonpacks/static/vanilla/entity/chest/trapped_left.png new file mode 100644 index 0000000..9ee9857 Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/trapped_left.png differ diff --git a/nonpacks/static/vanilla/entity/chest/trapped_right.png b/nonpacks/static/vanilla/entity/chest/trapped_right.png new file mode 100644 index 0000000..de612ac Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest/trapped_right.png differ diff --git a/nonpacks/static/vanilla/entity/chest_boat/acacia.png b/nonpacks/static/vanilla/entity/chest_boat/acacia.png new file mode 100644 index 0000000..b1ce08f Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest_boat/acacia.png differ diff --git a/nonpacks/static/vanilla/entity/chest_boat/bamboo.png b/nonpacks/static/vanilla/entity/chest_boat/bamboo.png new file mode 100644 index 0000000..0529a3c Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest_boat/bamboo.png differ diff --git a/nonpacks/static/vanilla/entity/chest_boat/birch.png b/nonpacks/static/vanilla/entity/chest_boat/birch.png new file mode 100644 index 0000000..38e597c Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest_boat/birch.png differ diff --git a/nonpacks/static/vanilla/entity/chest_boat/cherry.png b/nonpacks/static/vanilla/entity/chest_boat/cherry.png new file mode 100644 index 0000000..10c3118 Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest_boat/cherry.png differ diff --git a/nonpacks/static/vanilla/entity/chest_boat/dark_oak.png b/nonpacks/static/vanilla/entity/chest_boat/dark_oak.png new file mode 100644 index 0000000..99ea1db Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest_boat/dark_oak.png differ diff --git a/nonpacks/static/vanilla/entity/chest_boat/jungle.png b/nonpacks/static/vanilla/entity/chest_boat/jungle.png new file mode 100644 index 0000000..1aab89d Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest_boat/jungle.png differ diff --git a/nonpacks/static/vanilla/entity/chest_boat/mangrove.png b/nonpacks/static/vanilla/entity/chest_boat/mangrove.png new file mode 100644 index 0000000..b16b67d Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest_boat/mangrove.png differ diff --git a/nonpacks/static/vanilla/entity/chest_boat/oak.png b/nonpacks/static/vanilla/entity/chest_boat/oak.png new file mode 100644 index 0000000..96ccb65 Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest_boat/oak.png differ diff --git a/nonpacks/static/vanilla/entity/chest_boat/pale_oak.png b/nonpacks/static/vanilla/entity/chest_boat/pale_oak.png new file mode 100644 index 0000000..825a4d2 Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest_boat/pale_oak.png differ diff --git a/nonpacks/static/vanilla/entity/chest_boat/spruce.png b/nonpacks/static/vanilla/entity/chest_boat/spruce.png new file mode 100644 index 0000000..5d759ae Binary files /dev/null and b/nonpacks/static/vanilla/entity/chest_boat/spruce.png differ diff --git a/nonpacks/static/vanilla/entity/chicken/cold_chicken.png b/nonpacks/static/vanilla/entity/chicken/cold_chicken.png new file mode 100644 index 0000000..417883b Binary files /dev/null and b/nonpacks/static/vanilla/entity/chicken/cold_chicken.png differ diff --git a/nonpacks/static/vanilla/entity/chicken/temperate_chicken.png b/nonpacks/static/vanilla/entity/chicken/temperate_chicken.png new file mode 100644 index 0000000..dee0982 Binary files /dev/null and b/nonpacks/static/vanilla/entity/chicken/temperate_chicken.png differ diff --git a/nonpacks/static/vanilla/entity/chicken/warm_chicken.png b/nonpacks/static/vanilla/entity/chicken/warm_chicken.png new file mode 100644 index 0000000..241afe7 Binary files /dev/null and b/nonpacks/static/vanilla/entity/chicken/warm_chicken.png differ diff --git a/nonpacks/static/vanilla/entity/conduit/base.png b/nonpacks/static/vanilla/entity/conduit/base.png new file mode 100644 index 0000000..1bb8deb Binary files /dev/null and b/nonpacks/static/vanilla/entity/conduit/base.png differ diff --git a/nonpacks/static/vanilla/entity/conduit/break_particle.png b/nonpacks/static/vanilla/entity/conduit/break_particle.png new file mode 100644 index 0000000..c68c9d6 Binary files /dev/null and b/nonpacks/static/vanilla/entity/conduit/break_particle.png differ diff --git a/nonpacks/static/vanilla/entity/conduit/cage.png b/nonpacks/static/vanilla/entity/conduit/cage.png new file mode 100644 index 0000000..142b22e Binary files /dev/null and b/nonpacks/static/vanilla/entity/conduit/cage.png differ diff --git a/nonpacks/static/vanilla/entity/conduit/closed_eye.png b/nonpacks/static/vanilla/entity/conduit/closed_eye.png new file mode 100644 index 0000000..204b110 Binary files /dev/null and b/nonpacks/static/vanilla/entity/conduit/closed_eye.png differ diff --git a/nonpacks/static/vanilla/entity/conduit/open_eye.png b/nonpacks/static/vanilla/entity/conduit/open_eye.png new file mode 100644 index 0000000..f59cdb7 Binary files /dev/null and b/nonpacks/static/vanilla/entity/conduit/open_eye.png differ diff --git a/nonpacks/static/vanilla/entity/conduit/wind.png b/nonpacks/static/vanilla/entity/conduit/wind.png new file mode 100644 index 0000000..c7db2fd Binary files /dev/null and b/nonpacks/static/vanilla/entity/conduit/wind.png differ diff --git a/nonpacks/static/vanilla/entity/conduit/wind_vertical.png b/nonpacks/static/vanilla/entity/conduit/wind_vertical.png new file mode 100644 index 0000000..ebe47d2 Binary files /dev/null and b/nonpacks/static/vanilla/entity/conduit/wind_vertical.png differ diff --git a/nonpacks/static/vanilla/entity/copper_golem/copper_golem.png b/nonpacks/static/vanilla/entity/copper_golem/copper_golem.png new file mode 100644 index 0000000..eff34ff Binary files /dev/null and b/nonpacks/static/vanilla/entity/copper_golem/copper_golem.png differ diff --git a/nonpacks/static/vanilla/entity/copper_golem/copper_golem_eyes.png b/nonpacks/static/vanilla/entity/copper_golem/copper_golem_eyes.png new file mode 100644 index 0000000..495b683 Binary files /dev/null and b/nonpacks/static/vanilla/entity/copper_golem/copper_golem_eyes.png differ diff --git a/nonpacks/static/vanilla/entity/copper_golem/exposed_copper_golem.png b/nonpacks/static/vanilla/entity/copper_golem/exposed_copper_golem.png new file mode 100644 index 0000000..54aecd5 Binary files /dev/null and b/nonpacks/static/vanilla/entity/copper_golem/exposed_copper_golem.png differ diff --git a/nonpacks/static/vanilla/entity/copper_golem/exposed_copper_golem_eyes.png b/nonpacks/static/vanilla/entity/copper_golem/exposed_copper_golem_eyes.png new file mode 100644 index 0000000..9b3fb6d Binary files /dev/null and b/nonpacks/static/vanilla/entity/copper_golem/exposed_copper_golem_eyes.png differ diff --git a/nonpacks/static/vanilla/entity/copper_golem/oxidized_copper_golem.png b/nonpacks/static/vanilla/entity/copper_golem/oxidized_copper_golem.png new file mode 100644 index 0000000..d4130fd Binary files /dev/null and b/nonpacks/static/vanilla/entity/copper_golem/oxidized_copper_golem.png differ diff --git a/nonpacks/static/vanilla/entity/copper_golem/oxidized_copper_golem_eyes.png b/nonpacks/static/vanilla/entity/copper_golem/oxidized_copper_golem_eyes.png new file mode 100644 index 0000000..9c1675f Binary files /dev/null and b/nonpacks/static/vanilla/entity/copper_golem/oxidized_copper_golem_eyes.png differ diff --git a/nonpacks/static/vanilla/entity/copper_golem/weathered_copper_golem.png b/nonpacks/static/vanilla/entity/copper_golem/weathered_copper_golem.png new file mode 100644 index 0000000..96e41ba Binary files /dev/null and b/nonpacks/static/vanilla/entity/copper_golem/weathered_copper_golem.png differ diff --git a/nonpacks/static/vanilla/entity/copper_golem/weathered_copper_golem_eyes.png b/nonpacks/static/vanilla/entity/copper_golem/weathered_copper_golem_eyes.png new file mode 100644 index 0000000..e06ac4c Binary files /dev/null and b/nonpacks/static/vanilla/entity/copper_golem/weathered_copper_golem_eyes.png differ diff --git a/nonpacks/static/vanilla/entity/cow/brown_mooshroom.png b/nonpacks/static/vanilla/entity/cow/brown_mooshroom.png new file mode 100644 index 0000000..45a43e8 Binary files /dev/null and b/nonpacks/static/vanilla/entity/cow/brown_mooshroom.png differ diff --git a/nonpacks/static/vanilla/entity/cow/cold_cow.png b/nonpacks/static/vanilla/entity/cow/cold_cow.png new file mode 100644 index 0000000..30cde99 Binary files /dev/null and b/nonpacks/static/vanilla/entity/cow/cold_cow.png differ diff --git a/nonpacks/static/vanilla/entity/cow/red_mooshroom.png b/nonpacks/static/vanilla/entity/cow/red_mooshroom.png new file mode 100644 index 0000000..d010b56 Binary files /dev/null and b/nonpacks/static/vanilla/entity/cow/red_mooshroom.png differ diff --git a/nonpacks/static/vanilla/entity/cow/temperate_cow.png b/nonpacks/static/vanilla/entity/cow/temperate_cow.png new file mode 100644 index 0000000..084d408 Binary files /dev/null and b/nonpacks/static/vanilla/entity/cow/temperate_cow.png differ diff --git a/nonpacks/static/vanilla/entity/cow/warm_cow.png b/nonpacks/static/vanilla/entity/cow/warm_cow.png new file mode 100644 index 0000000..4fdc89c Binary files /dev/null and b/nonpacks/static/vanilla/entity/cow/warm_cow.png differ diff --git a/nonpacks/static/vanilla/entity/creaking/creaking.png b/nonpacks/static/vanilla/entity/creaking/creaking.png new file mode 100644 index 0000000..71dc498 Binary files /dev/null and b/nonpacks/static/vanilla/entity/creaking/creaking.png differ diff --git a/nonpacks/static/vanilla/entity/creaking/creaking_eyes.png b/nonpacks/static/vanilla/entity/creaking/creaking_eyes.png new file mode 100644 index 0000000..b93ba55 Binary files /dev/null and b/nonpacks/static/vanilla/entity/creaking/creaking_eyes.png differ diff --git a/nonpacks/static/vanilla/entity/creeper/creeper.png b/nonpacks/static/vanilla/entity/creeper/creeper.png new file mode 100644 index 0000000..75987d5 Binary files /dev/null and b/nonpacks/static/vanilla/entity/creeper/creeper.png differ diff --git a/nonpacks/static/vanilla/entity/creeper/creeper_armor.png b/nonpacks/static/vanilla/entity/creeper/creeper_armor.png new file mode 100644 index 0000000..c8a52a1 Binary files /dev/null and b/nonpacks/static/vanilla/entity/creeper/creeper_armor.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/angler_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/angler_pottery_pattern.png new file mode 100644 index 0000000..76acf0d Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/angler_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/archer_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/archer_pottery_pattern.png new file mode 100644 index 0000000..f0cc2d9 Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/archer_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/arms_up_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/arms_up_pottery_pattern.png new file mode 100644 index 0000000..2f31e15 Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/arms_up_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/blade_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/blade_pottery_pattern.png new file mode 100644 index 0000000..6e3eded Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/blade_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/brewer_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/brewer_pottery_pattern.png new file mode 100644 index 0000000..108c3f8 Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/brewer_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/burn_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/burn_pottery_pattern.png new file mode 100644 index 0000000..0bfd3ce Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/burn_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/danger_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/danger_pottery_pattern.png new file mode 100644 index 0000000..9e1fb9c Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/danger_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/decorated_pot_base.png b/nonpacks/static/vanilla/entity/decorated_pot/decorated_pot_base.png new file mode 100644 index 0000000..e737e28 Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/decorated_pot_base.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/decorated_pot_side.png b/nonpacks/static/vanilla/entity/decorated_pot/decorated_pot_side.png new file mode 100644 index 0000000..dcd6305 Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/decorated_pot_side.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/explorer_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/explorer_pottery_pattern.png new file mode 100644 index 0000000..b171d94 Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/explorer_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/flow_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/flow_pottery_pattern.png new file mode 100644 index 0000000..7487dad Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/flow_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/friend_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/friend_pottery_pattern.png new file mode 100644 index 0000000..12a7812 Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/friend_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/guster_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/guster_pottery_pattern.png new file mode 100644 index 0000000..fd9587a Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/guster_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/heart_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/heart_pottery_pattern.png new file mode 100644 index 0000000..a971cb8 Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/heart_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/heartbreak_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/heartbreak_pottery_pattern.png new file mode 100644 index 0000000..88d5969 Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/heartbreak_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/howl_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/howl_pottery_pattern.png new file mode 100644 index 0000000..f3fe62f Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/howl_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/miner_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/miner_pottery_pattern.png new file mode 100644 index 0000000..2c719f0 Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/miner_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/mourner_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/mourner_pottery_pattern.png new file mode 100644 index 0000000..51fc850 Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/mourner_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/plenty_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/plenty_pottery_pattern.png new file mode 100644 index 0000000..446ad2b Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/plenty_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/prize_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/prize_pottery_pattern.png new file mode 100644 index 0000000..b3ad017 Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/prize_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/scrape_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/scrape_pottery_pattern.png new file mode 100644 index 0000000..7252968 Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/scrape_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/sheaf_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/sheaf_pottery_pattern.png new file mode 100644 index 0000000..c1176f0 Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/sheaf_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/shelter_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/shelter_pottery_pattern.png new file mode 100644 index 0000000..6f6a660 Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/shelter_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/skull_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/skull_pottery_pattern.png new file mode 100644 index 0000000..12cacf1 Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/skull_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/decorated_pot/snort_pottery_pattern.png b/nonpacks/static/vanilla/entity/decorated_pot/snort_pottery_pattern.png new file mode 100644 index 0000000..af79cc8 Binary files /dev/null and b/nonpacks/static/vanilla/entity/decorated_pot/snort_pottery_pattern.png differ diff --git a/nonpacks/static/vanilla/entity/dolphin.png b/nonpacks/static/vanilla/entity/dolphin.png new file mode 100644 index 0000000..6fe7be4 Binary files /dev/null and b/nonpacks/static/vanilla/entity/dolphin.png differ diff --git a/nonpacks/static/vanilla/entity/enchanting_table_book.png b/nonpacks/static/vanilla/entity/enchanting_table_book.png new file mode 100644 index 0000000..ae861dc Binary files /dev/null and b/nonpacks/static/vanilla/entity/enchanting_table_book.png differ diff --git a/nonpacks/static/vanilla/entity/end_crystal/end_crystal.png b/nonpacks/static/vanilla/entity/end_crystal/end_crystal.png new file mode 100644 index 0000000..f11080b Binary files /dev/null and b/nonpacks/static/vanilla/entity/end_crystal/end_crystal.png differ diff --git a/nonpacks/static/vanilla/entity/end_crystal/end_crystal_beam.png b/nonpacks/static/vanilla/entity/end_crystal/end_crystal_beam.png new file mode 100644 index 0000000..8756ca9 Binary files /dev/null and b/nonpacks/static/vanilla/entity/end_crystal/end_crystal_beam.png differ diff --git a/nonpacks/static/vanilla/entity/end_gateway_beam.png b/nonpacks/static/vanilla/entity/end_gateway_beam.png new file mode 100644 index 0000000..00f493f Binary files /dev/null and b/nonpacks/static/vanilla/entity/end_gateway_beam.png differ diff --git a/nonpacks/static/vanilla/entity/end_portal.png b/nonpacks/static/vanilla/entity/end_portal.png new file mode 100644 index 0000000..ffb8fe1 Binary files /dev/null and b/nonpacks/static/vanilla/entity/end_portal.png differ diff --git a/nonpacks/static/vanilla/entity/enderdragon/dragon.png b/nonpacks/static/vanilla/entity/enderdragon/dragon.png new file mode 100644 index 0000000..10b3fcd Binary files /dev/null and b/nonpacks/static/vanilla/entity/enderdragon/dragon.png differ diff --git a/nonpacks/static/vanilla/entity/enderdragon/dragon_exploding.png b/nonpacks/static/vanilla/entity/enderdragon/dragon_exploding.png new file mode 100644 index 0000000..0ba7f8f Binary files /dev/null and b/nonpacks/static/vanilla/entity/enderdragon/dragon_exploding.png differ diff --git a/nonpacks/static/vanilla/entity/enderdragon/dragon_eyes.png b/nonpacks/static/vanilla/entity/enderdragon/dragon_eyes.png new file mode 100644 index 0000000..3376dcb Binary files /dev/null and b/nonpacks/static/vanilla/entity/enderdragon/dragon_eyes.png differ diff --git a/nonpacks/static/vanilla/entity/enderdragon/dragon_fireball.png b/nonpacks/static/vanilla/entity/enderdragon/dragon_fireball.png new file mode 100644 index 0000000..69a747f Binary files /dev/null and b/nonpacks/static/vanilla/entity/enderdragon/dragon_fireball.png differ diff --git a/nonpacks/static/vanilla/entity/enderman/enderman.png b/nonpacks/static/vanilla/entity/enderman/enderman.png new file mode 100644 index 0000000..9002e26 Binary files /dev/null and b/nonpacks/static/vanilla/entity/enderman/enderman.png differ diff --git a/nonpacks/static/vanilla/entity/enderman/enderman_eyes.png b/nonpacks/static/vanilla/entity/enderman/enderman_eyes.png new file mode 100644 index 0000000..0b66e20 Binary files /dev/null and b/nonpacks/static/vanilla/entity/enderman/enderman_eyes.png differ diff --git a/nonpacks/static/vanilla/entity/endermite.png b/nonpacks/static/vanilla/entity/endermite.png new file mode 100644 index 0000000..14d829a Binary files /dev/null and b/nonpacks/static/vanilla/entity/endermite.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/camel_husk_saddle/saddle.png b/nonpacks/static/vanilla/entity/equipment/camel_husk_saddle/saddle.png new file mode 100644 index 0000000..abd21cc Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/camel_husk_saddle/saddle.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/camel_saddle/saddle.png b/nonpacks/static/vanilla/entity/equipment/camel_saddle/saddle.png new file mode 100644 index 0000000..f8d2ab8 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/camel_saddle/saddle.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/donkey_saddle/saddle.png b/nonpacks/static/vanilla/entity/equipment/donkey_saddle/saddle.png new file mode 100644 index 0000000..ad5809e Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/donkey_saddle/saddle.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/black_harness.png b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/black_harness.png new file mode 100644 index 0000000..0ce46bf Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/black_harness.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/blue_harness.png b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/blue_harness.png new file mode 100644 index 0000000..5d63404 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/blue_harness.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/brown_harness.png b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/brown_harness.png new file mode 100644 index 0000000..6148f11 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/brown_harness.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/cyan_harness.png b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/cyan_harness.png new file mode 100644 index 0000000..d337ef9 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/cyan_harness.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/gray_harness.png b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/gray_harness.png new file mode 100644 index 0000000..87bf5e8 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/gray_harness.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/green_harness.png b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/green_harness.png new file mode 100644 index 0000000..ae963ed Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/green_harness.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/light_blue_harness.png b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/light_blue_harness.png new file mode 100644 index 0000000..5f74ca8 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/light_blue_harness.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/light_gray_harness.png b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/light_gray_harness.png new file mode 100644 index 0000000..d813d46 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/light_gray_harness.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/lime_harness.png b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/lime_harness.png new file mode 100644 index 0000000..6bdb675 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/lime_harness.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/magenta_harness.png b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/magenta_harness.png new file mode 100644 index 0000000..c8faff6 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/magenta_harness.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/orange_harness.png b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/orange_harness.png new file mode 100644 index 0000000..d1e6c2d Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/orange_harness.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/pink_harness.png b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/pink_harness.png new file mode 100644 index 0000000..8bd0121 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/pink_harness.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/purple_harness.png b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/purple_harness.png new file mode 100644 index 0000000..9a864d3 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/purple_harness.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/red_harness.png b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/red_harness.png new file mode 100644 index 0000000..7d6453d Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/red_harness.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/white_harness.png b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/white_harness.png new file mode 100644 index 0000000..24328bc Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/white_harness.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/yellow_harness.png b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/yellow_harness.png new file mode 100644 index 0000000..57ac894 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/happy_ghast_body/yellow_harness.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/horse_body/copper.png b/nonpacks/static/vanilla/entity/equipment/horse_body/copper.png new file mode 100644 index 0000000..b32ca2f Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/horse_body/copper.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/horse_body/diamond.png b/nonpacks/static/vanilla/entity/equipment/horse_body/diamond.png new file mode 100644 index 0000000..73e59e1 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/horse_body/diamond.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/horse_body/gold.png b/nonpacks/static/vanilla/entity/equipment/horse_body/gold.png new file mode 100644 index 0000000..cccbe72 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/horse_body/gold.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/horse_body/iron.png b/nonpacks/static/vanilla/entity/equipment/horse_body/iron.png new file mode 100644 index 0000000..28d2a38 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/horse_body/iron.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/horse_body/leather.png b/nonpacks/static/vanilla/entity/equipment/horse_body/leather.png new file mode 100644 index 0000000..303dfa8 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/horse_body/leather.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/horse_body/leather_overlay.png b/nonpacks/static/vanilla/entity/equipment/horse_body/leather_overlay.png new file mode 100644 index 0000000..d1f493e Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/horse_body/leather_overlay.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/horse_body/netherite.png b/nonpacks/static/vanilla/entity/equipment/horse_body/netherite.png new file mode 100644 index 0000000..d269696 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/horse_body/netherite.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/horse_saddle/saddle.png b/nonpacks/static/vanilla/entity/equipment/horse_saddle/saddle.png new file mode 100644 index 0000000..ad5809e Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/horse_saddle/saddle.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/humanoid/chainmail.png b/nonpacks/static/vanilla/entity/equipment/humanoid/chainmail.png new file mode 100644 index 0000000..b4e4aac Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/humanoid/chainmail.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/humanoid/copper.png b/nonpacks/static/vanilla/entity/equipment/humanoid/copper.png new file mode 100644 index 0000000..eccf785 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/humanoid/copper.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/humanoid/diamond.png b/nonpacks/static/vanilla/entity/equipment/humanoid/diamond.png new file mode 100644 index 0000000..b3dc020 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/humanoid/diamond.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/humanoid/gold.png b/nonpacks/static/vanilla/entity/equipment/humanoid/gold.png new file mode 100644 index 0000000..bbd3011 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/humanoid/gold.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/humanoid/iron.png b/nonpacks/static/vanilla/entity/equipment/humanoid/iron.png new file mode 100644 index 0000000..9c54e7e Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/humanoid/iron.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/humanoid/leather.png b/nonpacks/static/vanilla/entity/equipment/humanoid/leather.png new file mode 100644 index 0000000..2ebea47 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/humanoid/leather.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/humanoid/leather_overlay.png b/nonpacks/static/vanilla/entity/equipment/humanoid/leather_overlay.png new file mode 100644 index 0000000..8b9e75d Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/humanoid/leather_overlay.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/humanoid/netherite.png b/nonpacks/static/vanilla/entity/equipment/humanoid/netherite.png new file mode 100644 index 0000000..11c961e Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/humanoid/netherite.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/humanoid/turtle_scute.png b/nonpacks/static/vanilla/entity/equipment/humanoid/turtle_scute.png new file mode 100644 index 0000000..d536fa7 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/humanoid/turtle_scute.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/chainmail.png b/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/chainmail.png new file mode 100644 index 0000000..0d47920 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/chainmail.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/copper.png b/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/copper.png new file mode 100644 index 0000000..fc15738 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/copper.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/diamond.png b/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/diamond.png new file mode 100644 index 0000000..a9d69e8 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/diamond.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/gold.png b/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/gold.png new file mode 100644 index 0000000..0d1032e Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/gold.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/iron.png b/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/iron.png new file mode 100644 index 0000000..f45fb53 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/iron.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/leather.png b/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/leather.png new file mode 100644 index 0000000..527b526 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/leather.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/leather_overlay.png b/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/leather_overlay.png new file mode 100644 index 0000000..a6339f8 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/leather_overlay.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/netherite.png b/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/netherite.png new file mode 100644 index 0000000..8668fb4 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/humanoid_leggings/netherite.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/llama_body/black.png b/nonpacks/static/vanilla/entity/equipment/llama_body/black.png new file mode 100644 index 0000000..f6df41a Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/llama_body/black.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/llama_body/blue.png b/nonpacks/static/vanilla/entity/equipment/llama_body/blue.png new file mode 100644 index 0000000..84956c9 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/llama_body/blue.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/llama_body/brown.png b/nonpacks/static/vanilla/entity/equipment/llama_body/brown.png new file mode 100644 index 0000000..567eb54 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/llama_body/brown.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/llama_body/cyan.png b/nonpacks/static/vanilla/entity/equipment/llama_body/cyan.png new file mode 100644 index 0000000..06f6544 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/llama_body/cyan.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/llama_body/gray.png b/nonpacks/static/vanilla/entity/equipment/llama_body/gray.png new file mode 100644 index 0000000..6a2d87a Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/llama_body/gray.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/llama_body/green.png b/nonpacks/static/vanilla/entity/equipment/llama_body/green.png new file mode 100644 index 0000000..1d7187d Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/llama_body/green.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/llama_body/light_blue.png b/nonpacks/static/vanilla/entity/equipment/llama_body/light_blue.png new file mode 100644 index 0000000..6c35ac0 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/llama_body/light_blue.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/llama_body/light_gray.png b/nonpacks/static/vanilla/entity/equipment/llama_body/light_gray.png new file mode 100644 index 0000000..2b48e6f Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/llama_body/light_gray.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/llama_body/lime.png b/nonpacks/static/vanilla/entity/equipment/llama_body/lime.png new file mode 100644 index 0000000..d61844e Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/llama_body/lime.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/llama_body/magenta.png b/nonpacks/static/vanilla/entity/equipment/llama_body/magenta.png new file mode 100644 index 0000000..86b5f02 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/llama_body/magenta.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/llama_body/orange.png b/nonpacks/static/vanilla/entity/equipment/llama_body/orange.png new file mode 100644 index 0000000..96685d4 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/llama_body/orange.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/llama_body/pink.png b/nonpacks/static/vanilla/entity/equipment/llama_body/pink.png new file mode 100644 index 0000000..e9424fd Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/llama_body/pink.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/llama_body/purple.png b/nonpacks/static/vanilla/entity/equipment/llama_body/purple.png new file mode 100644 index 0000000..9733d8a Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/llama_body/purple.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/llama_body/red.png b/nonpacks/static/vanilla/entity/equipment/llama_body/red.png new file mode 100644 index 0000000..41111bd Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/llama_body/red.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/llama_body/trader_llama.png b/nonpacks/static/vanilla/entity/equipment/llama_body/trader_llama.png new file mode 100644 index 0000000..eeff45e Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/llama_body/trader_llama.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/llama_body/white.png b/nonpacks/static/vanilla/entity/equipment/llama_body/white.png new file mode 100644 index 0000000..2a91e67 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/llama_body/white.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/llama_body/yellow.png b/nonpacks/static/vanilla/entity/equipment/llama_body/yellow.png new file mode 100644 index 0000000..afcf071 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/llama_body/yellow.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/mule_saddle/saddle.png b/nonpacks/static/vanilla/entity/equipment/mule_saddle/saddle.png new file mode 100644 index 0000000..ad5809e Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/mule_saddle/saddle.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/nautilus_body/copper.png b/nonpacks/static/vanilla/entity/equipment/nautilus_body/copper.png new file mode 100644 index 0000000..8af2064 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/nautilus_body/copper.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/nautilus_body/diamond.png b/nonpacks/static/vanilla/entity/equipment/nautilus_body/diamond.png new file mode 100644 index 0000000..1598a3b Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/nautilus_body/diamond.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/nautilus_body/gold.png b/nonpacks/static/vanilla/entity/equipment/nautilus_body/gold.png new file mode 100644 index 0000000..e0d0438 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/nautilus_body/gold.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/nautilus_body/iron.png b/nonpacks/static/vanilla/entity/equipment/nautilus_body/iron.png new file mode 100644 index 0000000..66789cc Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/nautilus_body/iron.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/nautilus_body/netherite.png b/nonpacks/static/vanilla/entity/equipment/nautilus_body/netherite.png new file mode 100644 index 0000000..1724b92 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/nautilus_body/netherite.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/nautilus_saddle/saddle.png b/nonpacks/static/vanilla/entity/equipment/nautilus_saddle/saddle.png new file mode 100644 index 0000000..56b85cb Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/nautilus_saddle/saddle.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/pig_saddle/saddle.png b/nonpacks/static/vanilla/entity/equipment/pig_saddle/saddle.png new file mode 100644 index 0000000..c3f24ec Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/pig_saddle/saddle.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/skeleton_horse_saddle/saddle.png b/nonpacks/static/vanilla/entity/equipment/skeleton_horse_saddle/saddle.png new file mode 100644 index 0000000..ad5809e Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/skeleton_horse_saddle/saddle.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/strider_saddle/saddle.png b/nonpacks/static/vanilla/entity/equipment/strider_saddle/saddle.png new file mode 100644 index 0000000..55bd253 Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/strider_saddle/saddle.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/wings/elytra.png b/nonpacks/static/vanilla/entity/equipment/wings/elytra.png new file mode 100644 index 0000000..9fcb14d Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/wings/elytra.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/wolf_body/armadillo_scute.png b/nonpacks/static/vanilla/entity/equipment/wolf_body/armadillo_scute.png new file mode 100644 index 0000000..7c02e5d Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/wolf_body/armadillo_scute.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/wolf_body/armadillo_scute_overlay.png b/nonpacks/static/vanilla/entity/equipment/wolf_body/armadillo_scute_overlay.png new file mode 100644 index 0000000..83955fa Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/wolf_body/armadillo_scute_overlay.png differ diff --git a/nonpacks/static/vanilla/entity/equipment/zombie_horse_saddle/saddle.png b/nonpacks/static/vanilla/entity/equipment/zombie_horse_saddle/saddle.png new file mode 100644 index 0000000..ad5809e Binary files /dev/null and b/nonpacks/static/vanilla/entity/equipment/zombie_horse_saddle/saddle.png differ diff --git a/nonpacks/static/vanilla/entity/experience_orb.png b/nonpacks/static/vanilla/entity/experience_orb.png new file mode 100644 index 0000000..6dc65a0 Binary files /dev/null and b/nonpacks/static/vanilla/entity/experience_orb.png differ diff --git a/nonpacks/static/vanilla/entity/fish/cod.png b/nonpacks/static/vanilla/entity/fish/cod.png new file mode 100644 index 0000000..0d6cad8 Binary files /dev/null and b/nonpacks/static/vanilla/entity/fish/cod.png differ diff --git a/nonpacks/static/vanilla/entity/fish/pufferfish.png b/nonpacks/static/vanilla/entity/fish/pufferfish.png new file mode 100644 index 0000000..6eb30ce Binary files /dev/null and b/nonpacks/static/vanilla/entity/fish/pufferfish.png differ diff --git a/nonpacks/static/vanilla/entity/fish/salmon.png b/nonpacks/static/vanilla/entity/fish/salmon.png new file mode 100644 index 0000000..fec4afa Binary files /dev/null and b/nonpacks/static/vanilla/entity/fish/salmon.png differ diff --git a/nonpacks/static/vanilla/entity/fish/tropical_a.png b/nonpacks/static/vanilla/entity/fish/tropical_a.png new file mode 100644 index 0000000..f10464c Binary files /dev/null and b/nonpacks/static/vanilla/entity/fish/tropical_a.png differ diff --git a/nonpacks/static/vanilla/entity/fish/tropical_a_pattern_1.png b/nonpacks/static/vanilla/entity/fish/tropical_a_pattern_1.png new file mode 100644 index 0000000..8fef9b1 Binary files /dev/null and b/nonpacks/static/vanilla/entity/fish/tropical_a_pattern_1.png differ diff --git a/nonpacks/static/vanilla/entity/fish/tropical_a_pattern_2.png b/nonpacks/static/vanilla/entity/fish/tropical_a_pattern_2.png new file mode 100644 index 0000000..c0a4556 Binary files /dev/null and b/nonpacks/static/vanilla/entity/fish/tropical_a_pattern_2.png differ diff --git a/nonpacks/static/vanilla/entity/fish/tropical_a_pattern_3.png b/nonpacks/static/vanilla/entity/fish/tropical_a_pattern_3.png new file mode 100644 index 0000000..54c8b69 Binary files /dev/null and b/nonpacks/static/vanilla/entity/fish/tropical_a_pattern_3.png differ diff --git a/nonpacks/static/vanilla/entity/fish/tropical_a_pattern_4.png b/nonpacks/static/vanilla/entity/fish/tropical_a_pattern_4.png new file mode 100644 index 0000000..8395d49 Binary files /dev/null and b/nonpacks/static/vanilla/entity/fish/tropical_a_pattern_4.png differ diff --git a/nonpacks/static/vanilla/entity/fish/tropical_a_pattern_5.png b/nonpacks/static/vanilla/entity/fish/tropical_a_pattern_5.png new file mode 100644 index 0000000..87ba0bd Binary files /dev/null and b/nonpacks/static/vanilla/entity/fish/tropical_a_pattern_5.png differ diff --git a/nonpacks/static/vanilla/entity/fish/tropical_a_pattern_6.png b/nonpacks/static/vanilla/entity/fish/tropical_a_pattern_6.png new file mode 100644 index 0000000..771e1c0 Binary files /dev/null and b/nonpacks/static/vanilla/entity/fish/tropical_a_pattern_6.png differ diff --git a/nonpacks/static/vanilla/entity/fish/tropical_b.png b/nonpacks/static/vanilla/entity/fish/tropical_b.png new file mode 100644 index 0000000..705c31a Binary files /dev/null and b/nonpacks/static/vanilla/entity/fish/tropical_b.png differ diff --git a/nonpacks/static/vanilla/entity/fish/tropical_b_pattern_1.png b/nonpacks/static/vanilla/entity/fish/tropical_b_pattern_1.png new file mode 100644 index 0000000..b18aa32 Binary files /dev/null and b/nonpacks/static/vanilla/entity/fish/tropical_b_pattern_1.png differ diff --git a/nonpacks/static/vanilla/entity/fish/tropical_b_pattern_2.png b/nonpacks/static/vanilla/entity/fish/tropical_b_pattern_2.png new file mode 100644 index 0000000..adbd23a Binary files /dev/null and b/nonpacks/static/vanilla/entity/fish/tropical_b_pattern_2.png differ diff --git a/nonpacks/static/vanilla/entity/fish/tropical_b_pattern_3.png b/nonpacks/static/vanilla/entity/fish/tropical_b_pattern_3.png new file mode 100644 index 0000000..75fa20b Binary files /dev/null and b/nonpacks/static/vanilla/entity/fish/tropical_b_pattern_3.png differ diff --git a/nonpacks/static/vanilla/entity/fish/tropical_b_pattern_4.png b/nonpacks/static/vanilla/entity/fish/tropical_b_pattern_4.png new file mode 100644 index 0000000..c2ec1d0 Binary files /dev/null and b/nonpacks/static/vanilla/entity/fish/tropical_b_pattern_4.png differ diff --git a/nonpacks/static/vanilla/entity/fish/tropical_b_pattern_5.png b/nonpacks/static/vanilla/entity/fish/tropical_b_pattern_5.png new file mode 100644 index 0000000..45a8699 Binary files /dev/null and b/nonpacks/static/vanilla/entity/fish/tropical_b_pattern_5.png differ diff --git a/nonpacks/static/vanilla/entity/fish/tropical_b_pattern_6.png b/nonpacks/static/vanilla/entity/fish/tropical_b_pattern_6.png new file mode 100644 index 0000000..7be3fb4 Binary files /dev/null and b/nonpacks/static/vanilla/entity/fish/tropical_b_pattern_6.png differ diff --git a/nonpacks/static/vanilla/entity/fishing_hook.png b/nonpacks/static/vanilla/entity/fishing_hook.png new file mode 100644 index 0000000..e92d4d2 Binary files /dev/null and b/nonpacks/static/vanilla/entity/fishing_hook.png differ diff --git a/nonpacks/static/vanilla/entity/fox/fox.png b/nonpacks/static/vanilla/entity/fox/fox.png new file mode 100644 index 0000000..fde0753 Binary files /dev/null and b/nonpacks/static/vanilla/entity/fox/fox.png differ diff --git a/nonpacks/static/vanilla/entity/fox/fox_sleep.png b/nonpacks/static/vanilla/entity/fox/fox_sleep.png new file mode 100644 index 0000000..3095cb3 Binary files /dev/null and b/nonpacks/static/vanilla/entity/fox/fox_sleep.png differ diff --git a/nonpacks/static/vanilla/entity/fox/snow_fox.png b/nonpacks/static/vanilla/entity/fox/snow_fox.png new file mode 100644 index 0000000..c0bb67c Binary files /dev/null and b/nonpacks/static/vanilla/entity/fox/snow_fox.png differ diff --git a/nonpacks/static/vanilla/entity/fox/snow_fox_sleep.png b/nonpacks/static/vanilla/entity/fox/snow_fox_sleep.png new file mode 100644 index 0000000..45de007 Binary files /dev/null and b/nonpacks/static/vanilla/entity/fox/snow_fox_sleep.png differ diff --git a/nonpacks/static/vanilla/entity/frog/cold_frog.png b/nonpacks/static/vanilla/entity/frog/cold_frog.png new file mode 100644 index 0000000..c9e64a4 Binary files /dev/null and b/nonpacks/static/vanilla/entity/frog/cold_frog.png differ diff --git a/nonpacks/static/vanilla/entity/frog/temperate_frog.png b/nonpacks/static/vanilla/entity/frog/temperate_frog.png new file mode 100644 index 0000000..afa2e9f Binary files /dev/null and b/nonpacks/static/vanilla/entity/frog/temperate_frog.png differ diff --git a/nonpacks/static/vanilla/entity/frog/warm_frog.png b/nonpacks/static/vanilla/entity/frog/warm_frog.png new file mode 100644 index 0000000..0dbfe40 Binary files /dev/null and b/nonpacks/static/vanilla/entity/frog/warm_frog.png differ diff --git a/nonpacks/static/vanilla/entity/ghast/ghast.png b/nonpacks/static/vanilla/entity/ghast/ghast.png new file mode 100644 index 0000000..bf30914 Binary files /dev/null and b/nonpacks/static/vanilla/entity/ghast/ghast.png differ diff --git a/nonpacks/static/vanilla/entity/ghast/ghast_shooting.png b/nonpacks/static/vanilla/entity/ghast/ghast_shooting.png new file mode 100644 index 0000000..fe15f0f Binary files /dev/null and b/nonpacks/static/vanilla/entity/ghast/ghast_shooting.png differ diff --git a/nonpacks/static/vanilla/entity/ghast/happy_ghast.png b/nonpacks/static/vanilla/entity/ghast/happy_ghast.png new file mode 100644 index 0000000..584f44f Binary files /dev/null and b/nonpacks/static/vanilla/entity/ghast/happy_ghast.png differ diff --git a/nonpacks/static/vanilla/entity/ghast/happy_ghast_baby.png b/nonpacks/static/vanilla/entity/ghast/happy_ghast_baby.png new file mode 100644 index 0000000..1fb5df0 Binary files /dev/null and b/nonpacks/static/vanilla/entity/ghast/happy_ghast_baby.png differ diff --git a/nonpacks/static/vanilla/entity/ghast/happy_ghast_ropes.png b/nonpacks/static/vanilla/entity/ghast/happy_ghast_ropes.png new file mode 100644 index 0000000..2a1b3a8 Binary files /dev/null and b/nonpacks/static/vanilla/entity/ghast/happy_ghast_ropes.png differ diff --git a/nonpacks/static/vanilla/entity/goat/goat.png b/nonpacks/static/vanilla/entity/goat/goat.png new file mode 100644 index 0000000..cf61e56 Binary files /dev/null and b/nonpacks/static/vanilla/entity/goat/goat.png differ diff --git a/nonpacks/static/vanilla/entity/guardian.png b/nonpacks/static/vanilla/entity/guardian.png new file mode 100644 index 0000000..12e1846 Binary files /dev/null and b/nonpacks/static/vanilla/entity/guardian.png differ diff --git a/nonpacks/static/vanilla/entity/guardian_beam.png b/nonpacks/static/vanilla/entity/guardian_beam.png new file mode 100644 index 0000000..68f0109 Binary files /dev/null and b/nonpacks/static/vanilla/entity/guardian_beam.png differ diff --git a/nonpacks/static/vanilla/entity/guardian_elder.png b/nonpacks/static/vanilla/entity/guardian_elder.png new file mode 100644 index 0000000..c8c827b Binary files /dev/null and b/nonpacks/static/vanilla/entity/guardian_elder.png differ diff --git a/nonpacks/static/vanilla/entity/hoglin/hoglin.png b/nonpacks/static/vanilla/entity/hoglin/hoglin.png new file mode 100644 index 0000000..b15215b Binary files /dev/null and b/nonpacks/static/vanilla/entity/hoglin/hoglin.png differ diff --git a/nonpacks/static/vanilla/entity/hoglin/zoglin.png b/nonpacks/static/vanilla/entity/hoglin/zoglin.png new file mode 100644 index 0000000..36505c0 Binary files /dev/null and b/nonpacks/static/vanilla/entity/hoglin/zoglin.png differ diff --git a/nonpacks/static/vanilla/entity/horse/donkey.png b/nonpacks/static/vanilla/entity/horse/donkey.png new file mode 100644 index 0000000..f075d3e Binary files /dev/null and b/nonpacks/static/vanilla/entity/horse/donkey.png differ diff --git a/nonpacks/static/vanilla/entity/horse/horse_black.png b/nonpacks/static/vanilla/entity/horse/horse_black.png new file mode 100644 index 0000000..e2a7d6c Binary files /dev/null and b/nonpacks/static/vanilla/entity/horse/horse_black.png differ diff --git a/nonpacks/static/vanilla/entity/horse/horse_brown.png b/nonpacks/static/vanilla/entity/horse/horse_brown.png new file mode 100644 index 0000000..57187d6 Binary files /dev/null and b/nonpacks/static/vanilla/entity/horse/horse_brown.png differ diff --git a/nonpacks/static/vanilla/entity/horse/horse_chestnut.png b/nonpacks/static/vanilla/entity/horse/horse_chestnut.png new file mode 100644 index 0000000..c149e77 Binary files /dev/null and b/nonpacks/static/vanilla/entity/horse/horse_chestnut.png differ diff --git a/nonpacks/static/vanilla/entity/horse/horse_creamy.png b/nonpacks/static/vanilla/entity/horse/horse_creamy.png new file mode 100644 index 0000000..4d56034 Binary files /dev/null and b/nonpacks/static/vanilla/entity/horse/horse_creamy.png differ diff --git a/nonpacks/static/vanilla/entity/horse/horse_darkbrown.png b/nonpacks/static/vanilla/entity/horse/horse_darkbrown.png new file mode 100644 index 0000000..1e143cc Binary files /dev/null and b/nonpacks/static/vanilla/entity/horse/horse_darkbrown.png differ diff --git a/nonpacks/static/vanilla/entity/horse/horse_gray.png b/nonpacks/static/vanilla/entity/horse/horse_gray.png new file mode 100644 index 0000000..3dd9cd6 Binary files /dev/null and b/nonpacks/static/vanilla/entity/horse/horse_gray.png differ diff --git a/nonpacks/static/vanilla/entity/horse/horse_markings_blackdots.png b/nonpacks/static/vanilla/entity/horse/horse_markings_blackdots.png new file mode 100644 index 0000000..4749428 Binary files /dev/null and b/nonpacks/static/vanilla/entity/horse/horse_markings_blackdots.png differ diff --git a/nonpacks/static/vanilla/entity/horse/horse_markings_white.png b/nonpacks/static/vanilla/entity/horse/horse_markings_white.png new file mode 100644 index 0000000..4646ce7 Binary files /dev/null and b/nonpacks/static/vanilla/entity/horse/horse_markings_white.png differ diff --git a/nonpacks/static/vanilla/entity/horse/horse_markings_whitedots.png b/nonpacks/static/vanilla/entity/horse/horse_markings_whitedots.png new file mode 100644 index 0000000..c2cc7db Binary files /dev/null and b/nonpacks/static/vanilla/entity/horse/horse_markings_whitedots.png differ diff --git a/nonpacks/static/vanilla/entity/horse/horse_markings_whitefield.png b/nonpacks/static/vanilla/entity/horse/horse_markings_whitefield.png new file mode 100644 index 0000000..569e63b Binary files /dev/null and b/nonpacks/static/vanilla/entity/horse/horse_markings_whitefield.png differ diff --git a/nonpacks/static/vanilla/entity/horse/horse_skeleton.png b/nonpacks/static/vanilla/entity/horse/horse_skeleton.png new file mode 100644 index 0000000..b07f79c Binary files /dev/null and b/nonpacks/static/vanilla/entity/horse/horse_skeleton.png differ diff --git a/nonpacks/static/vanilla/entity/horse/horse_white.png b/nonpacks/static/vanilla/entity/horse/horse_white.png new file mode 100644 index 0000000..1804a87 Binary files /dev/null and b/nonpacks/static/vanilla/entity/horse/horse_white.png differ diff --git a/nonpacks/static/vanilla/entity/horse/horse_zombie.png b/nonpacks/static/vanilla/entity/horse/horse_zombie.png new file mode 100644 index 0000000..1280717 Binary files /dev/null and b/nonpacks/static/vanilla/entity/horse/horse_zombie.png differ diff --git a/nonpacks/static/vanilla/entity/horse/mule.png b/nonpacks/static/vanilla/entity/horse/mule.png new file mode 100644 index 0000000..d9c9653 Binary files /dev/null and b/nonpacks/static/vanilla/entity/horse/mule.png differ diff --git a/nonpacks/static/vanilla/entity/illager/evoker.png b/nonpacks/static/vanilla/entity/illager/evoker.png new file mode 100644 index 0000000..670bff9 Binary files /dev/null and b/nonpacks/static/vanilla/entity/illager/evoker.png differ diff --git a/nonpacks/static/vanilla/entity/illager/evoker_fangs.png b/nonpacks/static/vanilla/entity/illager/evoker_fangs.png new file mode 100644 index 0000000..2ec615f Binary files /dev/null and b/nonpacks/static/vanilla/entity/illager/evoker_fangs.png differ diff --git a/nonpacks/static/vanilla/entity/illager/illusioner.png b/nonpacks/static/vanilla/entity/illager/illusioner.png new file mode 100644 index 0000000..0f34f3e Binary files /dev/null and b/nonpacks/static/vanilla/entity/illager/illusioner.png differ diff --git a/nonpacks/static/vanilla/entity/illager/pillager.png b/nonpacks/static/vanilla/entity/illager/pillager.png new file mode 100644 index 0000000..626660d Binary files /dev/null and b/nonpacks/static/vanilla/entity/illager/pillager.png differ diff --git a/nonpacks/static/vanilla/entity/illager/ravager.png b/nonpacks/static/vanilla/entity/illager/ravager.png new file mode 100644 index 0000000..31a80bf Binary files /dev/null and b/nonpacks/static/vanilla/entity/illager/ravager.png differ diff --git a/nonpacks/static/vanilla/entity/illager/vex.png b/nonpacks/static/vanilla/entity/illager/vex.png new file mode 100644 index 0000000..fa42cd6 Binary files /dev/null and b/nonpacks/static/vanilla/entity/illager/vex.png differ diff --git a/nonpacks/static/vanilla/entity/illager/vex_charging.png b/nonpacks/static/vanilla/entity/illager/vex_charging.png new file mode 100644 index 0000000..37d59b8 Binary files /dev/null and b/nonpacks/static/vanilla/entity/illager/vex_charging.png differ diff --git a/nonpacks/static/vanilla/entity/illager/vindicator.png b/nonpacks/static/vanilla/entity/illager/vindicator.png new file mode 100644 index 0000000..0279788 Binary files /dev/null and b/nonpacks/static/vanilla/entity/illager/vindicator.png differ diff --git a/nonpacks/static/vanilla/entity/iron_golem/iron_golem.png b/nonpacks/static/vanilla/entity/iron_golem/iron_golem.png new file mode 100644 index 0000000..5258313 Binary files /dev/null and b/nonpacks/static/vanilla/entity/iron_golem/iron_golem.png differ diff --git a/nonpacks/static/vanilla/entity/iron_golem/iron_golem_crackiness_high.png b/nonpacks/static/vanilla/entity/iron_golem/iron_golem_crackiness_high.png new file mode 100644 index 0000000..665396f Binary files /dev/null and b/nonpacks/static/vanilla/entity/iron_golem/iron_golem_crackiness_high.png differ diff --git a/nonpacks/static/vanilla/entity/iron_golem/iron_golem_crackiness_low.png b/nonpacks/static/vanilla/entity/iron_golem/iron_golem_crackiness_low.png new file mode 100644 index 0000000..8c1f344 Binary files /dev/null and b/nonpacks/static/vanilla/entity/iron_golem/iron_golem_crackiness_low.png differ diff --git a/nonpacks/static/vanilla/entity/iron_golem/iron_golem_crackiness_medium.png b/nonpacks/static/vanilla/entity/iron_golem/iron_golem_crackiness_medium.png new file mode 100644 index 0000000..20a0200 Binary files /dev/null and b/nonpacks/static/vanilla/entity/iron_golem/iron_golem_crackiness_medium.png differ diff --git a/nonpacks/static/vanilla/entity/lead_knot.png b/nonpacks/static/vanilla/entity/lead_knot.png new file mode 100644 index 0000000..0466326 Binary files /dev/null and b/nonpacks/static/vanilla/entity/lead_knot.png differ diff --git a/nonpacks/static/vanilla/entity/llama/brown.png b/nonpacks/static/vanilla/entity/llama/brown.png new file mode 100644 index 0000000..bdcf4f4 Binary files /dev/null and b/nonpacks/static/vanilla/entity/llama/brown.png differ diff --git a/nonpacks/static/vanilla/entity/llama/creamy.png b/nonpacks/static/vanilla/entity/llama/creamy.png new file mode 100644 index 0000000..1aa6f43 Binary files /dev/null and b/nonpacks/static/vanilla/entity/llama/creamy.png differ diff --git a/nonpacks/static/vanilla/entity/llama/gray.png b/nonpacks/static/vanilla/entity/llama/gray.png new file mode 100644 index 0000000..8f1ed22 Binary files /dev/null and b/nonpacks/static/vanilla/entity/llama/gray.png differ diff --git a/nonpacks/static/vanilla/entity/llama/spit.png b/nonpacks/static/vanilla/entity/llama/spit.png new file mode 100644 index 0000000..4b6fb82 Binary files /dev/null and b/nonpacks/static/vanilla/entity/llama/spit.png differ diff --git a/nonpacks/static/vanilla/entity/llama/white.png b/nonpacks/static/vanilla/entity/llama/white.png new file mode 100644 index 0000000..623c77b Binary files /dev/null and b/nonpacks/static/vanilla/entity/llama/white.png differ diff --git a/nonpacks/static/vanilla/entity/minecart.png b/nonpacks/static/vanilla/entity/minecart.png new file mode 100644 index 0000000..9efe6a9 Binary files /dev/null and b/nonpacks/static/vanilla/entity/minecart.png differ diff --git a/nonpacks/static/vanilla/entity/nautilus/nautilus.png b/nonpacks/static/vanilla/entity/nautilus/nautilus.png new file mode 100644 index 0000000..da97867 Binary files /dev/null and b/nonpacks/static/vanilla/entity/nautilus/nautilus.png differ diff --git a/nonpacks/static/vanilla/entity/nautilus/nautilus_baby.png b/nonpacks/static/vanilla/entity/nautilus/nautilus_baby.png new file mode 100644 index 0000000..3708e09 Binary files /dev/null and b/nonpacks/static/vanilla/entity/nautilus/nautilus_baby.png differ diff --git a/nonpacks/static/vanilla/entity/nautilus/zombie_nautilus.png b/nonpacks/static/vanilla/entity/nautilus/zombie_nautilus.png new file mode 100644 index 0000000..6536072 Binary files /dev/null and b/nonpacks/static/vanilla/entity/nautilus/zombie_nautilus.png differ diff --git a/nonpacks/static/vanilla/entity/nautilus/zombie_nautilus_coral.png b/nonpacks/static/vanilla/entity/nautilus/zombie_nautilus_coral.png new file mode 100644 index 0000000..2bc58a6 Binary files /dev/null and b/nonpacks/static/vanilla/entity/nautilus/zombie_nautilus_coral.png differ diff --git a/nonpacks/static/vanilla/entity/panda/aggressive_panda.png b/nonpacks/static/vanilla/entity/panda/aggressive_panda.png new file mode 100644 index 0000000..56ab835 Binary files /dev/null and b/nonpacks/static/vanilla/entity/panda/aggressive_panda.png differ diff --git a/nonpacks/static/vanilla/entity/panda/brown_panda.png b/nonpacks/static/vanilla/entity/panda/brown_panda.png new file mode 100644 index 0000000..6c8aeb2 Binary files /dev/null and b/nonpacks/static/vanilla/entity/panda/brown_panda.png differ diff --git a/nonpacks/static/vanilla/entity/panda/lazy_panda.png b/nonpacks/static/vanilla/entity/panda/lazy_panda.png new file mode 100644 index 0000000..d425854 Binary files /dev/null and b/nonpacks/static/vanilla/entity/panda/lazy_panda.png differ diff --git a/nonpacks/static/vanilla/entity/panda/panda.png b/nonpacks/static/vanilla/entity/panda/panda.png new file mode 100644 index 0000000..ffb70bb Binary files /dev/null and b/nonpacks/static/vanilla/entity/panda/panda.png differ diff --git a/nonpacks/static/vanilla/entity/panda/playful_panda.png b/nonpacks/static/vanilla/entity/panda/playful_panda.png new file mode 100644 index 0000000..67fab0d Binary files /dev/null and b/nonpacks/static/vanilla/entity/panda/playful_panda.png differ diff --git a/nonpacks/static/vanilla/entity/panda/weak_panda.png b/nonpacks/static/vanilla/entity/panda/weak_panda.png new file mode 100644 index 0000000..f8b1b3c Binary files /dev/null and b/nonpacks/static/vanilla/entity/panda/weak_panda.png differ diff --git a/nonpacks/static/vanilla/entity/panda/worried_panda.png b/nonpacks/static/vanilla/entity/panda/worried_panda.png new file mode 100644 index 0000000..276dd9f Binary files /dev/null and b/nonpacks/static/vanilla/entity/panda/worried_panda.png differ diff --git a/nonpacks/static/vanilla/entity/parrot/parrot_blue.png b/nonpacks/static/vanilla/entity/parrot/parrot_blue.png new file mode 100644 index 0000000..0d50974 Binary files /dev/null and b/nonpacks/static/vanilla/entity/parrot/parrot_blue.png differ diff --git a/nonpacks/static/vanilla/entity/parrot/parrot_green.png b/nonpacks/static/vanilla/entity/parrot/parrot_green.png new file mode 100644 index 0000000..a2af05f Binary files /dev/null and b/nonpacks/static/vanilla/entity/parrot/parrot_green.png differ diff --git a/nonpacks/static/vanilla/entity/parrot/parrot_grey.png b/nonpacks/static/vanilla/entity/parrot/parrot_grey.png new file mode 100644 index 0000000..a8845fe Binary files /dev/null and b/nonpacks/static/vanilla/entity/parrot/parrot_grey.png differ diff --git a/nonpacks/static/vanilla/entity/parrot/parrot_red_blue.png b/nonpacks/static/vanilla/entity/parrot/parrot_red_blue.png new file mode 100644 index 0000000..1f5c28f Binary files /dev/null and b/nonpacks/static/vanilla/entity/parrot/parrot_red_blue.png differ diff --git a/nonpacks/static/vanilla/entity/parrot/parrot_yellow_blue.png b/nonpacks/static/vanilla/entity/parrot/parrot_yellow_blue.png new file mode 100644 index 0000000..ae1594a Binary files /dev/null and b/nonpacks/static/vanilla/entity/parrot/parrot_yellow_blue.png differ diff --git a/nonpacks/static/vanilla/entity/phantom.png b/nonpacks/static/vanilla/entity/phantom.png new file mode 100644 index 0000000..bacac6e Binary files /dev/null and b/nonpacks/static/vanilla/entity/phantom.png differ diff --git a/nonpacks/static/vanilla/entity/phantom_eyes.png b/nonpacks/static/vanilla/entity/phantom_eyes.png new file mode 100644 index 0000000..4fa35bd Binary files /dev/null and b/nonpacks/static/vanilla/entity/phantom_eyes.png differ diff --git a/nonpacks/static/vanilla/entity/pig/cold_pig.png b/nonpacks/static/vanilla/entity/pig/cold_pig.png new file mode 100644 index 0000000..ba79c8e Binary files /dev/null and b/nonpacks/static/vanilla/entity/pig/cold_pig.png differ diff --git a/nonpacks/static/vanilla/entity/pig/temperate_pig.png b/nonpacks/static/vanilla/entity/pig/temperate_pig.png new file mode 100644 index 0000000..63b78f9 Binary files /dev/null and b/nonpacks/static/vanilla/entity/pig/temperate_pig.png differ diff --git a/nonpacks/static/vanilla/entity/pig/warm_pig.png b/nonpacks/static/vanilla/entity/pig/warm_pig.png new file mode 100644 index 0000000..7cc2d87 Binary files /dev/null and b/nonpacks/static/vanilla/entity/pig/warm_pig.png differ diff --git a/nonpacks/static/vanilla/entity/piglin/piglin.png b/nonpacks/static/vanilla/entity/piglin/piglin.png new file mode 100644 index 0000000..4baacca Binary files /dev/null and b/nonpacks/static/vanilla/entity/piglin/piglin.png differ diff --git a/nonpacks/static/vanilla/entity/piglin/piglin_brute.png b/nonpacks/static/vanilla/entity/piglin/piglin_brute.png new file mode 100644 index 0000000..e31fdc9 Binary files /dev/null and b/nonpacks/static/vanilla/entity/piglin/piglin_brute.png differ diff --git a/nonpacks/static/vanilla/entity/piglin/zombified_piglin.png b/nonpacks/static/vanilla/entity/piglin/zombified_piglin.png new file mode 100644 index 0000000..781098e Binary files /dev/null and b/nonpacks/static/vanilla/entity/piglin/zombified_piglin.png differ diff --git a/nonpacks/static/vanilla/entity/player/slim/alex.png b/nonpacks/static/vanilla/entity/player/slim/alex.png new file mode 100644 index 0000000..99af193 Binary files /dev/null and b/nonpacks/static/vanilla/entity/player/slim/alex.png differ diff --git a/nonpacks/static/vanilla/entity/player/slim/ari.png b/nonpacks/static/vanilla/entity/player/slim/ari.png new file mode 100644 index 0000000..370292a Binary files /dev/null and b/nonpacks/static/vanilla/entity/player/slim/ari.png differ diff --git a/nonpacks/static/vanilla/entity/player/slim/efe.png b/nonpacks/static/vanilla/entity/player/slim/efe.png new file mode 100644 index 0000000..3370b1f Binary files /dev/null and b/nonpacks/static/vanilla/entity/player/slim/efe.png differ diff --git a/nonpacks/static/vanilla/entity/player/slim/kai.png b/nonpacks/static/vanilla/entity/player/slim/kai.png new file mode 100644 index 0000000..ed10785 Binary files /dev/null and b/nonpacks/static/vanilla/entity/player/slim/kai.png differ diff --git a/nonpacks/static/vanilla/entity/player/slim/makena.png b/nonpacks/static/vanilla/entity/player/slim/makena.png new file mode 100644 index 0000000..ad8cace Binary files /dev/null and b/nonpacks/static/vanilla/entity/player/slim/makena.png differ diff --git a/nonpacks/static/vanilla/entity/player/slim/noor.png b/nonpacks/static/vanilla/entity/player/slim/noor.png new file mode 100644 index 0000000..a471226 Binary files /dev/null and b/nonpacks/static/vanilla/entity/player/slim/noor.png differ diff --git a/nonpacks/static/vanilla/entity/player/slim/steve.png b/nonpacks/static/vanilla/entity/player/slim/steve.png new file mode 100644 index 0000000..b00ef05 Binary files /dev/null and b/nonpacks/static/vanilla/entity/player/slim/steve.png differ diff --git a/nonpacks/static/vanilla/entity/player/slim/sunny.png b/nonpacks/static/vanilla/entity/player/slim/sunny.png new file mode 100644 index 0000000..0c1f9c4 Binary files /dev/null and b/nonpacks/static/vanilla/entity/player/slim/sunny.png differ diff --git a/nonpacks/static/vanilla/entity/player/slim/zuri.png b/nonpacks/static/vanilla/entity/player/slim/zuri.png new file mode 100644 index 0000000..98386c1 Binary files /dev/null and b/nonpacks/static/vanilla/entity/player/slim/zuri.png differ diff --git a/nonpacks/static/vanilla/entity/player/wide/alex.png b/nonpacks/static/vanilla/entity/player/wide/alex.png new file mode 100644 index 0000000..f9973fd Binary files /dev/null and b/nonpacks/static/vanilla/entity/player/wide/alex.png differ diff --git a/nonpacks/static/vanilla/entity/player/wide/ari.png b/nonpacks/static/vanilla/entity/player/wide/ari.png new file mode 100644 index 0000000..150212b Binary files /dev/null and b/nonpacks/static/vanilla/entity/player/wide/ari.png differ diff --git a/nonpacks/static/vanilla/entity/player/wide/efe.png b/nonpacks/static/vanilla/entity/player/wide/efe.png new file mode 100644 index 0000000..7a9d147 Binary files /dev/null and b/nonpacks/static/vanilla/entity/player/wide/efe.png differ diff --git a/nonpacks/static/vanilla/entity/player/wide/kai.png b/nonpacks/static/vanilla/entity/player/wide/kai.png new file mode 100644 index 0000000..c7df76d Binary files /dev/null and b/nonpacks/static/vanilla/entity/player/wide/kai.png differ diff --git a/nonpacks/static/vanilla/entity/player/wide/makena.png b/nonpacks/static/vanilla/entity/player/wide/makena.png new file mode 100644 index 0000000..d505622 Binary files /dev/null and b/nonpacks/static/vanilla/entity/player/wide/makena.png differ diff --git a/nonpacks/static/vanilla/entity/player/wide/noor.png b/nonpacks/static/vanilla/entity/player/wide/noor.png new file mode 100644 index 0000000..32e9d63 Binary files /dev/null and b/nonpacks/static/vanilla/entity/player/wide/noor.png differ diff --git a/nonpacks/static/vanilla/entity/player/wide/steve.png b/nonpacks/static/vanilla/entity/player/wide/steve.png new file mode 100644 index 0000000..1607786 Binary files /dev/null and b/nonpacks/static/vanilla/entity/player/wide/steve.png differ diff --git a/nonpacks/static/vanilla/entity/player/wide/sunny.png b/nonpacks/static/vanilla/entity/player/wide/sunny.png new file mode 100644 index 0000000..3eea963 Binary files /dev/null and b/nonpacks/static/vanilla/entity/player/wide/sunny.png differ diff --git a/nonpacks/static/vanilla/entity/player/wide/zuri.png b/nonpacks/static/vanilla/entity/player/wide/zuri.png new file mode 100644 index 0000000..3c99058 Binary files /dev/null and b/nonpacks/static/vanilla/entity/player/wide/zuri.png differ diff --git a/nonpacks/static/vanilla/entity/projectiles/arrow.png b/nonpacks/static/vanilla/entity/projectiles/arrow.png new file mode 100644 index 0000000..913766a Binary files /dev/null and b/nonpacks/static/vanilla/entity/projectiles/arrow.png differ diff --git a/nonpacks/static/vanilla/entity/projectiles/spectral_arrow.png b/nonpacks/static/vanilla/entity/projectiles/spectral_arrow.png new file mode 100644 index 0000000..28e9c24 Binary files /dev/null and b/nonpacks/static/vanilla/entity/projectiles/spectral_arrow.png differ diff --git a/nonpacks/static/vanilla/entity/projectiles/tipped_arrow.png b/nonpacks/static/vanilla/entity/projectiles/tipped_arrow.png new file mode 100644 index 0000000..913766a Binary files /dev/null and b/nonpacks/static/vanilla/entity/projectiles/tipped_arrow.png differ diff --git a/nonpacks/static/vanilla/entity/projectiles/wind_charge.png b/nonpacks/static/vanilla/entity/projectiles/wind_charge.png new file mode 100644 index 0000000..5b4d0e3 Binary files /dev/null and b/nonpacks/static/vanilla/entity/projectiles/wind_charge.png differ diff --git a/nonpacks/static/vanilla/entity/rabbit/black.png b/nonpacks/static/vanilla/entity/rabbit/black.png new file mode 100644 index 0000000..5e99fff Binary files /dev/null and b/nonpacks/static/vanilla/entity/rabbit/black.png differ diff --git a/nonpacks/static/vanilla/entity/rabbit/brown.png b/nonpacks/static/vanilla/entity/rabbit/brown.png new file mode 100644 index 0000000..76d8265 Binary files /dev/null and b/nonpacks/static/vanilla/entity/rabbit/brown.png differ diff --git a/nonpacks/static/vanilla/entity/rabbit/caerbannog.png b/nonpacks/static/vanilla/entity/rabbit/caerbannog.png new file mode 100644 index 0000000..e8f06fd Binary files /dev/null and b/nonpacks/static/vanilla/entity/rabbit/caerbannog.png differ diff --git a/nonpacks/static/vanilla/entity/rabbit/gold.png b/nonpacks/static/vanilla/entity/rabbit/gold.png new file mode 100644 index 0000000..68aa6e8 Binary files /dev/null and b/nonpacks/static/vanilla/entity/rabbit/gold.png differ diff --git a/nonpacks/static/vanilla/entity/rabbit/salt.png b/nonpacks/static/vanilla/entity/rabbit/salt.png new file mode 100644 index 0000000..b970489 Binary files /dev/null and b/nonpacks/static/vanilla/entity/rabbit/salt.png differ diff --git a/nonpacks/static/vanilla/entity/rabbit/toast.png b/nonpacks/static/vanilla/entity/rabbit/toast.png new file mode 100644 index 0000000..1f8cc85 Binary files /dev/null and b/nonpacks/static/vanilla/entity/rabbit/toast.png differ diff --git a/nonpacks/static/vanilla/entity/rabbit/white.png b/nonpacks/static/vanilla/entity/rabbit/white.png new file mode 100644 index 0000000..96faf53 Binary files /dev/null and b/nonpacks/static/vanilla/entity/rabbit/white.png differ diff --git a/nonpacks/static/vanilla/entity/rabbit/white_splotched.png b/nonpacks/static/vanilla/entity/rabbit/white_splotched.png new file mode 100644 index 0000000..c4d265c Binary files /dev/null and b/nonpacks/static/vanilla/entity/rabbit/white_splotched.png differ diff --git a/nonpacks/static/vanilla/entity/sheep/sheep.png b/nonpacks/static/vanilla/entity/sheep/sheep.png new file mode 100644 index 0000000..8a39fa1 Binary files /dev/null and b/nonpacks/static/vanilla/entity/sheep/sheep.png differ diff --git a/nonpacks/static/vanilla/entity/sheep/sheep_wool.png b/nonpacks/static/vanilla/entity/sheep/sheep_wool.png new file mode 100644 index 0000000..749d567 Binary files /dev/null and b/nonpacks/static/vanilla/entity/sheep/sheep_wool.png differ diff --git a/nonpacks/static/vanilla/entity/sheep/sheep_wool_undercoat.png b/nonpacks/static/vanilla/entity/sheep/sheep_wool_undercoat.png new file mode 100644 index 0000000..2c2da1c Binary files /dev/null and b/nonpacks/static/vanilla/entity/sheep/sheep_wool_undercoat.png differ diff --git a/nonpacks/static/vanilla/entity/shield/base.png b/nonpacks/static/vanilla/entity/shield/base.png new file mode 100644 index 0000000..88e2c4a Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/base.png differ diff --git a/nonpacks/static/vanilla/entity/shield/border.png b/nonpacks/static/vanilla/entity/shield/border.png new file mode 100644 index 0000000..67e338b Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/border.png differ diff --git a/nonpacks/static/vanilla/entity/shield/bricks.png b/nonpacks/static/vanilla/entity/shield/bricks.png new file mode 100644 index 0000000..c158a00 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/bricks.png differ diff --git a/nonpacks/static/vanilla/entity/shield/circle.png b/nonpacks/static/vanilla/entity/shield/circle.png new file mode 100644 index 0000000..3cd5e9a Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/circle.png differ diff --git a/nonpacks/static/vanilla/entity/shield/creeper.png b/nonpacks/static/vanilla/entity/shield/creeper.png new file mode 100644 index 0000000..99fc815 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/creeper.png differ diff --git a/nonpacks/static/vanilla/entity/shield/cross.png b/nonpacks/static/vanilla/entity/shield/cross.png new file mode 100644 index 0000000..cdb9466 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/cross.png differ diff --git a/nonpacks/static/vanilla/entity/shield/curly_border.png b/nonpacks/static/vanilla/entity/shield/curly_border.png new file mode 100644 index 0000000..21a01b0 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/curly_border.png differ diff --git a/nonpacks/static/vanilla/entity/shield/diagonal_left.png b/nonpacks/static/vanilla/entity/shield/diagonal_left.png new file mode 100644 index 0000000..21e8eff Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/diagonal_left.png differ diff --git a/nonpacks/static/vanilla/entity/shield/diagonal_right.png b/nonpacks/static/vanilla/entity/shield/diagonal_right.png new file mode 100644 index 0000000..9eed778 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/diagonal_right.png differ diff --git a/nonpacks/static/vanilla/entity/shield/diagonal_up_left.png b/nonpacks/static/vanilla/entity/shield/diagonal_up_left.png new file mode 100644 index 0000000..9b42a2a Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/diagonal_up_left.png differ diff --git a/nonpacks/static/vanilla/entity/shield/diagonal_up_right.png b/nonpacks/static/vanilla/entity/shield/diagonal_up_right.png new file mode 100644 index 0000000..d5d224b Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/diagonal_up_right.png differ diff --git a/nonpacks/static/vanilla/entity/shield/flow.png b/nonpacks/static/vanilla/entity/shield/flow.png new file mode 100644 index 0000000..a51fe81 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/flow.png differ diff --git a/nonpacks/static/vanilla/entity/shield/flower.png b/nonpacks/static/vanilla/entity/shield/flower.png new file mode 100644 index 0000000..51a8d34 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/flower.png differ diff --git a/nonpacks/static/vanilla/entity/shield/globe.png b/nonpacks/static/vanilla/entity/shield/globe.png new file mode 100644 index 0000000..eee0501 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/globe.png differ diff --git a/nonpacks/static/vanilla/entity/shield/gradient.png b/nonpacks/static/vanilla/entity/shield/gradient.png new file mode 100644 index 0000000..c269b5a Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/gradient.png differ diff --git a/nonpacks/static/vanilla/entity/shield/gradient_up.png b/nonpacks/static/vanilla/entity/shield/gradient_up.png new file mode 100644 index 0000000..7b38538 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/gradient_up.png differ diff --git a/nonpacks/static/vanilla/entity/shield/guster.png b/nonpacks/static/vanilla/entity/shield/guster.png new file mode 100644 index 0000000..68f3ef4 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/guster.png differ diff --git a/nonpacks/static/vanilla/entity/shield/half_horizontal.png b/nonpacks/static/vanilla/entity/shield/half_horizontal.png new file mode 100644 index 0000000..5fdd027 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/half_horizontal.png differ diff --git a/nonpacks/static/vanilla/entity/shield/half_horizontal_bottom.png b/nonpacks/static/vanilla/entity/shield/half_horizontal_bottom.png new file mode 100644 index 0000000..d04ed4c Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/half_horizontal_bottom.png differ diff --git a/nonpacks/static/vanilla/entity/shield/half_vertical.png b/nonpacks/static/vanilla/entity/shield/half_vertical.png new file mode 100644 index 0000000..8a0d6f3 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/half_vertical.png differ diff --git a/nonpacks/static/vanilla/entity/shield/half_vertical_right.png b/nonpacks/static/vanilla/entity/shield/half_vertical_right.png new file mode 100644 index 0000000..ec0f64d Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/half_vertical_right.png differ diff --git a/nonpacks/static/vanilla/entity/shield/mojang.png b/nonpacks/static/vanilla/entity/shield/mojang.png new file mode 100644 index 0000000..02c025f Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/mojang.png differ diff --git a/nonpacks/static/vanilla/entity/shield/piglin.png b/nonpacks/static/vanilla/entity/shield/piglin.png new file mode 100644 index 0000000..74ecd1f Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/piglin.png differ diff --git a/nonpacks/static/vanilla/entity/shield/rhombus.png b/nonpacks/static/vanilla/entity/shield/rhombus.png new file mode 100644 index 0000000..9b4f128 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/rhombus.png differ diff --git a/nonpacks/static/vanilla/entity/shield/skull.png b/nonpacks/static/vanilla/entity/shield/skull.png new file mode 100644 index 0000000..59faecf Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/skull.png differ diff --git a/nonpacks/static/vanilla/entity/shield/small_stripes.png b/nonpacks/static/vanilla/entity/shield/small_stripes.png new file mode 100644 index 0000000..c1e9685 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/small_stripes.png differ diff --git a/nonpacks/static/vanilla/entity/shield/square_bottom_left.png b/nonpacks/static/vanilla/entity/shield/square_bottom_left.png new file mode 100644 index 0000000..60dab70 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/square_bottom_left.png differ diff --git a/nonpacks/static/vanilla/entity/shield/square_bottom_right.png b/nonpacks/static/vanilla/entity/shield/square_bottom_right.png new file mode 100644 index 0000000..05d2d87 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/square_bottom_right.png differ diff --git a/nonpacks/static/vanilla/entity/shield/square_top_left.png b/nonpacks/static/vanilla/entity/shield/square_top_left.png new file mode 100644 index 0000000..577bf17 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/square_top_left.png differ diff --git a/nonpacks/static/vanilla/entity/shield/square_top_right.png b/nonpacks/static/vanilla/entity/shield/square_top_right.png new file mode 100644 index 0000000..3de2d69 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/square_top_right.png differ diff --git a/nonpacks/static/vanilla/entity/shield/straight_cross.png b/nonpacks/static/vanilla/entity/shield/straight_cross.png new file mode 100644 index 0000000..8755f07 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/straight_cross.png differ diff --git a/nonpacks/static/vanilla/entity/shield/stripe_bottom.png b/nonpacks/static/vanilla/entity/shield/stripe_bottom.png new file mode 100644 index 0000000..5821e3c Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/stripe_bottom.png differ diff --git a/nonpacks/static/vanilla/entity/shield/stripe_center.png b/nonpacks/static/vanilla/entity/shield/stripe_center.png new file mode 100644 index 0000000..c2d1b35 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/stripe_center.png differ diff --git a/nonpacks/static/vanilla/entity/shield/stripe_downleft.png b/nonpacks/static/vanilla/entity/shield/stripe_downleft.png new file mode 100644 index 0000000..6190c06 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/stripe_downleft.png differ diff --git a/nonpacks/static/vanilla/entity/shield/stripe_downright.png b/nonpacks/static/vanilla/entity/shield/stripe_downright.png new file mode 100644 index 0000000..2724735 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/stripe_downright.png differ diff --git a/nonpacks/static/vanilla/entity/shield/stripe_left.png b/nonpacks/static/vanilla/entity/shield/stripe_left.png new file mode 100644 index 0000000..e239faf Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/stripe_left.png differ diff --git a/nonpacks/static/vanilla/entity/shield/stripe_middle.png b/nonpacks/static/vanilla/entity/shield/stripe_middle.png new file mode 100644 index 0000000..b8e6556 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/stripe_middle.png differ diff --git a/nonpacks/static/vanilla/entity/shield/stripe_right.png b/nonpacks/static/vanilla/entity/shield/stripe_right.png new file mode 100644 index 0000000..477a103 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/stripe_right.png differ diff --git a/nonpacks/static/vanilla/entity/shield/stripe_top.png b/nonpacks/static/vanilla/entity/shield/stripe_top.png new file mode 100644 index 0000000..95312c3 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/stripe_top.png differ diff --git a/nonpacks/static/vanilla/entity/shield/triangle_bottom.png b/nonpacks/static/vanilla/entity/shield/triangle_bottom.png new file mode 100644 index 0000000..0112633 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/triangle_bottom.png differ diff --git a/nonpacks/static/vanilla/entity/shield/triangle_top.png b/nonpacks/static/vanilla/entity/shield/triangle_top.png new file mode 100644 index 0000000..9570fd4 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/triangle_top.png differ diff --git a/nonpacks/static/vanilla/entity/shield/triangles_bottom.png b/nonpacks/static/vanilla/entity/shield/triangles_bottom.png new file mode 100644 index 0000000..e3768ba Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/triangles_bottom.png differ diff --git a/nonpacks/static/vanilla/entity/shield/triangles_top.png b/nonpacks/static/vanilla/entity/shield/triangles_top.png new file mode 100644 index 0000000..f20dc53 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield/triangles_top.png differ diff --git a/nonpacks/static/vanilla/entity/shield_base.png b/nonpacks/static/vanilla/entity/shield_base.png new file mode 100644 index 0000000..45f7456 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield_base.png differ diff --git a/nonpacks/static/vanilla/entity/shield_base_nopattern.png b/nonpacks/static/vanilla/entity/shield_base_nopattern.png new file mode 100644 index 0000000..0553ecc Binary files /dev/null and b/nonpacks/static/vanilla/entity/shield_base_nopattern.png differ diff --git a/nonpacks/static/vanilla/entity/shulker/shulker.png b/nonpacks/static/vanilla/entity/shulker/shulker.png new file mode 100644 index 0000000..7abfb3a Binary files /dev/null and b/nonpacks/static/vanilla/entity/shulker/shulker.png differ diff --git a/nonpacks/static/vanilla/entity/shulker/shulker_black.png b/nonpacks/static/vanilla/entity/shulker/shulker_black.png new file mode 100644 index 0000000..916f664 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shulker/shulker_black.png differ diff --git a/nonpacks/static/vanilla/entity/shulker/shulker_blue.png b/nonpacks/static/vanilla/entity/shulker/shulker_blue.png new file mode 100644 index 0000000..c8945cb Binary files /dev/null and b/nonpacks/static/vanilla/entity/shulker/shulker_blue.png differ diff --git a/nonpacks/static/vanilla/entity/shulker/shulker_brown.png b/nonpacks/static/vanilla/entity/shulker/shulker_brown.png new file mode 100644 index 0000000..d8d9339 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shulker/shulker_brown.png differ diff --git a/nonpacks/static/vanilla/entity/shulker/shulker_cyan.png b/nonpacks/static/vanilla/entity/shulker/shulker_cyan.png new file mode 100644 index 0000000..c0d8e2c Binary files /dev/null and b/nonpacks/static/vanilla/entity/shulker/shulker_cyan.png differ diff --git a/nonpacks/static/vanilla/entity/shulker/shulker_gray.png b/nonpacks/static/vanilla/entity/shulker/shulker_gray.png new file mode 100644 index 0000000..dbb7530 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shulker/shulker_gray.png differ diff --git a/nonpacks/static/vanilla/entity/shulker/shulker_green.png b/nonpacks/static/vanilla/entity/shulker/shulker_green.png new file mode 100644 index 0000000..9e6032a Binary files /dev/null and b/nonpacks/static/vanilla/entity/shulker/shulker_green.png differ diff --git a/nonpacks/static/vanilla/entity/shulker/shulker_light_blue.png b/nonpacks/static/vanilla/entity/shulker/shulker_light_blue.png new file mode 100644 index 0000000..c6620e8 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shulker/shulker_light_blue.png differ diff --git a/nonpacks/static/vanilla/entity/shulker/shulker_light_gray.png b/nonpacks/static/vanilla/entity/shulker/shulker_light_gray.png new file mode 100644 index 0000000..7ade535 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shulker/shulker_light_gray.png differ diff --git a/nonpacks/static/vanilla/entity/shulker/shulker_lime.png b/nonpacks/static/vanilla/entity/shulker/shulker_lime.png new file mode 100644 index 0000000..3b38edc Binary files /dev/null and b/nonpacks/static/vanilla/entity/shulker/shulker_lime.png differ diff --git a/nonpacks/static/vanilla/entity/shulker/shulker_magenta.png b/nonpacks/static/vanilla/entity/shulker/shulker_magenta.png new file mode 100644 index 0000000..0988e63 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shulker/shulker_magenta.png differ diff --git a/nonpacks/static/vanilla/entity/shulker/shulker_orange.png b/nonpacks/static/vanilla/entity/shulker/shulker_orange.png new file mode 100644 index 0000000..69f4038 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shulker/shulker_orange.png differ diff --git a/nonpacks/static/vanilla/entity/shulker/shulker_pink.png b/nonpacks/static/vanilla/entity/shulker/shulker_pink.png new file mode 100644 index 0000000..c08c01c Binary files /dev/null and b/nonpacks/static/vanilla/entity/shulker/shulker_pink.png differ diff --git a/nonpacks/static/vanilla/entity/shulker/shulker_purple.png b/nonpacks/static/vanilla/entity/shulker/shulker_purple.png new file mode 100644 index 0000000..221a820 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shulker/shulker_purple.png differ diff --git a/nonpacks/static/vanilla/entity/shulker/shulker_red.png b/nonpacks/static/vanilla/entity/shulker/shulker_red.png new file mode 100644 index 0000000..622d3e5 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shulker/shulker_red.png differ diff --git a/nonpacks/static/vanilla/entity/shulker/shulker_white.png b/nonpacks/static/vanilla/entity/shulker/shulker_white.png new file mode 100644 index 0000000..03473c5 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shulker/shulker_white.png differ diff --git a/nonpacks/static/vanilla/entity/shulker/shulker_yellow.png b/nonpacks/static/vanilla/entity/shulker/shulker_yellow.png new file mode 100644 index 0000000..ecb96bb Binary files /dev/null and b/nonpacks/static/vanilla/entity/shulker/shulker_yellow.png differ diff --git a/nonpacks/static/vanilla/entity/shulker/spark.png b/nonpacks/static/vanilla/entity/shulker/spark.png new file mode 100644 index 0000000..d5d3987 Binary files /dev/null and b/nonpacks/static/vanilla/entity/shulker/spark.png differ diff --git a/nonpacks/static/vanilla/entity/signs/acacia.png b/nonpacks/static/vanilla/entity/signs/acacia.png new file mode 100644 index 0000000..e972ef2 Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/acacia.png differ diff --git a/nonpacks/static/vanilla/entity/signs/bamboo.png b/nonpacks/static/vanilla/entity/signs/bamboo.png new file mode 100644 index 0000000..87db7e5 Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/bamboo.png differ diff --git a/nonpacks/static/vanilla/entity/signs/birch.png b/nonpacks/static/vanilla/entity/signs/birch.png new file mode 100644 index 0000000..b10e07a Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/birch.png differ diff --git a/nonpacks/static/vanilla/entity/signs/cherry.png b/nonpacks/static/vanilla/entity/signs/cherry.png new file mode 100644 index 0000000..468f090 Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/cherry.png differ diff --git a/nonpacks/static/vanilla/entity/signs/crimson.png b/nonpacks/static/vanilla/entity/signs/crimson.png new file mode 100644 index 0000000..2f89ca2 Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/crimson.png differ diff --git a/nonpacks/static/vanilla/entity/signs/dark_oak.png b/nonpacks/static/vanilla/entity/signs/dark_oak.png new file mode 100644 index 0000000..cd35067 Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/dark_oak.png differ diff --git a/nonpacks/static/vanilla/entity/signs/hanging/acacia.png b/nonpacks/static/vanilla/entity/signs/hanging/acacia.png new file mode 100644 index 0000000..9e64eda Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/hanging/acacia.png differ diff --git a/nonpacks/static/vanilla/entity/signs/hanging/bamboo.png b/nonpacks/static/vanilla/entity/signs/hanging/bamboo.png new file mode 100644 index 0000000..e304f41 Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/hanging/bamboo.png differ diff --git a/nonpacks/static/vanilla/entity/signs/hanging/birch.png b/nonpacks/static/vanilla/entity/signs/hanging/birch.png new file mode 100644 index 0000000..74c1f8f Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/hanging/birch.png differ diff --git a/nonpacks/static/vanilla/entity/signs/hanging/cherry.png b/nonpacks/static/vanilla/entity/signs/hanging/cherry.png new file mode 100644 index 0000000..3db115f Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/hanging/cherry.png differ diff --git a/nonpacks/static/vanilla/entity/signs/hanging/crimson.png b/nonpacks/static/vanilla/entity/signs/hanging/crimson.png new file mode 100644 index 0000000..790bd04 Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/hanging/crimson.png differ diff --git a/nonpacks/static/vanilla/entity/signs/hanging/dark_oak.png b/nonpacks/static/vanilla/entity/signs/hanging/dark_oak.png new file mode 100644 index 0000000..d34e507 Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/hanging/dark_oak.png differ diff --git a/nonpacks/static/vanilla/entity/signs/hanging/jungle.png b/nonpacks/static/vanilla/entity/signs/hanging/jungle.png new file mode 100644 index 0000000..29251b6 Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/hanging/jungle.png differ diff --git a/nonpacks/static/vanilla/entity/signs/hanging/mangrove.png b/nonpacks/static/vanilla/entity/signs/hanging/mangrove.png new file mode 100644 index 0000000..44e5e03 Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/hanging/mangrove.png differ diff --git a/nonpacks/static/vanilla/entity/signs/hanging/oak.png b/nonpacks/static/vanilla/entity/signs/hanging/oak.png new file mode 100644 index 0000000..b7fbbb6 Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/hanging/oak.png differ diff --git a/nonpacks/static/vanilla/entity/signs/hanging/pale_oak.png b/nonpacks/static/vanilla/entity/signs/hanging/pale_oak.png new file mode 100644 index 0000000..375fa01 Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/hanging/pale_oak.png differ diff --git a/nonpacks/static/vanilla/entity/signs/hanging/spruce.png b/nonpacks/static/vanilla/entity/signs/hanging/spruce.png new file mode 100644 index 0000000..19c4d5b Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/hanging/spruce.png differ diff --git a/nonpacks/static/vanilla/entity/signs/hanging/warped.png b/nonpacks/static/vanilla/entity/signs/hanging/warped.png new file mode 100644 index 0000000..fbe9d62 Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/hanging/warped.png differ diff --git a/nonpacks/static/vanilla/entity/signs/jungle.png b/nonpacks/static/vanilla/entity/signs/jungle.png new file mode 100644 index 0000000..7cdb79e Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/jungle.png differ diff --git a/nonpacks/static/vanilla/entity/signs/mangrove.png b/nonpacks/static/vanilla/entity/signs/mangrove.png new file mode 100644 index 0000000..fc12fad Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/mangrove.png differ diff --git a/nonpacks/static/vanilla/entity/signs/oak.png b/nonpacks/static/vanilla/entity/signs/oak.png new file mode 100644 index 0000000..35afd3d Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/oak.png differ diff --git a/nonpacks/static/vanilla/entity/signs/pale_oak.png b/nonpacks/static/vanilla/entity/signs/pale_oak.png new file mode 100644 index 0000000..d584d61 Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/pale_oak.png differ diff --git a/nonpacks/static/vanilla/entity/signs/spruce.png b/nonpacks/static/vanilla/entity/signs/spruce.png new file mode 100644 index 0000000..4af12a7 Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/spruce.png differ diff --git a/nonpacks/static/vanilla/entity/signs/warped.png b/nonpacks/static/vanilla/entity/signs/warped.png new file mode 100644 index 0000000..92bd4e5 Binary files /dev/null and b/nonpacks/static/vanilla/entity/signs/warped.png differ diff --git a/nonpacks/static/vanilla/entity/silverfish.png b/nonpacks/static/vanilla/entity/silverfish.png new file mode 100644 index 0000000..7d9e98c Binary files /dev/null and b/nonpacks/static/vanilla/entity/silverfish.png differ diff --git a/nonpacks/static/vanilla/entity/skeleton/bogged.png b/nonpacks/static/vanilla/entity/skeleton/bogged.png new file mode 100644 index 0000000..9c56937 Binary files /dev/null and b/nonpacks/static/vanilla/entity/skeleton/bogged.png differ diff --git a/nonpacks/static/vanilla/entity/skeleton/bogged_overlay.png b/nonpacks/static/vanilla/entity/skeleton/bogged_overlay.png new file mode 100644 index 0000000..20c0236 Binary files /dev/null and b/nonpacks/static/vanilla/entity/skeleton/bogged_overlay.png differ diff --git a/nonpacks/static/vanilla/entity/skeleton/parched.png b/nonpacks/static/vanilla/entity/skeleton/parched.png new file mode 100644 index 0000000..7de520f Binary files /dev/null and b/nonpacks/static/vanilla/entity/skeleton/parched.png differ diff --git a/nonpacks/static/vanilla/entity/skeleton/skeleton.png b/nonpacks/static/vanilla/entity/skeleton/skeleton.png new file mode 100644 index 0000000..8399290 Binary files /dev/null and b/nonpacks/static/vanilla/entity/skeleton/skeleton.png differ diff --git a/nonpacks/static/vanilla/entity/skeleton/stray.png b/nonpacks/static/vanilla/entity/skeleton/stray.png new file mode 100644 index 0000000..4579113 Binary files /dev/null and b/nonpacks/static/vanilla/entity/skeleton/stray.png differ diff --git a/nonpacks/static/vanilla/entity/skeleton/stray_overlay.png b/nonpacks/static/vanilla/entity/skeleton/stray_overlay.png new file mode 100644 index 0000000..7c4e818 Binary files /dev/null and b/nonpacks/static/vanilla/entity/skeleton/stray_overlay.png differ diff --git a/nonpacks/static/vanilla/entity/skeleton/wither_skeleton.png b/nonpacks/static/vanilla/entity/skeleton/wither_skeleton.png new file mode 100644 index 0000000..4c5d635 Binary files /dev/null and b/nonpacks/static/vanilla/entity/skeleton/wither_skeleton.png differ diff --git a/nonpacks/static/vanilla/entity/slime/magmacube.png b/nonpacks/static/vanilla/entity/slime/magmacube.png new file mode 100644 index 0000000..2d68799 Binary files /dev/null and b/nonpacks/static/vanilla/entity/slime/magmacube.png differ diff --git a/nonpacks/static/vanilla/entity/slime/slime.png b/nonpacks/static/vanilla/entity/slime/slime.png new file mode 100644 index 0000000..082504f Binary files /dev/null and b/nonpacks/static/vanilla/entity/slime/slime.png differ diff --git a/nonpacks/static/vanilla/entity/sniffer/sniffer.png b/nonpacks/static/vanilla/entity/sniffer/sniffer.png new file mode 100644 index 0000000..7583bb6 Binary files /dev/null and b/nonpacks/static/vanilla/entity/sniffer/sniffer.png differ diff --git a/nonpacks/static/vanilla/entity/snow_golem.png b/nonpacks/static/vanilla/entity/snow_golem.png new file mode 100644 index 0000000..0ab1f65 Binary files /dev/null and b/nonpacks/static/vanilla/entity/snow_golem.png differ diff --git a/nonpacks/static/vanilla/entity/spider/cave_spider.png b/nonpacks/static/vanilla/entity/spider/cave_spider.png new file mode 100644 index 0000000..7183811 Binary files /dev/null and b/nonpacks/static/vanilla/entity/spider/cave_spider.png differ diff --git a/nonpacks/static/vanilla/entity/spider/spider.png b/nonpacks/static/vanilla/entity/spider/spider.png new file mode 100644 index 0000000..1cb6e8b Binary files /dev/null and b/nonpacks/static/vanilla/entity/spider/spider.png differ diff --git a/nonpacks/static/vanilla/entity/spider_eyes.png b/nonpacks/static/vanilla/entity/spider_eyes.png new file mode 100644 index 0000000..b1df22d Binary files /dev/null and b/nonpacks/static/vanilla/entity/spider_eyes.png differ diff --git a/nonpacks/static/vanilla/entity/squid/glow_squid.png b/nonpacks/static/vanilla/entity/squid/glow_squid.png new file mode 100644 index 0000000..d255645 Binary files /dev/null and b/nonpacks/static/vanilla/entity/squid/glow_squid.png differ diff --git a/nonpacks/static/vanilla/entity/squid/squid.png b/nonpacks/static/vanilla/entity/squid/squid.png new file mode 100644 index 0000000..0de9f3d Binary files /dev/null and b/nonpacks/static/vanilla/entity/squid/squid.png differ diff --git a/nonpacks/static/vanilla/entity/strider/strider.png b/nonpacks/static/vanilla/entity/strider/strider.png new file mode 100644 index 0000000..c755232 Binary files /dev/null and b/nonpacks/static/vanilla/entity/strider/strider.png differ diff --git a/nonpacks/static/vanilla/entity/strider/strider_cold.png b/nonpacks/static/vanilla/entity/strider/strider_cold.png new file mode 100644 index 0000000..52c5ec9 Binary files /dev/null and b/nonpacks/static/vanilla/entity/strider/strider_cold.png differ diff --git a/nonpacks/static/vanilla/entity/tadpole/tadpole.png b/nonpacks/static/vanilla/entity/tadpole/tadpole.png new file mode 100644 index 0000000..83d96ec Binary files /dev/null and b/nonpacks/static/vanilla/entity/tadpole/tadpole.png differ diff --git a/nonpacks/static/vanilla/entity/trident.png b/nonpacks/static/vanilla/entity/trident.png new file mode 100644 index 0000000..62364dd Binary files /dev/null and b/nonpacks/static/vanilla/entity/trident.png differ diff --git a/nonpacks/static/vanilla/entity/trident_riptide.png b/nonpacks/static/vanilla/entity/trident_riptide.png new file mode 100644 index 0000000..3147cbb Binary files /dev/null and b/nonpacks/static/vanilla/entity/trident_riptide.png differ diff --git a/nonpacks/static/vanilla/entity/turtle/big_sea_turtle.png b/nonpacks/static/vanilla/entity/turtle/big_sea_turtle.png new file mode 100644 index 0000000..15d1ede Binary files /dev/null and b/nonpacks/static/vanilla/entity/turtle/big_sea_turtle.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession/armorer.png b/nonpacks/static/vanilla/entity/villager/profession/armorer.png new file mode 100644 index 0000000..eaeabea Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession/armorer.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession/butcher.png b/nonpacks/static/vanilla/entity/villager/profession/butcher.png new file mode 100644 index 0000000..ff77029 Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession/butcher.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession/cartographer.png b/nonpacks/static/vanilla/entity/villager/profession/cartographer.png new file mode 100644 index 0000000..6600680 Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession/cartographer.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession/cleric.png b/nonpacks/static/vanilla/entity/villager/profession/cleric.png new file mode 100644 index 0000000..98c4d38 Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession/cleric.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession/farmer.png b/nonpacks/static/vanilla/entity/villager/profession/farmer.png new file mode 100644 index 0000000..a7f2956 Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession/farmer.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession/fisherman.png b/nonpacks/static/vanilla/entity/villager/profession/fisherman.png new file mode 100644 index 0000000..abc15fb Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession/fisherman.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession/fletcher.png b/nonpacks/static/vanilla/entity/villager/profession/fletcher.png new file mode 100644 index 0000000..bd19f90 Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession/fletcher.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession/leatherworker.png b/nonpacks/static/vanilla/entity/villager/profession/leatherworker.png new file mode 100644 index 0000000..a45b2cf Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession/leatherworker.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession/librarian.png b/nonpacks/static/vanilla/entity/villager/profession/librarian.png new file mode 100644 index 0000000..215915e Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession/librarian.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession/mason.png b/nonpacks/static/vanilla/entity/villager/profession/mason.png new file mode 100644 index 0000000..0c4201c Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession/mason.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession/nitwit.png b/nonpacks/static/vanilla/entity/villager/profession/nitwit.png new file mode 100644 index 0000000..8357d36 Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession/nitwit.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession/shepherd.png b/nonpacks/static/vanilla/entity/villager/profession/shepherd.png new file mode 100644 index 0000000..acaf313 Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession/shepherd.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession/toolsmith.png b/nonpacks/static/vanilla/entity/villager/profession/toolsmith.png new file mode 100644 index 0000000..3ad39c5 Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession/toolsmith.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession/weaponsmith.png b/nonpacks/static/vanilla/entity/villager/profession/weaponsmith.png new file mode 100644 index 0000000..0c45a28 Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession/weaponsmith.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession_level/diamond.png b/nonpacks/static/vanilla/entity/villager/profession_level/diamond.png new file mode 100644 index 0000000..7d873e5 Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession_level/diamond.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession_level/emerald.png b/nonpacks/static/vanilla/entity/villager/profession_level/emerald.png new file mode 100644 index 0000000..e77ab45 Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession_level/emerald.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession_level/gold.png b/nonpacks/static/vanilla/entity/villager/profession_level/gold.png new file mode 100644 index 0000000..1fe74ac Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession_level/gold.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession_level/iron.png b/nonpacks/static/vanilla/entity/villager/profession_level/iron.png new file mode 100644 index 0000000..94cd414 Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession_level/iron.png differ diff --git a/nonpacks/static/vanilla/entity/villager/profession_level/stone.png b/nonpacks/static/vanilla/entity/villager/profession_level/stone.png new file mode 100644 index 0000000..0daf8bb Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/profession_level/stone.png differ diff --git a/nonpacks/static/vanilla/entity/villager/type/desert.png b/nonpacks/static/vanilla/entity/villager/type/desert.png new file mode 100644 index 0000000..1636092 Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/type/desert.png differ diff --git a/nonpacks/static/vanilla/entity/villager/type/jungle.png b/nonpacks/static/vanilla/entity/villager/type/jungle.png new file mode 100644 index 0000000..862b1bb Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/type/jungle.png differ diff --git a/nonpacks/static/vanilla/entity/villager/type/plains.png b/nonpacks/static/vanilla/entity/villager/type/plains.png new file mode 100644 index 0000000..211a492 Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/type/plains.png differ diff --git a/nonpacks/static/vanilla/entity/villager/type/savanna.png b/nonpacks/static/vanilla/entity/villager/type/savanna.png new file mode 100644 index 0000000..957933d Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/type/savanna.png differ diff --git a/nonpacks/static/vanilla/entity/villager/type/snow.png b/nonpacks/static/vanilla/entity/villager/type/snow.png new file mode 100644 index 0000000..e51ae72 Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/type/snow.png differ diff --git a/nonpacks/static/vanilla/entity/villager/type/swamp.png b/nonpacks/static/vanilla/entity/villager/type/swamp.png new file mode 100644 index 0000000..430714f Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/type/swamp.png differ diff --git a/nonpacks/static/vanilla/entity/villager/type/taiga.png b/nonpacks/static/vanilla/entity/villager/type/taiga.png new file mode 100644 index 0000000..79c5bab Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/type/taiga.png differ diff --git a/nonpacks/static/vanilla/entity/villager/villager.png b/nonpacks/static/vanilla/entity/villager/villager.png new file mode 100644 index 0000000..1422c9c Binary files /dev/null and b/nonpacks/static/vanilla/entity/villager/villager.png differ diff --git a/nonpacks/static/vanilla/entity/wandering_trader.png b/nonpacks/static/vanilla/entity/wandering_trader.png new file mode 100644 index 0000000..200d218 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wandering_trader.png differ diff --git a/nonpacks/static/vanilla/entity/warden/warden.png b/nonpacks/static/vanilla/entity/warden/warden.png new file mode 100644 index 0000000..ef88c08 Binary files /dev/null and b/nonpacks/static/vanilla/entity/warden/warden.png differ diff --git a/nonpacks/static/vanilla/entity/warden/warden_bioluminescent_layer.png b/nonpacks/static/vanilla/entity/warden/warden_bioluminescent_layer.png new file mode 100644 index 0000000..9ea97a4 Binary files /dev/null and b/nonpacks/static/vanilla/entity/warden/warden_bioluminescent_layer.png differ diff --git a/nonpacks/static/vanilla/entity/warden/warden_heart.png b/nonpacks/static/vanilla/entity/warden/warden_heart.png new file mode 100644 index 0000000..892728e Binary files /dev/null and b/nonpacks/static/vanilla/entity/warden/warden_heart.png differ diff --git a/nonpacks/static/vanilla/entity/warden/warden_pulsating_spots_1.png b/nonpacks/static/vanilla/entity/warden/warden_pulsating_spots_1.png new file mode 100644 index 0000000..c782f6b Binary files /dev/null and b/nonpacks/static/vanilla/entity/warden/warden_pulsating_spots_1.png differ diff --git a/nonpacks/static/vanilla/entity/warden/warden_pulsating_spots_2.png b/nonpacks/static/vanilla/entity/warden/warden_pulsating_spots_2.png new file mode 100644 index 0000000..38008fe Binary files /dev/null and b/nonpacks/static/vanilla/entity/warden/warden_pulsating_spots_2.png differ diff --git a/nonpacks/static/vanilla/entity/witch.png b/nonpacks/static/vanilla/entity/witch.png new file mode 100644 index 0000000..ebef478 Binary files /dev/null and b/nonpacks/static/vanilla/entity/witch.png differ diff --git a/nonpacks/static/vanilla/entity/wither/wither.png b/nonpacks/static/vanilla/entity/wither/wither.png new file mode 100644 index 0000000..bc7d2a1 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wither/wither.png differ diff --git a/nonpacks/static/vanilla/entity/wither/wither_armor.png b/nonpacks/static/vanilla/entity/wither/wither_armor.png new file mode 100644 index 0000000..f8eb8ba Binary files /dev/null and b/nonpacks/static/vanilla/entity/wither/wither_armor.png differ diff --git a/nonpacks/static/vanilla/entity/wither/wither_invulnerable.png b/nonpacks/static/vanilla/entity/wither/wither_invulnerable.png new file mode 100644 index 0000000..39db354 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wither/wither_invulnerable.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf.png b/nonpacks/static/vanilla/entity/wolf/wolf.png new file mode 100644 index 0000000..dc8f979 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_angry.png b/nonpacks/static/vanilla/entity/wolf/wolf_angry.png new file mode 100644 index 0000000..e1fa8d3 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_angry.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_armor_crackiness_high.png b/nonpacks/static/vanilla/entity/wolf/wolf_armor_crackiness_high.png new file mode 100644 index 0000000..e367bf5 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_armor_crackiness_high.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_armor_crackiness_low.png b/nonpacks/static/vanilla/entity/wolf/wolf_armor_crackiness_low.png new file mode 100644 index 0000000..e0d8544 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_armor_crackiness_low.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_armor_crackiness_medium.png b/nonpacks/static/vanilla/entity/wolf/wolf_armor_crackiness_medium.png new file mode 100644 index 0000000..0779df8 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_armor_crackiness_medium.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_ashen.png b/nonpacks/static/vanilla/entity/wolf/wolf_ashen.png new file mode 100644 index 0000000..26ebfb7 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_ashen.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_ashen_angry.png b/nonpacks/static/vanilla/entity/wolf/wolf_ashen_angry.png new file mode 100644 index 0000000..7ec4d87 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_ashen_angry.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_ashen_tame.png b/nonpacks/static/vanilla/entity/wolf/wolf_ashen_tame.png new file mode 100644 index 0000000..a0ae8c1 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_ashen_tame.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_black.png b/nonpacks/static/vanilla/entity/wolf/wolf_black.png new file mode 100644 index 0000000..f518e04 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_black.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_black_angry.png b/nonpacks/static/vanilla/entity/wolf/wolf_black_angry.png new file mode 100644 index 0000000..7f77038 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_black_angry.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_black_tame.png b/nonpacks/static/vanilla/entity/wolf/wolf_black_tame.png new file mode 100644 index 0000000..47a6710 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_black_tame.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_chestnut.png b/nonpacks/static/vanilla/entity/wolf/wolf_chestnut.png new file mode 100644 index 0000000..a911249 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_chestnut.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_chestnut_angry.png b/nonpacks/static/vanilla/entity/wolf/wolf_chestnut_angry.png new file mode 100644 index 0000000..3f156b2 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_chestnut_angry.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_chestnut_tame.png b/nonpacks/static/vanilla/entity/wolf/wolf_chestnut_tame.png new file mode 100644 index 0000000..a7ee9c2 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_chestnut_tame.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_collar.png b/nonpacks/static/vanilla/entity/wolf/wolf_collar.png new file mode 100644 index 0000000..26a08e3 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_collar.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_rusty.png b/nonpacks/static/vanilla/entity/wolf/wolf_rusty.png new file mode 100644 index 0000000..b7871e6 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_rusty.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_rusty_angry.png b/nonpacks/static/vanilla/entity/wolf/wolf_rusty_angry.png new file mode 100644 index 0000000..cf3a6ac Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_rusty_angry.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_rusty_tame.png b/nonpacks/static/vanilla/entity/wolf/wolf_rusty_tame.png new file mode 100644 index 0000000..474514d Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_rusty_tame.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_snowy.png b/nonpacks/static/vanilla/entity/wolf/wolf_snowy.png new file mode 100644 index 0000000..d9a564e Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_snowy.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_snowy_angry.png b/nonpacks/static/vanilla/entity/wolf/wolf_snowy_angry.png new file mode 100644 index 0000000..46cd6cb Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_snowy_angry.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_snowy_tame.png b/nonpacks/static/vanilla/entity/wolf/wolf_snowy_tame.png new file mode 100644 index 0000000..a0486ca Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_snowy_tame.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_spotted.png b/nonpacks/static/vanilla/entity/wolf/wolf_spotted.png new file mode 100644 index 0000000..a0ca359 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_spotted.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_spotted_angry.png b/nonpacks/static/vanilla/entity/wolf/wolf_spotted_angry.png new file mode 100644 index 0000000..8963c99 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_spotted_angry.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_spotted_tame.png b/nonpacks/static/vanilla/entity/wolf/wolf_spotted_tame.png new file mode 100644 index 0000000..ac9ece2 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_spotted_tame.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_striped.png b/nonpacks/static/vanilla/entity/wolf/wolf_striped.png new file mode 100644 index 0000000..5d4008a Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_striped.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_striped_angry.png b/nonpacks/static/vanilla/entity/wolf/wolf_striped_angry.png new file mode 100644 index 0000000..38d2e26 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_striped_angry.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_striped_tame.png b/nonpacks/static/vanilla/entity/wolf/wolf_striped_tame.png new file mode 100644 index 0000000..fd68eb0 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_striped_tame.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_tame.png b/nonpacks/static/vanilla/entity/wolf/wolf_tame.png new file mode 100644 index 0000000..0c0fb2d Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_tame.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_woods.png b/nonpacks/static/vanilla/entity/wolf/wolf_woods.png new file mode 100644 index 0000000..9ef41e4 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_woods.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_woods_angry.png b/nonpacks/static/vanilla/entity/wolf/wolf_woods_angry.png new file mode 100644 index 0000000..f6b4739 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_woods_angry.png differ diff --git a/nonpacks/static/vanilla/entity/wolf/wolf_woods_tame.png b/nonpacks/static/vanilla/entity/wolf/wolf_woods_tame.png new file mode 100644 index 0000000..0274612 Binary files /dev/null and b/nonpacks/static/vanilla/entity/wolf/wolf_woods_tame.png differ diff --git a/nonpacks/static/vanilla/entity/zombie/drowned.png b/nonpacks/static/vanilla/entity/zombie/drowned.png new file mode 100644 index 0000000..ae35a93 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie/drowned.png differ diff --git a/nonpacks/static/vanilla/entity/zombie/drowned_outer_layer.png b/nonpacks/static/vanilla/entity/zombie/drowned_outer_layer.png new file mode 100644 index 0000000..3d2cdc4 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie/drowned_outer_layer.png differ diff --git a/nonpacks/static/vanilla/entity/zombie/husk.png b/nonpacks/static/vanilla/entity/zombie/husk.png new file mode 100644 index 0000000..1ff4b87 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie/husk.png differ diff --git a/nonpacks/static/vanilla/entity/zombie/zombie.png b/nonpacks/static/vanilla/entity/zombie/zombie.png new file mode 100644 index 0000000..d27ef98 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie/zombie.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession/armorer.png b/nonpacks/static/vanilla/entity/zombie_villager/profession/armorer.png new file mode 100644 index 0000000..51da9a8 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession/armorer.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession/butcher.png b/nonpacks/static/vanilla/entity/zombie_villager/profession/butcher.png new file mode 100644 index 0000000..ff77029 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession/butcher.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession/cartographer.png b/nonpacks/static/vanilla/entity/zombie_villager/profession/cartographer.png new file mode 100644 index 0000000..6600680 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession/cartographer.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession/cleric.png b/nonpacks/static/vanilla/entity/zombie_villager/profession/cleric.png new file mode 100644 index 0000000..98c4d38 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession/cleric.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession/farmer.png b/nonpacks/static/vanilla/entity/zombie_villager/profession/farmer.png new file mode 100644 index 0000000..a7f2956 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession/farmer.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession/fisherman.png b/nonpacks/static/vanilla/entity/zombie_villager/profession/fisherman.png new file mode 100644 index 0000000..abc15fb Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession/fisherman.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession/fletcher.png b/nonpacks/static/vanilla/entity/zombie_villager/profession/fletcher.png new file mode 100644 index 0000000..bd19f90 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession/fletcher.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession/leatherworker.png b/nonpacks/static/vanilla/entity/zombie_villager/profession/leatherworker.png new file mode 100644 index 0000000..a45b2cf Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession/leatherworker.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession/librarian.png b/nonpacks/static/vanilla/entity/zombie_villager/profession/librarian.png new file mode 100644 index 0000000..215915e Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession/librarian.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession/mason.png b/nonpacks/static/vanilla/entity/zombie_villager/profession/mason.png new file mode 100644 index 0000000..0c4201c Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession/mason.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession/nitwit.png b/nonpacks/static/vanilla/entity/zombie_villager/profession/nitwit.png new file mode 100644 index 0000000..d838d31 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession/nitwit.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession/shepherd.png b/nonpacks/static/vanilla/entity/zombie_villager/profession/shepherd.png new file mode 100644 index 0000000..acaf313 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession/shepherd.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession/toolsmith.png b/nonpacks/static/vanilla/entity/zombie_villager/profession/toolsmith.png new file mode 100644 index 0000000..3ad39c5 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession/toolsmith.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession/weaponsmith.png b/nonpacks/static/vanilla/entity/zombie_villager/profession/weaponsmith.png new file mode 100644 index 0000000..bd0443f Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession/weaponsmith.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession_level/diamond.png b/nonpacks/static/vanilla/entity/zombie_villager/profession_level/diamond.png new file mode 100644 index 0000000..7d873e5 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession_level/diamond.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession_level/emerald.png b/nonpacks/static/vanilla/entity/zombie_villager/profession_level/emerald.png new file mode 100644 index 0000000..e77ab45 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession_level/emerald.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession_level/gold.png b/nonpacks/static/vanilla/entity/zombie_villager/profession_level/gold.png new file mode 100644 index 0000000..1fe74ac Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession_level/gold.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession_level/iron.png b/nonpacks/static/vanilla/entity/zombie_villager/profession_level/iron.png new file mode 100644 index 0000000..94cd414 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession_level/iron.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/profession_level/stone.png b/nonpacks/static/vanilla/entity/zombie_villager/profession_level/stone.png new file mode 100644 index 0000000..0daf8bb Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/profession_level/stone.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/type/desert.png b/nonpacks/static/vanilla/entity/zombie_villager/type/desert.png new file mode 100644 index 0000000..26ee5ca Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/type/desert.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/type/jungle.png b/nonpacks/static/vanilla/entity/zombie_villager/type/jungle.png new file mode 100644 index 0000000..def4417 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/type/jungle.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/type/plains.png b/nonpacks/static/vanilla/entity/zombie_villager/type/plains.png new file mode 100644 index 0000000..6e84d66 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/type/plains.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/type/savanna.png b/nonpacks/static/vanilla/entity/zombie_villager/type/savanna.png new file mode 100644 index 0000000..cc754fe Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/type/savanna.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/type/snow.png b/nonpacks/static/vanilla/entity/zombie_villager/type/snow.png new file mode 100644 index 0000000..e2e30b5 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/type/snow.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/type/swamp.png b/nonpacks/static/vanilla/entity/zombie_villager/type/swamp.png new file mode 100644 index 0000000..98e5df5 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/type/swamp.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/type/taiga.png b/nonpacks/static/vanilla/entity/zombie_villager/type/taiga.png new file mode 100644 index 0000000..e78b46e Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/type/taiga.png differ diff --git a/nonpacks/static/vanilla/entity/zombie_villager/zombie_villager.png b/nonpacks/static/vanilla/entity/zombie_villager/zombie_villager.png new file mode 100644 index 0000000..9bd3e23 Binary files /dev/null and b/nonpacks/static/vanilla/entity/zombie_villager/zombie_villager.png differ diff --git a/nonpacks/static/vendor/blockbench/LICENSE.MD b/nonpacks/static/vendor/blockbench/LICENSE.MD new file mode 100644 index 0000000..e72bfdd --- /dev/null +++ b/nonpacks/static/vendor/blockbench/LICENSE.MD @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/nonpacks/static/vendor/blockbench/VENDOR.md b/nonpacks/static/vendor/blockbench/VENDOR.md new file mode 100644 index 0000000..ad4f020 --- /dev/null +++ b/nonpacks/static/vendor/blockbench/VENDOR.md @@ -0,0 +1,37 @@ +# Vendored: Blockbench (web app) + +This directory contains the official **Blockbench** web application, mirrored +verbatim from the deployed official build at `https://web.blockbench.net/` +(served by the upstream project), used here as an embedded model editor/viewer +for the Packs site. + +- **Project**: Blockbench — https://github.com/JannisX11/blockbench +- **Version**: 5.x (web build; `dist/bundle.js`, mirrored 2026-08-04) +- **License**: GPL-3.0-or-later — see `LICENSE.MD` + +## Local modifications + +1. `index.html` — removed the Cloudflare Insights beacon `` + (after the bundle). That script auto-loads the bundled plugins below and + bridges model/texture loading from the Packs site via `postMessage`. + +## Bundled plugins + +- `plugins/geckolib/` — **GeckoLib Models & Animations** (v4.2.5), the official + GeckoLib Blockbench plugin, from the Blockbench plugin store repository + (`JannisX11/blockbench-plugins/plugins/geckolib`). +- `plugins/MultiactorEditor/` — **Multi Actor Animator** (v1.0.0) by L1Z0, for + the AnimationDirector mod. Handles `afw_bone_textures` and texture preview. +- `plugins/packs_bootstrap.js` — the site's own bridge (loads the two plugins, + opens a geo model, loads the feature + vanilla textures). + +No other upstream files were changed. + +## Update note + +We intentionally do **not** plan to re-vendor newer Blockbench releases — this +copy is pinned for stability. To update, re-mirror `https://web.blockbench.net/` +(including `dist/bundle.js`, `css/`, `font/`, `assets/`, `icons/`) and re-apply +the two index.html modifications above. diff --git a/nonpacks/static/vendor/blockbench/assets/armor_stand.png b/nonpacks/static/vendor/blockbench/assets/armor_stand.png new file mode 100644 index 0000000..0d47a34 Binary files /dev/null and b/nonpacks/static/vendor/blockbench/assets/armor_stand.png differ diff --git a/nonpacks/static/vendor/blockbench/assets/crosshair.png b/nonpacks/static/vendor/blockbench/assets/crosshair.png new file mode 100644 index 0000000..aca6555 Binary files /dev/null and b/nonpacks/static/vendor/blockbench/assets/crosshair.png differ diff --git a/nonpacks/static/vendor/blockbench/assets/flower_pot.png b/nonpacks/static/vendor/blockbench/assets/flower_pot.png new file mode 100644 index 0000000..13902cd Binary files /dev/null and b/nonpacks/static/vendor/blockbench/assets/flower_pot.png differ diff --git a/nonpacks/static/vendor/blockbench/assets/fox.png b/nonpacks/static/vendor/blockbench/assets/fox.png new file mode 100644 index 0000000..ab1f3dd Binary files /dev/null and b/nonpacks/static/vendor/blockbench/assets/fox.png differ diff --git a/nonpacks/static/vendor/blockbench/assets/item_frame.png b/nonpacks/static/vendor/blockbench/assets/item_frame.png new file mode 100644 index 0000000..68e9819 Binary files /dev/null and b/nonpacks/static/vendor/blockbench/assets/item_frame.png differ diff --git a/nonpacks/static/vendor/blockbench/assets/locator.png b/nonpacks/static/vendor/blockbench/assets/locator.png new file mode 100644 index 0000000..f63d43e Binary files /dev/null and b/nonpacks/static/vendor/blockbench/assets/locator.png differ diff --git a/nonpacks/static/vendor/blockbench/assets/logo_cutout.svg b/nonpacks/static/vendor/blockbench/assets/logo_cutout.svg new file mode 100644 index 0000000..2670c08 --- /dev/null +++ b/nonpacks/static/vendor/blockbench/assets/logo_cutout.svg @@ -0,0 +1,66 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/nonpacks/static/vendor/blockbench/assets/logo_text_white.svg b/nonpacks/static/vendor/blockbench/assets/logo_text_white.svg new file mode 100644 index 0000000..0e78b30 --- /dev/null +++ b/nonpacks/static/vendor/blockbench/assets/logo_text_white.svg @@ -0,0 +1,125 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff --git a/nonpacks/static/vendor/blockbench/assets/missing.png b/nonpacks/static/vendor/blockbench/assets/missing.png new file mode 100644 index 0000000..b812595 Binary files /dev/null and b/nonpacks/static/vendor/blockbench/assets/missing.png differ diff --git a/nonpacks/static/vendor/blockbench/assets/north.png b/nonpacks/static/vendor/blockbench/assets/north.png new file mode 100644 index 0000000..9cca2ae Binary files /dev/null and b/nonpacks/static/vendor/blockbench/assets/north.png differ diff --git a/nonpacks/static/vendor/blockbench/assets/null_object.png b/nonpacks/static/vendor/blockbench/assets/null_object.png new file mode 100644 index 0000000..893458d Binary files /dev/null and b/nonpacks/static/vendor/blockbench/assets/null_object.png differ diff --git a/nonpacks/static/vendor/blockbench/assets/oak_shelf.png b/nonpacks/static/vendor/blockbench/assets/oak_shelf.png new file mode 100644 index 0000000..2dd7967 Binary files /dev/null and b/nonpacks/static/vendor/blockbench/assets/oak_shelf.png differ diff --git a/nonpacks/static/vendor/blockbench/assets/player_skin.png b/nonpacks/static/vendor/blockbench/assets/player_skin.png new file mode 100644 index 0000000..517f409 Binary files /dev/null and b/nonpacks/static/vendor/blockbench/assets/player_skin.png differ diff --git a/nonpacks/static/vendor/blockbench/assets/rotate_cursor.png b/nonpacks/static/vendor/blockbench/assets/rotate_cursor.png new file mode 100644 index 0000000..36c6b2b Binary files /dev/null and b/nonpacks/static/vendor/blockbench/assets/rotate_cursor.png differ diff --git a/nonpacks/static/vendor/blockbench/assets/uv_preview.png b/nonpacks/static/vendor/blockbench/assets/uv_preview.png new file mode 100644 index 0000000..5d3d15b Binary files /dev/null and b/nonpacks/static/vendor/blockbench/assets/uv_preview.png differ diff --git a/nonpacks/static/vendor/blockbench/css/dialogs.css b/nonpacks/static/vendor/blockbench/css/dialogs.css new file mode 100644 index 0000000..722702c --- /dev/null +++ b/nonpacks/static/vendor/blockbench/css/dialogs.css @@ -0,0 +1,2851 @@ +@layer base { +/*Dialog*/ + #blackout { + display: none; + position: absolute; + width: 100%; + height: 100%; + left: 0; + right: 0; + z-index: 21; + background-color: transparent; + opacity: 0; + } + #blackout.darken { + background-color: var(--color-dark); + opacity: 0.6; + } + .dialog_handle { + position: relative; + cursor: pointer; + overflow: hidden; + touch-action: none; + padding-left: 8px; + padding-top: 2px; + background: var(--color-elevated); + height: 33px; + flex: 0 0 auto; + z-index: 2; + border-radius: inherit; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12); + } + .dialog_handle .dialog_title { + padding-top: 2px; + font-size: 1.12em; + padding-left: 16px; + pointer-events: none; + } + .dialog_close_button { + position: absolute; + right: 0px; + top: 0px; + height: 33px; + width: 33px; + padding: 6px; + border-radius: inherit; + cursor: pointer; + z-index: inherit; + } + .dialog_close_button:hover { + color: var(--color-accent_text); + background-color: var(--color-close); + } + .dialog_resize_handle { + --size: 7px; + position: absolute; + width: var(--size); + height: var(--size); + bottom: 0; + right: 0; + border-width: var(--size); + border-style: solid; + border-color: var(--color-button); + border-top-color: transparent !important; + border-left-color: transparent !important; + border-bottom-right-radius: inherit; + cursor: se-resize; + } + .dialog_resize_handle:hover, .dialog_resize_handle.dragging { + border-color: var(--color-accent); + } + .dialog_sidebar_menu_button { + height: 100%; + width: 34px; + padding: 4px; + float: left; + text-align: center; + } + .dialog_sidebar_menu_button:hover { + color: var(--color-light); + } + .dialog_menu_button { + height: 100%; + width: 30px; + padding: 4px 0; + float: left; + text-align: center; + margin-left: 2px; + } + .dialog_menu_button:hover { + color: var(--color-light); + } + .dialog:not(.draggable) .dialog_close_button { + top: 8px; + right: -34px; + } + + dialog { + width: 540px; + min-width: min(370px, 100%); + max-height: calc(100% - 40px); + height: auto; + flex-direction: column; + background-color: var(--color-ui); + color: inherit; + border: none; + box-shadow: 0 0px 20px rgba(0, 0, 0, 0.56); + left: unset; + right: unset; + bottom: unset; + display: none; + border-radius: 6px; + } + .shapeless_dialog { + position: fixed; + z-index: 21; + } + dialog > content, dialog .dialog_wrapper > content { + display: block; + overflow-y: auto; + flex: 1 1 auto; + } + + dialog p > code { + background-color: var(--color-back); + border: 1px solid var(--color-border); + user-select: text; + -webkit-user-select: text; + font-family: var(--font-code); + word-break: break-word; + padding: 2px 6px; + } + + .dialog { + position: fixed; + z-index: 21; + top: 30px; + max-width: 100vw; + max-height: calc(100vh - 30px); + } + .dialog:not(.draggable) { + left: 0; + right: 0; + margin-right: auto; + margin-left: auto; + } + dialog.dialog.config_dialog { + margin-right: 0; + margin-left: 0; + width: fit-content; + min-width: 200px; + } + .dialog.config_dialog > div > .dialog_content { + margin: 4px 12px; + } + .config_dialog_title { + padding: 4px 12px; + margin-bottom: -6px; + margin-right: 18px; + text-align: center; + font-size: 1.1em; + text-transform: uppercase; + color: var(--color-subtle_text); + border-radius: inherit; + } + .dialog .config_dialog_title > .dialog_close_button { + right: 0; + top: 0; + } + .dialog.config_dialog hr { + margin: 6px 0; + } + .dialog:not(.resizable) { + min-width: min(400px, 100%); + max-width: min(960px, 100%); + } + .dialog_bar { + position: relative; + min-height: 30px; + margin-top: 4px; + margin-bottom: 4px; + height: auto; + clear: both; + } + .dialog_bar.form_bar { + display: flex; + align-items: center; + } + label.name_space_left { + float: left; + min-width: 90px; + padding-top: 4px; + padding-left: 1px; + padding-right: 8px; + flex-shrink: 0; + overflow-wrap: break-word; + box-sizing: content-box; + } + .dialog label.name_space_left { + min-width: 140px; + } + .dialog_bar.form_bar.full_width_dialog_bar { + flex-wrap: wrap; + } + .dialog_bar.form_bar.full_width_dialog_bar > label { + min-width: 95%; + } + .dialog_bar.form_bar .half { + flex-grow: 1; + } + .dialog_bar > label { + width: var(--max_label_width); + } + .dialog_bar > .molang_input { + width: calc(100% - var(--max_label_width) - 10px); + } + .dialog_bar.form_bar.small_text { + word-break: break-word; + } + /*.dialog_bar::after { + content: ""; + clear: both; + display: block; + }*/ + .dialog_bar.narrow { + min-height: 30px; + } + .dialog_bar.button_bar { + text-align: right; + flex: 0 0 auto; + } + .dialog_bar > button.large { + margin-bottom: 0; + margin-top: 16px; + margin: 16px 4px 0 4px; + } + .dialog_bar > button.confirm_btn:not(:hover) { + background-color: var(--color-selected); + } + .dialog_bar input[type=checkbox] { + padding: 0 4px; + } + .dialog_bar .tool { + position: relative; + margin: 0; + margin-right: auto; + } + .dialog_bar.form_bar .tool > .tooltip { + display: none !important; + } + .dialog_bar .form_overlay_tools { + position: absolute; + top: 2px; + right: 10px; + background-color: color-mix(in srgb, var(--color-back) 60%, transparent); + border-radius: 5px; + padding: 0 5px; + } + .dialog_bar.small_text li { + list-style: auto; + margin-left: 20px; + padding-left: 4px; + } + .dialog_vector_group { + display: flex; + gap: 3px; + } + .dialog_vector_group > input { + min-width: 30px; + flex-grow: 1; + flex-shrink: 1; + } + .dialog_bar > .range_input_label { + overflow: hidden; + width: 58px; + flex-grow: 0; + flex-shrink: 0; + padding-top: 4px; + margin-left: 5px; + } + .dialog_bar.form_toggle_disabled *:not(.form_input_toggle) { + pointer-events: none; + opacity: 0.6; + } + .tab_bar { + height: 30px; + display: flex; + } + .tab_bar > * { + height: 100%; + padding-top: 2px; + flex-grow: 1; + cursor: default; + text-align: center; + vertical-align: middle; + } + .tab_bar > .open { + border-bottom: 3px solid var(--color-accent); + } + .tab_bar > *:hover { + color: var(--color-light); + } + + .dialog h3 { + margin-left: 0; + } + .dialog_bar label.in_toolbar { + padding-left: 0; + } + .dialog p.multiline_text { + margin-top: 0; + margin-bottom: 20px; + margin-left: 12px; + margin-right: 12px; + font-size: 0.86em; + user-select: text; + -webkit-user-select: text; + } + + .dialog_message_box_command { + padding: 6px 12px; + cursor: pointer; + font-size: 1.1em; + background-color: var(--color-back); + margin-top: 2px; + margin-bottom: 4px; + border-radius: 5px; + } + .dialog_message_box_command:hover { + background-color: var(--color-accent); + color: var(--color-accent_text); + } + .dialog_message_box_command::before { + float: right; + content: "\f105"; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; + margin-right: 4px; + pointer-events: none; + } + .dialog_message_box_command > .icon { + margin-right: 10px; + vertical-align: sub; + } + .dialog_message_box_command > label { + display: block; + color: var(--color-subtle_text); + font-size: 0.93em; + width: fit-content; + pointer-events: none; + margin-top: -5px; + } + .dialog_message_box_command:has(.icon) > label { + margin-left: 30px; + } + .dialog_message_box_command:hover > label { + color: var(--color-accent_text); + } + .dialog_message_box_command_category { + padding-left: 5px; + color: var(--color-subtle_text); + } + .dialog_message_box_checkboxes { + margin-top: 15px; + margin-bottom: -14px; + } + + .form_bar_file .input_wrapper { + position: relative; + flex-grow: 1; + } + .form_bar_file .input_wrapper input { + width: 100%; + padding-right: 30px; + } + .form_bar_file .input_wrapper > .material-icons { + position: absolute; + margin-left: -28px; + margin-top: 4px; + opacity: 0.75; + right: 4px; + } + .form_bar_file:hover .input_wrapper > .material-icons { + opacity: 1; + } + .form_inline_select { + display: flex; + flex-wrap: wrap; + gap: 2px; + flex-grow: 1; + border-radius: 5px; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); + } + .form_inline_select > li { + height: 30px; + padding: 3px 8px; + flex-grow: 1; + cursor: pointer; + background-color: var(--color-button); + text-align: center; + } + .form_inline_select > li:first-of-type { + border-top-left-radius: inherit; + border-bottom-left-radius: inherit; + } + .form_inline_select > li:last-of-type { + border-top-right-radius: inherit; + border-bottom-right-radius: inherit; + } + .form_inline_select > li:hover { + color: var(--color-light); + } + .form_inline_select > li.selected { + background-color: var(--color-accent); + color: var(--color-accent_text); + cursor: default; + border-radius: inherit; + } + ul.form_multi_select { + display: flex; + flex-wrap: wrap; + gap: 4px; + } + ul.form_multi_select > li { + background-color: var(--color-button); + padding: 0px 8px; + border-radius: 5px; + display: flex; + padding-top: 2px; + margin-top: 2px; + gap: 2px; + padding-bottom: 0; + height: 28px; + } + ul.form_multi_select > li > .icon { + cursor: pointer; + font-size: 19px; + padding-top: 3px; + } + .form_bar_radio { + display: flex; + } + .form_bar_radio:hover { + color: var(--color-light); + } + .form_bar_radio label { + flex-grow: 1; + padding: 3px 5px; + } + .form_bar > .nslide_tool { + flex-grow: 1; + } + .dialog_form_description { + margin-left: auto; + padding-top: 8px; + font-size: 13px; + height: 28px; + color: var(--color-subtle_text); + display: block; + width: 16px; + text-align: center; + } + .dialog_form_description:hover { + color: var(--color-light); + transition: color 750ms linear; + } + +/* Sidebar */ + .dialog_wrapper { + flex-grow: 1; + display: block; + } + .dialog_wrapper.has_sidebar { + display: grid; + grid-template-rows: auto 42px; + grid-template-columns: minmax(160px, 200px) auto; + grid-template-areas: "sidebar content" "sidebar buttons"; + transition: grid-template-columns 100ms ease; + } + .dialog_wrapper:not(.has_sidebar) .dialog_sidebar { + display: none; + } + .dialog_sidebar { + background-color: var(--color-back); + flex: 1 0 160px; + position: relative; + grid-area: sidebar; + display: flex; + flex-direction: column; + overflow-x: hidden; + overflow-y: auto; + border-bottom-left-radius: 6px; + margin-top: -10px; + padding-top: 10px; + } + .dialog_content { + display: block; + grid-area: content; + max-height: calc(100vh - 180px); + } + dialog .dialog_content, + dialog .dialog_bar.button_bar { + margin: 16px 24px; + } + @media (max-device-width: 640px) { + dialog { + width: 100% !important; + } + dialog .dialog_content, dialog .dialog_bar.button_bar { + margin: 12px; + } + .dialog_content { + max-height: calc(100vh - 136px); + } + } + dialog .dialog_bar.button_bar { + grid-area: buttons; + margin-top: 0px; + margin-bottom: 12px; + display: flex; + flex-wrap: wrap; + justify-content: right; + gap: 3px; + } + + .dialog_sidebar .dialog_sidebar_pages { + margin-top: 16px; + margin-bottom: 16px; + } + .dialog_sidebar .dialog_sidebar_pages li { + width: 100%; + padding: 6px 20px; + border-left: 4px solid transparent; + cursor: pointer; + } + .dialog_sidebar .dialog_sidebar_pages li .icon { + float: left; + margin-left: -10px; + margin-right: 5px; + } + .dialog_sidebar .dialog_sidebar_pages li:hover { + color: var(--color-light); + } + .dialog_sidebar .dialog_sidebar_pages li.selected { + background-color: var(--color-ui); + border-left: 4px solid var(--color-accent); + } + .dialog_sidebar .dialog_sidebar_pages li.error::after { + content: ""; + position: absolute; + display: block; + background-color: var(--color-close); + border-radius: 10px; + width: 10px; + height: 10px; + right: 6px; + margin-top: -17px; + } + .dialog_sidebar_separator { + min-height: 4px; + color: var(--color-subtle_text); + margin-bottom: -1px; + margin-top: 4px; + text-indent: 16px; + display: flex; + align-items: center; + } + .dialog_sidebar_separator > span { + background-color: var(--color-button); + width: 0; + height: 2px; + flex-grow: 1; + margin: 0 5px; + } + + .dialog_sidebar .dialog_sidebar_actions { + bottom: 10px; + padding: 8px; + margin-top: auto; + border-top: 2px solid var(--color-border); + } + .dialog_sidebar .dialog_sidebar_actions li { + display: flex; + height: 30px; + padding: 4px; + padding-left: 34px; + padding-right: 8px; + cursor: pointer; + } + .dialog_sidebar .dialog_sidebar_actions li:hover { + color: var(--color-light); + } + .dialog_sidebar .dialog_sidebar_actions li i { + margin-top: 1px; + margin-right: 8px; + margin-left: -28px; + flex-shrink: 0; + pointer-events: none; + } + .dialog_sidebar .dialog_sidebar_actions li img { + cursor: default; + height: 20px; + width: 20px; + color: var(--color-text); + white-space: nowrap; + margin-bottom: -3px; + margin-left: -27px; + margin-right: 5px; + margin-top: 1px; + } + .dialog_sidebar .dialog_sidebar_actions li span { + pointer-events: none; + flex: 1 0 auto; + } + + +/*Settings Dialog*/ + dialog#settings .dialog_wrapper { + min-height: 640px; + } + dialog#settings .dialog_content { + margin-top: 10px; + } + #settings_tab_bar { + margin: -24px; + margin-bottom: 0; + margin-top: -20px; + } + dialog#settings h2, dialog#keybindings h2, dialog#theme h2 { + margin-top: -6px; + font-size: 1.8em; + } + dialog#settings h2 { + margin-top: -15px; + } + + #settings_profile_wrapper { + display: flex; + align-items: center; + justify-content: right; + margin-bottom: 8px; + } + #settings_profile_wrapper > .bb-select { + min-width: 126px; + margin-left: 6px; + } + #settings_profile_wrapper > .bb-select.profile_is_selected { + background-color: var(--color-profile); + color: #000; + } + + + /*Settings*/ + .settings_list { + width: 100%; + max-height: 600px; + overflow-y: scroll; + clear: both; + } + .settings_list li { + padding: 2px 1px; + margin: 8px 0; + display: flex; + align-items: center; + } + .settings_list li.full_width_input { + flex-wrap: wrap; + } + .settings_list li.has_profile_override { + border: 1px solid var(--color-profile); + padding: 1px 0; + position: relative; + border-radius: 6px; + } + .settings_list .setting_profile_clear_button { + position: absolute; + top: 4px; + right: 0; + } + .settings_list li:hover input[type=checkbox] { + color: var(--color-light); + } + .settings_list .setting_element { + width: 60px; + text-align: center; + float: left; + margin-top: 12px; + flex-shrink: 0; + } + .settings_list li > .setting_icon { + margin-top: 8px; + } + .settings_list li > .setting_label { + display: inline-block; + margin-left: 8px; + width: 100%; + flex-shrink: 1; + } + .settings_list .setting_name { + font-size: 1.1em; + display: inline-block; + } + .settings_list .setting_description { + font-size: 0.94em; + color: var(--color-subtle_text); + } + .settings_list .setting_plugin_label { + padding: 3px 10px; + font-size: 15px; + float: right; + border-radius: 5px; + background-color: var(--color-back); + cursor: pointer; + } + .settings_list .setting_plugin_label:hover { + color: var(--color-light); + } + .settings_list .setting_plugin_label > span { + color: var(--color-subtle_text); + } + .setting_profile_value_indicator { + display: inline-block; + width: 13px; + height: 13px; + border: 3px solid var(--color-profile); + opacity: 0.8; + border-radius: 50%; + margin-left: 5px; + cursor: pointer; + } + .setting_profile_value_indicator.active { + background-color: var(--color-profile); + } + .setting_profile_value_indicator:hover { + opacity: 1; + } + .settings_list input[type=number] { + height: 28px; + width: 100%; + background-color: var(--color-back); + border: 1px solid var(--color-border); + padding-left: 4px; + text-align: right; + } + .settings_list input[type=text], .settings_list input[type=password] { + height: 36px; + padding: 10px; + margin-left: 5px; + vertical-align: bottom; + } + .settings_list div.bar_select { + margin: 8px; + width: 96%; + } + .settings_list div.bar_select select { + width: 100%; + } + .settings_list li .setting_icon i { + font-size: 26pt; + max-width: unset; + margin-top: -6px; + } + .settings_list li:hover .setting_icon i { + color: var(--color-light); + } + .bar div.password_toggle { + display: inline-block; + margin-left: 4px; + padding-top: 2px; + width: 24px; + text-align: center; + vertical-align: text-bottom; + } + .form_input_tool { + width: 30px; + } + + /*Keybinds*/ + dialog#keybindings .dialog_wrapper { + min-height: 640px; + } + #keybindlist { + max-height: 600px; + margin-top: 10px; + overflow-y: scroll; + overflow-x: hidden; + clear: both; + } + .keybind_line { + position: relative; + display: flex; + width: 100%; + } + .keybind_line__sub::before { + display: block; + position: relative; + content: "\f061"; + font-family: 'Font Awesome 6 Free'; + font-weight: 600; + color: var(--color-subtle_text); + height: 24px; + padding: 3px 2px; + margin-left: 22px; + } + .keybind_line > div:first-child { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + padding: 4px; + padding-left: 8px; + display: flex; + } + .keybind_line > div:first-child > .keybind_guide_line { + border-bottom: 3px solid var(--color-button); + width: 0; + height: 14px; + flex-grow: 1; + margin-left: 5px; + margin-right: 3px; + } + .keybind_line > div.keybindslot { + width: calc(51% - 32px); + padding: 6px; + margin-bottom: 2px; + height: 32px; + background-color: var(--color-back); + font-size: 0.94em; + overflow: hidden; + white-space: nowrap; + cursor: pointer; + border-radius: 6px; + } + .keybind_line > div.keybindslot:hover { + color: var(--color-light); + } + .keybind_line > div.keybindslot.conflict { + border-left: 4px solid var(--color-close); + } + .keybindslot .punctuation { + color: var(--color-subtle_text); + } + .keybindslot .modifier, .keybindslot .key { + background: var(--color-button); + padding: 2px 5px; + border-radius: 5px; + } + .keybindslot .optional { + color: var(--color-subtle_text); + padding: 2px 5px; + } + #keybindlist .tool { + height: 30px; + width: 25px; + float: right; + } + .keybind_item_variations > li { + display: flex; + margin-bottom: 2px; + } + .keybind_item_variations > li > label { + color: var(--color-subtle_text); + padding: 3px; + padding-left: 15px; + width: 30px; + } + .keybind_item_variations > li > * { + flex-grow: 1; + flex-shrink: 0; + width: 0; + } + .keybind_item_variations > li > .bb-select { + margin-right: 54px; + } + .keybind_variation_conflict { + color: var(--color-warning); + margin-left: -22px; + width: 22px; + } + + /*Colors*/ + dialog#theme .dialog_wrapper { + min-height: 480px; + } + div#color_wrapper { + columns: 2; + margin-bottom: 20px; + } + .color_field { + min-height: 50px; + width: 100%; + margin: 2px 0; + } + .color_field .desc { + width: calc(100% - 60px); + display: inline-block; + } + .color_field p { + margin: 0; + font-size: 0.94em; + color: var(--color-subtle_text); + } + .color_field h4 { + margin: 0; + font-size: 1.2em; + } + .layout_color_preview { + height: 45px; + width: 45px; + margin: 4px; + display: inline-block; + vertical-align: top; + border-radius: 6px; + } + .prism-editor-wrapper .prism-editor__line-numbers { + background-color: var(--color-back) !important; + height: fit-content; + } + .prism-editor-wrapper code[class*="language-"] { + color: var(--color-text); + } + #css_editor { + height: calc(100vh - 228px); + display: flex; + flex-direction: column; + } + #css_editor > .prism-editor-component { + flex-grow: 1; + } + #thumbnail_editor { + height: calc(100vh - 345px); + display: flex; + flex-direction: column; + } + #thumbnail_editor > .prism-editor-component { + flex-grow: 1; + } + + #theme_list { + overflow-y: auto; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + grid-gap: 10px; + } + #theme_list .theme { + float: left; + padding: 8px; + border: 2px solid transparent; + color: var(--color-text); + background-color: var(--color-elevated); + box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); + cursor: pointer; + border-radius: 5px; + } + #theme_list .theme:hover { + color: var(--color-light); + background-color: var(--color-button); + } + #theme_list .theme.selected { + border-color: var(--color-accent); + } + #theme_list .theme > .theme_preview { + margin-bottom: 4px; + } + #theme_list .theme * { + cursor: inherit; + } + .theme_name { + padding-left: 2px; + } + .theme_details_bar { + display: flex; + align-items: center; + width: 100%; + } + .theme_author { + color: var(--color-subtle_text); + margin-right: auto; + } + .theme_type_icon { + color: var(--color-subtle_text); + height: 24px; + margin-right: 2px; + } + + #theme_list .theme_preview, .custom_thumbnail_preview { + position: relative; + height: 108px; + width: 100%; + background-color: var(--color-frame); + border: 2px solid var(--color-frame); + border-top: none; + overflow: hidden; + } + .custom_thumbnail_preview { + position: relative; + margin-bottom: 20px; + max-width: 200px; + } + .theme_preview_header { + height: 20px; + width: 100%; + background-color: var(--color-frame); + } + .theme_preview_window { + width: 100%; + height: calc(100% - 20px); + display: flex; + justify-content: space-between; + background-color: var(--color-dark); + } + .theme_preview_sidebar { + flex: 0 0 40px; + background-color: var(--color-ui); + position: relative; + } + .theme_preview_sidebar::after { + content: ""; + position: absolute; + bottom: 0; + width: 100%; + height: 24px; + background-color: var(--color-back); + } + .theme_preview_center { + width: 60px; + height: 60px; + border: 5px solid var(--color-grid); + transform: rotate3d(1, 0, 0, 69deg) rotate(45deg); + margin-top: 34px; + border-radius: 4px; + } + .theme_preview_text { + height: 4px; + width: 40px; + border-radius: 2px; + margin: 8px 4px; + background-color: var(--color-text); + display: inline-block; + opacity: 0.6; + } + .theme_preview_menu { + background-color: var(--color-bright_ui); + position: absolute; + left: 31px; + z-index: 1; + border-radius: 2px; + } + .theme_preview_menu_header { + height: 20px; + background-color: var(--color-accent); + display: inline-block; + } + .theme_preview_menu_header > .theme_preview_text { + background-color: var(--color-accent_text); + } + .theme_preview_menu > .theme_preview_text { + background-color: var(--color-bright_ui_text); + display: block; + margin: 10px 7px; + } + .theme_preview.borders .theme_preview_window { + border-top: 2px solid var(--color-border); + } + .theme_preview.borders .theme_preview_menu { + border: 2px solid var(--color-border); + } + .theme_preview.borders .theme_preview_sidebar:first-child { + border-right: 2px solid var(--color-border); + } + .theme_preview.borders .theme_preview_sidebar:last-child { + border-left: 2px solid var(--color-border); + } + .theme_backup_bar { + padding: 2px 8px; + border: 2px solid var(--color-accent); + margin-bottom: 7px; + cursor: pointer; + border-radius: 6px; + } + .theme_backup_bar:hover { + color: var(--color-light); + } + .theme_backup_bar > i { + padding: 1px; + color: var(--color-text); + float: right; + } + .theme_backup_bar > i:hover { + color: var(--color-light); + } + + /*About*/ + dialog#about .dialog_content { + text-align: center; + } + dialog#about h4 { + color: var(--color-subtle_text); + margin-top: 30px; + border-top: 2px + solid var(--color-border); + padding-top: 12px; + } + #about_page_title { + vertical-align: top; + opacity: 0.9; + } + #about_page_title img { + width: min(340px, 100%); + } + dialog#about div.socials { + display: flex; + padding: 20px 0; + max-width: 540px; + margin: auto; + } + dialog#about div.socials a { + text-align: center; + flex-basis: 0; + flex-grow: 1; + text-decoration: none; + padding: 6px; + padding-top: 10px; + border-radius: 6px; + } + dialog#about div.socials a:hover { + background-color: var(--color-accent); + } + dialog#about div.socials a i { + display: block; + font-size: 2em; + max-width: none; + pointer-events: none; + } + dialog#about div.socials a:hover i { + color: var(--color-light) !important; + } + dialog#about div.socials a label { + color: var(--color-subtle_text); + cursor: inherit; + pointer-events: none; + } + dialog#about div.socials a:hover label { + color: var(--color-light); + } + dialog#about .multi_column_list { + column-count: 3; + } + .special_thanks_mentions li { + line-height: 18px; + margin-bottom: 8px; + } + +/*Specific Dialogs*/ + dialog#model_stats .form_bar { + margin: 0; + } + .dialog#texture_edit p.multiline_text { + width: 344px; + min-height: 51px; + } + p.multiline_text span { + user-select: inherit; + -webkit-user-select: text; + } + #texture_menu_thumbnail { + float: right; + margin-top: 3px; + margin-right: 12px; + height: 128px; + background-color: var(--color-back); + overflow-y: auto; + } + #texture_menu_thumbnail img { + width: 128px; + margin-bottom: -7px; + } + #import_texture_list li { + min-height: 112px; + width: 148px; + margin: 6px 3px; + position: relative; + display: inline-block; + background-repeat: no-repeat; + background-size: 112px; + background-position-x: center; + background-position-y: 6px; + box-sizing: content-box; + border: 2px solid transparent; + vertical-align: top; + cursor: pointer; + } + #import_texture_list li:hover { + background-color: var(--color-selected);; + } + #import_texture_list li.selected { + border-color: var(--color-accent); + } + #import_texture_list li.selected::after { + position: absolute; + content: "\f00c"; + font-family: 'Font Awesome 6 Free'; + font-weight: 600; + color: var(--color-accent); + background-color: var(--color-ui); + height: 19px; + right: 0; + top: 0; + margin-right: -7px; + margin-top: -12px; + border-bottom-left-radius: 8px; + padding-left: 2px; + } + #import_texture_list li label { + display: block; + width: 100%; + margin-top: 112px; + color: var(--color-subtle_text); + overflow-wrap: anywhere; + text-align: center; + cursor: inherit; + background-color: inherit; + } + #import_texture_list li:hover label { + color: var(--color-text); + } + body.entity_mode button.entity_mode_uv_button { + display: block; + padding: 0; + height: 32px; + width: 73px; + border: none; + } + dialog div.dialog_form_buttons { + padding: 4px; + display: flex; + flex-wrap: wrap; + gap: 2px; + width: 100%; + } + dialog div.dialog_form_buttons button { + padding: 2px 10px; + border-radius: 13px; + width: auto; + height: auto; + min-width: 52px; + height: auto; + white-space: nowrap; + flex-grow: 1; + } + /*Scale*/ + dialog#scale .form_bar_overflow_info { + color: #ff5767; + } + dialog#scale .toggle_panel { + font-weight: bold; + } + + /*Extrusion*/ + #image_extruder label { + float: left; + margin-right: 8px; + padding-top: 5px; + } + #scan_tolerance { + width: 200px; + } + #scan_tolerance_label { + margin-left: 8px; + } + #extrusion_canvas { + border-bottom: 1px solid var(--color-grid); + border-right: 1px solid var(--color-grid); + margin: auto; + display: block; + } + button.large:first-child { + margin-left: 0; + } + + /*Import entity texture*/ + dialog#select_texture > ul { + max-height: 420px; + } + + /*Selection Creator*/ + input[type=range].dark_bordered { + height: 30px; + padding-top: 3px; + padding-left: 0; + } + select.dark_bordered { + color: var(--color-text); + padding: 6px; + padding-top: 2px; + height: 30px; + } + +/*PE Import Dialog*/ + dialog#bedrock_model_select .search_bar { + margin-bottom: 6px; + } + #model_select_list li { + overflow: hidden; + cursor: pointer; + padding: 2px 0; + } + #model_select_list li.selected { + background-color: var(--color-selected); + color: var(--color-light); + } + #model_select_list li:hover { + color: var(--color-light); + } + #model_select_list li > * { + margin: 0; + margin-left: 12px; + cursor: inherit; + } + #model_select_list > li > label { + color: var(--color-subtle_text); + } + #model_select_list > li.selected > label { + color: var(--color-text); + } + +/* Screenshot */ + dialog#screenshot content { + color: var(--color-subtle_text); + } + dialog#screenshot content img { + border: 1px solid var(--color-accent); + max-width: 100%; + max-height: 60vh; + transform-origin: top left; + } + +/*Bedrock Bindings*/ + dialog#edit_bedrock_binding > .dialog_wrapper > .dialog_content { + overflow: visible; + } + +/*Keybind Recording*/ + #overlay_message_box { + height: 100%; + width: 100%; + position: absolute; + z-index: 130; + text-align: center; + background-color: rgba(0, 0, 0, 0.8); + } + #overlay_message_box > div { + margin-top: 64px; + width: 460px; + margin-left: auto; + margin-right: auto; + } + #overlay_message_box > div > p { + margin-bottom: 20px; + } + #overlay_message_box h3 i { + vertical-align: bottom; + margin: 3px 10px; + font-size: 1.2em; + } + #keybind_record_key_list { + width: 100%; + padding: 6px; + height: 38px; + background-color: var(--color-back); + border: 1px solid var(--color-border); + overflow: hidden; + white-space: nowrap; + pointer-events: none; + border-radius: 6px; + margin-bottom: 12px; + } + + .mouse_gesture_keybind_menu { + display: flex; + flex-direction: row; + flex-wrap: wrap; + border: 2px solid var(--color-border); + width: 220px; + padding: 12px; + border-radius: 6px; + position: relative; + left: -240px; + bottom: 130px; + } + .mouse_gesture_keybind_menu:hover { + background-color: var(--color-back); + border-color: transparent; + } + .mouse_gesture_keybind_menu > h3 { + flex-basis: 100%; + margin: 4px 0 6px 0; + } + .mouse_gesture_keybind_menu > div { + flex-basis: 80px; + flex-grow: 1; + display: none; + } + .mouse_gesture_keybind_menu:hover > div { + display: block; + } + .mouse_gesture_keybind_menu label { + margin-bottom: 4px; + display: block; + color: var(--color-subtle_text); + } + .mouse_gesture_option { + cursor: pointer; + border-radius: 5px; + width: 64px; + height: 58px; + margin: auto; + padding-top: 14px; + } + .mouse_gesture_option:hover { + background-color: var(--color-accent); + color: var(--color-accent_text); + } + .mouse_gesture_option > .icon { + font-size: 30px; + max-width: unset; + pointer-events: none; + } + +/*Plugin Menu*/ + dialog#plugins { + max-width: min(1400px, 100%); + height: calc(96% - 108px); + } + dialog#plugins .dialog_wrapper { + display: flex; + flex-direction: column; + flex-shrink: 1; + overflow: hidden; + } + dialog#plugins content.dialog_content { + margin: 0; + display: flex; + max-height: initial; + } + #plugin_browser_sidebar { + width: 38.2%; + flex-grow: 1; + display: flex; + flex-direction: column; + padding-top: 10px; + border-right: 1px solid var(--color-border); + } + #plugin_browser_page, + #plugin_browser_start_page { + width: 61.8%; + flex-grow: 1; + } + #plugin_browser_start_page { + overflow-y: auto; + padding: 16px 24px; + } + #plugin_browser_page { + display: flex; + flex-direction: column; + position: relative; + } + + .bar.next_to_title { + display: inline-block; + vertical-align: text-bottom; + } + .dialog.draggable .bar.next_to_title { + width: max-content; + margin-top: -30px; + margin-left: 111px; + float: left; + z-index: inherit; + } + #plugin_search_bar { + flex-grow: 1; + } + #plugins .tab_bar { + width: 100%; + margin-top: 10px; + } + #plugin_browser_sidebar > .pagination_numbers { + padding: 8px; + } + #plugin_list { + overflow-y: scroll; + } + #plugin_list > li { + overflow-y: hidden; + position: relative; + margin: 12px; + padding: 8px 12px; + padding-bottom: 12px; + margin-right: 2px; + border-radius: 6px; + cursor: pointer; + background-color: var(--color-ui); + box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); + } + #plugin_list > li.selected { + background-color: var(--color-button); + } + #plugin_list > li.incompatible { + color: var(--color-subtle_text); + } + body.theme_borders #plugin_list > li { + border: 1px solid var(--color-border); + margin: 0; + margin-bottom: -1px; + } + #plugin_list > li > div:first-child { + display: flex; + gap: 8px; + margin-bottom: 2px; + } + #plugin_list > li:hover:not(.incompatible) .title { + color: var(--color-light); + } + .plugin_icon_area { + flex: 0 0 48px; + padding-top: 2px; + text-align: center; + margin-left: -2px; + height: 52px; + } + .plugin_icon_area .icon { + font-size: 32px; + width: 48px; + max-width: unset; + margin-top: 8px; + display: inline-block; + } + .plugin_icon_area img.icon { + height: auto; + margin-top: 0; + } + .plugin_icon_area img { + border-radius: 8px; + pointer-events: none; + } + #plugin_list > li * { + cursor: inherit; + } + #plugin_list > li .button_bar { + height: auto; + float: right; + margin-left: -1px; + margin-top: 0; + text-align: right; + } + .plugin_compatibility_issue { + color: var(--color-error); + } + .plugin_deprecation_note { + color: var(--color-warning); + } + .plugin_compatibility_issue > .icon, + .plugin_deprecation_note > .icon { + vertical-align: text-bottom; + } + #plugin_list > li button { + min-width: 100px; + width: auto; + height: 36px; + float: right; + padding: 4px; + margin-left: -1px; + margin-top: 6px; + color: var(--color-text); + transition: width 100ms ease-in; + } + #plugin_list > li button > i { + float: left; + margin-top: 2px; + } + #plugin_list > li .title { + font-size: 1.34em; + } + + #plugin_list .plugin_version { + color: var(--color-subtle_text); + font-size: 0.9em; + margin-top: 14px; + float: left; + margin-left: 8px; + } + #plugin_list .author { + color: var(--color-subtle_text); + font-size: 0.9em; + clear: both; + } + #plugin_list .description { + font-size: 0.94em; + max-height: 148px; + margin-right: 12px; + } + .plugin_installed_tag, + .plugin_disabled_tag { + display: inline-block; + background-color: var(--color-back); + height: 25px; + padding: 1px 6px; + border-radius: 5px; + margin-left: 8px; + } + .plugin_installed_tag { + color: var(--color-confirm); + } + #plugin_list .plugin_installed_tag { + position: absolute; + right: 4px; + } + dialog#plugins .version { + display: inline-block; + color: var(--color-subtle_text); + background-color: var(--color-back); + font-size: 15px; + padding: 1px 6px; + border-radius: 5px; + letter-spacing: normal; + } + dialog#plugins .author { + color: var(--color-subtle_text); + margin-top: -6px; + } + #plugin_list > li ul.plugin_tag_list { + margin-top: 4px; + line-height: 0; + } + .plugin_tag_list li { + display: inline-block; + background-color: var(--color-accent); + color: var(--color-accent_text); + height: 25px; + padding: 1px 10px; + border-radius: 12px; + margin: 2px; + white-space: nowrap; + overflow: hidden; + line-height: normal; + cursor: pointer; + } + #plugin_list .plugin_tag_list li { + height: 22px; + font-size: 0.9em; + padding: 1px 9px; + } + .plugin_tag_list li.plugin_tag_source { + background-color: #ff7a52; + color: #111625; + } + .plugin_tag_list li.plugin_tag_mc { + background-color: #73e473; + color: #111625; + } + .plugin_tag_list li.plugin_tag_hytale { + background-color: #4a4297; + color: white; + } + .plugin_tag_list li.plugin_tag_deprecated { + background-color: #ff3467; + color: #000000; + } + .no_plugin_message { + text-align: center; + margin-top: 30px; + color: var(--color-subtle_text); + } + #plugin_browser_page .button_bar { + margin: 8px 0px; + float: right; + } + #plugin_browser_page .button_bar button { + height: 70px; + background-color: transparent; + margin: 0; + min-width: 72px; + width: auto; + margin-right: 0; + padding: 0 2px; + text-decoration: none; + box-shadow: none; + } + #plugin_browser_page .button_bar button:hover { + background-color: var(--color-accent); + } + #plugin_browser_page .button_bar button i { + display: block; + text-align: center; + width: 100%; + max-width: unset; + font-size: 35px; + text-decoration: none; + } + .plugin_dependencies { + color: var(--color-subtle_text); + margin: 10px 0; + } + .plugin_dependencies > a { + background-color: var(--color-back); + color: var(--color-text); + cursor: pointer; + padding: 1px 4px; + border-radius: 5px; + margin-left: 4px; + } + .plugin_dependencies > a:hover { + color: var(--color-light); + } + .disabled_plugin { + color: var(--color-subtle_text); + } + .plugin_browser_back_button { + padding: 5px 16px; + margin-top: 5px; + } + .plugin_browser_back_button > i { + vertical-align: text-bottom; + } + .plugin_browser_page_header { + padding: 16px 24px; + } + .plugin_browser_page_titlebar { + display: flex; + margin-bottom: 12px; + } + .plugin_browser_page_titlebar .plugin_icon_area { + flex-basis: 64px; + margin-top: 14px; + } + .plugin_browser_page_titlebar h1 { + margin: 0; + margin-top: 4px; + font-family: inherit; + font-weight: inherit; + } + #plugin_browser_page_tab_bar { + display: flex; + height: 32px; + width: 100%; + float: right; + padding: 0 20px; + } + #plugin_browser_page_tab_bar > li { + height: 100%; + margin: 0 5px; + padding: 2px 4px; + font-size: 1.2em; + overflow: hidden; + cursor: pointer; + } + #plugin_browser_page_tab_bar > li.selected { + border-bottom: 3px solid var(--color-accent); + } + #plugin_browser_page_tab_bar > li:hover { + color: var(--color-light); + } + #plugin_browser_page > .about { + overflow-y: auto; + padding: 16px 24px; + padding-top: 0; + } + #plugin_browser_page .about, #plugin_browser_page .description { + user-select: text; + } + #plugin_page_background_decoration { + pointer-events: none; + position: absolute; + color: black; + opacity: 0.1; + font-size: 700px; + text-align: center; + width: auto; + height: auto; + max-height: 614px; + max-width: 584px; + bottom: 0; + right: 0; + top: 0; + left: 0; + margin-left: auto; + margin-top: auto; + overflow: hidden; + max-width: unset; + } + .plugin_browser_tabbed_page { + padding: 8px 24px; + overflow-y: auto; + } + #plugin_browser_details tr:nth-child(even) { + background-color: var(--color-back); + } + #plugin_browser_details td { + padding: 5px 2px; + line-height: 20px; + } + #plugin_browser_changelog > li { + padding: 7px 8px; + user-select: text; + } + #plugin_browser_changelog h3 { + margin-bottom: 2px; + font-weight: 600; + padding-bottom: 0; + margin-bottom: 0; + } + #plugin_browser_changelog > li > ul { + margin-left: 8px; + } + #plugin_browser_changelog ul.plugin_changelog_features { + margin-left: 20px; + } + #plugin_browser_changelog ul.plugin_changelog_features > li { + list-style: circle; + } + #plugin_browser_changelog h4 { + margin-bottom: 2px; + } + #plugin_browser_changelog label.plugin_changelog_author { + color: var(--color-subtle_text); + font-size: 0.95em; + } + #plugin_browser_changelog label.plugin_changelog_date { + color: var(--color-subtle_text); + font-size: 0.95em; + margin-left: 8px; + } + #plugin_browser_changelog label.plugin_changelog_date > i { + vertical-align: sub; + font-size: 20px; + margin-right: 2px; + } + li.plugin_feature_entry { + display: flex; + gap: 8px; + padding-left: 4px; + min-height: 28px; + align-items: center; + } + li.plugin_feature_entry.clickable { + cursor: pointer; + } + li.plugin_feature_entry.clickable:hover { + color: var(--color-light); + } + li.plugin_feature_entry label { + white-space: nowrap; + cursor: inherit; + } + li.plugin_feature_entry > .description, + li.plugin_feature_entry > .extra_info { + color: var(--color-subtle_text); + margin-left: auto; + cursor: inherit; + overflow-wrap: anywhere; + } + + + #plugin_browser_start_page > img { + float: right; + width: 320px; + margin-bottom: -26px; + margin-top: -20px; + image-rendering: auto; + } + .plugins_suggested_row { + width: 100%; + clear: both; + margin-top: 30px; + } + .plugins_suggested_row > ul { + display: flex; + gap: 12px; + overflow-x: auto; + padding: 12px 32px; + width: calc(100% + 48px); + margin-right: -24px; + margin-left: -24px; + } + .plugins_suggested_row > ul > li { + width: 211px; + height: 130px; + text-align: center; + flex-shrink: 0; + flex-grow: 0; + overflow: hidden; + cursor: pointer; + padding: 4px 4px; + } + .plugins_suggested_row > ul > li:hover { + background-color: var(--color-button); + } + .plugins_suggested_row > ul > li * { + cursor: inherit; + } + .plugins_suggested_row > ul > li .title { + height: 50px; + display: flex; + flex-direction: column; + justify-content: center; + line-height: normal; + font-weight: 600; + } + +/* Search Bar */ + .search_bar { + float: right; + position: relative; + width: 220px; + } + .search_bar input { + float: right; + padding-right: 20px; + width: 100%; + transition: width 100ms ease; + } + .search_bar i { + float: right; + position: absolute; + right: 6px; + margin-top: 5px; + } + .search_bar.folded { + width: auto; + } + .search_bar.folded input { + width: 0px; + padding-left: 0; + padding-right: 0; + border-width: 0; + } + .search_bar.folded i:hover { + color: var(--color-light); + } + +/*Toolbar Dialog*/ + dialog#toolbar_edit .search_bar { + margin-top: 10px; + margin-bottom: 2px; + } + #bar_item_list { + max-height: 400px; + overflow-y: scroll; + min-height: 80px; + background-color: transparent; + } + #bar_item_list li { + padding: 4px; + height: 32px; + display: flex; + gap: 8px; + } + #bar_item_list li:hover { + color: var(--color-light); + } + #bar_item_list li div.icon_wrapper { + display: inline-block; + height: 26px; + vertical-align: text-top; + } + #bar_item_list li:not(:hover) div.icon_wrapper.add, #bar_item_list li:hover > .icon { + display: none; + } + #bar_items_current { + background-color: var(--color-back); + overflow: hidden; + height: auto; + min-height: 34px; + border: 1px solid var(--color-border); + } + #bar_items_current li { + min-width: 20px; + height: 30px; + cursor: move; + } + #bar_items_current li > * { + cursor: inherit; + } + #bar_items_current .toolbar_separator.border { + height: 32px; + width: 12px; + background: var(--color-border); + } + #bar_items_current .toolbar_separator.spacer { + width: 40px; + } + #bar_items_current .toolbar_separator.spacer::after { + content: ""; + border-bottom: 6px dotted var(--color-subtle_text); + display: block; + position: a; + height: 18px; + width: 32px; + } + #bar_items_current .toolbar_separator.linebreak { + height: 32px; + width: 20px; + background-color: var(--color-dark); + color: var(--color-subtle_text); + } + #bar_items_current .toolbar_separator.linebreak::after { + content: "¶"; + font-size: 22px; + margin-left: 4px; + } + +/*Action Control*/ + #action_selector { + position: absolute; + display: block; + z-index: 24; + right: 0; + left: 0; + margin-left: auto; + margin-right: auto; + top: 200px; + width: 400px; + height: 42px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.5); + } + body.is_mobile #action_selector { + top: 26px; + } + #action_selector > input { + width: calc(100% - 48px); + height: 100%; + padding: 5px; + padding-left: 12px; + border-left: 1px solid var(--color-border); + } + #action_selector > .tool { + height: 100%; + width: 44px; + margin: 0; + padding-top: 6px; + background-color: var(--color-back); + border-top-left-radius: inherit; + border-bottom-left-radius: inherit; + } + #action_selector > i { + position: absolute; + right: 12px; + top: 10px; + } + #action_selector > #action_selector_list { + background-color: var(--color-ui); + color: var(--color-text); + width: 340px; + margin-left: 45px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.5); + border-radius: 5px; + } + #action_selector ul { + background-color: var(--color-bright_ui); + color: var(--color-bright_ui_text); + min-height: 20px; + width: 100%; + max-height: 400px; + overflow-y: auto; + overflow-x: hidden; + border-radius: 5px; + } + #action_selector > #action_selector_list > div { + background-color: var(--color-ui); + color: var(--color-text); + height: auto; + padding: 5px; + font-size: 0.94em; + word-break: break-word; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + } + #action_selector ul > li { + height: 32px; + padding: 5px; + overflow: hidden; + display: flex; + white-space: nowrap; + } + #action_selector ul > li div.icon_wrapper { + flex-grow: 0; + flex-shrink: 0; + } + #action_selector ul > li span { + padding-left: 4px; + flex-grow: 1; + flex-shrink: 0; + } + #action_selector ul > li label { + font-size: 0.84em; + padding: 2px; + flex-grow: 0; + flex-shrink: 1; + } + #action_selector ul > li.selected { + background-color: var(--color-accent); + color: var(--color-accent_text); + } + #action_selector ul > li .icon { + width: 26px; + max-width: 26px; + text-align: center; + flex-shrink: 0; + } + .action_selector_type_overlay { + position: absolute; + color: transparent; + background-color: var(--color-ui); + height: 30px; + width: auto; + pointer-events: none; + opacity: 0.32; + top: 4px; + left: 49px; + padding-left: 8px; + padding-top: 6px; + } + +/* Quit */ + ul.unsaved_models_list { + max-height: 264px; + } + li.unsaved_model { + display: flex; + display: flex; + height: 40px; + align-items: center; + padding: 0 5px; + gap: 5px; + } + li.unsaved_model:hover { + color: var(--color-light); + } + li.unsaved_model:active { + background-color: var(--color-selected); + } + li.unsaved_model > .icon { + width: 32px; + text-align: center; + max-width: unset; + } + li.unsaved_model > span { + flex-grow: 1; + } + +/* Validator */ + li.validator_dialog_problem { + background-color: var(--color-back); + padding: 3px 5px; + margin-bottom: 5px; + display: flex; + overflow-wrap: anywhere; + align-items: center; + border-radius: 6px; + } + li.validator_dialog_problem.validator_warning > i { + color: var(--color-warning); + margin: 3px 4px; + flex-shrink: 0; + } + li.validator_dialog_problem.validator_error > i { + color: var(--color-error); + margin: 3px 4px; + flex-shrink: 0; + } + li.validator_dialog_problem span { + flex-grow: 1; + flex-shrink: 1; + padding-top: 3px; + user-select: text; + } + li.validator_dialog_problem .tool { + flex-shrink: 0; + flex-grow: 0; + } + +/* Edit History */ + #edit_history_list ul { + margin-left: 14px; + } + #edit_history_list ul li { + height: 30px; + padding: 2px 6px; + cursor: pointer; + border: 2px solid transparent; + display: flex; + gap: 5px; + } + #edit_history_list ul li.current { + border-color: var(--color-accent); + } + #edit_history_list ul li:hover { + color: var(--color-light); + } + #edit_history_list ul li.selected { + background-color: var(--color-accent); + color: var(--color-accent_text); + position: relative; + } + #edit_history_list ul li.selected:not(:first-of-type)::before { + content: "\f04b"; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; + font-size: 14px; + color: var(--color-accent); + display: block; + position: absolute; + top: -11px; + left: -16px; + } + #edit_history_list .edit_history_time { + color: var(--color-subtle_text); + } + #edit_history_list > ul > li label { + margin-right: auto; + } + #edit_history_list ul li.selected .edit_history_time { + color: inherit; + } + +/* View Backups */ + ul#view_backups_list { + max-height: calc(95vh - 220px); + margin-top: 8px; + margin-bottom: 8px; + } + ul#view_backups_list > li { + padding: 2px 6px; + cursor: pointer; + border: 2px solid transparent; + display: flex; + justify-content: space-between; + flex-wrap: wrap; + } + ul#view_backups_list > li.current { + border-color: var(--color-accent); + } + ul#view_backups_list > li:hover { + color: var(--color-light); + } + ul#view_backups_list > li.selected { + background-color: var(--color-accent); + color: var(--color-accent_text); + position: relative; + } + #view_backups_list span { + flex-grow: 1; + } + #view_backups_list .view_backups_info_field { + color: var(--color-subtle_text); + width: 90px; + white-space: nowrap; + overflow: hidden; + cursor: inherit; + text-align: right; + } + #view_backups_list .view_backups_info_field:last-child { + width: 82px; + } + ul#view_backups_list > li.selected .view_backups_info_field { + color: inherit; + } + + ol.pagination_numbers { + display: flex; + gap: 3px; + justify-content: center; + } + ol.pagination_numbers > li { + border-radius: 3px; + cursor: pointer; + padding: 0px 7px; + min-width: 22px; + } + ol.pagination_numbers > li:hover, ol.pagination_numbers > li.selected { + background-color: var(--color-accent); + color: var(--color-accent_text); + } +/* Collection properties */ + #collection_properties_vue > ul.list { + max-height: 200px; + display: flex; + flex-wrap: wrap; + padding: 6px; + } + #collection_properties_vue > ul > li { + display: flex; + gap: 4px; + align-items: center; + border-radius: 6px; + background-color: var(--color-ui); + height: 27px; + padding: 0 7px; + margin: 2px; + min-width: 149px; + } + #collection_properties_vue > ul > li.selected { + background-color: var(--color-selected); + } + #collection_properties_vue > ul > li > i { + scale: 0.9; + } + #collection_properties_vue > ul > li > i.fa_big { + transform-origin: bottom; + } + +/* Custom Brush Options */ + dialog#brush_options:not(.preset_selected) div.form_bar, + dialog#brush_options:not(.preset_selected) hr { + display: none !important; + } + ul#brush_preset_bar { + display: flex; + overflow-y: hidden; + overflow-x: auto; + margin-bottom: 26px; + background-color: var(--color-back); + } + ul#brush_preset_bar > li { + flex-grow: 0; + flex-shrink: 0; + width: 40px; + height: 40px; + padding: 8px 4px; + text-align: center; + cursor: pointer; + } + ul#brush_preset_bar > li * { + pointer-events: none; + } + ul#brush_preset_bar > li:hover { + color: var(--color-light); + } + ul#brush_preset_bar > li.selected { + border-bottom: 3px solid var(--color-accent); + } + ul#brush_preset_bar > li:last-child { + position: sticky; + right: 0; + background: var(--color-back); + } +/* Animation import */ + dialog#animation_import .form_bar__path { + padding: 2px; + color: var(--color-subtle_text); + overflow-x: auto; + white-space: nowrap; + text-align: right; + direction: rtl; + } + dialog#recover_backup .dialog_wrapper, + dialog#animation_import .dialog_wrapper, + dialog#animation_export .dialog_wrapper { + max-height: calc(100vh - 90px); + display: flex; + flex-direction: column; + } +/* Animation Controller curves */ + + dialog#blend_transition_edit .blend_transition_graph_wrapper { + margin-top: 6px; + margin-bottom: 10px; + display: flex; + } + #blend_transition_graph { + background-color: var(--color-back); + border: 1px solid var(--color-border); + position: relative; + overflow: hidden; + cursor: crosshair; + } + #blend_transition_graph svg { + height: 100%; + width: 100%; + pointer-events: none; + } + #blend_transition_graph svg path { + fill: none; + stroke-width: 2px; + stroke: var(--color-accent); + } + #blend_transition_graph svg path.zero_lines { + fill: none; + stroke-width: 1px; + stroke: var(--color-grid); + } + .blend_transition_graph_point { + position: absolute; + width: 11px; + height: 11px; + background-color: var(--color-accent); + margin: -1px; + transform: rotate(45deg); + transform-origin: center; + } + .blend_transition_graph_point:hover { + background-color: var(--color-light); + } + .blend_transition_graph_point::before { + content: ""; + position: absolute; + width: 24px; + height: 24px; + left: -6px; + top: -6px; + cursor: move; + } + .blend_transition_preview { + width: 12px; + height: auto; + position: relative; + background-color: var(--color-back); + margin-left: 8px; + overflow: hidden; + } + .blend_transition_preview > div { + background-color: var(--color-accent); + position: absolute; + height: calc(var(--progress) * 100%); + width: 100%; + bottom: 0; + left: 0; + right: 0; + } +/* Molang */ + dialog#expression_editor .dialog_content { + overflow: unset; + } + +/* Texture Edit */ + div.texture_adjust_previews { + overflow: auto; + max-height: 416px; + display: flex; + margin-bottom: 10px; + width: calc(100% - 38px); + float: left; + } + div.texture_adjust_previews.folded { + max-height: 30px; + overflow: hidden; + } + div.texture_adjust_previews img, div.texture_adjust_previews canvas { + max-height: 400px; + width: 400px; + margin: auto; + } + dialog .slider_input_combo { + clear: both; + } + .form_label_compact { + display: block; + margin-bottom: -3px; + font-size: 0.94em; + } + .bar.button_bar_checkbox { + position: absolute; + bottom: 14px; + display: flex; + align-items: center; + z-index: 1; + } + dialog#adjust_curves .dialog_content { + margin-top: 6px; + margin-bottom: 10px; + } + #contrast_graph { + background-color: var(--color-back); + border: 1px solid var(--color-border); + height: 412px; + width: 412px; + position: relative; + overflow: hidden; + cursor: crosshair; + } + .contrast_graph_selector { + clear: both; + display: flex; + } + .contrast_graph_selector > div { + flex-basis: 0; + flex-grow: 1; + padding-top: 2px; + text-align: center; + cursor: pointer; + } + .contrast_graph_selector > div:hover { + color: var(--color-light); + } + .contrast_graph_selector > div.selected { + background-color: var(--color-accent); + color: var(--color-accent_text); + } + #contrast_graph svg { + height: 100%; + width: 100%; + pointer-events: none; + } + #contrast_graph svg path { + fill: none; + stroke-width: 2px; + stroke: var(--color-accent); + opacity: 0.3; + } + #contrast_graph svg path.active { + opacity: 1.0; + } + #contrast_graph svg polygon { + fill: var(--color-selected); + stroke: none; + stroke-width: 0; + pointer-events: none; + } + .contrast_graph_point { + position: absolute; + width: 12px; + height: 12px; + border-radius: 50%; + background-color: var(--color-accent); + margin: -1px; + } + .contrast_graph_point:hover { + background-color: var(--color-light); + } + .contrast_graph_point::before { + content: ""; + position: absolute; + width: 24px; + height: 24px; + left: -6px; + top: -6px; + cursor: move; + } +/*Flipbook texture editor*/ + dialog#animated_texture_editor .dialog_content { + margin-bottom: 0; + } + #flipbook_editor { + display: flex; + flex-direction: row; + max-height: calc(100vh - 230px); + } + body.is_mobile #flipbook_editor { + flex-direction: column-reverse; + overflow-y: auto; + align-items: center; + } + .flipbook_frame_preview { + width: auto; + flex-grow: 1; + display: flex; + flex-direction: column; + justify-content: center; + } + .flipbook_frame_preview > div:first-child { + display: flex; + justify-content: center; + } + .flipbook_frame_preview > div.flipbook_controls { + display: flex; + justify-content: center; + align-items: center; + } + .flipbook_frame_preview > div.flipbook_options { + display: flex; + align-items: center; + gap: 8px; + border-top: 1px solid var(--color-border); + padding-top: 6px; + margin-top: 6px; + margin-right: 12px; + margin-left: 12px; + } + .flipbook_frame_preview > div.flipbook_options > .numeric_input { + width: 70px; + flex-grow: 0; + margin-left: 4px; + } + .flipbook_frame_preview img { + width: 512px; + max-width: 100%; + max-height: calc(var(--dialog-height) - 156px); + } + + .flipbook_frame_timeline { + width: 160px; + flex-grow: 0; + flex-shrink: 0; + display: flex; + flex-direction: column; + gap: 6px; + } + .flipbook_frame_timeline > button { + flex-shrink: 0; + } + .flipbook_frame_timeline > ul { + overflow-y: scroll; + min-height: 300px; + padding-right: 12px; + flex-grow: 1; + } + .flipbook_frame { + display: flex; + align-items: center; + cursor: pointer; + padding: 2px; + position: relative; + } + .flipbook_frame:hover { + color: var(--color-light); + background-color: var(--color-back); + } + .flipbook_frame.viewing::before { + content: ""; + position: absolute; + left: 0; + top: 10px; + bottom: 10px; + border-top: 40px solid transparent; + border-bottom: 40px solid transparent; + border-left: 8px solid var(--color-accent); + } + .flipbook_frame.viewing { + background-color: var(--color-back); + } + .flipbook_frame.selected { + background-color: var(--color-accent); + color: var(--color-accent_text); + } + .flipbook_frame > img { + cursor: inherit; + pointer-events: none; + } + .flipbook_frame > label { + cursor: inherit; + width: 28px; + flex-grow: 1; + flex-shrink: 0; + text-align: center; + } + #flipbook_editor_timeline { + display: flex; + position: relative; + height: 16px; + width: calc(100% - 43px); + margin-right: auto; + margin-left: auto; + margin-top: 5px; + padding-left: 0px; + padding-right: 2px; + border-bottom: 2px solid var(--color-border); + border-top: 2px solid var(--color-border); + } + #flipbook_editor_timeline .frame { + flex-grow: 1; + width: 1px; + height: 12px; + border-left: 2px solid var(--color-ui); + background-color: var(--color-back); + pointer-events: none; + cursor: ew-resize; + } + #flipbook_editor_timeline #flipbook_editor_playhead { + position: absolute; + height: 100%; + border-style: solid; + border-width: 8px; + border-color: transparent; + border-top-color: var(--color-accent); + border-radius: 3px; + margin-left: -7px; + margin-top: -2px; + pointer-events: none; + } + #flipbook_editor_timeline #flipbook_editor_playhead::before { + position: absolute; + content: ""; + height: 8px; + border-left: 2px solid var(--color-accent); + top: -2px; + left: -1px; + } + .code_editor_file_title { + background-color: var(--color-back); + padding-left: 12px; + padding-top: 2px; + color: var(--color-subtle_text); + user-select: text; + } +/* Export Collision */ + dialog#generate_bedrock_collision_box textarea.code { + color: #a2ebff; + } + +/* Predicate Overrides */ + .predicate_override_top_bar { + margin-bottom: 22px; + } + .predicate_override_top_bar > span { + max-width: calc(100% - 240px); + display: inline-block; + color: var(--color-subtle_text); + } + dialog#predicate_overrides .bar.flex div { + flex: 1 1 0; + padding: 0 10px; + text-align: center; + color: var(--color-subtle_text); + } + #predicate_override_list > li { + background-color: var(--color-ui); + display: flex; + margin: 8px; + } + #predicate_override_list .predicate { + display: flex; + } + #predicate_override_list .predicate_model { + width: 50px; + flex-grow: 1; + padding: 4px; + } + #predicate_override_list .predicate_model input { + width: 100%; + } + #predicate_override_list .predicate_model .tool { + float: right; + } + #predicate_override_list > li > .tool { + margin: 4px; + } + #predicate_override_list .predicate_list { + flex-grow: 1; + width: 100px; + position: relative; + } + #predicate_override_list .predicate_list li { + display: flex; + gap: 6px; + padding: 4px; + } + #predicate_override_list .predicate_list > li > .bb-select { + flex-grow: 1; + } + #predicate_override_list .predicate_list .numeric_input { + max-width: 100px; + } + #predicate_override_list .predicate_list > li .tool { + width: 28px; + } + .predicate_drag_handle { + width: 18px; + cursor: move; + flex-shrink: 0; + background-color: var(--color-button); + } + #predicate_override_list .predicate_list > .tool { + position: absolute; + bottom: 4px; + left: -32px; + } + #predicate_override_add { + overflow: hidden; + display: flex; + gap: 4px; + } + #predicate_override_add button { + overflow: hidden; + flex-grow: 1; + } + #predicate_override_generator { + margin-top: 10px; + display: flex; + border: 1px solid var(--color-accent); + height: 46px; + padding: 7px 4px; + } + #predicate_override_generator .bb-select { + flex-grow: 1; + } + #predicate_override_generator label { + padding: 3px 4px; + margin-left: 8px; + white-space: nowrap; + } + + #tab_overview { + z-index: 21; + display: flex; + width: max(600px, 80%); + max-width: 100%; + margin: auto; + top: 0; + bottom: 0; + right: 0; + left: 0; + pointer-events: none; + flex-direction: column; + align-items: center; + } + #tab_overview_search .search_bar { + top: 130px; + pointer-events: all; + box-shadow: 0 0 0 2px var(--color-accent); + width: min(100vw, 326px); + border-radius: 5px; + } + #tab_overview_grid { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 16px; + margin: auto; + max-width: 100%; + max-height: 86%; + overflow-y: auto; + pointer-events: all; + } + #tab_overview_grid > li { + width: 300px; + height: 220px; + text-align: center; + background-color: var(--color-back); + cursor: pointer; + padding: 0 10px; + box-shadow: 0 0px 28px rgb(0 0 0 / 24%); + border-radius: 8px; + } + #tab_overview_grid > li:hover { + color: var(--color-light); + background-color: var(--color-ui); + } + #tab_overview_grid > li img { + max-width: 100%; + height: calc(100% - 30px); + display: block; + margin: auto; + cursor: inherit; + object-fit: contain; + image-rendering: auto; + } + #tab_overview_grid > li.pixel_art img { + image-rendering: pixelated; + } + #tab_overview_grid > li label { + cursor: inherit; + } +} diff --git a/nonpacks/static/vendor/blockbench/css/fontawesome.css b/nonpacks/static/vendor/blockbench/css/fontawesome.css new file mode 100644 index 0000000..aa67099 --- /dev/null +++ b/nonpacks/static/vendor/blockbench/css/fontawesome.css @@ -0,0 +1,7820 @@ +/*! + * Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +@layer lib { + .fa { + font-family: var(--fa-style-family, "Font Awesome 6 Free"); + font-weight: var(--fa-style, 900); } + +.fa-solid, +.fa-regular, +.fa-brands, +.fas, +.far, +.fab, +.fa-sharp-solid, +.fa-classic, +.fa { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: var(--fa-display, inline-block); + font-style: normal; + font-variant: normal; + line-height: 1; + text-rendering: auto; } + +.fas, +.fa-classic, +.fa-solid, +.far, +.fa-regular { + font-family: 'Font Awesome 6 Free'; } + +.fab, +.fa-brands { + font-family: 'Font Awesome 6 Brands'; } + +.fa-1x { + font-size: 1em; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-6x { + font-size: 6em; } + +.fa-7x { + font-size: 7em; } + +.fa-8x { + font-size: 8em; } + +.fa-9x { + font-size: 9em; } + +.fa-10x { + font-size: 10em; } + +.fa-2xs { + font-size: 0.625em; + line-height: 0.1em; + vertical-align: 0.225em; } + +.fa-xs { + font-size: 0.75em; + line-height: 0.08333em; + vertical-align: 0.125em; } + +.fa-sm { + font-size: 0.875em; + line-height: 0.07143em; + vertical-align: 0.05357em; } + +.fa-lg { + font-size: 1.25em; + line-height: 0.05em; + vertical-align: -0.075em; } + +.fa-xl { + font-size: 1.5em; + line-height: 0.04167em; + vertical-align: -0.125em; } + +.fa-2xl { + font-size: 2em; + line-height: 0.03125em; + vertical-align: -0.1875em; } + +.fa-fw { + text-align: center; + width: 1.25em; } + +.fa-ul { + list-style-type: none; + margin-left: var(--fa-li-margin, 2.5em); + padding-left: 0; } + .fa-ul > li { + position: relative; } + +.fa-li { + left: calc(-1 * var(--fa-li-width, 2em)); + position: absolute; + text-align: center; + width: var(--fa-li-width, 2em); + line-height: inherit; } + +.fa-border { + border-color: var(--fa-border-color, #eee); + border-radius: var(--fa-border-radius, 0.1em); + border-style: var(--fa-border-style, solid); + border-width: var(--fa-border-width, 0.08em); + padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); } + +.fa-pull-left { + float: left; + margin-right: var(--fa-pull-margin, 0.3em); } + +.fa-pull-right { + float: right; + margin-left: var(--fa-pull-margin, 0.3em); } + +.fa-beat { + animation-name: fa-beat; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, ease-in-out); } + +.fa-bounce { + animation-name: fa-bounce; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); } + +.fa-fade { + animation-name: fa-fade; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } + +.fa-beat-fade { + animation-name: fa-beat-fade; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } + +.fa-flip { + animation-name: fa-flip; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, ease-in-out); } + +.fa-shake { + animation-name: fa-shake; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, linear); } + +.fa-spin { + animation-name: fa-spin; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 2s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, linear); } + +.fa-spin-reverse { + --fa-animation-direction: reverse; } + +.fa-pulse, +.fa-spin-pulse { + animation-name: fa-spin; + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, steps(8)); } + +@media (prefers-reduced-motion: reduce) { + .fa-beat, + .fa-bounce, + .fa-fade, + .fa-beat-fade, + .fa-flip, + .fa-pulse, + .fa-shake, + .fa-spin, + .fa-spin-pulse { + animation-delay: -1ms; + animation-duration: 1ms; + animation-iteration-count: 1; + transition-delay: 0s; + transition-duration: 0s; } } + +@keyframes fa-beat { + 0%, 90% { + transform: scale(1); } + 45% { + transform: scale(var(--fa-beat-scale, 1.25)); } } + +@keyframes fa-bounce { + 0% { + transform: scale(1, 1) translateY(0); } + 10% { + transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); } + 30% { + transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); } + 50% { + transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); } + 57% { + transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); } + 64% { + transform: scale(1, 1) translateY(0); } + 100% { + transform: scale(1, 1) translateY(0); } } + +@keyframes fa-fade { + 50% { + opacity: var(--fa-fade-opacity, 0.4); } } + +@keyframes fa-beat-fade { + 0%, 100% { + opacity: var(--fa-beat-fade-opacity, 0.4); + transform: scale(1); } + 50% { + opacity: 1; + transform: scale(var(--fa-beat-fade-scale, 1.125)); } } + +@keyframes fa-flip { + 50% { + transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } } + +@keyframes fa-shake { + 0% { + transform: rotate(-15deg); } + 4% { + transform: rotate(15deg); } + 8%, 24% { + transform: rotate(-18deg); } + 12%, 28% { + transform: rotate(18deg); } + 16% { + transform: rotate(-22deg); } + 20% { + transform: rotate(22deg); } + 32% { + transform: rotate(-12deg); } + 36% { + transform: rotate(12deg); } + 40%, 100% { + transform: rotate(0deg); } } + +@keyframes fa-spin { + 0% { + transform: rotate(0deg); } + 100% { + transform: rotate(360deg); } } + +.fa-rotate-90 { + transform: rotate(90deg); } + +.fa-rotate-180 { + transform: rotate(180deg); } + +.fa-rotate-270 { + transform: rotate(270deg); } + +.fa-flip-horizontal { + transform: scale(-1, 1); } + +.fa-flip-vertical { + transform: scale(1, -1); } + +.fa-flip-both, +.fa-flip-horizontal.fa-flip-vertical { + transform: scale(-1, -1); } + +.fa-rotate-by { + transform: rotate(var(--fa-rotate-angle, 0)); } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2.5em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; + z-index: var(--fa-stack-z-index, auto); } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: var(--fa-inverse, #fff); } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ + +.fa-0::before { + content: "\30"; } + +.fa-1::before { + content: "\31"; } + +.fa-2::before { + content: "\32"; } + +.fa-3::before { + content: "\33"; } + +.fa-4::before { + content: "\34"; } + +.fa-5::before { + content: "\35"; } + +.fa-6::before { + content: "\36"; } + +.fa-7::before { + content: "\37"; } + +.fa-8::before { + content: "\38"; } + +.fa-9::before { + content: "\39"; } + +.fa-fill-drip::before { + content: "\f576"; } + +.fa-arrows-to-circle::before { + content: "\e4bd"; } + +.fa-circle-chevron-right::before { + content: "\f138"; } + +.fa-chevron-circle-right::before { + content: "\f138"; } + +.fa-at::before { + content: "\40"; } + +.fa-trash-can::before { + content: "\f2ed"; } + +.fa-trash-alt::before { + content: "\f2ed"; } + +.fa-text-height::before { + content: "\f034"; } + +.fa-user-xmark::before { + content: "\f235"; } + +.fa-user-times::before { + content: "\f235"; } + +.fa-stethoscope::before { + content: "\f0f1"; } + +.fa-message::before { + content: "\f27a"; } + +.fa-comment-alt::before { + content: "\f27a"; } + +.fa-info::before { + content: "\f129"; } + +.fa-down-left-and-up-right-to-center::before { + content: "\f422"; } + +.fa-compress-alt::before { + content: "\f422"; } + +.fa-explosion::before { + content: "\e4e9"; } + +.fa-file-lines::before { + content: "\f15c"; } + +.fa-file-alt::before { + content: "\f15c"; } + +.fa-file-text::before { + content: "\f15c"; } + +.fa-wave-square::before { + content: "\f83e"; } + +.fa-ring::before { + content: "\f70b"; } + +.fa-building-un::before { + content: "\e4d9"; } + +.fa-dice-three::before { + content: "\f527"; } + +.fa-calendar-days::before { + content: "\f073"; } + +.fa-calendar-alt::before { + content: "\f073"; } + +.fa-anchor-circle-check::before { + content: "\e4aa"; } + +.fa-building-circle-arrow-right::before { + content: "\e4d1"; } + +.fa-volleyball::before { + content: "\f45f"; } + +.fa-volleyball-ball::before { + content: "\f45f"; } + +.fa-arrows-up-to-line::before { + content: "\e4c2"; } + +.fa-sort-down::before { + content: "\f0dd"; } + +.fa-sort-desc::before { + content: "\f0dd"; } + +.fa-circle-minus::before { + content: "\f056"; } + +.fa-minus-circle::before { + content: "\f056"; } + +.fa-door-open::before { + content: "\f52b"; } + +.fa-right-from-bracket::before { + content: "\f2f5"; } + +.fa-sign-out-alt::before { + content: "\f2f5"; } + +.fa-atom::before { + content: "\f5d2"; } + +.fa-soap::before { + content: "\e06e"; } + +.fa-icons::before { + content: "\f86d"; } + +.fa-heart-music-camera-bolt::before { + content: "\f86d"; } + +.fa-microphone-lines-slash::before { + content: "\f539"; } + +.fa-microphone-alt-slash::before { + content: "\f539"; } + +.fa-bridge-circle-check::before { + content: "\e4c9"; } + +.fa-pump-medical::before { + content: "\e06a"; } + +.fa-fingerprint::before { + content: "\f577"; } + +.fa-hand-point-right::before { + content: "\f0a4"; } + +.fa-magnifying-glass-location::before { + content: "\f689"; } + +.fa-search-location::before { + content: "\f689"; } + +.fa-forward-step::before { + content: "\f051"; } + +.fa-step-forward::before { + content: "\f051"; } + +.fa-face-smile-beam::before { + content: "\f5b8"; } + +.fa-smile-beam::before { + content: "\f5b8"; } + +.fa-flag-checkered::before { + content: "\f11e"; } + +.fa-football::before { + content: "\f44e"; } + +.fa-football-ball::before { + content: "\f44e"; } + +.fa-school-circle-exclamation::before { + content: "\e56c"; } + +.fa-crop::before { + content: "\f125"; } + +.fa-angles-down::before { + content: "\f103"; } + +.fa-angle-double-down::before { + content: "\f103"; } + +.fa-users-rectangle::before { + content: "\e594"; } + +.fa-people-roof::before { + content: "\e537"; } + +.fa-people-line::before { + content: "\e534"; } + +.fa-beer-mug-empty::before { + content: "\f0fc"; } + +.fa-beer::before { + content: "\f0fc"; } + +.fa-diagram-predecessor::before { + content: "\e477"; } + +.fa-arrow-up-long::before { + content: "\f176"; } + +.fa-long-arrow-up::before { + content: "\f176"; } + +.fa-fire-flame-simple::before { + content: "\f46a"; } + +.fa-burn::before { + content: "\f46a"; } + +.fa-person::before { + content: "\f183"; } + +.fa-male::before { + content: "\f183"; } + +.fa-laptop::before { + content: "\f109"; } + +.fa-file-csv::before { + content: "\f6dd"; } + +.fa-menorah::before { + content: "\f676"; } + +.fa-truck-plane::before { + content: "\e58f"; } + +.fa-record-vinyl::before { + content: "\f8d9"; } + +.fa-face-grin-stars::before { + content: "\f587"; } + +.fa-grin-stars::before { + content: "\f587"; } + +.fa-bong::before { + content: "\f55c"; } + +.fa-spaghetti-monster-flying::before { + content: "\f67b"; } + +.fa-pastafarianism::before { + content: "\f67b"; } + +.fa-arrow-down-up-across-line::before { + content: "\e4af"; } + +.fa-spoon::before { + content: "\f2e5"; } + +.fa-utensil-spoon::before { + content: "\f2e5"; } + +.fa-jar-wheat::before { + content: "\e517"; } + +.fa-envelopes-bulk::before { + content: "\f674"; } + +.fa-mail-bulk::before { + content: "\f674"; } + +.fa-file-circle-exclamation::before { + content: "\e4eb"; } + +.fa-circle-h::before { + content: "\f47e"; } + +.fa-hospital-symbol::before { + content: "\f47e"; } + +.fa-pager::before { + content: "\f815"; } + +.fa-address-book::before { + content: "\f2b9"; } + +.fa-contact-book::before { + content: "\f2b9"; } + +.fa-strikethrough::before { + content: "\f0cc"; } + +.fa-k::before { + content: "\4b"; } + +.fa-landmark-flag::before { + content: "\e51c"; } + +.fa-pencil::before { + content: "\f303"; } + +.fa-pencil-alt::before { + content: "\f303"; } + +.fa-backward::before { + content: "\f04a"; } + +.fa-caret-right::before { + content: "\f0da"; } + +.fa-comments::before { + content: "\f086"; } + +.fa-paste::before { + content: "\f0ea"; } + +.fa-file-clipboard::before { + content: "\f0ea"; } + +.fa-code-pull-request::before { + content: "\e13c"; } + +.fa-clipboard-list::before { + content: "\f46d"; } + +.fa-truck-ramp-box::before { + content: "\f4de"; } + +.fa-truck-loading::before { + content: "\f4de"; } + +.fa-user-check::before { + content: "\f4fc"; } + +.fa-vial-virus::before { + content: "\e597"; } + +.fa-sheet-plastic::before { + content: "\e571"; } + +.fa-blog::before { + content: "\f781"; } + +.fa-user-ninja::before { + content: "\f504"; } + +.fa-person-arrow-up-from-line::before { + content: "\e539"; } + +.fa-scroll-torah::before { + content: "\f6a0"; } + +.fa-torah::before { + content: "\f6a0"; } + +.fa-broom-ball::before { + content: "\f458"; } + +.fa-quidditch::before { + content: "\f458"; } + +.fa-quidditch-broom-ball::before { + content: "\f458"; } + +.fa-toggle-off::before { + content: "\f204"; } + +.fa-box-archive::before { + content: "\f187"; } + +.fa-archive::before { + content: "\f187"; } + +.fa-person-drowning::before { + content: "\e545"; } + +.fa-arrow-down-9-1::before { + content: "\f886"; } + +.fa-sort-numeric-desc::before { + content: "\f886"; } + +.fa-sort-numeric-down-alt::before { + content: "\f886"; } + +.fa-face-grin-tongue-squint::before { + content: "\f58a"; } + +.fa-grin-tongue-squint::before { + content: "\f58a"; } + +.fa-spray-can::before { + content: "\f5bd"; } + +.fa-truck-monster::before { + content: "\f63b"; } + +.fa-w::before { + content: "\57"; } + +.fa-earth-africa::before { + content: "\f57c"; } + +.fa-globe-africa::before { + content: "\f57c"; } + +.fa-rainbow::before { + content: "\f75b"; } + +.fa-circle-notch::before { + content: "\f1ce"; } + +.fa-tablet-screen-button::before { + content: "\f3fa"; } + +.fa-tablet-alt::before { + content: "\f3fa"; } + +.fa-paw::before { + content: "\f1b0"; } + +.fa-cloud::before { + content: "\f0c2"; } + +.fa-trowel-bricks::before { + content: "\e58a"; } + +.fa-face-flushed::before { + content: "\f579"; } + +.fa-flushed::before { + content: "\f579"; } + +.fa-hospital-user::before { + content: "\f80d"; } + +.fa-tent-arrow-left-right::before { + content: "\e57f"; } + +.fa-gavel::before { + content: "\f0e3"; } + +.fa-legal::before { + content: "\f0e3"; } + +.fa-binoculars::before { + content: "\f1e5"; } + +.fa-microphone-slash::before { + content: "\f131"; } + +.fa-box-tissue::before { + content: "\e05b"; } + +.fa-motorcycle::before { + content: "\f21c"; } + +.fa-bell-concierge::before { + content: "\f562"; } + +.fa-concierge-bell::before { + content: "\f562"; } + +.fa-pen-ruler::before { + content: "\f5ae"; } + +.fa-pencil-ruler::before { + content: "\f5ae"; } + +.fa-people-arrows::before { + content: "\e068"; } + +.fa-people-arrows-left-right::before { + content: "\e068"; } + +.fa-mars-and-venus-burst::before { + content: "\e523"; } + +.fa-square-caret-right::before { + content: "\f152"; } + +.fa-caret-square-right::before { + content: "\f152"; } + +.fa-scissors::before { + content: "\f0c4"; } + +.fa-cut::before { + content: "\f0c4"; } + +.fa-sun-plant-wilt::before { + content: "\e57a"; } + +.fa-toilets-portable::before { + content: "\e584"; } + +.fa-hockey-puck::before { + content: "\f453"; } + +.fa-table::before { + content: "\f0ce"; } + +.fa-magnifying-glass-arrow-right::before { + content: "\e521"; } + +.fa-tachograph-digital::before { + content: "\f566"; } + +.fa-digital-tachograph::before { + content: "\f566"; } + +.fa-users-slash::before { + content: "\e073"; } + +.fa-clover::before { + content: "\e139"; } + +.fa-reply::before { + content: "\f3e5"; } + +.fa-mail-reply::before { + content: "\f3e5"; } + +.fa-star-and-crescent::before { + content: "\f699"; } + +.fa-house-fire::before { + content: "\e50c"; } + +.fa-square-minus::before { + content: "\f146"; } + +.fa-minus-square::before { + content: "\f146"; } + +.fa-helicopter::before { + content: "\f533"; } + +.fa-compass::before { + content: "\f14e"; } + +.fa-square-caret-down::before { + content: "\f150"; } + +.fa-caret-square-down::before { + content: "\f150"; } + +.fa-file-circle-question::before { + content: "\e4ef"; } + +.fa-laptop-code::before { + content: "\f5fc"; } + +.fa-swatchbook::before { + content: "\f5c3"; } + +.fa-prescription-bottle::before { + content: "\f485"; } + +.fa-bars::before { + content: "\f0c9"; } + +.fa-navicon::before { + content: "\f0c9"; } + +.fa-people-group::before { + content: "\e533"; } + +.fa-hourglass-end::before { + content: "\f253"; } + +.fa-hourglass-3::before { + content: "\f253"; } + +.fa-heart-crack::before { + content: "\f7a9"; } + +.fa-heart-broken::before { + content: "\f7a9"; } + +.fa-square-up-right::before { + content: "\f360"; } + +.fa-external-link-square-alt::before { + content: "\f360"; } + +.fa-face-kiss-beam::before { + content: "\f597"; } + +.fa-kiss-beam::before { + content: "\f597"; } + +.fa-film::before { + content: "\f008"; } + +.fa-ruler-horizontal::before { + content: "\f547"; } + +.fa-people-robbery::before { + content: "\e536"; } + +.fa-lightbulb::before { + content: "\f0eb"; } + +.fa-caret-left::before { + content: "\f0d9"; } + +.fa-circle-exclamation::before { + content: "\f06a"; } + +.fa-exclamation-circle::before { + content: "\f06a"; } + +.fa-school-circle-xmark::before { + content: "\e56d"; } + +.fa-arrow-right-from-bracket::before { + content: "\f08b"; } + +.fa-sign-out::before { + content: "\f08b"; } + +.fa-circle-chevron-down::before { + content: "\f13a"; } + +.fa-chevron-circle-down::before { + content: "\f13a"; } + +.fa-unlock-keyhole::before { + content: "\f13e"; } + +.fa-unlock-alt::before { + content: "\f13e"; } + +.fa-cloud-showers-heavy::before { + content: "\f740"; } + +.fa-headphones-simple::before { + content: "\f58f"; } + +.fa-headphones-alt::before { + content: "\f58f"; } + +.fa-sitemap::before { + content: "\f0e8"; } + +.fa-circle-dollar-to-slot::before { + content: "\f4b9"; } + +.fa-donate::before { + content: "\f4b9"; } + +.fa-memory::before { + content: "\f538"; } + +.fa-road-spikes::before { + content: "\e568"; } + +.fa-fire-burner::before { + content: "\e4f1"; } + +.fa-flag::before { + content: "\f024"; } + +.fa-hanukiah::before { + content: "\f6e6"; } + +.fa-feather::before { + content: "\f52d"; } + +.fa-volume-low::before { + content: "\f027"; } + +.fa-volume-down::before { + content: "\f027"; } + +.fa-comment-slash::before { + content: "\f4b3"; } + +.fa-cloud-sun-rain::before { + content: "\f743"; } + +.fa-compress::before { + content: "\f066"; } + +.fa-wheat-awn::before { + content: "\e2cd"; } + +.fa-wheat-alt::before { + content: "\e2cd"; } + +.fa-ankh::before { + content: "\f644"; } + +.fa-hands-holding-child::before { + content: "\e4fa"; } + +.fa-asterisk::before { + content: "\2a"; } + +.fa-square-check::before { + content: "\f14a"; } + +.fa-check-square::before { + content: "\f14a"; } + +.fa-peseta-sign::before { + content: "\e221"; } + +.fa-heading::before { + content: "\f1dc"; } + +.fa-header::before { + content: "\f1dc"; } + +.fa-ghost::before { + content: "\f6e2"; } + +.fa-list::before { + content: "\f03a"; } + +.fa-list-squares::before { + content: "\f03a"; } + +.fa-square-phone-flip::before { + content: "\f87b"; } + +.fa-phone-square-alt::before { + content: "\f87b"; } + +.fa-cart-plus::before { + content: "\f217"; } + +.fa-gamepad::before { + content: "\f11b"; } + +.fa-circle-dot::before { + content: "\f192"; } + +.fa-dot-circle::before { + content: "\f192"; } + +.fa-face-dizzy::before { + content: "\f567"; } + +.fa-dizzy::before { + content: "\f567"; } + +.fa-egg::before { + content: "\f7fb"; } + +.fa-house-medical-circle-xmark::before { + content: "\e513"; } + +.fa-campground::before { + content: "\f6bb"; } + +.fa-folder-plus::before { + content: "\f65e"; } + +.fa-futbol::before { + content: "\f1e3"; } + +.fa-futbol-ball::before { + content: "\f1e3"; } + +.fa-soccer-ball::before { + content: "\f1e3"; } + +.fa-paintbrush::before { + content: "\f1fc"; } + +.fa-paint-brush::before { + content: "\f1fc"; } + +.fa-lock::before { + content: "\f023"; } + +.fa-gas-pump::before { + content: "\f52f"; } + +.fa-hot-tub-person::before { + content: "\f593"; } + +.fa-hot-tub::before { + content: "\f593"; } + +.fa-map-location::before { + content: "\f59f"; } + +.fa-map-marked::before { + content: "\f59f"; } + +.fa-house-flood-water::before { + content: "\e50e"; } + +.fa-tree::before { + content: "\f1bb"; } + +.fa-bridge-lock::before { + content: "\e4cc"; } + +.fa-sack-dollar::before { + content: "\f81d"; } + +.fa-pen-to-square::before { + content: "\f044"; } + +.fa-edit::before { + content: "\f044"; } + +.fa-car-side::before { + content: "\f5e4"; } + +.fa-share-nodes::before { + content: "\f1e0"; } + +.fa-share-alt::before { + content: "\f1e0"; } + +.fa-heart-circle-minus::before { + content: "\e4ff"; } + +.fa-hourglass-half::before { + content: "\f252"; } + +.fa-hourglass-2::before { + content: "\f252"; } + +.fa-microscope::before { + content: "\f610"; } + +.fa-sink::before { + content: "\e06d"; } + +.fa-bag-shopping::before { + content: "\f290"; } + +.fa-shopping-bag::before { + content: "\f290"; } + +.fa-arrow-down-z-a::before { + content: "\f881"; } + +.fa-sort-alpha-desc::before { + content: "\f881"; } + +.fa-sort-alpha-down-alt::before { + content: "\f881"; } + +.fa-mitten::before { + content: "\f7b5"; } + +.fa-person-rays::before { + content: "\e54d"; } + +.fa-users::before { + content: "\f0c0"; } + +.fa-eye-slash::before { + content: "\f070"; } + +.fa-flask-vial::before { + content: "\e4f3"; } + +.fa-hand::before { + content: "\f256"; } + +.fa-hand-paper::before { + content: "\f256"; } + +.fa-om::before { + content: "\f679"; } + +.fa-worm::before { + content: "\e599"; } + +.fa-house-circle-xmark::before { + content: "\e50b"; } + +.fa-plug::before { + content: "\f1e6"; } + +.fa-chevron-up::before { + content: "\f077"; } + +.fa-hand-spock::before { + content: "\f259"; } + +.fa-stopwatch::before { + content: "\f2f2"; } + +.fa-face-kiss::before { + content: "\f596"; } + +.fa-kiss::before { + content: "\f596"; } + +.fa-bridge-circle-xmark::before { + content: "\e4cb"; } + +.fa-face-grin-tongue::before { + content: "\f589"; } + +.fa-grin-tongue::before { + content: "\f589"; } + +.fa-chess-bishop::before { + content: "\f43a"; } + +.fa-face-grin-wink::before { + content: "\f58c"; } + +.fa-grin-wink::before { + content: "\f58c"; } + +.fa-ear-deaf::before { + content: "\f2a4"; } + +.fa-deaf::before { + content: "\f2a4"; } + +.fa-deafness::before { + content: "\f2a4"; } + +.fa-hard-of-hearing::before { + content: "\f2a4"; } + +.fa-road-circle-check::before { + content: "\e564"; } + +.fa-dice-five::before { + content: "\f523"; } + +.fa-square-rss::before { + content: "\f143"; } + +.fa-rss-square::before { + content: "\f143"; } + +.fa-land-mine-on::before { + content: "\e51b"; } + +.fa-i-cursor::before { + content: "\f246"; } + +.fa-stamp::before { + content: "\f5bf"; } + +.fa-stairs::before { + content: "\e289"; } + +.fa-i::before { + content: "\49"; } + +.fa-hryvnia-sign::before { + content: "\f6f2"; } + +.fa-hryvnia::before { + content: "\f6f2"; } + +.fa-pills::before { + content: "\f484"; } + +.fa-face-grin-wide::before { + content: "\f581"; } + +.fa-grin-alt::before { + content: "\f581"; } + +.fa-tooth::before { + content: "\f5c9"; } + +.fa-v::before { + content: "\56"; } + +.fa-bangladeshi-taka-sign::before { + content: "\e2e6"; } + +.fa-bicycle::before { + content: "\f206"; } + +.fa-staff-snake::before { + content: "\e579"; } + +.fa-rod-asclepius::before { + content: "\e579"; } + +.fa-rod-snake::before { + content: "\e579"; } + +.fa-staff-aesculapius::before { + content: "\e579"; } + +.fa-head-side-cough-slash::before { + content: "\e062"; } + +.fa-truck-medical::before { + content: "\f0f9"; } + +.fa-ambulance::before { + content: "\f0f9"; } + +.fa-wheat-awn-circle-exclamation::before { + content: "\e598"; } + +.fa-snowman::before { + content: "\f7d0"; } + +.fa-mortar-pestle::before { + content: "\f5a7"; } + +.fa-road-barrier::before { + content: "\e562"; } + +.fa-school::before { + content: "\f549"; } + +.fa-igloo::before { + content: "\f7ae"; } + +.fa-joint::before { + content: "\f595"; } + +.fa-angle-right::before { + content: "\f105"; } + +.fa-horse::before { + content: "\f6f0"; } + +.fa-q::before { + content: "\51"; } + +.fa-g::before { + content: "\47"; } + +.fa-notes-medical::before { + content: "\f481"; } + +.fa-temperature-half::before { + content: "\f2c9"; } + +.fa-temperature-2::before { + content: "\f2c9"; } + +.fa-thermometer-2::before { + content: "\f2c9"; } + +.fa-thermometer-half::before { + content: "\f2c9"; } + +.fa-dong-sign::before { + content: "\e169"; } + +.fa-capsules::before { + content: "\f46b"; } + +.fa-poo-storm::before { + content: "\f75a"; } + +.fa-poo-bolt::before { + content: "\f75a"; } + +.fa-face-frown-open::before { + content: "\f57a"; } + +.fa-frown-open::before { + content: "\f57a"; } + +.fa-hand-point-up::before { + content: "\f0a6"; } + +.fa-money-bill::before { + content: "\f0d6"; } + +.fa-bookmark::before { + content: "\f02e"; } + +.fa-align-justify::before { + content: "\f039"; } + +.fa-umbrella-beach::before { + content: "\f5ca"; } + +.fa-helmet-un::before { + content: "\e503"; } + +.fa-bullseye::before { + content: "\f140"; } + +.fa-bacon::before { + content: "\f7e5"; } + +.fa-hand-point-down::before { + content: "\f0a7"; } + +.fa-arrow-up-from-bracket::before { + content: "\e09a"; } + +.fa-folder::before { + content: "\f07b"; } + +.fa-folder-blank::before { + content: "\f07b"; } + +.fa-file-waveform::before { + content: "\f478"; } + +.fa-file-medical-alt::before { + content: "\f478"; } + +.fa-radiation::before { + content: "\f7b9"; } + +.fa-chart-simple::before { + content: "\e473"; } + +.fa-mars-stroke::before { + content: "\f229"; } + +.fa-vial::before { + content: "\f492"; } + +.fa-gauge::before { + content: "\f624"; } + +.fa-dashboard::before { + content: "\f624"; } + +.fa-gauge-med::before { + content: "\f624"; } + +.fa-tachometer-alt-average::before { + content: "\f624"; } + +.fa-wand-magic-sparkles::before { + content: "\e2ca"; } + +.fa-magic-wand-sparkles::before { + content: "\e2ca"; } + +.fa-e::before { + content: "\45"; } + +.fa-pen-clip::before { + content: "\f305"; } + +.fa-pen-alt::before { + content: "\f305"; } + +.fa-bridge-circle-exclamation::before { + content: "\e4ca"; } + +.fa-user::before { + content: "\f007"; } + +.fa-school-circle-check::before { + content: "\e56b"; } + +.fa-dumpster::before { + content: "\f793"; } + +.fa-van-shuttle::before { + content: "\f5b6"; } + +.fa-shuttle-van::before { + content: "\f5b6"; } + +.fa-building-user::before { + content: "\e4da"; } + +.fa-square-caret-left::before { + content: "\f191"; } + +.fa-caret-square-left::before { + content: "\f191"; } + +.fa-highlighter::before { + content: "\f591"; } + +.fa-key::before { + content: "\f084"; } + +.fa-bullhorn::before { + content: "\f0a1"; } + +.fa-globe::before { + content: "\f0ac"; } + +.fa-synagogue::before { + content: "\f69b"; } + +.fa-person-half-dress::before { + content: "\e548"; } + +.fa-road-bridge::before { + content: "\e563"; } + +.fa-location-arrow::before { + content: "\f124"; } + +.fa-c::before { + content: "\43"; } + +.fa-tablet-button::before { + content: "\f10a"; } + +.fa-building-lock::before { + content: "\e4d6"; } + +.fa-pizza-slice::before { + content: "\f818"; } + +.fa-money-bill-wave::before { + content: "\f53a"; } + +.fa-chart-area::before { + content: "\f1fe"; } + +.fa-area-chart::before { + content: "\f1fe"; } + +.fa-house-flag::before { + content: "\e50d"; } + +.fa-person-circle-minus::before { + content: "\e540"; } + +.fa-ban::before { + content: "\f05e"; } + +.fa-cancel::before { + content: "\f05e"; } + +.fa-camera-rotate::before { + content: "\e0d8"; } + +.fa-spray-can-sparkles::before { + content: "\f5d0"; } + +.fa-air-freshener::before { + content: "\f5d0"; } + +.fa-star::before { + content: "\f005"; } + +.fa-repeat::before { + content: "\f363"; } + +.fa-cross::before { + content: "\f654"; } + +.fa-box::before { + content: "\f466"; } + +.fa-venus-mars::before { + content: "\f228"; } + +.fa-arrow-pointer::before { + content: "\f245"; } + +.fa-mouse-pointer::before { + content: "\f245"; } + +.fa-maximize::before { + content: "\f31e"; } + +.fa-expand-arrows-alt::before { + content: "\f31e"; } + +.fa-charging-station::before { + content: "\f5e7"; } + +.fa-shapes::before { + content: "\f61f"; } + +.fa-triangle-circle-square::before { + content: "\f61f"; } + +.fa-shuffle::before { + content: "\f074"; } + +.fa-random::before { + content: "\f074"; } + +.fa-person-running::before { + content: "\f70c"; } + +.fa-running::before { + content: "\f70c"; } + +.fa-mobile-retro::before { + content: "\e527"; } + +.fa-grip-lines-vertical::before { + content: "\f7a5"; } + +.fa-spider::before { + content: "\f717"; } + +.fa-hands-bound::before { + content: "\e4f9"; } + +.fa-file-invoice-dollar::before { + content: "\f571"; } + +.fa-plane-circle-exclamation::before { + content: "\e556"; } + +.fa-x-ray::before { + content: "\f497"; } + +.fa-spell-check::before { + content: "\f891"; } + +.fa-slash::before { + content: "\f715"; } + +.fa-computer-mouse::before { + content: "\f8cc"; } + +.fa-mouse::before { + content: "\f8cc"; } + +.fa-arrow-right-to-bracket::before { + content: "\f090"; } + +.fa-sign-in::before { + content: "\f090"; } + +.fa-shop-slash::before { + content: "\e070"; } + +.fa-store-alt-slash::before { + content: "\e070"; } + +.fa-server::before { + content: "\f233"; } + +.fa-virus-covid-slash::before { + content: "\e4a9"; } + +.fa-shop-lock::before { + content: "\e4a5"; } + +.fa-hourglass-start::before { + content: "\f251"; } + +.fa-hourglass-1::before { + content: "\f251"; } + +.fa-blender-phone::before { + content: "\f6b6"; } + +.fa-building-wheat::before { + content: "\e4db"; } + +.fa-person-breastfeeding::before { + content: "\e53a"; } + +.fa-right-to-bracket::before { + content: "\f2f6"; } + +.fa-sign-in-alt::before { + content: "\f2f6"; } + +.fa-venus::before { + content: "\f221"; } + +.fa-passport::before { + content: "\f5ab"; } + +.fa-thumbtack-slash::before { + content: "\e68f"; } + +.fa-thumb-tack-slash::before { + content: "\e68f"; } + +.fa-heart-pulse::before { + content: "\f21e"; } + +.fa-heartbeat::before { + content: "\f21e"; } + +.fa-people-carry-box::before { + content: "\f4ce"; } + +.fa-people-carry::before { + content: "\f4ce"; } + +.fa-temperature-high::before { + content: "\f769"; } + +.fa-microchip::before { + content: "\f2db"; } + +.fa-crown::before { + content: "\f521"; } + +.fa-weight-hanging::before { + content: "\f5cd"; } + +.fa-xmarks-lines::before { + content: "\e59a"; } + +.fa-file-prescription::before { + content: "\f572"; } + +.fa-weight-scale::before { + content: "\f496"; } + +.fa-weight::before { + content: "\f496"; } + +.fa-user-group::before { + content: "\f500"; } + +.fa-user-friends::before { + content: "\f500"; } + +.fa-arrow-up-a-z::before { + content: "\f15e"; } + +.fa-sort-alpha-up::before { + content: "\f15e"; } + +.fa-chess-knight::before { + content: "\f441"; } + +.fa-face-laugh-squint::before { + content: "\f59b"; } + +.fa-laugh-squint::before { + content: "\f59b"; } + +.fa-wheelchair::before { + content: "\f193"; } + +.fa-circle-arrow-up::before { + content: "\f0aa"; } + +.fa-arrow-circle-up::before { + content: "\f0aa"; } + +.fa-toggle-on::before { + content: "\f205"; } + +.fa-person-walking::before { + content: "\f554"; } + +.fa-walking::before { + content: "\f554"; } + +.fa-l::before { + content: "\4c"; } + +.fa-fire::before { + content: "\f06d"; } + +.fa-bed-pulse::before { + content: "\f487"; } + +.fa-procedures::before { + content: "\f487"; } + +.fa-shuttle-space::before { + content: "\f197"; } + +.fa-space-shuttle::before { + content: "\f197"; } + +.fa-face-laugh::before { + content: "\f599"; } + +.fa-laugh::before { + content: "\f599"; } + +.fa-folder-open::before { + content: "\f07c"; } + +.fa-heart-circle-plus::before { + content: "\e500"; } + +.fa-code-fork::before { + content: "\e13b"; } + +.fa-city::before { + content: "\f64f"; } + +.fa-microphone-lines::before { + content: "\f3c9"; } + +.fa-microphone-alt::before { + content: "\f3c9"; } + +.fa-pepper-hot::before { + content: "\f816"; } + +.fa-unlock::before { + content: "\f09c"; } + +.fa-colon-sign::before { + content: "\e140"; } + +.fa-headset::before { + content: "\f590"; } + +.fa-store-slash::before { + content: "\e071"; } + +.fa-road-circle-xmark::before { + content: "\e566"; } + +.fa-user-minus::before { + content: "\f503"; } + +.fa-mars-stroke-up::before { + content: "\f22a"; } + +.fa-mars-stroke-v::before { + content: "\f22a"; } + +.fa-champagne-glasses::before { + content: "\f79f"; } + +.fa-glass-cheers::before { + content: "\f79f"; } + +.fa-clipboard::before { + content: "\f328"; } + +.fa-house-circle-exclamation::before { + content: "\e50a"; } + +.fa-file-arrow-up::before { + content: "\f574"; } + +.fa-file-upload::before { + content: "\f574"; } + +.fa-wifi::before { + content: "\f1eb"; } + +.fa-wifi-3::before { + content: "\f1eb"; } + +.fa-wifi-strong::before { + content: "\f1eb"; } + +.fa-bath::before { + content: "\f2cd"; } + +.fa-bathtub::before { + content: "\f2cd"; } + +.fa-underline::before { + content: "\f0cd"; } + +.fa-user-pen::before { + content: "\f4ff"; } + +.fa-user-edit::before { + content: "\f4ff"; } + +.fa-signature::before { + content: "\f5b7"; } + +.fa-stroopwafel::before { + content: "\f551"; } + +.fa-bold::before { + content: "\f032"; } + +.fa-anchor-lock::before { + content: "\e4ad"; } + +.fa-building-ngo::before { + content: "\e4d7"; } + +.fa-manat-sign::before { + content: "\e1d5"; } + +.fa-not-equal::before { + content: "\f53e"; } + +.fa-border-top-left::before { + content: "\f853"; } + +.fa-border-style::before { + content: "\f853"; } + +.fa-map-location-dot::before { + content: "\f5a0"; } + +.fa-map-marked-alt::before { + content: "\f5a0"; } + +.fa-jedi::before { + content: "\f669"; } + +.fa-square-poll-vertical::before { + content: "\f681"; } + +.fa-poll::before { + content: "\f681"; } + +.fa-mug-hot::before { + content: "\f7b6"; } + +.fa-car-battery::before { + content: "\f5df"; } + +.fa-battery-car::before { + content: "\f5df"; } + +.fa-gift::before { + content: "\f06b"; } + +.fa-dice-two::before { + content: "\f528"; } + +.fa-chess-queen::before { + content: "\f445"; } + +.fa-glasses::before { + content: "\f530"; } + +.fa-chess-board::before { + content: "\f43c"; } + +.fa-building-circle-check::before { + content: "\e4d2"; } + +.fa-person-chalkboard::before { + content: "\e53d"; } + +.fa-mars-stroke-right::before { + content: "\f22b"; } + +.fa-mars-stroke-h::before { + content: "\f22b"; } + +.fa-hand-back-fist::before { + content: "\f255"; } + +.fa-hand-rock::before { + content: "\f255"; } + +.fa-square-caret-up::before { + content: "\f151"; } + +.fa-caret-square-up::before { + content: "\f151"; } + +.fa-cloud-showers-water::before { + content: "\e4e4"; } + +.fa-chart-bar::before { + content: "\f080"; } + +.fa-bar-chart::before { + content: "\f080"; } + +.fa-hands-bubbles::before { + content: "\e05e"; } + +.fa-hands-wash::before { + content: "\e05e"; } + +.fa-less-than-equal::before { + content: "\f537"; } + +.fa-train::before { + content: "\f238"; } + +.fa-eye-low-vision::before { + content: "\f2a8"; } + +.fa-low-vision::before { + content: "\f2a8"; } + +.fa-crow::before { + content: "\f520"; } + +.fa-sailboat::before { + content: "\e445"; } + +.fa-window-restore::before { + content: "\f2d2"; } + +.fa-square-plus::before { + content: "\f0fe"; } + +.fa-plus-square::before { + content: "\f0fe"; } + +.fa-torii-gate::before { + content: "\f6a1"; } + +.fa-frog::before { + content: "\f52e"; } + +.fa-bucket::before { + content: "\e4cf"; } + +.fa-image::before { + content: "\f03e"; } + +.fa-microphone::before { + content: "\f130"; } + +.fa-cow::before { + content: "\f6c8"; } + +.fa-caret-up::before { + content: "\f0d8"; } + +.fa-screwdriver::before { + content: "\f54a"; } + +.fa-folder-closed::before { + content: "\e185"; } + +.fa-house-tsunami::before { + content: "\e515"; } + +.fa-square-nfi::before { + content: "\e576"; } + +.fa-arrow-up-from-ground-water::before { + content: "\e4b5"; } + +.fa-martini-glass::before { + content: "\f57b"; } + +.fa-glass-martini-alt::before { + content: "\f57b"; } + +.fa-rotate-left::before { + content: "\f2ea"; } + +.fa-rotate-back::before { + content: "\f2ea"; } + +.fa-rotate-backward::before { + content: "\f2ea"; } + +.fa-undo-alt::before { + content: "\f2ea"; } + +.fa-table-columns::before { + content: "\f0db"; } + +.fa-columns::before { + content: "\f0db"; } + +.fa-lemon::before { + content: "\f094"; } + +.fa-head-side-mask::before { + content: "\e063"; } + +.fa-handshake::before { + content: "\f2b5"; } + +.fa-gem::before { + content: "\f3a5"; } + +.fa-dolly::before { + content: "\f472"; } + +.fa-dolly-box::before { + content: "\f472"; } + +.fa-smoking::before { + content: "\f48d"; } + +.fa-minimize::before { + content: "\f78c"; } + +.fa-compress-arrows-alt::before { + content: "\f78c"; } + +.fa-monument::before { + content: "\f5a6"; } + +.fa-snowplow::before { + content: "\f7d2"; } + +.fa-angles-right::before { + content: "\f101"; } + +.fa-angle-double-right::before { + content: "\f101"; } + +.fa-cannabis::before { + content: "\f55f"; } + +.fa-circle-play::before { + content: "\f144"; } + +.fa-play-circle::before { + content: "\f144"; } + +.fa-tablets::before { + content: "\f490"; } + +.fa-ethernet::before { + content: "\f796"; } + +.fa-euro-sign::before { + content: "\f153"; } + +.fa-eur::before { + content: "\f153"; } + +.fa-euro::before { + content: "\f153"; } + +.fa-chair::before { + content: "\f6c0"; } + +.fa-circle-check::before { + content: "\f058"; } + +.fa-check-circle::before { + content: "\f058"; } + +.fa-circle-stop::before { + content: "\f28d"; } + +.fa-stop-circle::before { + content: "\f28d"; } + +.fa-compass-drafting::before { + content: "\f568"; } + +.fa-drafting-compass::before { + content: "\f568"; } + +.fa-plate-wheat::before { + content: "\e55a"; } + +.fa-icicles::before { + content: "\f7ad"; } + +.fa-person-shelter::before { + content: "\e54f"; } + +.fa-neuter::before { + content: "\f22c"; } + +.fa-id-badge::before { + content: "\f2c1"; } + +.fa-marker::before { + content: "\f5a1"; } + +.fa-face-laugh-beam::before { + content: "\f59a"; } + +.fa-laugh-beam::before { + content: "\f59a"; } + +.fa-helicopter-symbol::before { + content: "\e502"; } + +.fa-universal-access::before { + content: "\f29a"; } + +.fa-circle-chevron-up::before { + content: "\f139"; } + +.fa-chevron-circle-up::before { + content: "\f139"; } + +.fa-lari-sign::before { + content: "\e1c8"; } + +.fa-volcano::before { + content: "\f770"; } + +.fa-person-walking-dashed-line-arrow-right::before { + content: "\e553"; } + +.fa-sterling-sign::before { + content: "\f154"; } + +.fa-gbp::before { + content: "\f154"; } + +.fa-pound-sign::before { + content: "\f154"; } + +.fa-viruses::before { + content: "\e076"; } + +.fa-square-person-confined::before { + content: "\e577"; } + +.fa-user-tie::before { + content: "\f508"; } + +.fa-arrow-down-long::before { + content: "\f175"; } + +.fa-long-arrow-down::before { + content: "\f175"; } + +.fa-tent-arrow-down-to-line::before { + content: "\e57e"; } + +.fa-certificate::before { + content: "\f0a3"; } + +.fa-reply-all::before { + content: "\f122"; } + +.fa-mail-reply-all::before { + content: "\f122"; } + +.fa-suitcase::before { + content: "\f0f2"; } + +.fa-person-skating::before { + content: "\f7c5"; } + +.fa-skating::before { + content: "\f7c5"; } + +.fa-filter-circle-dollar::before { + content: "\f662"; } + +.fa-funnel-dollar::before { + content: "\f662"; } + +.fa-camera-retro::before { + content: "\f083"; } + +.fa-circle-arrow-down::before { + content: "\f0ab"; } + +.fa-arrow-circle-down::before { + content: "\f0ab"; } + +.fa-file-import::before { + content: "\f56f"; } + +.fa-arrow-right-to-file::before { + content: "\f56f"; } + +.fa-square-arrow-up-right::before { + content: "\f14c"; } + +.fa-external-link-square::before { + content: "\f14c"; } + +.fa-box-open::before { + content: "\f49e"; } + +.fa-scroll::before { + content: "\f70e"; } + +.fa-spa::before { + content: "\f5bb"; } + +.fa-location-pin-lock::before { + content: "\e51f"; } + +.fa-pause::before { + content: "\f04c"; } + +.fa-hill-avalanche::before { + content: "\e507"; } + +.fa-temperature-empty::before { + content: "\f2cb"; } + +.fa-temperature-0::before { + content: "\f2cb"; } + +.fa-thermometer-0::before { + content: "\f2cb"; } + +.fa-thermometer-empty::before { + content: "\f2cb"; } + +.fa-bomb::before { + content: "\f1e2"; } + +.fa-registered::before { + content: "\f25d"; } + +.fa-address-card::before { + content: "\f2bb"; } + +.fa-contact-card::before { + content: "\f2bb"; } + +.fa-vcard::before { + content: "\f2bb"; } + +.fa-scale-unbalanced-flip::before { + content: "\f516"; } + +.fa-balance-scale-right::before { + content: "\f516"; } + +.fa-subscript::before { + content: "\f12c"; } + +.fa-diamond-turn-right::before { + content: "\f5eb"; } + +.fa-directions::before { + content: "\f5eb"; } + +.fa-burst::before { + content: "\e4dc"; } + +.fa-house-laptop::before { + content: "\e066"; } + +.fa-laptop-house::before { + content: "\e066"; } + +.fa-face-tired::before { + content: "\f5c8"; } + +.fa-tired::before { + content: "\f5c8"; } + +.fa-money-bills::before { + content: "\e1f3"; } + +.fa-smog::before { + content: "\f75f"; } + +.fa-crutch::before { + content: "\f7f7"; } + +.fa-cloud-arrow-up::before { + content: "\f0ee"; } + +.fa-cloud-upload::before { + content: "\f0ee"; } + +.fa-cloud-upload-alt::before { + content: "\f0ee"; } + +.fa-palette::before { + content: "\f53f"; } + +.fa-arrows-turn-right::before { + content: "\e4c0"; } + +.fa-vest::before { + content: "\e085"; } + +.fa-ferry::before { + content: "\e4ea"; } + +.fa-arrows-down-to-people::before { + content: "\e4b9"; } + +.fa-seedling::before { + content: "\f4d8"; } + +.fa-sprout::before { + content: "\f4d8"; } + +.fa-left-right::before { + content: "\f337"; } + +.fa-arrows-alt-h::before { + content: "\f337"; } + +.fa-boxes-packing::before { + content: "\e4c7"; } + +.fa-circle-arrow-left::before { + content: "\f0a8"; } + +.fa-arrow-circle-left::before { + content: "\f0a8"; } + +.fa-group-arrows-rotate::before { + content: "\e4f6"; } + +.fa-bowl-food::before { + content: "\e4c6"; } + +.fa-candy-cane::before { + content: "\f786"; } + +.fa-arrow-down-wide-short::before { + content: "\f160"; } + +.fa-sort-amount-asc::before { + content: "\f160"; } + +.fa-sort-amount-down::before { + content: "\f160"; } + +.fa-cloud-bolt::before { + content: "\f76c"; } + +.fa-thunderstorm::before { + content: "\f76c"; } + +.fa-text-slash::before { + content: "\f87d"; } + +.fa-remove-format::before { + content: "\f87d"; } + +.fa-face-smile-wink::before { + content: "\f4da"; } + +.fa-smile-wink::before { + content: "\f4da"; } + +.fa-file-word::before { + content: "\f1c2"; } + +.fa-file-powerpoint::before { + content: "\f1c4"; } + +.fa-arrows-left-right::before { + content: "\f07e"; } + +.fa-arrows-h::before { + content: "\f07e"; } + +.fa-house-lock::before { + content: "\e510"; } + +.fa-cloud-arrow-down::before { + content: "\f0ed"; } + +.fa-cloud-download::before { + content: "\f0ed"; } + +.fa-cloud-download-alt::before { + content: "\f0ed"; } + +.fa-children::before { + content: "\e4e1"; } + +.fa-chalkboard::before { + content: "\f51b"; } + +.fa-blackboard::before { + content: "\f51b"; } + +.fa-user-large-slash::before { + content: "\f4fa"; } + +.fa-user-alt-slash::before { + content: "\f4fa"; } + +.fa-envelope-open::before { + content: "\f2b6"; } + +.fa-handshake-simple-slash::before { + content: "\e05f"; } + +.fa-handshake-alt-slash::before { + content: "\e05f"; } + +.fa-mattress-pillow::before { + content: "\e525"; } + +.fa-guarani-sign::before { + content: "\e19a"; } + +.fa-arrows-rotate::before { + content: "\f021"; } + +.fa-refresh::before { + content: "\f021"; } + +.fa-sync::before { + content: "\f021"; } + +.fa-fire-extinguisher::before { + content: "\f134"; } + +.fa-cruzeiro-sign::before { + content: "\e152"; } + +.fa-greater-than-equal::before { + content: "\f532"; } + +.fa-shield-halved::before { + content: "\f3ed"; } + +.fa-shield-alt::before { + content: "\f3ed"; } + +.fa-book-atlas::before { + content: "\f558"; } + +.fa-atlas::before { + content: "\f558"; } + +.fa-virus::before { + content: "\e074"; } + +.fa-envelope-circle-check::before { + content: "\e4e8"; } + +.fa-layer-group::before { + content: "\f5fd"; } + +.fa-arrows-to-dot::before { + content: "\e4be"; } + +.fa-archway::before { + content: "\f557"; } + +.fa-heart-circle-check::before { + content: "\e4fd"; } + +.fa-house-chimney-crack::before { + content: "\f6f1"; } + +.fa-house-damage::before { + content: "\f6f1"; } + +.fa-file-zipper::before { + content: "\f1c6"; } + +.fa-file-archive::before { + content: "\f1c6"; } + +.fa-square::before { + content: "\f0c8"; } + +.fa-martini-glass-empty::before { + content: "\f000"; } + +.fa-glass-martini::before { + content: "\f000"; } + +.fa-couch::before { + content: "\f4b8"; } + +.fa-cedi-sign::before { + content: "\e0df"; } + +.fa-italic::before { + content: "\f033"; } + +.fa-table-cells-column-lock::before { + content: "\e678"; } + +.fa-church::before { + content: "\f51d"; } + +.fa-comments-dollar::before { + content: "\f653"; } + +.fa-democrat::before { + content: "\f747"; } + +.fa-z::before { + content: "\5a"; } + +.fa-person-skiing::before { + content: "\f7c9"; } + +.fa-skiing::before { + content: "\f7c9"; } + +.fa-road-lock::before { + content: "\e567"; } + +.fa-a::before { + content: "\41"; } + +.fa-temperature-arrow-down::before { + content: "\e03f"; } + +.fa-temperature-down::before { + content: "\e03f"; } + +.fa-feather-pointed::before { + content: "\f56b"; } + +.fa-feather-alt::before { + content: "\f56b"; } + +.fa-p::before { + content: "\50"; } + +.fa-snowflake::before { + content: "\f2dc"; } + +.fa-newspaper::before { + content: "\f1ea"; } + +.fa-rectangle-ad::before { + content: "\f641"; } + +.fa-ad::before { + content: "\f641"; } + +.fa-circle-arrow-right::before { + content: "\f0a9"; } + +.fa-arrow-circle-right::before { + content: "\f0a9"; } + +.fa-filter-circle-xmark::before { + content: "\e17b"; } + +.fa-locust::before { + content: "\e520"; } + +.fa-sort::before { + content: "\f0dc"; } + +.fa-unsorted::before { + content: "\f0dc"; } + +.fa-list-ol::before { + content: "\f0cb"; } + +.fa-list-1-2::before { + content: "\f0cb"; } + +.fa-list-numeric::before { + content: "\f0cb"; } + +.fa-person-dress-burst::before { + content: "\e544"; } + +.fa-money-check-dollar::before { + content: "\f53d"; } + +.fa-money-check-alt::before { + content: "\f53d"; } + +.fa-vector-square::before { + content: "\f5cb"; } + +.fa-bread-slice::before { + content: "\f7ec"; } + +.fa-language::before { + content: "\f1ab"; } + +.fa-face-kiss-wink-heart::before { + content: "\f598"; } + +.fa-kiss-wink-heart::before { + content: "\f598"; } + +.fa-filter::before { + content: "\f0b0"; } + +.fa-question::before { + content: "\3f"; } + +.fa-file-signature::before { + content: "\f573"; } + +.fa-up-down-left-right::before { + content: "\f0b2"; } + +.fa-arrows-alt::before { + content: "\f0b2"; } + +.fa-house-chimney-user::before { + content: "\e065"; } + +.fa-hand-holding-heart::before { + content: "\f4be"; } + +.fa-puzzle-piece::before { + content: "\f12e"; } + +.fa-money-check::before { + content: "\f53c"; } + +.fa-star-half-stroke::before { + content: "\f5c0"; } + +.fa-star-half-alt::before { + content: "\f5c0"; } + +.fa-code::before { + content: "\f121"; } + +.fa-whiskey-glass::before { + content: "\f7a0"; } + +.fa-glass-whiskey::before { + content: "\f7a0"; } + +.fa-building-circle-exclamation::before { + content: "\e4d3"; } + +.fa-magnifying-glass-chart::before { + content: "\e522"; } + +.fa-arrow-up-right-from-square::before { + content: "\f08e"; } + +.fa-external-link::before { + content: "\f08e"; } + +.fa-cubes-stacked::before { + content: "\e4e6"; } + +.fa-won-sign::before { + content: "\f159"; } + +.fa-krw::before { + content: "\f159"; } + +.fa-won::before { + content: "\f159"; } + +.fa-virus-covid::before { + content: "\e4a8"; } + +.fa-austral-sign::before { + content: "\e0a9"; } + +.fa-f::before { + content: "\46"; } + +.fa-leaf::before { + content: "\f06c"; } + +.fa-road::before { + content: "\f018"; } + +.fa-taxi::before { + content: "\f1ba"; } + +.fa-cab::before { + content: "\f1ba"; } + +.fa-person-circle-plus::before { + content: "\e541"; } + +.fa-chart-pie::before { + content: "\f200"; } + +.fa-pie-chart::before { + content: "\f200"; } + +.fa-bolt-lightning::before { + content: "\e0b7"; } + +.fa-sack-xmark::before { + content: "\e56a"; } + +.fa-file-excel::before { + content: "\f1c3"; } + +.fa-file-contract::before { + content: "\f56c"; } + +.fa-fish-fins::before { + content: "\e4f2"; } + +.fa-building-flag::before { + content: "\e4d5"; } + +.fa-face-grin-beam::before { + content: "\f582"; } + +.fa-grin-beam::before { + content: "\f582"; } + +.fa-object-ungroup::before { + content: "\f248"; } + +.fa-poop::before { + content: "\f619"; } + +.fa-location-pin::before { + content: "\f041"; } + +.fa-map-marker::before { + content: "\f041"; } + +.fa-kaaba::before { + content: "\f66b"; } + +.fa-toilet-paper::before { + content: "\f71e"; } + +.fa-helmet-safety::before { + content: "\f807"; } + +.fa-hard-hat::before { + content: "\f807"; } + +.fa-hat-hard::before { + content: "\f807"; } + +.fa-eject::before { + content: "\f052"; } + +.fa-circle-right::before { + content: "\f35a"; } + +.fa-arrow-alt-circle-right::before { + content: "\f35a"; } + +.fa-plane-circle-check::before { + content: "\e555"; } + +.fa-face-rolling-eyes::before { + content: "\f5a5"; } + +.fa-meh-rolling-eyes::before { + content: "\f5a5"; } + +.fa-object-group::before { + content: "\f247"; } + +.fa-chart-line::before { + content: "\f201"; } + +.fa-line-chart::before { + content: "\f201"; } + +.fa-mask-ventilator::before { + content: "\e524"; } + +.fa-arrow-right::before { + content: "\f061"; } + +.fa-signs-post::before { + content: "\f277"; } + +.fa-map-signs::before { + content: "\f277"; } + +.fa-cash-register::before { + content: "\f788"; } + +.fa-person-circle-question::before { + content: "\e542"; } + +.fa-h::before { + content: "\48"; } + +.fa-tarp::before { + content: "\e57b"; } + +.fa-screwdriver-wrench::before { + content: "\f7d9"; } + +.fa-tools::before { + content: "\f7d9"; } + +.fa-arrows-to-eye::before { + content: "\e4bf"; } + +.fa-plug-circle-bolt::before { + content: "\e55b"; } + +.fa-heart::before { + content: "\f004"; } + +.fa-mars-and-venus::before { + content: "\f224"; } + +.fa-house-user::before { + content: "\e1b0"; } + +.fa-home-user::before { + content: "\e1b0"; } + +.fa-dumpster-fire::before { + content: "\f794"; } + +.fa-house-crack::before { + content: "\e3b1"; } + +.fa-martini-glass-citrus::before { + content: "\f561"; } + +.fa-cocktail::before { + content: "\f561"; } + +.fa-face-surprise::before { + content: "\f5c2"; } + +.fa-surprise::before { + content: "\f5c2"; } + +.fa-bottle-water::before { + content: "\e4c5"; } + +.fa-circle-pause::before { + content: "\f28b"; } + +.fa-pause-circle::before { + content: "\f28b"; } + +.fa-toilet-paper-slash::before { + content: "\e072"; } + +.fa-apple-whole::before { + content: "\f5d1"; } + +.fa-apple-alt::before { + content: "\f5d1"; } + +.fa-kitchen-set::before { + content: "\e51a"; } + +.fa-r::before { + content: "\52"; } + +.fa-temperature-quarter::before { + content: "\f2ca"; } + +.fa-temperature-1::before { + content: "\f2ca"; } + +.fa-thermometer-1::before { + content: "\f2ca"; } + +.fa-thermometer-quarter::before { + content: "\f2ca"; } + +.fa-cube::before { + content: "\f1b2"; } + +.fa-bitcoin-sign::before { + content: "\e0b4"; } + +.fa-shield-dog::before { + content: "\e573"; } + +.fa-solar-panel::before { + content: "\f5ba"; } + +.fa-lock-open::before { + content: "\f3c1"; } + +.fa-elevator::before { + content: "\e16d"; } + +.fa-money-bill-transfer::before { + content: "\e528"; } + +.fa-money-bill-trend-up::before { + content: "\e529"; } + +.fa-house-flood-water-circle-arrow-right::before { + content: "\e50f"; } + +.fa-square-poll-horizontal::before { + content: "\f682"; } + +.fa-poll-h::before { + content: "\f682"; } + +.fa-circle::before { + content: "\f111"; } + +.fa-backward-fast::before { + content: "\f049"; } + +.fa-fast-backward::before { + content: "\f049"; } + +.fa-recycle::before { + content: "\f1b8"; } + +.fa-user-astronaut::before { + content: "\f4fb"; } + +.fa-plane-slash::before { + content: "\e069"; } + +.fa-trademark::before { + content: "\f25c"; } + +.fa-basketball::before { + content: "\f434"; } + +.fa-basketball-ball::before { + content: "\f434"; } + +.fa-satellite-dish::before { + content: "\f7c0"; } + +.fa-circle-up::before { + content: "\f35b"; } + +.fa-arrow-alt-circle-up::before { + content: "\f35b"; } + +.fa-mobile-screen-button::before { + content: "\f3cd"; } + +.fa-mobile-alt::before { + content: "\f3cd"; } + +.fa-volume-high::before { + content: "\f028"; } + +.fa-volume-up::before { + content: "\f028"; } + +.fa-users-rays::before { + content: "\e593"; } + +.fa-wallet::before { + content: "\f555"; } + +.fa-clipboard-check::before { + content: "\f46c"; } + +.fa-file-audio::before { + content: "\f1c7"; } + +.fa-burger::before { + content: "\f805"; } + +.fa-hamburger::before { + content: "\f805"; } + +.fa-wrench::before { + content: "\f0ad"; } + +.fa-bugs::before { + content: "\e4d0"; } + +.fa-rupee-sign::before { + content: "\f156"; } + +.fa-rupee::before { + content: "\f156"; } + +.fa-file-image::before { + content: "\f1c5"; } + +.fa-circle-question::before { + content: "\f059"; } + +.fa-question-circle::before { + content: "\f059"; } + +.fa-plane-departure::before { + content: "\f5b0"; } + +.fa-handshake-slash::before { + content: "\e060"; } + +.fa-book-bookmark::before { + content: "\e0bb"; } + +.fa-code-branch::before { + content: "\f126"; } + +.fa-hat-cowboy::before { + content: "\f8c0"; } + +.fa-bridge::before { + content: "\e4c8"; } + +.fa-phone-flip::before { + content: "\f879"; } + +.fa-phone-alt::before { + content: "\f879"; } + +.fa-truck-front::before { + content: "\e2b7"; } + +.fa-cat::before { + content: "\f6be"; } + +.fa-anchor-circle-exclamation::before { + content: "\e4ab"; } + +.fa-truck-field::before { + content: "\e58d"; } + +.fa-route::before { + content: "\f4d7"; } + +.fa-clipboard-question::before { + content: "\e4e3"; } + +.fa-panorama::before { + content: "\e209"; } + +.fa-comment-medical::before { + content: "\f7f5"; } + +.fa-teeth-open::before { + content: "\f62f"; } + +.fa-file-circle-minus::before { + content: "\e4ed"; } + +.fa-tags::before { + content: "\f02c"; } + +.fa-wine-glass::before { + content: "\f4e3"; } + +.fa-forward-fast::before { + content: "\f050"; } + +.fa-fast-forward::before { + content: "\f050"; } + +.fa-face-meh-blank::before { + content: "\f5a4"; } + +.fa-meh-blank::before { + content: "\f5a4"; } + +.fa-square-parking::before { + content: "\f540"; } + +.fa-parking::before { + content: "\f540"; } + +.fa-house-signal::before { + content: "\e012"; } + +.fa-bars-progress::before { + content: "\f828"; } + +.fa-tasks-alt::before { + content: "\f828"; } + +.fa-faucet-drip::before { + content: "\e006"; } + +.fa-cart-flatbed::before { + content: "\f474"; } + +.fa-dolly-flatbed::before { + content: "\f474"; } + +.fa-ban-smoking::before { + content: "\f54d"; } + +.fa-smoking-ban::before { + content: "\f54d"; } + +.fa-terminal::before { + content: "\f120"; } + +.fa-mobile-button::before { + content: "\f10b"; } + +.fa-house-medical-flag::before { + content: "\e514"; } + +.fa-basket-shopping::before { + content: "\f291"; } + +.fa-shopping-basket::before { + content: "\f291"; } + +.fa-tape::before { + content: "\f4db"; } + +.fa-bus-simple::before { + content: "\f55e"; } + +.fa-bus-alt::before { + content: "\f55e"; } + +.fa-eye::before { + content: "\f06e"; } + +.fa-face-sad-cry::before { + content: "\f5b3"; } + +.fa-sad-cry::before { + content: "\f5b3"; } + +.fa-audio-description::before { + content: "\f29e"; } + +.fa-person-military-to-person::before { + content: "\e54c"; } + +.fa-file-shield::before { + content: "\e4f0"; } + +.fa-user-slash::before { + content: "\f506"; } + +.fa-pen::before { + content: "\f304"; } + +.fa-tower-observation::before { + content: "\e586"; } + +.fa-file-code::before { + content: "\f1c9"; } + +.fa-signal::before { + content: "\f012"; } + +.fa-signal-5::before { + content: "\f012"; } + +.fa-signal-perfect::before { + content: "\f012"; } + +.fa-bus::before { + content: "\f207"; } + +.fa-heart-circle-xmark::before { + content: "\e501"; } + +.fa-house-chimney::before { + content: "\e3af"; } + +.fa-home-lg::before { + content: "\e3af"; } + +.fa-window-maximize::before { + content: "\f2d0"; } + +.fa-face-frown::before { + content: "\f119"; } + +.fa-frown::before { + content: "\f119"; } + +.fa-prescription::before { + content: "\f5b1"; } + +.fa-shop::before { + content: "\f54f"; } + +.fa-store-alt::before { + content: "\f54f"; } + +.fa-floppy-disk::before { + content: "\f0c7"; } + +.fa-save::before { + content: "\f0c7"; } + +.fa-vihara::before { + content: "\f6a7"; } + +.fa-scale-unbalanced::before { + content: "\f515"; } + +.fa-balance-scale-left::before { + content: "\f515"; } + +.fa-sort-up::before { + content: "\f0de"; } + +.fa-sort-asc::before { + content: "\f0de"; } + +.fa-comment-dots::before { + content: "\f4ad"; } + +.fa-commenting::before { + content: "\f4ad"; } + +.fa-plant-wilt::before { + content: "\e5aa"; } + +.fa-diamond::before { + content: "\f219"; } + +.fa-face-grin-squint::before { + content: "\f585"; } + +.fa-grin-squint::before { + content: "\f585"; } + +.fa-hand-holding-dollar::before { + content: "\f4c0"; } + +.fa-hand-holding-usd::before { + content: "\f4c0"; } + +.fa-bacterium::before { + content: "\e05a"; } + +.fa-hand-pointer::before { + content: "\f25a"; } + +.fa-drum-steelpan::before { + content: "\f56a"; } + +.fa-hand-scissors::before { + content: "\f257"; } + +.fa-hands-praying::before { + content: "\f684"; } + +.fa-praying-hands::before { + content: "\f684"; } + +.fa-arrow-rotate-right::before { + content: "\f01e"; } + +.fa-arrow-right-rotate::before { + content: "\f01e"; } + +.fa-arrow-rotate-forward::before { + content: "\f01e"; } + +.fa-redo::before { + content: "\f01e"; } + +.fa-biohazard::before { + content: "\f780"; } + +.fa-location-crosshairs::before { + content: "\f601"; } + +.fa-location::before { + content: "\f601"; } + +.fa-mars-double::before { + content: "\f227"; } + +.fa-child-dress::before { + content: "\e59c"; } + +.fa-users-between-lines::before { + content: "\e591"; } + +.fa-lungs-virus::before { + content: "\e067"; } + +.fa-face-grin-tears::before { + content: "\f588"; } + +.fa-grin-tears::before { + content: "\f588"; } + +.fa-phone::before { + content: "\f095"; } + +.fa-calendar-xmark::before { + content: "\f273"; } + +.fa-calendar-times::before { + content: "\f273"; } + +.fa-child-reaching::before { + content: "\e59d"; } + +.fa-head-side-virus::before { + content: "\e064"; } + +.fa-user-gear::before { + content: "\f4fe"; } + +.fa-user-cog::before { + content: "\f4fe"; } + +.fa-arrow-up-1-9::before { + content: "\f163"; } + +.fa-sort-numeric-up::before { + content: "\f163"; } + +.fa-door-closed::before { + content: "\f52a"; } + +.fa-shield-virus::before { + content: "\e06c"; } + +.fa-dice-six::before { + content: "\f526"; } + +.fa-mosquito-net::before { + content: "\e52c"; } + +.fa-bridge-water::before { + content: "\e4ce"; } + +.fa-person-booth::before { + content: "\f756"; } + +.fa-text-width::before { + content: "\f035"; } + +.fa-hat-wizard::before { + content: "\f6e8"; } + +.fa-pen-fancy::before { + content: "\f5ac"; } + +.fa-person-digging::before { + content: "\f85e"; } + +.fa-digging::before { + content: "\f85e"; } + +.fa-trash::before { + content: "\f1f8"; } + +.fa-gauge-simple::before { + content: "\f629"; } + +.fa-gauge-simple-med::before { + content: "\f629"; } + +.fa-tachometer-average::before { + content: "\f629"; } + +.fa-book-medical::before { + content: "\f7e6"; } + +.fa-poo::before { + content: "\f2fe"; } + +.fa-quote-right::before { + content: "\f10e"; } + +.fa-quote-right-alt::before { + content: "\f10e"; } + +.fa-shirt::before { + content: "\f553"; } + +.fa-t-shirt::before { + content: "\f553"; } + +.fa-tshirt::before { + content: "\f553"; } + +.fa-cubes::before { + content: "\f1b3"; } + +.fa-divide::before { + content: "\f529"; } + +.fa-tenge-sign::before { + content: "\f7d7"; } + +.fa-tenge::before { + content: "\f7d7"; } + +.fa-headphones::before { + content: "\f025"; } + +.fa-hands-holding::before { + content: "\f4c2"; } + +.fa-hands-clapping::before { + content: "\e1a8"; } + +.fa-republican::before { + content: "\f75e"; } + +.fa-arrow-left::before { + content: "\f060"; } + +.fa-person-circle-xmark::before { + content: "\e543"; } + +.fa-ruler::before { + content: "\f545"; } + +.fa-align-left::before { + content: "\f036"; } + +.fa-dice-d6::before { + content: "\f6d1"; } + +.fa-restroom::before { + content: "\f7bd"; } + +.fa-j::before { + content: "\4a"; } + +.fa-users-viewfinder::before { + content: "\e595"; } + +.fa-file-video::before { + content: "\f1c8"; } + +.fa-up-right-from-square::before { + content: "\f35d"; } + +.fa-external-link-alt::before { + content: "\f35d"; } + +.fa-table-cells::before { + content: "\f00a"; } + +.fa-th::before { + content: "\f00a"; } + +.fa-file-pdf::before { + content: "\f1c1"; } + +.fa-book-bible::before { + content: "\f647"; } + +.fa-bible::before { + content: "\f647"; } + +.fa-o::before { + content: "\4f"; } + +.fa-suitcase-medical::before { + content: "\f0fa"; } + +.fa-medkit::before { + content: "\f0fa"; } + +.fa-user-secret::before { + content: "\f21b"; } + +.fa-otter::before { + content: "\f700"; } + +.fa-person-dress::before { + content: "\f182"; } + +.fa-female::before { + content: "\f182"; } + +.fa-comment-dollar::before { + content: "\f651"; } + +.fa-business-time::before { + content: "\f64a"; } + +.fa-briefcase-clock::before { + content: "\f64a"; } + +.fa-table-cells-large::before { + content: "\f009"; } + +.fa-th-large::before { + content: "\f009"; } + +.fa-book-tanakh::before { + content: "\f827"; } + +.fa-tanakh::before { + content: "\f827"; } + +.fa-phone-volume::before { + content: "\f2a0"; } + +.fa-volume-control-phone::before { + content: "\f2a0"; } + +.fa-hat-cowboy-side::before { + content: "\f8c1"; } + +.fa-clipboard-user::before { + content: "\f7f3"; } + +.fa-child::before { + content: "\f1ae"; } + +.fa-lira-sign::before { + content: "\f195"; } + +.fa-satellite::before { + content: "\f7bf"; } + +.fa-plane-lock::before { + content: "\e558"; } + +.fa-tag::before { + content: "\f02b"; } + +.fa-comment::before { + content: "\f075"; } + +.fa-cake-candles::before { + content: "\f1fd"; } + +.fa-birthday-cake::before { + content: "\f1fd"; } + +.fa-cake::before { + content: "\f1fd"; } + +.fa-envelope::before { + content: "\f0e0"; } + +.fa-angles-up::before { + content: "\f102"; } + +.fa-angle-double-up::before { + content: "\f102"; } + +.fa-paperclip::before { + content: "\f0c6"; } + +.fa-arrow-right-to-city::before { + content: "\e4b3"; } + +.fa-ribbon::before { + content: "\f4d6"; } + +.fa-lungs::before { + content: "\f604"; } + +.fa-arrow-up-9-1::before { + content: "\f887"; } + +.fa-sort-numeric-up-alt::before { + content: "\f887"; } + +.fa-litecoin-sign::before { + content: "\e1d3"; } + +.fa-border-none::before { + content: "\f850"; } + +.fa-circle-nodes::before { + content: "\e4e2"; } + +.fa-parachute-box::before { + content: "\f4cd"; } + +.fa-indent::before { + content: "\f03c"; } + +.fa-truck-field-un::before { + content: "\e58e"; } + +.fa-hourglass::before { + content: "\f254"; } + +.fa-hourglass-empty::before { + content: "\f254"; } + +.fa-mountain::before { + content: "\f6fc"; } + +.fa-user-doctor::before { + content: "\f0f0"; } + +.fa-user-md::before { + content: "\f0f0"; } + +.fa-circle-info::before { + content: "\f05a"; } + +.fa-info-circle::before { + content: "\f05a"; } + +.fa-cloud-meatball::before { + content: "\f73b"; } + +.fa-camera::before { + content: "\f030"; } + +.fa-camera-alt::before { + content: "\f030"; } + +.fa-square-virus::before { + content: "\e578"; } + +.fa-meteor::before { + content: "\f753"; } + +.fa-car-on::before { + content: "\e4dd"; } + +.fa-sleigh::before { + content: "\f7cc"; } + +.fa-arrow-down-1-9::before { + content: "\f162"; } + +.fa-sort-numeric-asc::before { + content: "\f162"; } + +.fa-sort-numeric-down::before { + content: "\f162"; } + +.fa-hand-holding-droplet::before { + content: "\f4c1"; } + +.fa-hand-holding-water::before { + content: "\f4c1"; } + +.fa-water::before { + content: "\f773"; } + +.fa-calendar-check::before { + content: "\f274"; } + +.fa-braille::before { + content: "\f2a1"; } + +.fa-prescription-bottle-medical::before { + content: "\f486"; } + +.fa-prescription-bottle-alt::before { + content: "\f486"; } + +.fa-landmark::before { + content: "\f66f"; } + +.fa-truck::before { + content: "\f0d1"; } + +.fa-crosshairs::before { + content: "\f05b"; } + +.fa-person-cane::before { + content: "\e53c"; } + +.fa-tent::before { + content: "\e57d"; } + +.fa-vest-patches::before { + content: "\e086"; } + +.fa-check-double::before { + content: "\f560"; } + +.fa-arrow-down-a-z::before { + content: "\f15d"; } + +.fa-sort-alpha-asc::before { + content: "\f15d"; } + +.fa-sort-alpha-down::before { + content: "\f15d"; } + +.fa-money-bill-wheat::before { + content: "\e52a"; } + +.fa-cookie::before { + content: "\f563"; } + +.fa-arrow-rotate-left::before { + content: "\f0e2"; } + +.fa-arrow-left-rotate::before { + content: "\f0e2"; } + +.fa-arrow-rotate-back::before { + content: "\f0e2"; } + +.fa-arrow-rotate-backward::before { + content: "\f0e2"; } + +.fa-undo::before { + content: "\f0e2"; } + +.fa-hard-drive::before { + content: "\f0a0"; } + +.fa-hdd::before { + content: "\f0a0"; } + +.fa-face-grin-squint-tears::before { + content: "\f586"; } + +.fa-grin-squint-tears::before { + content: "\f586"; } + +.fa-dumbbell::before { + content: "\f44b"; } + +.fa-rectangle-list::before { + content: "\f022"; } + +.fa-list-alt::before { + content: "\f022"; } + +.fa-tarp-droplet::before { + content: "\e57c"; } + +.fa-house-medical-circle-check::before { + content: "\e511"; } + +.fa-person-skiing-nordic::before { + content: "\f7ca"; } + +.fa-skiing-nordic::before { + content: "\f7ca"; } + +.fa-calendar-plus::before { + content: "\f271"; } + +.fa-plane-arrival::before { + content: "\f5af"; } + +.fa-circle-left::before { + content: "\f359"; } + +.fa-arrow-alt-circle-left::before { + content: "\f359"; } + +.fa-train-subway::before { + content: "\f239"; } + +.fa-subway::before { + content: "\f239"; } + +.fa-chart-gantt::before { + content: "\e0e4"; } + +.fa-indian-rupee-sign::before { + content: "\e1bc"; } + +.fa-indian-rupee::before { + content: "\e1bc"; } + +.fa-inr::before { + content: "\e1bc"; } + +.fa-crop-simple::before { + content: "\f565"; } + +.fa-crop-alt::before { + content: "\f565"; } + +.fa-money-bill-1::before { + content: "\f3d1"; } + +.fa-money-bill-alt::before { + content: "\f3d1"; } + +.fa-left-long::before { + content: "\f30a"; } + +.fa-long-arrow-alt-left::before { + content: "\f30a"; } + +.fa-dna::before { + content: "\f471"; } + +.fa-virus-slash::before { + content: "\e075"; } + +.fa-minus::before { + content: "\f068"; } + +.fa-subtract::before { + content: "\f068"; } + +.fa-chess::before { + content: "\f439"; } + +.fa-arrow-left-long::before { + content: "\f177"; } + +.fa-long-arrow-left::before { + content: "\f177"; } + +.fa-plug-circle-check::before { + content: "\e55c"; } + +.fa-street-view::before { + content: "\f21d"; } + +.fa-franc-sign::before { + content: "\e18f"; } + +.fa-volume-off::before { + content: "\f026"; } + +.fa-hands-asl-interpreting::before { + content: "\f2a3"; } + +.fa-american-sign-language-interpreting::before { + content: "\f2a3"; } + +.fa-asl-interpreting::before { + content: "\f2a3"; } + +.fa-hands-american-sign-language-interpreting::before { + content: "\f2a3"; } + +.fa-gear::before { + content: "\f013"; } + +.fa-cog::before { + content: "\f013"; } + +.fa-droplet-slash::before { + content: "\f5c7"; } + +.fa-tint-slash::before { + content: "\f5c7"; } + +.fa-mosque::before { + content: "\f678"; } + +.fa-mosquito::before { + content: "\e52b"; } + +.fa-star-of-david::before { + content: "\f69a"; } + +.fa-person-military-rifle::before { + content: "\e54b"; } + +.fa-cart-shopping::before { + content: "\f07a"; } + +.fa-shopping-cart::before { + content: "\f07a"; } + +.fa-vials::before { + content: "\f493"; } + +.fa-plug-circle-plus::before { + content: "\e55f"; } + +.fa-place-of-worship::before { + content: "\f67f"; } + +.fa-grip-vertical::before { + content: "\f58e"; } + +.fa-arrow-turn-up::before { + content: "\f148"; } + +.fa-level-up::before { + content: "\f148"; } + +.fa-u::before { + content: "\55"; } + +.fa-square-root-variable::before { + content: "\f698"; } + +.fa-square-root-alt::before { + content: "\f698"; } + +.fa-clock::before { + content: "\f017"; } + +.fa-clock-four::before { + content: "\f017"; } + +.fa-backward-step::before { + content: "\f048"; } + +.fa-step-backward::before { + content: "\f048"; } + +.fa-pallet::before { + content: "\f482"; } + +.fa-faucet::before { + content: "\e005"; } + +.fa-baseball-bat-ball::before { + content: "\f432"; } + +.fa-s::before { + content: "\53"; } + +.fa-timeline::before { + content: "\e29c"; } + +.fa-keyboard::before { + content: "\f11c"; } + +.fa-caret-down::before { + content: "\f0d7"; } + +.fa-house-chimney-medical::before { + content: "\f7f2"; } + +.fa-clinic-medical::before { + content: "\f7f2"; } + +.fa-temperature-three-quarters::before { + content: "\f2c8"; } + +.fa-temperature-3::before { + content: "\f2c8"; } + +.fa-thermometer-3::before { + content: "\f2c8"; } + +.fa-thermometer-three-quarters::before { + content: "\f2c8"; } + +.fa-mobile-screen::before { + content: "\f3cf"; } + +.fa-mobile-android-alt::before { + content: "\f3cf"; } + +.fa-plane-up::before { + content: "\e22d"; } + +.fa-piggy-bank::before { + content: "\f4d3"; } + +.fa-battery-half::before { + content: "\f242"; } + +.fa-battery-3::before { + content: "\f242"; } + +.fa-mountain-city::before { + content: "\e52e"; } + +.fa-coins::before { + content: "\f51e"; } + +.fa-khanda::before { + content: "\f66d"; } + +.fa-sliders::before { + content: "\f1de"; } + +.fa-sliders-h::before { + content: "\f1de"; } + +.fa-folder-tree::before { + content: "\f802"; } + +.fa-network-wired::before { + content: "\f6ff"; } + +.fa-map-pin::before { + content: "\f276"; } + +.fa-hamsa::before { + content: "\f665"; } + +.fa-cent-sign::before { + content: "\e3f5"; } + +.fa-flask::before { + content: "\f0c3"; } + +.fa-person-pregnant::before { + content: "\e31e"; } + +.fa-wand-sparkles::before { + content: "\f72b"; } + +.fa-ellipsis-vertical::before { + content: "\f142"; } + +.fa-ellipsis-v::before { + content: "\f142"; } + +.fa-ticket::before { + content: "\f145"; } + +.fa-power-off::before { + content: "\f011"; } + +.fa-right-long::before { + content: "\f30b"; } + +.fa-long-arrow-alt-right::before { + content: "\f30b"; } + +.fa-flag-usa::before { + content: "\f74d"; } + +.fa-laptop-file::before { + content: "\e51d"; } + +.fa-tty::before { + content: "\f1e4"; } + +.fa-teletype::before { + content: "\f1e4"; } + +.fa-diagram-next::before { + content: "\e476"; } + +.fa-person-rifle::before { + content: "\e54e"; } + +.fa-house-medical-circle-exclamation::before { + content: "\e512"; } + +.fa-closed-captioning::before { + content: "\f20a"; } + +.fa-person-hiking::before { + content: "\f6ec"; } + +.fa-hiking::before { + content: "\f6ec"; } + +.fa-venus-double::before { + content: "\f226"; } + +.fa-images::before { + content: "\f302"; } + +.fa-calculator::before { + content: "\f1ec"; } + +.fa-people-pulling::before { + content: "\e535"; } + +.fa-n::before { + content: "\4e"; } + +.fa-cable-car::before { + content: "\f7da"; } + +.fa-tram::before { + content: "\f7da"; } + +.fa-cloud-rain::before { + content: "\f73d"; } + +.fa-building-circle-xmark::before { + content: "\e4d4"; } + +.fa-ship::before { + content: "\f21a"; } + +.fa-arrows-down-to-line::before { + content: "\e4b8"; } + +.fa-download::before { + content: "\f019"; } + +.fa-face-grin::before { + content: "\f580"; } + +.fa-grin::before { + content: "\f580"; } + +.fa-delete-left::before { + content: "\f55a"; } + +.fa-backspace::before { + content: "\f55a"; } + +.fa-eye-dropper::before { + content: "\f1fb"; } + +.fa-eye-dropper-empty::before { + content: "\f1fb"; } + +.fa-eyedropper::before { + content: "\f1fb"; } + +.fa-file-circle-check::before { + content: "\e5a0"; } + +.fa-forward::before { + content: "\f04e"; } + +.fa-mobile::before { + content: "\f3ce"; } + +.fa-mobile-android::before { + content: "\f3ce"; } + +.fa-mobile-phone::before { + content: "\f3ce"; } + +.fa-face-meh::before { + content: "\f11a"; } + +.fa-meh::before { + content: "\f11a"; } + +.fa-align-center::before { + content: "\f037"; } + +.fa-book-skull::before { + content: "\f6b7"; } + +.fa-book-dead::before { + content: "\f6b7"; } + +.fa-id-card::before { + content: "\f2c2"; } + +.fa-drivers-license::before { + content: "\f2c2"; } + +.fa-outdent::before { + content: "\f03b"; } + +.fa-dedent::before { + content: "\f03b"; } + +.fa-heart-circle-exclamation::before { + content: "\e4fe"; } + +.fa-house::before { + content: "\f015"; } + +.fa-home::before { + content: "\f015"; } + +.fa-home-alt::before { + content: "\f015"; } + +.fa-home-lg-alt::before { + content: "\f015"; } + +.fa-calendar-week::before { + content: "\f784"; } + +.fa-laptop-medical::before { + content: "\f812"; } + +.fa-b::before { + content: "\42"; } + +.fa-file-medical::before { + content: "\f477"; } + +.fa-dice-one::before { + content: "\f525"; } + +.fa-kiwi-bird::before { + content: "\f535"; } + +.fa-arrow-right-arrow-left::before { + content: "\f0ec"; } + +.fa-exchange::before { + content: "\f0ec"; } + +.fa-rotate-right::before { + content: "\f2f9"; } + +.fa-redo-alt::before { + content: "\f2f9"; } + +.fa-rotate-forward::before { + content: "\f2f9"; } + +.fa-utensils::before { + content: "\f2e7"; } + +.fa-cutlery::before { + content: "\f2e7"; } + +.fa-arrow-up-wide-short::before { + content: "\f161"; } + +.fa-sort-amount-up::before { + content: "\f161"; } + +.fa-mill-sign::before { + content: "\e1ed"; } + +.fa-bowl-rice::before { + content: "\e2eb"; } + +.fa-skull::before { + content: "\f54c"; } + +.fa-tower-broadcast::before { + content: "\f519"; } + +.fa-broadcast-tower::before { + content: "\f519"; } + +.fa-truck-pickup::before { + content: "\f63c"; } + +.fa-up-long::before { + content: "\f30c"; } + +.fa-long-arrow-alt-up::before { + content: "\f30c"; } + +.fa-stop::before { + content: "\f04d"; } + +.fa-code-merge::before { + content: "\f387"; } + +.fa-upload::before { + content: "\f093"; } + +.fa-hurricane::before { + content: "\f751"; } + +.fa-mound::before { + content: "\e52d"; } + +.fa-toilet-portable::before { + content: "\e583"; } + +.fa-compact-disc::before { + content: "\f51f"; } + +.fa-file-arrow-down::before { + content: "\f56d"; } + +.fa-file-download::before { + content: "\f56d"; } + +.fa-caravan::before { + content: "\f8ff"; } + +.fa-shield-cat::before { + content: "\e572"; } + +.fa-bolt::before { + content: "\f0e7"; } + +.fa-zap::before { + content: "\f0e7"; } + +.fa-glass-water::before { + content: "\e4f4"; } + +.fa-oil-well::before { + content: "\e532"; } + +.fa-vault::before { + content: "\e2c5"; } + +.fa-mars::before { + content: "\f222"; } + +.fa-toilet::before { + content: "\f7d8"; } + +.fa-plane-circle-xmark::before { + content: "\e557"; } + +.fa-yen-sign::before { + content: "\f157"; } + +.fa-cny::before { + content: "\f157"; } + +.fa-jpy::before { + content: "\f157"; } + +.fa-rmb::before { + content: "\f157"; } + +.fa-yen::before { + content: "\f157"; } + +.fa-ruble-sign::before { + content: "\f158"; } + +.fa-rouble::before { + content: "\f158"; } + +.fa-rub::before { + content: "\f158"; } + +.fa-ruble::before { + content: "\f158"; } + +.fa-sun::before { + content: "\f185"; } + +.fa-guitar::before { + content: "\f7a6"; } + +.fa-face-laugh-wink::before { + content: "\f59c"; } + +.fa-laugh-wink::before { + content: "\f59c"; } + +.fa-horse-head::before { + content: "\f7ab"; } + +.fa-bore-hole::before { + content: "\e4c3"; } + +.fa-industry::before { + content: "\f275"; } + +.fa-circle-down::before { + content: "\f358"; } + +.fa-arrow-alt-circle-down::before { + content: "\f358"; } + +.fa-arrows-turn-to-dots::before { + content: "\e4c1"; } + +.fa-florin-sign::before { + content: "\e184"; } + +.fa-arrow-down-short-wide::before { + content: "\f884"; } + +.fa-sort-amount-desc::before { + content: "\f884"; } + +.fa-sort-amount-down-alt::before { + content: "\f884"; } + +.fa-less-than::before { + content: "\3c"; } + +.fa-angle-down::before { + content: "\f107"; } + +.fa-car-tunnel::before { + content: "\e4de"; } + +.fa-head-side-cough::before { + content: "\e061"; } + +.fa-grip-lines::before { + content: "\f7a4"; } + +.fa-thumbs-down::before { + content: "\f165"; } + +.fa-user-lock::before { + content: "\f502"; } + +.fa-arrow-right-long::before { + content: "\f178"; } + +.fa-long-arrow-right::before { + content: "\f178"; } + +.fa-anchor-circle-xmark::before { + content: "\e4ac"; } + +.fa-ellipsis::before { + content: "\f141"; } + +.fa-ellipsis-h::before { + content: "\f141"; } + +.fa-chess-pawn::before { + content: "\f443"; } + +.fa-kit-medical::before { + content: "\f479"; } + +.fa-first-aid::before { + content: "\f479"; } + +.fa-person-through-window::before { + content: "\e5a9"; } + +.fa-toolbox::before { + content: "\f552"; } + +.fa-hands-holding-circle::before { + content: "\e4fb"; } + +.fa-bug::before { + content: "\f188"; } + +.fa-credit-card::before { + content: "\f09d"; } + +.fa-credit-card-alt::before { + content: "\f09d"; } + +.fa-car::before { + content: "\f1b9"; } + +.fa-automobile::before { + content: "\f1b9"; } + +.fa-hand-holding-hand::before { + content: "\e4f7"; } + +.fa-book-open-reader::before { + content: "\f5da"; } + +.fa-book-reader::before { + content: "\f5da"; } + +.fa-mountain-sun::before { + content: "\e52f"; } + +.fa-arrows-left-right-to-line::before { + content: "\e4ba"; } + +.fa-dice-d20::before { + content: "\f6cf"; } + +.fa-truck-droplet::before { + content: "\e58c"; } + +.fa-file-circle-xmark::before { + content: "\e5a1"; } + +.fa-temperature-arrow-up::before { + content: "\e040"; } + +.fa-temperature-up::before { + content: "\e040"; } + +.fa-medal::before { + content: "\f5a2"; } + +.fa-bed::before { + content: "\f236"; } + +.fa-square-h::before { + content: "\f0fd"; } + +.fa-h-square::before { + content: "\f0fd"; } + +.fa-podcast::before { + content: "\f2ce"; } + +.fa-temperature-full::before { + content: "\f2c7"; } + +.fa-temperature-4::before { + content: "\f2c7"; } + +.fa-thermometer-4::before { + content: "\f2c7"; } + +.fa-thermometer-full::before { + content: "\f2c7"; } + +.fa-bell::before { + content: "\f0f3"; } + +.fa-superscript::before { + content: "\f12b"; } + +.fa-plug-circle-xmark::before { + content: "\e560"; } + +.fa-star-of-life::before { + content: "\f621"; } + +.fa-phone-slash::before { + content: "\f3dd"; } + +.fa-paint-roller::before { + content: "\f5aa"; } + +.fa-handshake-angle::before { + content: "\f4c4"; } + +.fa-hands-helping::before { + content: "\f4c4"; } + +.fa-location-dot::before { + content: "\f3c5"; } + +.fa-map-marker-alt::before { + content: "\f3c5"; } + +.fa-file::before { + content: "\f15b"; } + +.fa-greater-than::before { + content: "\3e"; } + +.fa-person-swimming::before { + content: "\f5c4"; } + +.fa-swimmer::before { + content: "\f5c4"; } + +.fa-arrow-down::before { + content: "\f063"; } + +.fa-droplet::before { + content: "\f043"; } + +.fa-tint::before { + content: "\f043"; } + +.fa-eraser::before { + content: "\f12d"; } + +.fa-earth-americas::before { + content: "\f57d"; } + +.fa-earth::before { + content: "\f57d"; } + +.fa-earth-america::before { + content: "\f57d"; } + +.fa-globe-americas::before { + content: "\f57d"; } + +.fa-person-burst::before { + content: "\e53b"; } + +.fa-dove::before { + content: "\f4ba"; } + +.fa-battery-empty::before { + content: "\f244"; } + +.fa-battery-0::before { + content: "\f244"; } + +.fa-socks::before { + content: "\f696"; } + +.fa-inbox::before { + content: "\f01c"; } + +.fa-section::before { + content: "\e447"; } + +.fa-gauge-high::before { + content: "\f625"; } + +.fa-tachometer-alt::before { + content: "\f625"; } + +.fa-tachometer-alt-fast::before { + content: "\f625"; } + +.fa-envelope-open-text::before { + content: "\f658"; } + +.fa-hospital::before { + content: "\f0f8"; } + +.fa-hospital-alt::before { + content: "\f0f8"; } + +.fa-hospital-wide::before { + content: "\f0f8"; } + +.fa-wine-bottle::before { + content: "\f72f"; } + +.fa-chess-rook::before { + content: "\f447"; } + +.fa-bars-staggered::before { + content: "\f550"; } + +.fa-reorder::before { + content: "\f550"; } + +.fa-stream::before { + content: "\f550"; } + +.fa-dharmachakra::before { + content: "\f655"; } + +.fa-hotdog::before { + content: "\f80f"; } + +.fa-person-walking-with-cane::before { + content: "\f29d"; } + +.fa-blind::before { + content: "\f29d"; } + +.fa-drum::before { + content: "\f569"; } + +.fa-ice-cream::before { + content: "\f810"; } + +.fa-heart-circle-bolt::before { + content: "\e4fc"; } + +.fa-fax::before { + content: "\f1ac"; } + +.fa-paragraph::before { + content: "\f1dd"; } + +.fa-check-to-slot::before { + content: "\f772"; } + +.fa-vote-yea::before { + content: "\f772"; } + +.fa-star-half::before { + content: "\f089"; } + +.fa-boxes-stacked::before { + content: "\f468"; } + +.fa-boxes::before { + content: "\f468"; } + +.fa-boxes-alt::before { + content: "\f468"; } + +.fa-link::before { + content: "\f0c1"; } + +.fa-chain::before { + content: "\f0c1"; } + +.fa-ear-listen::before { + content: "\f2a2"; } + +.fa-assistive-listening-systems::before { + content: "\f2a2"; } + +.fa-tree-city::before { + content: "\e587"; } + +.fa-play::before { + content: "\f04b"; } + +.fa-font::before { + content: "\f031"; } + +.fa-table-cells-row-lock::before { + content: "\e67a"; } + +.fa-rupiah-sign::before { + content: "\e23d"; } + +.fa-magnifying-glass::before { + content: "\f002"; } + +.fa-search::before { + content: "\f002"; } + +.fa-table-tennis-paddle-ball::before { + content: "\f45d"; } + +.fa-ping-pong-paddle-ball::before { + content: "\f45d"; } + +.fa-table-tennis::before { + content: "\f45d"; } + +.fa-person-dots-from-line::before { + content: "\f470"; } + +.fa-diagnoses::before { + content: "\f470"; } + +.fa-trash-can-arrow-up::before { + content: "\f82a"; } + +.fa-trash-restore-alt::before { + content: "\f82a"; } + +.fa-naira-sign::before { + content: "\e1f6"; } + +.fa-cart-arrow-down::before { + content: "\f218"; } + +.fa-walkie-talkie::before { + content: "\f8ef"; } + +.fa-file-pen::before { + content: "\f31c"; } + +.fa-file-edit::before { + content: "\f31c"; } + +.fa-receipt::before { + content: "\f543"; } + +.fa-square-pen::before { + content: "\f14b"; } + +.fa-pen-square::before { + content: "\f14b"; } + +.fa-pencil-square::before { + content: "\f14b"; } + +.fa-suitcase-rolling::before { + content: "\f5c1"; } + +.fa-person-circle-exclamation::before { + content: "\e53f"; } + +.fa-chevron-down::before { + content: "\f078"; } + +.fa-battery-full::before { + content: "\f240"; } + +.fa-battery::before { + content: "\f240"; } + +.fa-battery-5::before { + content: "\f240"; } + +.fa-skull-crossbones::before { + content: "\f714"; } + +.fa-code-compare::before { + content: "\e13a"; } + +.fa-list-ul::before { + content: "\f0ca"; } + +.fa-list-dots::before { + content: "\f0ca"; } + +.fa-school-lock::before { + content: "\e56f"; } + +.fa-tower-cell::before { + content: "\e585"; } + +.fa-down-long::before { + content: "\f309"; } + +.fa-long-arrow-alt-down::before { + content: "\f309"; } + +.fa-ranking-star::before { + content: "\e561"; } + +.fa-chess-king::before { + content: "\f43f"; } + +.fa-person-harassing::before { + content: "\e549"; } + +.fa-brazilian-real-sign::before { + content: "\e46c"; } + +.fa-landmark-dome::before { + content: "\f752"; } + +.fa-landmark-alt::before { + content: "\f752"; } + +.fa-arrow-up::before { + content: "\f062"; } + +.fa-tv::before { + content: "\f26c"; } + +.fa-television::before { + content: "\f26c"; } + +.fa-tv-alt::before { + content: "\f26c"; } + +.fa-shrimp::before { + content: "\e448"; } + +.fa-list-check::before { + content: "\f0ae"; } + +.fa-tasks::before { + content: "\f0ae"; } + +.fa-jug-detergent::before { + content: "\e519"; } + +.fa-circle-user::before { + content: "\f2bd"; } + +.fa-user-circle::before { + content: "\f2bd"; } + +.fa-user-shield::before { + content: "\f505"; } + +.fa-wind::before { + content: "\f72e"; } + +.fa-car-burst::before { + content: "\f5e1"; } + +.fa-car-crash::before { + content: "\f5e1"; } + +.fa-y::before { + content: "\59"; } + +.fa-person-snowboarding::before { + content: "\f7ce"; } + +.fa-snowboarding::before { + content: "\f7ce"; } + +.fa-truck-fast::before { + content: "\f48b"; } + +.fa-shipping-fast::before { + content: "\f48b"; } + +.fa-fish::before { + content: "\f578"; } + +.fa-user-graduate::before { + content: "\f501"; } + +.fa-circle-half-stroke::before { + content: "\f042"; } + +.fa-adjust::before { + content: "\f042"; } + +.fa-clapperboard::before { + content: "\e131"; } + +.fa-circle-radiation::before { + content: "\f7ba"; } + +.fa-radiation-alt::before { + content: "\f7ba"; } + +.fa-baseball::before { + content: "\f433"; } + +.fa-baseball-ball::before { + content: "\f433"; } + +.fa-jet-fighter-up::before { + content: "\e518"; } + +.fa-diagram-project::before { + content: "\f542"; } + +.fa-project-diagram::before { + content: "\f542"; } + +.fa-copy::before { + content: "\f0c5"; } + +.fa-volume-xmark::before { + content: "\f6a9"; } + +.fa-volume-mute::before { + content: "\f6a9"; } + +.fa-volume-times::before { + content: "\f6a9"; } + +.fa-hand-sparkles::before { + content: "\e05d"; } + +.fa-grip::before { + content: "\f58d"; } + +.fa-grip-horizontal::before { + content: "\f58d"; } + +.fa-share-from-square::before { + content: "\f14d"; } + +.fa-share-square::before { + content: "\f14d"; } + +.fa-child-combatant::before { + content: "\e4e0"; } + +.fa-child-rifle::before { + content: "\e4e0"; } + +.fa-gun::before { + content: "\e19b"; } + +.fa-square-phone::before { + content: "\f098"; } + +.fa-phone-square::before { + content: "\f098"; } + +.fa-plus::before { + content: "\2b"; } + +.fa-add::before { + content: "\2b"; } + +.fa-expand::before { + content: "\f065"; } + +.fa-computer::before { + content: "\e4e5"; } + +.fa-xmark::before { + content: "\f00d"; } + +.fa-close::before { + content: "\f00d"; } + +.fa-multiply::before { + content: "\f00d"; } + +.fa-remove::before { + content: "\f00d"; } + +.fa-times::before { + content: "\f00d"; } + +.fa-arrows-up-down-left-right::before { + content: "\f047"; } + +.fa-arrows::before { + content: "\f047"; } + +.fa-chalkboard-user::before { + content: "\f51c"; } + +.fa-chalkboard-teacher::before { + content: "\f51c"; } + +.fa-peso-sign::before { + content: "\e222"; } + +.fa-building-shield::before { + content: "\e4d8"; } + +.fa-baby::before { + content: "\f77c"; } + +.fa-users-line::before { + content: "\e592"; } + +.fa-quote-left::before { + content: "\f10d"; } + +.fa-quote-left-alt::before { + content: "\f10d"; } + +.fa-tractor::before { + content: "\f722"; } + +.fa-trash-arrow-up::before { + content: "\f829"; } + +.fa-trash-restore::before { + content: "\f829"; } + +.fa-arrow-down-up-lock::before { + content: "\e4b0"; } + +.fa-lines-leaning::before { + content: "\e51e"; } + +.fa-ruler-combined::before { + content: "\f546"; } + +.fa-copyright::before { + content: "\f1f9"; } + +.fa-equals::before { + content: "\3d"; } + +.fa-blender::before { + content: "\f517"; } + +.fa-teeth::before { + content: "\f62e"; } + +.fa-shekel-sign::before { + content: "\f20b"; } + +.fa-ils::before { + content: "\f20b"; } + +.fa-shekel::before { + content: "\f20b"; } + +.fa-sheqel::before { + content: "\f20b"; } + +.fa-sheqel-sign::before { + content: "\f20b"; } + +.fa-map::before { + content: "\f279"; } + +.fa-rocket::before { + content: "\f135"; } + +.fa-photo-film::before { + content: "\f87c"; } + +.fa-photo-video::before { + content: "\f87c"; } + +.fa-folder-minus::before { + content: "\f65d"; } + +.fa-store::before { + content: "\f54e"; } + +.fa-arrow-trend-up::before { + content: "\e098"; } + +.fa-plug-circle-minus::before { + content: "\e55e"; } + +.fa-sign-hanging::before { + content: "\f4d9"; } + +.fa-sign::before { + content: "\f4d9"; } + +.fa-bezier-curve::before { + content: "\f55b"; } + +.fa-bell-slash::before { + content: "\f1f6"; } + +.fa-tablet::before { + content: "\f3fb"; } + +.fa-tablet-android::before { + content: "\f3fb"; } + +.fa-school-flag::before { + content: "\e56e"; } + +.fa-fill::before { + content: "\f575"; } + +.fa-angle-up::before { + content: "\f106"; } + +.fa-drumstick-bite::before { + content: "\f6d7"; } + +.fa-holly-berry::before { + content: "\f7aa"; } + +.fa-chevron-left::before { + content: "\f053"; } + +.fa-bacteria::before { + content: "\e059"; } + +.fa-hand-lizard::before { + content: "\f258"; } + +.fa-notdef::before { + content: "\e1fe"; } + +.fa-disease::before { + content: "\f7fa"; } + +.fa-briefcase-medical::before { + content: "\f469"; } + +.fa-genderless::before { + content: "\f22d"; } + +.fa-chevron-right::before { + content: "\f054"; } + +.fa-retweet::before { + content: "\f079"; } + +.fa-car-rear::before { + content: "\f5de"; } + +.fa-car-alt::before { + content: "\f5de"; } + +.fa-pump-soap::before { + content: "\e06b"; } + +.fa-video-slash::before { + content: "\f4e2"; } + +.fa-battery-quarter::before { + content: "\f243"; } + +.fa-battery-2::before { + content: "\f243"; } + +.fa-radio::before { + content: "\f8d7"; } + +.fa-baby-carriage::before { + content: "\f77d"; } + +.fa-carriage-baby::before { + content: "\f77d"; } + +.fa-traffic-light::before { + content: "\f637"; } + +.fa-thermometer::before { + content: "\f491"; } + +.fa-vr-cardboard::before { + content: "\f729"; } + +.fa-hand-middle-finger::before { + content: "\f806"; } + +.fa-percent::before { + content: "\25"; } + +.fa-percentage::before { + content: "\25"; } + +.fa-truck-moving::before { + content: "\f4df"; } + +.fa-glass-water-droplet::before { + content: "\e4f5"; } + +.fa-display::before { + content: "\e163"; } + +.fa-face-smile::before { + content: "\f118"; } + +.fa-smile::before { + content: "\f118"; } + +.fa-thumbtack::before { + content: "\f08d"; } + +.fa-thumb-tack::before { + content: "\f08d"; } + +.fa-trophy::before { + content: "\f091"; } + +.fa-person-praying::before { + content: "\f683"; } + +.fa-pray::before { + content: "\f683"; } + +.fa-hammer::before { + content: "\f6e3"; } + +.fa-hand-peace::before { + content: "\f25b"; } + +.fa-rotate::before { + content: "\f2f1"; } + +.fa-sync-alt::before { + content: "\f2f1"; } + +.fa-spinner::before { + content: "\f110"; } + +.fa-robot::before { + content: "\f544"; } + +.fa-peace::before { + content: "\f67c"; } + +.fa-gears::before { + content: "\f085"; } + +.fa-cogs::before { + content: "\f085"; } + +.fa-warehouse::before { + content: "\f494"; } + +.fa-arrow-up-right-dots::before { + content: "\e4b7"; } + +.fa-splotch::before { + content: "\f5bc"; } + +.fa-face-grin-hearts::before { + content: "\f584"; } + +.fa-grin-hearts::before { + content: "\f584"; } + +.fa-dice-four::before { + content: "\f524"; } + +.fa-sim-card::before { + content: "\f7c4"; } + +.fa-transgender::before { + content: "\f225"; } + +.fa-transgender-alt::before { + content: "\f225"; } + +.fa-mercury::before { + content: "\f223"; } + +.fa-arrow-turn-down::before { + content: "\f149"; } + +.fa-level-down::before { + content: "\f149"; } + +.fa-person-falling-burst::before { + content: "\e547"; } + +.fa-award::before { + content: "\f559"; } + +.fa-ticket-simple::before { + content: "\f3ff"; } + +.fa-ticket-alt::before { + content: "\f3ff"; } + +.fa-building::before { + content: "\f1ad"; } + +.fa-angles-left::before { + content: "\f100"; } + +.fa-angle-double-left::before { + content: "\f100"; } + +.fa-qrcode::before { + content: "\f029"; } + +.fa-clock-rotate-left::before { + content: "\f1da"; } + +.fa-history::before { + content: "\f1da"; } + +.fa-face-grin-beam-sweat::before { + content: "\f583"; } + +.fa-grin-beam-sweat::before { + content: "\f583"; } + +.fa-file-export::before { + content: "\f56e"; } + +.fa-arrow-right-from-file::before { + content: "\f56e"; } + +.fa-shield::before { + content: "\f132"; } + +.fa-shield-blank::before { + content: "\f132"; } + +.fa-arrow-up-short-wide::before { + content: "\f885"; } + +.fa-sort-amount-up-alt::before { + content: "\f885"; } + +.fa-house-medical::before { + content: "\e3b2"; } + +.fa-golf-ball-tee::before { + content: "\f450"; } + +.fa-golf-ball::before { + content: "\f450"; } + +.fa-circle-chevron-left::before { + content: "\f137"; } + +.fa-chevron-circle-left::before { + content: "\f137"; } + +.fa-house-chimney-window::before { + content: "\e00d"; } + +.fa-pen-nib::before { + content: "\f5ad"; } + +.fa-tent-arrow-turn-left::before { + content: "\e580"; } + +.fa-tents::before { + content: "\e582"; } + +.fa-wand-magic::before { + content: "\f0d0"; } + +.fa-magic::before { + content: "\f0d0"; } + +.fa-dog::before { + content: "\f6d3"; } + +.fa-carrot::before { + content: "\f787"; } + +.fa-moon::before { + content: "\f186"; } + +.fa-wine-glass-empty::before { + content: "\f5ce"; } + +.fa-wine-glass-alt::before { + content: "\f5ce"; } + +.fa-cheese::before { + content: "\f7ef"; } + +.fa-yin-yang::before { + content: "\f6ad"; } + +.fa-music::before { + content: "\f001"; } + +.fa-code-commit::before { + content: "\f386"; } + +.fa-temperature-low::before { + content: "\f76b"; } + +.fa-person-biking::before { + content: "\f84a"; } + +.fa-biking::before { + content: "\f84a"; } + +.fa-broom::before { + content: "\f51a"; } + +.fa-shield-heart::before { + content: "\e574"; } + +.fa-gopuram::before { + content: "\f664"; } + +.fa-earth-oceania::before { + content: "\e47b"; } + +.fa-globe-oceania::before { + content: "\e47b"; } + +.fa-square-xmark::before { + content: "\f2d3"; } + +.fa-times-square::before { + content: "\f2d3"; } + +.fa-xmark-square::before { + content: "\f2d3"; } + +.fa-hashtag::before { + content: "\23"; } + +.fa-up-right-and-down-left-from-center::before { + content: "\f424"; } + +.fa-expand-alt::before { + content: "\f424"; } + +.fa-oil-can::before { + content: "\f613"; } + +.fa-t::before { + content: "\54"; } + +.fa-hippo::before { + content: "\f6ed"; } + +.fa-chart-column::before { + content: "\e0e3"; } + +.fa-infinity::before { + content: "\f534"; } + +.fa-vial-circle-check::before { + content: "\e596"; } + +.fa-person-arrow-down-to-line::before { + content: "\e538"; } + +.fa-voicemail::before { + content: "\f897"; } + +.fa-fan::before { + content: "\f863"; } + +.fa-person-walking-luggage::before { + content: "\e554"; } + +.fa-up-down::before { + content: "\f338"; } + +.fa-arrows-alt-v::before { + content: "\f338"; } + +.fa-cloud-moon-rain::before { + content: "\f73c"; } + +.fa-calendar::before { + content: "\f133"; } + +.fa-trailer::before { + content: "\e041"; } + +.fa-bahai::before { + content: "\f666"; } + +.fa-haykal::before { + content: "\f666"; } + +.fa-sd-card::before { + content: "\f7c2"; } + +.fa-dragon::before { + content: "\f6d5"; } + +.fa-shoe-prints::before { + content: "\f54b"; } + +.fa-circle-plus::before { + content: "\f055"; } + +.fa-plus-circle::before { + content: "\f055"; } + +.fa-face-grin-tongue-wink::before { + content: "\f58b"; } + +.fa-grin-tongue-wink::before { + content: "\f58b"; } + +.fa-hand-holding::before { + content: "\f4bd"; } + +.fa-plug-circle-exclamation::before { + content: "\e55d"; } + +.fa-link-slash::before { + content: "\f127"; } + +.fa-chain-broken::before { + content: "\f127"; } + +.fa-chain-slash::before { + content: "\f127"; } + +.fa-unlink::before { + content: "\f127"; } + +.fa-clone::before { + content: "\f24d"; } + +.fa-person-walking-arrow-loop-left::before { + content: "\e551"; } + +.fa-arrow-up-z-a::before { + content: "\f882"; } + +.fa-sort-alpha-up-alt::before { + content: "\f882"; } + +.fa-fire-flame-curved::before { + content: "\f7e4"; } + +.fa-fire-alt::before { + content: "\f7e4"; } + +.fa-tornado::before { + content: "\f76f"; } + +.fa-file-circle-plus::before { + content: "\e494"; } + +.fa-book-quran::before { + content: "\f687"; } + +.fa-quran::before { + content: "\f687"; } + +.fa-anchor::before { + content: "\f13d"; } + +.fa-border-all::before { + content: "\f84c"; } + +.fa-face-angry::before { + content: "\f556"; } + +.fa-angry::before { + content: "\f556"; } + +.fa-cookie-bite::before { + content: "\f564"; } + +.fa-arrow-trend-down::before { + content: "\e097"; } + +.fa-rss::before { + content: "\f09e"; } + +.fa-feed::before { + content: "\f09e"; } + +.fa-draw-polygon::before { + content: "\f5ee"; } + +.fa-scale-balanced::before { + content: "\f24e"; } + +.fa-balance-scale::before { + content: "\f24e"; } + +.fa-gauge-simple-high::before { + content: "\f62a"; } + +.fa-tachometer::before { + content: "\f62a"; } + +.fa-tachometer-fast::before { + content: "\f62a"; } + +.fa-shower::before { + content: "\f2cc"; } + +.fa-desktop::before { + content: "\f390"; } + +.fa-desktop-alt::before { + content: "\f390"; } + +.fa-m::before { + content: "\4d"; } + +.fa-table-list::before { + content: "\f00b"; } + +.fa-th-list::before { + content: "\f00b"; } + +.fa-comment-sms::before { + content: "\f7cd"; } + +.fa-sms::before { + content: "\f7cd"; } + +.fa-book::before { + content: "\f02d"; } + +.fa-user-plus::before { + content: "\f234"; } + +.fa-check::before { + content: "\f00c"; } + +.fa-battery-three-quarters::before { + content: "\f241"; } + +.fa-battery-4::before { + content: "\f241"; } + +.fa-house-circle-check::before { + content: "\e509"; } + +.fa-angle-left::before { + content: "\f104"; } + +.fa-diagram-successor::before { + content: "\e47a"; } + +.fa-truck-arrow-right::before { + content: "\e58b"; } + +.fa-arrows-split-up-and-left::before { + content: "\e4bc"; } + +.fa-hand-fist::before { + content: "\f6de"; } + +.fa-fist-raised::before { + content: "\f6de"; } + +.fa-cloud-moon::before { + content: "\f6c3"; } + +.fa-briefcase::before { + content: "\f0b1"; } + +.fa-person-falling::before { + content: "\e546"; } + +.fa-image-portrait::before { + content: "\f3e0"; } + +.fa-portrait::before { + content: "\f3e0"; } + +.fa-user-tag::before { + content: "\f507"; } + +.fa-rug::before { + content: "\e569"; } + +.fa-earth-europe::before { + content: "\f7a2"; } + +.fa-globe-europe::before { + content: "\f7a2"; } + +.fa-cart-flatbed-suitcase::before { + content: "\f59d"; } + +.fa-luggage-cart::before { + content: "\f59d"; } + +.fa-rectangle-xmark::before { + content: "\f410"; } + +.fa-rectangle-times::before { + content: "\f410"; } + +.fa-times-rectangle::before { + content: "\f410"; } + +.fa-window-close::before { + content: "\f410"; } + +.fa-baht-sign::before { + content: "\e0ac"; } + +.fa-book-open::before { + content: "\f518"; } + +.fa-book-journal-whills::before { + content: "\f66a"; } + +.fa-journal-whills::before { + content: "\f66a"; } + +.fa-handcuffs::before { + content: "\e4f8"; } + +.fa-triangle-exclamation::before { + content: "\f071"; } + +.fa-exclamation-triangle::before { + content: "\f071"; } + +.fa-warning::before { + content: "\f071"; } + +.fa-database::before { + content: "\f1c0"; } + +.fa-share::before { + content: "\f064"; } + +.fa-mail-forward::before { + content: "\f064"; } + +.fa-bottle-droplet::before { + content: "\e4c4"; } + +.fa-mask-face::before { + content: "\e1d7"; } + +.fa-hill-rockslide::before { + content: "\e508"; } + +.fa-right-left::before { + content: "\f362"; } + +.fa-exchange-alt::before { + content: "\f362"; } + +.fa-paper-plane::before { + content: "\f1d8"; } + +.fa-road-circle-exclamation::before { + content: "\e565"; } + +.fa-dungeon::before { + content: "\f6d9"; } + +.fa-align-right::before { + content: "\f038"; } + +.fa-money-bill-1-wave::before { + content: "\f53b"; } + +.fa-money-bill-wave-alt::before { + content: "\f53b"; } + +.fa-life-ring::before { + content: "\f1cd"; } + +.fa-hands::before { + content: "\f2a7"; } + +.fa-sign-language::before { + content: "\f2a7"; } + +.fa-signing::before { + content: "\f2a7"; } + +.fa-calendar-day::before { + content: "\f783"; } + +.fa-water-ladder::before { + content: "\f5c5"; } + +.fa-ladder-water::before { + content: "\f5c5"; } + +.fa-swimming-pool::before { + content: "\f5c5"; } + +.fa-arrows-up-down::before { + content: "\f07d"; } + +.fa-arrows-v::before { + content: "\f07d"; } + +.fa-face-grimace::before { + content: "\f57f"; } + +.fa-grimace::before { + content: "\f57f"; } + +.fa-wheelchair-move::before { + content: "\e2ce"; } + +.fa-wheelchair-alt::before { + content: "\e2ce"; } + +.fa-turn-down::before { + content: "\f3be"; } + +.fa-level-down-alt::before { + content: "\f3be"; } + +.fa-person-walking-arrow-right::before { + content: "\e552"; } + +.fa-square-envelope::before { + content: "\f199"; } + +.fa-envelope-square::before { + content: "\f199"; } + +.fa-dice::before { + content: "\f522"; } + +.fa-bowling-ball::before { + content: "\f436"; } + +.fa-brain::before { + content: "\f5dc"; } + +.fa-bandage::before { + content: "\f462"; } + +.fa-band-aid::before { + content: "\f462"; } + +.fa-calendar-minus::before { + content: "\f272"; } + +.fa-circle-xmark::before { + content: "\f057"; } + +.fa-times-circle::before { + content: "\f057"; } + +.fa-xmark-circle::before { + content: "\f057"; } + +.fa-gifts::before { + content: "\f79c"; } + +.fa-hotel::before { + content: "\f594"; } + +.fa-earth-asia::before { + content: "\f57e"; } + +.fa-globe-asia::before { + content: "\f57e"; } + +.fa-id-card-clip::before { + content: "\f47f"; } + +.fa-id-card-alt::before { + content: "\f47f"; } + +.fa-magnifying-glass-plus::before { + content: "\f00e"; } + +.fa-search-plus::before { + content: "\f00e"; } + +.fa-thumbs-up::before { + content: "\f164"; } + +.fa-user-clock::before { + content: "\f4fd"; } + +.fa-hand-dots::before { + content: "\f461"; } + +.fa-allergies::before { + content: "\f461"; } + +.fa-file-invoice::before { + content: "\f570"; } + +.fa-window-minimize::before { + content: "\f2d1"; } + +.fa-mug-saucer::before { + content: "\f0f4"; } + +.fa-coffee::before { + content: "\f0f4"; } + +.fa-brush::before { + content: "\f55d"; } + +.fa-mask::before { + content: "\f6fa"; } + +.fa-magnifying-glass-minus::before { + content: "\f010"; } + +.fa-search-minus::before { + content: "\f010"; } + +.fa-ruler-vertical::before { + content: "\f548"; } + +.fa-user-large::before { + content: "\f406"; } + +.fa-user-alt::before { + content: "\f406"; } + +.fa-train-tram::before { + content: "\e5b4"; } + +.fa-user-nurse::before { + content: "\f82f"; } + +.fa-syringe::before { + content: "\f48e"; } + +.fa-cloud-sun::before { + content: "\f6c4"; } + +.fa-stopwatch-20::before { + content: "\e06f"; } + +.fa-square-full::before { + content: "\f45c"; } + +.fa-magnet::before { + content: "\f076"; } + +.fa-jar::before { + content: "\e516"; } + +.fa-note-sticky::before { + content: "\f249"; } + +.fa-sticky-note::before { + content: "\f249"; } + +.fa-bug-slash::before { + content: "\e490"; } + +.fa-arrow-up-from-water-pump::before { + content: "\e4b6"; } + +.fa-bone::before { + content: "\f5d7"; } + +.fa-table-cells-row-unlock::before { + content: "\e691"; } + +.fa-user-injured::before { + content: "\f728"; } + +.fa-face-sad-tear::before { + content: "\f5b4"; } + +.fa-sad-tear::before { + content: "\f5b4"; } + +.fa-plane::before { + content: "\f072"; } + +.fa-tent-arrows-down::before { + content: "\e581"; } + +.fa-exclamation::before { + content: "\21"; } + +.fa-arrows-spin::before { + content: "\e4bb"; } + +.fa-print::before { + content: "\f02f"; } + +.fa-turkish-lira-sign::before { + content: "\e2bb"; } + +.fa-try::before { + content: "\e2bb"; } + +.fa-turkish-lira::before { + content: "\e2bb"; } + +.fa-dollar-sign::before { + content: "\24"; } + +.fa-dollar::before { + content: "\24"; } + +.fa-usd::before { + content: "\24"; } + +.fa-x::before { + content: "\58"; } + +.fa-magnifying-glass-dollar::before { + content: "\f688"; } + +.fa-search-dollar::before { + content: "\f688"; } + +.fa-users-gear::before { + content: "\f509"; } + +.fa-users-cog::before { + content: "\f509"; } + +.fa-person-military-pointing::before { + content: "\e54a"; } + +.fa-building-columns::before { + content: "\f19c"; } + +.fa-bank::before { + content: "\f19c"; } + +.fa-institution::before { + content: "\f19c"; } + +.fa-museum::before { + content: "\f19c"; } + +.fa-university::before { + content: "\f19c"; } + +.fa-umbrella::before { + content: "\f0e9"; } + +.fa-trowel::before { + content: "\e589"; } + +.fa-d::before { + content: "\44"; } + +.fa-stapler::before { + content: "\e5af"; } + +.fa-masks-theater::before { + content: "\f630"; } + +.fa-theater-masks::before { + content: "\f630"; } + +.fa-kip-sign::before { + content: "\e1c4"; } + +.fa-hand-point-left::before { + content: "\f0a5"; } + +.fa-handshake-simple::before { + content: "\f4c6"; } + +.fa-handshake-alt::before { + content: "\f4c6"; } + +.fa-jet-fighter::before { + content: "\f0fb"; } + +.fa-fighter-jet::before { + content: "\f0fb"; } + +.fa-square-share-nodes::before { + content: "\f1e1"; } + +.fa-share-alt-square::before { + content: "\f1e1"; } + +.fa-barcode::before { + content: "\f02a"; } + +.fa-plus-minus::before { + content: "\e43c"; } + +.fa-video::before { + content: "\f03d"; } + +.fa-video-camera::before { + content: "\f03d"; } + +.fa-graduation-cap::before { + content: "\f19d"; } + +.fa-mortar-board::before { + content: "\f19d"; } + +.fa-hand-holding-medical::before { + content: "\e05c"; } + .fa-monero:before { + content: "\f3d0"; } + + .fa-hooli:before { + content: "\f427"; } + + .fa-yelp:before { + content: "\f1e9"; } + + .fa-cc-visa:before { + content: "\f1f0"; } + + .fa-lastfm:before { + content: "\f202"; } + + .fa-shopware:before { + content: "\f5b5"; } + + .fa-creative-commons-nc:before { + content: "\f4e8"; } + + .fa-aws:before { + content: "\f375"; } + + .fa-redhat:before { + content: "\f7bc"; } + + .fa-yoast:before { + content: "\f2b1"; } + + .fa-cloudflare:before { + content: "\e07d"; } + + .fa-ups:before { + content: "\f7e0"; } + + .fa-pixiv:before { + content: "\e640"; } + + .fa-wpexplorer:before { + content: "\f2de"; } + + .fa-dyalog:before { + content: "\f399"; } + + .fa-bity:before { + content: "\f37a"; } + + .fa-stackpath:before { + content: "\f842"; } + + .fa-buysellads:before { + content: "\f20d"; } + + .fa-first-order:before { + content: "\f2b0"; } + + .fa-modx:before { + content: "\f285"; } + + .fa-guilded:before { + content: "\e07e"; } + + .fa-vnv:before { + content: "\f40b"; } + + .fa-square-js:before { + content: "\f3b9"; } + + .fa-js-square:before { + content: "\f3b9"; } + + .fa-microsoft:before { + content: "\f3ca"; } + + .fa-qq:before { + content: "\f1d6"; } + + .fa-orcid:before { + content: "\f8d2"; } + + .fa-java:before { + content: "\f4e4"; } + + .fa-invision:before { + content: "\f7b0"; } + + .fa-creative-commons-pd-alt:before { + content: "\f4ed"; } + + .fa-centercode:before { + content: "\f380"; } + + .fa-glide-g:before { + content: "\f2a6"; } + + .fa-drupal:before { + content: "\f1a9"; } + + .fa-jxl:before { + content: "\e67b"; } + + .fa-dart-lang:before { + content: "\e693"; } + + .fa-hire-a-helper:before { + content: "\f3b0"; } + + .fa-creative-commons-by:before { + content: "\f4e7"; } + + .fa-unity:before { + content: "\e049"; } + + .fa-whmcs:before { + content: "\f40d"; } + + .fa-rocketchat:before { + content: "\f3e8"; } + + .fa-vk:before { + content: "\f189"; } + + .fa-untappd:before { + content: "\f405"; } + + .fa-mailchimp:before { + content: "\f59e"; } + + .fa-css3-alt:before { + content: "\f38b"; } + + .fa-square-reddit:before { + content: "\f1a2"; } + + .fa-reddit-square:before { + content: "\f1a2"; } + + .fa-vimeo-v:before { + content: "\f27d"; } + + .fa-contao:before { + content: "\f26d"; } + + .fa-square-font-awesome:before { + content: "\e5ad"; } + + .fa-deskpro:before { + content: "\f38f"; } + + .fa-brave:before { + content: "\e63c"; } + + .fa-sistrix:before { + content: "\f3ee"; } + + .fa-square-instagram:before { + content: "\e055"; } + + .fa-instagram-square:before { + content: "\e055"; } + + .fa-battle-net:before { + content: "\f835"; } + + .fa-the-red-yeti:before { + content: "\f69d"; } + + .fa-square-hacker-news:before { + content: "\f3af"; } + + .fa-hacker-news-square:before { + content: "\f3af"; } + + .fa-edge:before { + content: "\f282"; } + + .fa-threads:before { + content: "\e618"; } + + .fa-napster:before { + content: "\f3d2"; } + + .fa-square-snapchat:before { + content: "\f2ad"; } + + .fa-snapchat-square:before { + content: "\f2ad"; } + + .fa-google-plus-g:before { + content: "\f0d5"; } + + .fa-artstation:before { + content: "\f77a"; } + + .fa-markdown:before { + content: "\f60f"; } + + .fa-sourcetree:before { + content: "\f7d3"; } + + .fa-google-plus:before { + content: "\f2b3"; } + + .fa-diaspora:before { + content: "\f791"; } + + .fa-foursquare:before { + content: "\f180"; } + + .fa-stack-overflow:before { + content: "\f16c"; } + + .fa-github-alt:before { + content: "\f113"; } + + .fa-phoenix-squadron:before { + content: "\f511"; } + + .fa-pagelines:before { + content: "\f18c"; } + + .fa-algolia:before { + content: "\f36c"; } + + .fa-red-river:before { + content: "\f3e3"; } + + .fa-creative-commons-sa:before { + content: "\f4ef"; } + + .fa-safari:before { + content: "\f267"; } + + .fa-google:before { + content: "\f1a0"; } + + .fa-square-font-awesome-stroke:before { + content: "\f35c"; } + + .fa-font-awesome-alt:before { + content: "\f35c"; } + + .fa-atlassian:before { + content: "\f77b"; } + + .fa-linkedin-in:before { + content: "\f0e1"; } + + .fa-digital-ocean:before { + content: "\f391"; } + + .fa-nimblr:before { + content: "\f5a8"; } + + .fa-chromecast:before { + content: "\f838"; } + + .fa-evernote:before { + content: "\f839"; } + + .fa-hacker-news:before { + content: "\f1d4"; } + + .fa-creative-commons-sampling:before { + content: "\f4f0"; } + + .fa-adversal:before { + content: "\f36a"; } + + .fa-creative-commons:before { + content: "\f25e"; } + + .fa-watchman-monitoring:before { + content: "\e087"; } + + .fa-fonticons:before { + content: "\f280"; } + + .fa-weixin:before { + content: "\f1d7"; } + + .fa-shirtsinbulk:before { + content: "\f214"; } + + .fa-codepen:before { + content: "\f1cb"; } + + .fa-git-alt:before { + content: "\f841"; } + + .fa-lyft:before { + content: "\f3c3"; } + + .fa-rev:before { + content: "\f5b2"; } + + .fa-windows:before { + content: "\f17a"; } + + .fa-wizards-of-the-coast:before { + content: "\f730"; } + + .fa-square-viadeo:before { + content: "\f2aa"; } + + .fa-viadeo-square:before { + content: "\f2aa"; } + + .fa-meetup:before { + content: "\f2e0"; } + + .fa-centos:before { + content: "\f789"; } + + .fa-adn:before { + content: "\f170"; } + + .fa-cloudsmith:before { + content: "\f384"; } + + .fa-opensuse:before { + content: "\e62b"; } + + .fa-pied-piper-alt:before { + content: "\f1a8"; } + + .fa-square-dribbble:before { + content: "\f397"; } + + .fa-dribbble-square:before { + content: "\f397"; } + + .fa-codiepie:before { + content: "\f284"; } + + .fa-node:before { + content: "\f419"; } + + .fa-mix:before { + content: "\f3cb"; } + + .fa-steam:before { + content: "\f1b6"; } + + .fa-cc-apple-pay:before { + content: "\f416"; } + + .fa-scribd:before { + content: "\f28a"; } + + .fa-debian:before { + content: "\e60b"; } + + .fa-openid:before { + content: "\f19b"; } + + .fa-instalod:before { + content: "\e081"; } + + .fa-expeditedssl:before { + content: "\f23e"; } + + .fa-sellcast:before { + content: "\f2da"; } + + .fa-square-twitter:before { + content: "\f081"; } + + .fa-twitter-square:before { + content: "\f081"; } + + .fa-r-project:before { + content: "\f4f7"; } + + .fa-delicious:before { + content: "\f1a5"; } + + .fa-freebsd:before { + content: "\f3a4"; } + + .fa-vuejs:before { + content: "\f41f"; } + + .fa-accusoft:before { + content: "\f369"; } + + .fa-ioxhost:before { + content: "\f208"; } + + .fa-fonticons-fi:before { + content: "\f3a2"; } + + .fa-app-store:before { + content: "\f36f"; } + + .fa-cc-mastercard:before { + content: "\f1f1"; } + + .fa-itunes-note:before { + content: "\f3b5"; } + + .fa-golang:before { + content: "\e40f"; } + + .fa-kickstarter:before { + content: "\f3bb"; } + + .fa-square-kickstarter:before { + content: "\f3bb"; } + + .fa-grav:before { + content: "\f2d6"; } + + .fa-weibo:before { + content: "\f18a"; } + + .fa-uncharted:before { + content: "\e084"; } + + .fa-firstdraft:before { + content: "\f3a1"; } + + .fa-square-youtube:before { + content: "\f431"; } + + .fa-youtube-square:before { + content: "\f431"; } + + .fa-wikipedia-w:before { + content: "\f266"; } + + .fa-wpressr:before { + content: "\f3e4"; } + + .fa-rendact:before { + content: "\f3e4"; } + + .fa-angellist:before { + content: "\f209"; } + + .fa-galactic-republic:before { + content: "\f50c"; } + + .fa-nfc-directional:before { + content: "\e530"; } + + .fa-skype:before { + content: "\f17e"; } + + .fa-joget:before { + content: "\f3b7"; } + + .fa-fedora:before { + content: "\f798"; } + + .fa-stripe-s:before { + content: "\f42a"; } + + .fa-meta:before { + content: "\e49b"; } + + .fa-laravel:before { + content: "\f3bd"; } + + .fa-hotjar:before { + content: "\f3b1"; } + + .fa-bluetooth-b:before { + content: "\f294"; } + + .fa-square-letterboxd:before { + content: "\e62e"; } + + .fa-sticker-mule:before { + content: "\f3f7"; } + + .fa-creative-commons-zero:before { + content: "\f4f3"; } + + .fa-hips:before { + content: "\f452"; } + + .fa-behance:before { + content: "\f1b4"; } + + .fa-reddit:before { + content: "\f1a1"; } + + .fa-discord:before { + content: "\f392"; } + + .fa-chrome:before { + content: "\f268"; } + + .fa-app-store-ios:before { + content: "\f370"; } + + .fa-cc-discover:before { + content: "\f1f2"; } + + .fa-wpbeginner:before { + content: "\f297"; } + + .fa-confluence:before { + content: "\f78d"; } + + .fa-shoelace:before { + content: "\e60c"; } + + .fa-mdb:before { + content: "\f8ca"; } + + .fa-dochub:before { + content: "\f394"; } + + .fa-accessible-icon:before { + content: "\f368"; } + + .fa-ebay:before { + content: "\f4f4"; } + + .fa-amazon:before { + content: "\f270"; } + + .fa-unsplash:before { + content: "\e07c"; } + + .fa-yarn:before { + content: "\f7e3"; } + + .fa-square-steam:before { + content: "\f1b7"; } + + .fa-steam-square:before { + content: "\f1b7"; } + + .fa-500px:before { + content: "\f26e"; } + + .fa-square-vimeo:before { + content: "\f194"; } + + .fa-vimeo-square:before { + content: "\f194"; } + + .fa-asymmetrik:before { + content: "\f372"; } + + .fa-font-awesome:before { + content: "\f2b4"; } + + .fa-font-awesome-flag:before { + content: "\f2b4"; } + + .fa-font-awesome-logo-full:before { + content: "\f2b4"; } + + .fa-gratipay:before { + content: "\f184"; } + + .fa-apple:before { + content: "\f179"; } + + .fa-hive:before { + content: "\e07f"; } + + .fa-gitkraken:before { + content: "\f3a6"; } + + .fa-keybase:before { + content: "\f4f5"; } + + .fa-apple-pay:before { + content: "\f415"; } + + .fa-padlet:before { + content: "\e4a0"; } + + .fa-amazon-pay:before { + content: "\f42c"; } + + .fa-square-github:before { + content: "\f092"; } + + .fa-github-square:before { + content: "\f092"; } + + .fa-stumbleupon:before { + content: "\f1a4"; } + + .fa-fedex:before { + content: "\f797"; } + + .fa-phoenix-framework:before { + content: "\f3dc"; } + + .fa-shopify:before { + content: "\e057"; } + + .fa-neos:before { + content: "\f612"; } + + .fa-square-threads:before { + content: "\e619"; } + + .fa-hackerrank:before { + content: "\f5f7"; } + + .fa-researchgate:before { + content: "\f4f8"; } + + .fa-swift:before { + content: "\f8e1"; } + + .fa-angular:before { + content: "\f420"; } + + .fa-speakap:before { + content: "\f3f3"; } + + .fa-angrycreative:before { + content: "\f36e"; } + + .fa-y-combinator:before { + content: "\f23b"; } + + .fa-empire:before { + content: "\f1d1"; } + + .fa-envira:before { + content: "\f299"; } + + .fa-google-scholar:before { + content: "\e63b"; } + + .fa-square-gitlab:before { + content: "\e5ae"; } + + .fa-gitlab-square:before { + content: "\e5ae"; } + + .fa-studiovinari:before { + content: "\f3f8"; } + + .fa-pied-piper:before { + content: "\f2ae"; } + + .fa-wordpress:before { + content: "\f19a"; } + + .fa-product-hunt:before { + content: "\f288"; } + + .fa-firefox:before { + content: "\f269"; } + + .fa-linode:before { + content: "\f2b8"; } + + .fa-goodreads:before { + content: "\f3a8"; } + + .fa-square-odnoklassniki:before { + content: "\f264"; } + + .fa-odnoklassniki-square:before { + content: "\f264"; } + + .fa-jsfiddle:before { + content: "\f1cc"; } + + .fa-sith:before { + content: "\f512"; } + + .fa-themeisle:before { + content: "\f2b2"; } + + .fa-page4:before { + content: "\f3d7"; } + + .fa-hashnode:before { + content: "\e499"; } + + .fa-react:before { + content: "\f41b"; } + + .fa-cc-paypal:before { + content: "\f1f4"; } + + .fa-squarespace:before { + content: "\f5be"; } + + .fa-cc-stripe:before { + content: "\f1f5"; } + + .fa-creative-commons-share:before { + content: "\f4f2"; } + + .fa-bitcoin:before { + content: "\f379"; } + + .fa-keycdn:before { + content: "\f3ba"; } + + .fa-opera:before { + content: "\f26a"; } + + .fa-itch-io:before { + content: "\f83a"; } + + .fa-umbraco:before { + content: "\f8e8"; } + + .fa-galactic-senate:before { + content: "\f50d"; } + + .fa-ubuntu:before { + content: "\f7df"; } + + .fa-draft2digital:before { + content: "\f396"; } + + .fa-stripe:before { + content: "\f429"; } + + .fa-houzz:before { + content: "\f27c"; } + + .fa-gg:before { + content: "\f260"; } + + .fa-dhl:before { + content: "\f790"; } + + .fa-square-pinterest:before { + content: "\f0d3"; } + + .fa-pinterest-square:before { + content: "\f0d3"; } + + .fa-xing:before { + content: "\f168"; } + + .fa-blackberry:before { + content: "\f37b"; } + + .fa-creative-commons-pd:before { + content: "\f4ec"; } + + .fa-playstation:before { + content: "\f3df"; } + + .fa-quinscape:before { + content: "\f459"; } + + .fa-less:before { + content: "\f41d"; } + + .fa-blogger-b:before { + content: "\f37d"; } + + .fa-opencart:before { + content: "\f23d"; } + + .fa-vine:before { + content: "\f1ca"; } + + .fa-signal-messenger:before { + content: "\e663"; } + + .fa-paypal:before { + content: "\f1ed"; } + + .fa-gitlab:before { + content: "\f296"; } + + .fa-typo3:before { + content: "\f42b"; } + + .fa-reddit-alien:before { + content: "\f281"; } + + .fa-yahoo:before { + content: "\f19e"; } + + .fa-dailymotion:before { + content: "\e052"; } + + .fa-affiliatetheme:before { + content: "\f36b"; } + + .fa-pied-piper-pp:before { + content: "\f1a7"; } + + .fa-bootstrap:before { + content: "\f836"; } + + .fa-odnoklassniki:before { + content: "\f263"; } + + .fa-nfc-symbol:before { + content: "\e531"; } + + .fa-mintbit:before { + content: "\e62f"; } + + .fa-ethereum:before { + content: "\f42e"; } + + .fa-speaker-deck:before { + content: "\f83c"; } + + .fa-creative-commons-nc-eu:before { + content: "\f4e9"; } + + .fa-patreon:before { + content: "\f3d9"; } + + .fa-avianex:before { + content: "\f374"; } + + .fa-ello:before { + content: "\f5f1"; } + + .fa-gofore:before { + content: "\f3a7"; } + + .fa-bimobject:before { + content: "\f378"; } + + .fa-brave-reverse:before { + content: "\e63d"; } + + .fa-facebook-f:before { + content: "\f39e"; } + + .fa-square-google-plus:before { + content: "\f0d4"; } + + .fa-google-plus-square:before { + content: "\f0d4"; } + + .fa-web-awesome:before { + content: "\e682"; } + + .fa-mandalorian:before { + content: "\f50f"; } + + .fa-first-order-alt:before { + content: "\f50a"; } + + .fa-osi:before { + content: "\f41a"; } + + .fa-google-wallet:before { + content: "\f1ee"; } + + .fa-d-and-d-beyond:before { + content: "\f6ca"; } + + .fa-periscope:before { + content: "\f3da"; } + + .fa-fulcrum:before { + content: "\f50b"; } + + .fa-cloudscale:before { + content: "\f383"; } + + .fa-forumbee:before { + content: "\f211"; } + + .fa-mizuni:before { + content: "\f3cc"; } + + .fa-schlix:before { + content: "\f3ea"; } + + .fa-square-xing:before { + content: "\f169"; } + + .fa-xing-square:before { + content: "\f169"; } + + .fa-bandcamp:before { + content: "\f2d5"; } + + .fa-wpforms:before { + content: "\f298"; } + + .fa-cloudversify:before { + content: "\f385"; } + + .fa-usps:before { + content: "\f7e1"; } + + .fa-megaport:before { + content: "\f5a3"; } + + .fa-magento:before { + content: "\f3c4"; } + + .fa-spotify:before { + content: "\f1bc"; } + + .fa-optin-monster:before { + content: "\f23c"; } + + .fa-fly:before { + content: "\f417"; } + + .fa-aviato:before { + content: "\f421"; } + + .fa-itunes:before { + content: "\f3b4"; } + + .fa-cuttlefish:before { + content: "\f38c"; } + + .fa-blogger:before { + content: "\f37c"; } + + .fa-flickr:before { + content: "\f16e"; } + + .fa-viber:before { + content: "\f409"; } + + .fa-soundcloud:before { + content: "\f1be"; } + + .fa-digg:before { + content: "\f1a6"; } + + .fa-tencent-weibo:before { + content: "\f1d5"; } + + .fa-letterboxd:before { + content: "\e62d"; } + + .fa-symfony:before { + content: "\f83d"; } + + .fa-maxcdn:before { + content: "\f136"; } + + .fa-etsy:before { + content: "\f2d7"; } + + .fa-facebook-messenger:before { + content: "\f39f"; } + + .fa-audible:before { + content: "\f373"; } + + .fa-think-peaks:before { + content: "\f731"; } + + .fa-bilibili:before { + content: "\e3d9"; } + + .fa-erlang:before { + content: "\f39d"; } + + .fa-x-twitter:before { + content: "\e61b"; } + + .fa-cotton-bureau:before { + content: "\f89e"; } + + .fa-dashcube:before { + content: "\f210"; } + + .fa-42-group:before { + content: "\e080"; } + + .fa-innosoft:before { + content: "\e080"; } + + .fa-stack-exchange:before { + content: "\f18d"; } + + .fa-elementor:before { + content: "\f430"; } + + .fa-square-pied-piper:before { + content: "\e01e"; } + + .fa-pied-piper-square:before { + content: "\e01e"; } + + .fa-creative-commons-nd:before { + content: "\f4eb"; } + + .fa-palfed:before { + content: "\f3d8"; } + + .fa-superpowers:before { + content: "\f2dd"; } + + .fa-resolving:before { + content: "\f3e7"; } + + .fa-xbox:before { + content: "\f412"; } + + .fa-square-web-awesome-stroke:before { + content: "\e684"; } + + .fa-searchengin:before { + content: "\f3eb"; } + + .fa-tiktok:before { + content: "\e07b"; } + + .fa-square-facebook:before { + content: "\f082"; } + + .fa-facebook-square:before { + content: "\f082"; } + + .fa-renren:before { + content: "\f18b"; } + + .fa-linux:before { + content: "\f17c"; } + + .fa-glide:before { + content: "\f2a5"; } + + .fa-linkedin:before { + content: "\f08c"; } + + .fa-hubspot:before { + content: "\f3b2"; } + + .fa-deploydog:before { + content: "\f38e"; } + + .fa-twitch:before { + content: "\f1e8"; } + + .fa-flutter:before { + content: "\e694"; } + + .fa-ravelry:before { + content: "\f2d9"; } + + .fa-mixer:before { + content: "\e056"; } + + .fa-square-lastfm:before { + content: "\f203"; } + + .fa-lastfm-square:before { + content: "\f203"; } + + .fa-vimeo:before { + content: "\f40a"; } + + .fa-mendeley:before { + content: "\f7b3"; } + + .fa-uniregistry:before { + content: "\f404"; } + + .fa-figma:before { + content: "\f799"; } + + .fa-creative-commons-remix:before { + content: "\f4ee"; } + + .fa-cc-amazon-pay:before { + content: "\f42d"; } + + .fa-dropbox:before { + content: "\f16b"; } + + .fa-instagram:before { + content: "\f16d"; } + + .fa-cmplid:before { + content: "\e360"; } + + .fa-upwork:before { + content: "\e641"; } + + .fa-facebook:before { + content: "\f09a"; } + + .fa-gripfire:before { + content: "\f3ac"; } + + .fa-jedi-order:before { + content: "\f50e"; } + + .fa-uikit:before { + content: "\f403"; } + + .fa-fort-awesome-alt:before { + content: "\f3a3"; } + + .fa-phabricator:before { + content: "\f3db"; } + + .fa-ussunnah:before { + content: "\f407"; } + + .fa-earlybirds:before { + content: "\f39a"; } + + .fa-trade-federation:before { + content: "\f513"; } + + .fa-autoprefixer:before { + content: "\f41c"; } + + .fa-whatsapp:before { + content: "\f232"; } + + .fa-square-upwork:before { + content: "\e67c"; } + + .fa-slideshare:before { + content: "\f1e7"; } + + .fa-google-play:before { + content: "\f3ab"; } + + .fa-viadeo:before { + content: "\f2a9"; } + + .fa-line:before { + content: "\f3c0"; } + + .fa-google-drive:before { + content: "\f3aa"; } + + .fa-servicestack:before { + content: "\f3ec"; } + + .fa-simplybuilt:before { + content: "\f215"; } + + .fa-bitbucket:before { + content: "\f171"; } + + .fa-imdb:before { + content: "\f2d8"; } + + .fa-deezer:before { + content: "\e077"; } + + .fa-raspberry-pi:before { + content: "\f7bb"; } + + .fa-jira:before { + content: "\f7b1"; } + + .fa-docker:before { + content: "\f395"; } + + .fa-screenpal:before { + content: "\e570"; } + + .fa-bluetooth:before { + content: "\f293"; } + + .fa-gitter:before { + content: "\f426"; } + + .fa-d-and-d:before { + content: "\f38d"; } + + .fa-microblog:before { + content: "\e01a"; } + + .fa-cc-diners-club:before { + content: "\f24c"; } + + .fa-gg-circle:before { + content: "\f261"; } + + .fa-pied-piper-hat:before { + content: "\f4e5"; } + + .fa-kickstarter-k:before { + content: "\f3bc"; } + + .fa-yandex:before { + content: "\f413"; } + + .fa-readme:before { + content: "\f4d5"; } + + .fa-html5:before { + content: "\f13b"; } + + .fa-sellsy:before { + content: "\f213"; } + + .fa-square-web-awesome:before { + content: "\e683"; } + + .fa-sass:before { + content: "\f41e"; } + + .fa-wirsindhandwerk:before { + content: "\e2d0"; } + + .fa-wsh:before { + content: "\e2d0"; } + + .fa-buromobelexperte:before { + content: "\f37f"; } + + .fa-salesforce:before { + content: "\f83b"; } + + .fa-octopus-deploy:before { + content: "\e082"; } + + .fa-medapps:before { + content: "\f3c6"; } + + .fa-ns8:before { + content: "\f3d5"; } + + .fa-pinterest-p:before { + content: "\f231"; } + + .fa-apper:before { + content: "\f371"; } + + .fa-fort-awesome:before { + content: "\f286"; } + + .fa-waze:before { + content: "\f83f"; } + + .fa-bluesky:before { + content: "\e671"; } + + .fa-cc-jcb:before { + content: "\f24b"; } + + .fa-snapchat:before { + content: "\f2ab"; } + + .fa-snapchat-ghost:before { + content: "\f2ab"; } + + .fa-fantasy-flight-games:before { + content: "\f6dc"; } + + .fa-rust:before { + content: "\e07a"; } + + .fa-wix:before { + content: "\f5cf"; } + + .fa-square-behance:before { + content: "\f1b5"; } + + .fa-behance-square:before { + content: "\f1b5"; } + + .fa-supple:before { + content: "\f3f9"; } + + .fa-webflow:before { + content: "\e65c"; } + + .fa-rebel:before { + content: "\f1d0"; } + + .fa-css3:before { + content: "\f13c"; } + + .fa-staylinked:before { + content: "\f3f5"; } + + .fa-kaggle:before { + content: "\f5fa"; } + + .fa-space-awesome:before { + content: "\e5ac"; } + + .fa-deviantart:before { + content: "\f1bd"; } + + .fa-cpanel:before { + content: "\f388"; } + + .fa-goodreads-g:before { + content: "\f3a9"; } + + .fa-square-git:before { + content: "\f1d2"; } + + .fa-git-square:before { + content: "\f1d2"; } + + .fa-square-tumblr:before { + content: "\f174"; } + + .fa-tumblr-square:before { + content: "\f174"; } + + .fa-trello:before { + content: "\f181"; } + + .fa-creative-commons-nc-jp:before { + content: "\f4ea"; } + + .fa-get-pocket:before { + content: "\f265"; } + + .fa-perbyte:before { + content: "\e083"; } + + .fa-grunt:before { + content: "\f3ad"; } + + .fa-weebly:before { + content: "\f5cc"; } + + .fa-connectdevelop:before { + content: "\f20e"; } + + .fa-leanpub:before { + content: "\f212"; } + + .fa-black-tie:before { + content: "\f27e"; } + + .fa-themeco:before { + content: "\f5c6"; } + + .fa-python:before { + content: "\f3e2"; } + + .fa-android:before { + content: "\f17b"; } + + .fa-bots:before { + content: "\e340"; } + + .fa-free-code-camp:before { + content: "\f2c5"; } + + .fa-hornbill:before { + content: "\f592"; } + + .fa-js:before { + content: "\f3b8"; } + + .fa-ideal:before { + content: "\e013"; } + + .fa-git:before { + content: "\f1d3"; } + + .fa-dev:before { + content: "\f6cc"; } + + .fa-sketch:before { + content: "\f7c6"; } + + .fa-yandex-international:before { + content: "\f414"; } + + .fa-cc-amex:before { + content: "\f1f3"; } + + .fa-uber:before { + content: "\f402"; } + + .fa-github:before { + content: "\f09b"; } + + .fa-php:before { + content: "\f457"; } + + .fa-alipay:before { + content: "\f642"; } + + .fa-youtube:before { + content: "\f167"; } + + .fa-skyatlas:before { + content: "\f216"; } + + .fa-firefox-browser:before { + content: "\e007"; } + + .fa-replyd:before { + content: "\f3e6"; } + + .fa-suse:before { + content: "\f7d6"; } + + .fa-jenkins:before { + content: "\f3b6"; } + + .fa-twitter:before { + content: "\f099"; } + + .fa-rockrms:before { + content: "\f3e9"; } + + .fa-pinterest:before { + content: "\f0d2"; } + + .fa-buffer:before { + content: "\f837"; } + + .fa-npm:before { + content: "\f3d4"; } + + .fa-yammer:before { + content: "\f840"; } + + .fa-btc:before { + content: "\f15a"; } + + .fa-dribbble:before { + content: "\f17d"; } + + .fa-stumbleupon-circle:before { + content: "\f1a3"; } + + .fa-internet-explorer:before { + content: "\f26b"; } + + .fa-stubber:before { + content: "\e5c7"; } + + .fa-telegram:before { + content: "\f2c6"; } + + .fa-telegram-plane:before { + content: "\f2c6"; } + + .fa-old-republic:before { + content: "\f510"; } + + .fa-odysee:before { + content: "\e5c6"; } + + .fa-square-whatsapp:before { + content: "\f40c"; } + + .fa-whatsapp-square:before { + content: "\f40c"; } + + .fa-node-js:before { + content: "\f3d3"; } + + .fa-edge-legacy:before { + content: "\e078"; } + + .fa-slack:before { + content: "\f198"; } + + .fa-slack-hash:before { + content: "\f198"; } + + .fa-medrt:before { + content: "\f3c8"; } + + .fa-usb:before { + content: "\f287"; } + + .fa-tumblr:before { + content: "\f173"; } + + .fa-vaadin:before { + content: "\f408"; } + + .fa-quora:before { + content: "\f2c4"; } + + .fa-square-x-twitter:before { + content: "\e61a"; } + + .fa-reacteurope:before { + content: "\f75d"; } + + .fa-medium:before { + content: "\f23a"; } + + .fa-medium-m:before { + content: "\f23a"; } + + .fa-amilia:before { + content: "\f36d"; } + + .fa-mixcloud:before { + content: "\f289"; } + + .fa-flipboard:before { + content: "\f44d"; } + + .fa-viacoin:before { + content: "\f237"; } + + .fa-critical-role:before { + content: "\f6c9"; } + + .fa-sitrox:before { + content: "\e44a"; } + + .fa-discourse:before { + content: "\f393"; } + + .fa-joomla:before { + content: "\f1aa"; } + + .fa-mastodon:before { + content: "\f4f6"; } + + .fa-airbnb:before { + content: "\f834"; } + + .fa-wolf-pack-battalion:before { + content: "\f514"; } + + .fa-buy-n-large:before { + content: "\f8a6"; } + + .fa-gulp:before { + content: "\f3ae"; } + + .fa-creative-commons-sampling-plus:before { + content: "\f4f1"; } + + .fa-strava:before { + content: "\f428"; } + + .fa-ember:before { + content: "\f423"; } + + .fa-canadian-maple-leaf:before { + content: "\f785"; } + + .fa-teamspeak:before { + content: "\f4f9"; } + + .fa-pushed:before { + content: "\f3e1"; } + + .fa-wordpress-simple:before { + content: "\f411"; } + + .fa-nutritionix:before { + content: "\f3d6"; } + + .fa-wodu:before { + content: "\e088"; } + + .fa-google-pay:before { + content: "\e079"; } + + .fa-intercom:before { + content: "\f7af"; } + + .fa-zhihu:before { + content: "\f63f"; } + + .fa-korvue:before { + content: "\f42f"; } + + .fa-pix:before { + content: "\e43a"; } + + .fa-steam-symbol:before { + content: "\f3f6"; } + + @font-face { + font-family: 'Font Awesome 6 Brands'; + font-style: normal; + font-weight: normal; + font-display: auto; + src: url("../font/fa-brands-400.woff2") format("woff2")} + + .fa { + font-family: 'Font Awesome 6 Free'; + font-weight: 900; } + + .fab { + font-family: 'Font Awesome 6 Brands'; } + @font-face { + font-family: 'Font Awesome 6 Free'; + font-style: normal; + font-weight: 400; + font-display: auto; + src: url("../font/fa-regular-400.woff2") format("woff2")} + + .far { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + @font-face { + font-family: 'Font Awesome 6 Free'; + font-style: normal; + font-weight: 900; + font-display: auto; + src: url("../font/fa-solid-900.woff2") format("woff2")} + .sr-only, + .fa-sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; } + + .fas { + font-family: 'Font Awesome 6 Free'; + font-weight: 900; } + .sr-only-focusable:not(:focus), + .fa-sr-only-focusable:not(:focus) { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; } +} \ No newline at end of file diff --git a/nonpacks/static/vendor/blockbench/css/general.css b/nonpacks/static/vendor/blockbench/css/general.css new file mode 100644 index 0000000..c40766b --- /dev/null +++ b/nonpacks/static/vendor/blockbench/css/general.css @@ -0,0 +1,947 @@ +@layer base { +/*Defaults*/ + div.tool.wide { + width: 72px; + padding: 1px 0; + } + .hidden, .tooltip_shift, .custom_select ul, .mobile_only, .m_disp { + display: none; + } + div.selection_only { + visibility: hidden; + } + a.open-in-browser { + cursor: pointer; + } + .f_left { + float: left; + } + .f_right { + float: right !important; + } + .i_b { + display: inline-block; + } + label.inline_label { + padding-left: 8px; + padding-right: 8px; + padding-top: 2px; + } + .progress_bar { + background-color: var(--color-back); + height: 18px; + margin-top: 12px; + border-radius: 10px; + } + .progress_bar_inner { + background-color: var(--color-accent); + height: 100%; + width: calc(100% * var(--progress)); + border-radius: inherit; + } + .accent_color { + color: var(--color-accent); + font-weight: normal; + } + .slash { + color: var(--color-light); + padding-left: 3px; + padding-right: 3px; + font-weight: normal; + display: inline-block; + } + code, .code { + font-family: var(--font-code); + } + .code { + font-size: 16px; + tab-size: 4; + } + textarea.code { + padding: 5px; + } + .small_text { + font-size: 0.94em; + } + .subtle { + color: var(--color-subtle_text); + } + .color_x { + color: var(--color-axis-x); + } + .color_y { + color: var(--color-axis-y); + } + .color_z { + color: var(--color-axis-z); + } + .color_u { + color: var(--color-axis-u); + } + .color_v { + color: var(--color-axis-v); + } + .color_w { + color: var(--color-axis-w); + } + .button { + display: inline-block; + width: 30px; + text-align: center; + cursor: default; + } + .dark_bordered { + height: 30px; + padding-left: 4px; + padding-top: 1px; + background-color: var(--color-back); + border: 1px solid var(--color-border); + border-radius: 5px; + } + .input_wide { + width: 100%; + padding: 8px; + height: 40px; + padding-bottom: 5px; + } + input.medium_width { + width: 64px; + } + .prism-editor-wrapper { + padding-left: 4px; + padding-top: 1px; + background-color: var(--color-back); + border: 1px solid var(--color-border); + border-radius: 5px; + } + .prism-editor__autocomplete { + background-color: var(--color-back); + border: 1px solid var(--color-accent); + z-index: 30; + } + .prism-editor__autocomplete li:hover { + color: var(--color-light); + } + .prism-editor__autocomplete li.selected { + background-color: var(--color-accent); + color: var(--color-accent_text); + } + .checkerboard, .checkerboard_trigger .checkerboard_target { + --color-checker_offset: rgba(0, 0, 0, 0.16); + background-color: var(--color-checkerboard) !important; + background-image: linear-gradient(45deg, var(--color-checkerboard) 25%, transparent 25%), + linear-gradient(-45deg, var(--color-checkerboard) 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, var(--color-checkerboard) 75%), + linear-gradient(-45deg, var(--color-checker_offset) 75%, var(--color-checkerboard) 75%); + background-size: 30px 30px; + background-position: 0 0, 0 15px, 15px -15px, -15px 0px; + } + body[mode=start] div#center.checkerboard { + background-image: none; + background-color: var(--color-dark) !important; + } + +/*UI Elements*/ + div.preview { + height: 100%; + width: 100%; + position: relative; + cursor: inherit; + } + .preview > canvas { + background-repeat: no-repeat; + } + div.preview.fixed_ratio { + display: flex; + } + .preview.fixed_ratio > canvas { + margin: auto; + border-radius: 7px; + border: 2px solid var(--color-grid); + } + .preview > .preview_perspective_label { + position: absolute; + width: fit-content; + margin: auto; + bottom: 4px; + right: 0; + left: 0; + pointer-events: none; + opacity: 0.5; + text-transform: uppercase; + } + .preview .preview_menu { + position: absolute; + right: 3px; + top: 2px; + border-radius: 5px; + background-color: var(--color-dark); + display: flex; + } + .checkerboard .preview_menu { + background-color: var(--color-checkerboard); + } + .preview .preview_menu .tool { + width: 32px; + } + .preview .preview_menu .preview_main_menu > i { + width: 20px; + } + .preview .preview_background_menu { + background-size: cover; + width: 30px; + } + .preview > canvas.selectable_cursor { + cursor: copy; + } + #weight_brush_outline { + --radius: 50; + position: absolute; + width: calc(var(--radius) * 2px); + height: calc(var(--radius) * 2px); + margin: calc(var(--radius) * -1px); + border-radius: 50%; + border: 1px dashed var(--color-light); + pointer-events: none; + z-index: 12; + } + .text_padding { + margin-left: 5px; + margin-right: 5px; + } + .toolbar_label { + padding: 2px; + margin-left: 4px; + } + .bar { + height: 30px; + } + .bar > * { + float: left; + } + .bar.flex { + display: flex; + } + .bar.flex > * { + float: none; + } + .bar.flex > label { + flex-grow: 0; + } + .scroll_horizontal { + overflow-x: scroll; + overflow-y: hidden; + height: 100%; + scrollbar-width: none; + } + .scroll_horizontal ::-webkit-scrollbar { + height: 0px; + } + .list { + background-color: var(--color-back); + overflow-y: scroll; + flex-grow: 1; + clear: both; + } + .list::-webkit-scrollbar-track { + background: var(--color-back); + } + ul.list_style li { + list-style: initial; + margin-left: 20px; + } + #quick_message_box { + position: absolute; + margin-left: auto; + margin-right: auto; + left: 0; + right: 0; + top: 420px; + z-index: 100; + min-width: 150px; + max-width: 250px; + width: fit-content; + padding: 0 12px; + background-color: var(--color-bright_ui); + color: var(--color-bright_ui_text); + box-shadow: 0 0 2px rgba(0, 0, 0, 0.5);; + text-align: center; + overflow-wrap: break-word; + cursor: default; + pointer-events: none; + } + @media (max-device-width: 640px) { + #quick_message_box { + bottom: 26px; + top: unset; + padding: 6px; + } + } + #cursor_tooltip { + position: absolute; + z-index: 101; + max-width: 250px; + width: fit-content; + line-height: 18px; + padding: 2px 8px; + margin-top: 10px; + margin-left: 9px; + background-color: var(--color-bright_ui); + color: var(--color-bright_ui_text); + box-shadow: 0 0 2px rgba(0, 0, 0, 0.5);; + overflow-wrap: break-word; + white-space: pre-line; + cursor: default; + pointer-events: none; + } + .uv_message_box { + position: absolute; + margin-left: auto; + margin-right: auto; + z-index: 101; + min-width: 100px; + max-width: 200px; + background-color: var(--color-bright_ui); + color: var(--color-bright_ui_text); + box-shadow: 0 0 2px rgba(0, 0, 0, 0.5);; + text-align: center; + cursor: default; + top: 40px; + right: 0px; + left: 0px; + pointer-events: none; + } + .selection_rectangle { + position: absolute; + display: block; + border: 1px solid var(--color-accent); + background-color: rgba(40,50,60,0.5); + pointer-events: none; + } + + .annotation { + min-width: 40px; + max-width: 100%; + width: max-content; + position: absolute; + text-align: center; + background-color: var(--color-bright_ui); + color: var(--color-bright_ui_text); + padding: 3px 8px; + pointer-events: none; + } + .annotation.transparent { + background: transparent; + font-weight: normal; + font-size: 1.2em; + padding: 0; + margin: -4px; + min-width: 15px; + color: var(--color-light); + text-shadow: 0 0 5px black; + } + .light_on_hover:hover { + color: var(--color-light); + } + + .elevated { + background-color: var(--color-elevated); + box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); + border-radius: 5px; + } + + .spinning { + -webkit-animation: spin 2s linear infinite; + -moz-animation: spin 2s linear infinite; + animation: spin 2s linear infinite; + } + @-moz-keyframes spin { 100% { -moz-transform: rotate(360deg); } } + @-webkit-keyframes spin { 100% { -webkit-transform: rotate(360deg); } } + @keyframes spin { 100% { -webkit-transform: rotate(360deg); transform:rotate(360deg); } } +/*Markdown*/ + .markdown h1 { + margin: 8px 0 8px 0; + } + .markdown h2 { + margin: 14px 0 8px 0; + } + .markdown p { + margin: 12px 0; + } + .markdown li { + list-style: initial; + cursor: inherit; + margin: 8px 0; + } + .markdown li > p, + .markdown h2 > p, + .markdown h3 > p { + margin: 0; + } + .markdown ul { + padding-left: 24px; + } + .markdown ol { + padding-left: 24px; + } + .markdown ol li { + list-style: auto; + } + .markdown a { + cursor: pointer; + } + .markdown pre { + border: 1px solid var(--color-border); + background: var(--color-back); + font-family: var(--font-code); + padding: 6px 10px; + clear: both; + cursor: text; + user-select: text; + -webkit-user-select: text; + overflow: auto; + } + .markdown pre code { + user-select: text; + -webkit-user-select: text; + } + blockquote { + border-left: 4px solid var(--color-accent); + padding: 4px; + padding-left: 16px; + background: var(--color-back); + } + .markdown table { + border: 1px solid var(--color-border); + background: var(--color-back); + } + .markdown th { + padding: 4px; + } + .markdown td { + padding: 3px 4px; + border-top: 1px solid var(--color-border); + } + .markdown img { + image-rendering: auto; + max-width: 100%; + } + +/*Actions*/ + .toolbar { + width: 100%; + overflow: hidden; + flex-shrink: 0; + } + .toolbar > .content { + display: flex; + flex-wrap: wrap; + } + div.toolbar_wrapper { + float: none; + } + .toolbar_wrapper.narrow > .toolbar { + width: fit-content; + display: flex; + flex-direction: row-reverse; + justify-content: space-between; + height: 100%; + } + body.is_mobile .toolbar_wrapper.narrow > .toolbar:not(.vertical) { + width: 100%; + } + .toolbar_wrapper > .toolbar.no_wrap { + width: fit-content; + display: flex; + flex-flow: row-reverse; + flex-wrap: nowrap; + height: 100%; + } + .toolbar_wrapper > .toolbar.no_wrap > .content { + height: 100%; + overflow: hidden; + flex-grow: 1; + } + .toolbar_wrapper > .toolbar.vertical { + width: 40px; + flex-direction: column-reverse; + } + .toolbar_wrapper > .toolbar.vertical .tool { + height: 36px; + width: 40px; + padding: 2px; + } + .toolbar > .tool.toolbar_menu { + float: right; + width: 12px; + color: var(--color-subtle_text); + } + .toolbar.vertical .toolbar_menu { + height: 24px; + padding: 0; + } + .toolbar > .tool.toolbar_menu > i { + width: 16px; + margin-left: -5px; + font-size: 20px; + margin-top: 5px; + } + .toolbar.vertical > .tool.toolbar_menu > i { + width: auto; + margin-right: auto; + margin-left: auto; + } + .toolbar_overflow_popup { + background-color: var(--color-ui); + position: absolute; + display: flex; + flex-wrap: wrap; + max-width: 180px; + z-index: 20; + box-shadow: 0 0px 8px rgba(0, 0, 0, 0.64); + } + .toolbar_overflow_dummy { + height: 30px; + width: 38px; + } + .tool { + height: 30px; + width: 36px; + margin-left: 1px; + margin-right: 1px; + background: transparent; + display: inline-block; + text-align: center; + vertical-align: middle; + cursor: default; + float: left; + color: var(--color-text); + flex-shrink: 0; + cursor: pointer; + } + .tool i { + display: block; + margin: 4px auto; + } + .tool:active > .icon { + padding-top: 1px; + } + .tool:active > .icon.fa_big { + padding-top: 2px; + } + img.icon { + height: 26px; + image-rendering: pixelated; + } + + .tool.widget { + width: auto; + padding: 0; + } + .tool.widget.bar_text { + padding: 2px; + } + .tool.has_label { + width: auto; + } + + .tool:hover { + color: var(--color-light); + } + .tool.right_tool { + position: relative; + } + .tool.enabled { + background: var(--color-accent); + border-radius: 4px; + color: var(--color-accent_text); + } + + .placeholder { + width: 20px; + height: 10px; + float: left; + } + .toolbar .toolbar_separator.border { + width: 2px; + height: 24px; + float: left; + background-color: var(--color-border); + margin: 4px; + margin-bottom: 0; + } + .toolbar .toolbar_separator.spacer { + background: transparent; + flex-grow: 1; + } + .toolbar .toolbar_separator.linebreak { + display: block; + float: left; + width: 100%; + height: 0; + margin: 0; + } + .text_button:hover { + color: var(--color-light); + } + .bar_select_wrapper { + position: relative; + } + .bar_select:hover { + color: var(--color-light); + } + .bar_select select { + padding-right: 24px; + width: 100%; + } + .bar_select .bar_select_wrapper::before { + content: "\f0d7"; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; + display: block; + position: absolute; + height: 12px; + width: 16px; + pointer-events: none; + right: 6px; + top: 3px; + } + .half { + display: inline-block; + width: calc(50% - 4px); + } + .tooltip { + position: absolute; + height: 28px; + width: fit-content; + padding-left: 6px; + padding-right: 6px; + padding-top: 1px; + background: var(--color-bright_ui); + color: var(--color-bright_ui_text); + margin-top: 30px; + white-space: nowrap; + z-index: 20; + box-shadow: 0 0.4px 3.5px rgba(0, 0, 0, 0.6); + border-radius: 4px; + pointer-events: none; + visibility: hidden; + } + .tool:hover > .tooltip { + visibility: visible; + } + .tooltip_shift { + display: none; + } + .tooltip_description { + position: absolute; + background-color: var(--color-ui); + color: var(--color-text); + border: 1px solid var(--color-bright_ui); + padding: 2px 6px; + margin-top: 1px; + font-size: 0.84em; + margin-left: -5px; + opacity: 0; + } + .tool:hover > .tooltip .tooltip_description { + transition-property: opacity; + transition-duration: 200ms; + transition-delay: 600ms; + opacity: 1; + } + .tool.bar_select.icon_mode { + padding: 0 4px; + background-color: var(--color-button); + border-radius: 5px; + } + .tool.bar_select .select_option { + float: left; + width: 28px; + height: 100%; + border-radius: 4px; + color: var(--color-text); + } + .tool.bar_select .select_option:hover { + color: var(--color-light); + } + .tool.bar_select .select_option.selected { + background: var(--color-accent); + color: var(--color-accent_text); + } + .tool.bar_select .select_option:active { + padding-top: 1px; + } + .tool.bar_select .select_option .icon { + transform: scale(0.86); + } + .tool.bar_select .select_option[key=vertex] .icon { + transform: scale(0.6); + } + + .tool.side_menu_tool { + width: 48px; + } + .tool.side_menu_tool i.icon { + display: block; + margin-left: 6px; + float: left; + } + .tool.side_menu_tool i.icon.action_more_options { + display: inline-block; + width: 20px; + height: 100%; + margin-top: 0; + padding-top: 4px; + color: var(--color-text); + margin-left: 0; + } + .tool.side_menu_tool i.icon.action_more_options:hover { + color: inherit; + } + .toolbar.vertical .tool.side_menu_tool { + height: 54px; + } + .toolbar.vertical .tool.side_menu_tool > .action_more_options { + max-width: 48px; + text-align: center; + width: 100%; + margin-top: 0px; + padding-top: 0px; + } + +/*(Context-)Menu*/ + .contextMenu { + position: absolute; + display: block; + height: auto; + width: fit-content; + min-width: 145px; + background-color: var(--color-bright_ui); + color: var(--color-bright_ui_text); + z-index: 30; + box-shadow: 0.4px 0.4px 4px rgba(0, 0, 0, 0.7); + border-radius: 6px; + cursor: default; + white-space: nowrap; + } + .contextMenu.sub { + display: none; + margin-top: -4px; + } + .contextMenu.scrollable { + max-height: min(800px, 100vh); + overflow: auto; + } + .contextMenu li { + display: flex; + height: 30px; + padding: 4px; + padding-left: 34px; + padding-right: 8px; + } + .contextMenu li:first-of-type { + border-top-left-radius: inherit; + border-top-right-radius: inherit; + } + .contextMenu li:last-of-type { + border-bottom-left-radius: inherit; + border-bottom-right-radius: inherit; + } + .contextMenu li.parent { + padding-right: 20px; + } + .contextMenu li.parent::after { + content: "\f105"; + display: block; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + margin-right: -12px; + margin-left: 6px; + margin-top: -1px; + pointer-events: none; + } + .contextMenu li.enabled { + padding-left: 29px; + border-left: 5px solid var(--color-accent); + } + .contextMenu li.focused, + .contextMenu li.parent.opened { + background-color: var(--color-accent); + color: var(--color-accent_text); + } + .contextMenu li.hybrid_parent.opened { + background-color: transparent; + } + .contextMenu li > i { + margin-top: 1px; + margin-right: 4px; + margin-left: -28px; + pointer-events: none; + } + .contextMenu li > img { + cursor: default; + height: 20px; + width: 20px; + color: var(--color-text); + white-space: nowrap; + margin-bottom: -3px; + margin-left: -27px; + margin-right: 5px; + margin-top: 1px; + } + .contextMenu li > span { + pointer-events: none; + flex: 1 0 auto; + } + .contextMenu li.marked > span { + text-decoration: underline; + } + .contextMenu li.parent.focused > .contextMenu.sub { + display: block; + } + .contextMenu li.hybrid_parent.opened > .contextMenu.sub { + display: block; + } + .contextMenu li.opened > .contextMenu.sub { + display: block; + } + .contextMenu .menu_more_button { + width: 28px; + margin: -4px -8px -4px 2px; + padding: 4px 0; + text-align: center; + border-radius: 5px; + } + .contextMenu .menu_more_button:hover, + .hybrid_parent.opened .menu_more_button { + background-color: var(--color-accent); + color: var(--color-accent_text); + } + .contextMenu .menu_more_button > * { + pointer-events: none; + } + li.menu_separator { + height: 2px; + width: 100%; + padding: 0; + background-color: var(--color-menu_separator); + } + li.menu_separator.has_label { + margin-top: 12px; + margin-bottom: 6px; + } + li.menu_separator.has_label > label { + background-color: var(--color-bright_ui); + color: color-mix(in srgb, var(--color-bright_ui_text) 70%, transparent); + margin-top: -12px; + margin-left: 12px; + padding: 0 5px; + height: 20px; + } + .contextMenu li.highlighted { + animation: menu_item_highlight 1s infinite ease-in-out; + } + @keyframes menu_item_highlight { + 0% { + background-color: transparent; + } + 50% { + background-color: var(--color-accent); + } + 100% { + background-color: transparent; + } + } + .contextMenu .menu_search_bar { + padding: 0; + display: flex; + position: sticky; + top: 0; + background-color: inherit; + border-bottom: 2px solid var(--color-menu_separator); + } + .menu_search_bar > input { + color: inherit; + padding: 6px; + flex-grow: 1; + height: auto; + } + .menu_search_bar > div { + width: 30px; + text-align: center; + padding-top: 2px; + } + .menu_search_bar > div > * { + pointer-events: none; + vertical-align: middle; + } + + .keybinding_label { + pointer-events: none; + font-size: 0.84em; + padding: 2px 0 2px 8px; + opacity: 0.6; + flex-grow: 0; + flex-shrink: 0; + } + +/* Theme Borders */ + body.theme_borders .contextMenu, + body.theme_borders dialog, + body.theme_borders #start_screen > content, + body.theme_borders #quick_message_box, + body.theme_borders action_selector > #action_selector_list, + body.theme_borders .plugins_suggested_row > ul > li + { + border: 1px solid var(--color-border); + } + body.theme_borders #start_screen section { + border-bottom: 1px solid var(--color-border); + } + body.theme_borders .panel { + margin-top: -1px; + border-top: 01px solid var(--color-border); + } + body.theme_borders #right_bar { + border-left: 1px solid var(--color-border); + } + body.theme_borders #left_bar { + border-right: 1px solid var(--color-border); + } + body.theme_borders .preview .preview_menu { + right: 0; + } + body.theme_borders .dialog_sidebar { + border-right: 1px solid var(--color-border); + } + body.theme_borders .dialog_handle { + border-bottom: 1px solid var(--color-border); + } + body.theme_borders .dialog_close_button { + right: -1px; + top: -1px; + height: 34px; + } + body.theme_borders li.animation_file { + border-top: 1px solid var(--color-border); + } + body.theme_borders #main_toolbar, body.theme_borders #tab_bar { + border-bottom: 1px solid var(--color-border); + } + body.theme_borders #status_bar { + border-top: 1px solid var(--color-border); + } + body.theme_borders .contextMenu li.menu_separator { + background-color: var(--color-border); + height: 1px; + padding: 0; + opacity: 1; + } + body.theme_borders #animation_controllers_wrapper .controller_state { + border-color: var(--color-border); + } +} \ No newline at end of file diff --git a/nonpacks/static/vendor/blockbench/css/jquery-ui.min.css b/nonpacks/static/vendor/blockbench/css/jquery-ui.min.css new file mode 100644 index 0000000..4c36e06 --- /dev/null +++ b/nonpacks/static/vendor/blockbench/css/jquery-ui.min.css @@ -0,0 +1,512 @@ +/*! jQuery UI - v1.12.1 - 2017-04-02 +* http://jqueryui.com +* Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif +* Copyright jQuery Foundation and other contributors; Licensed MIT */ +@layer lib { +.ui-draggable-handle { + -ms-touch-action: none; + touch-action: none +} + +.ui-helper-hidden { + display: none +} + +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px +} + +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none +} + +.ui-helper-clearfix:before, +.ui-helper-clearfix:after { + content: ""; + display: table; + border-collapse: collapse +} + +.ui-helper-clearfix:after { + clear: both +} + +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + left: 0; + position: absolute; + opacity: 0; + filter: Alpha(Opacity=0) +} + +.ui-front { + z-index: 100 +} + +.ui-state-disabled { + cursor: default!important; + pointer-events: none +} + +.ui-icon { + display: inline-block; + vertical-align: middle; + margin-top: -.25em; + position: relative; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat +} + +.ui-widget-icon-block { + left: 50%; + margin-left: -8px; + display: block +} + +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100% +} + +.ui-resizable { + position: relative +} + +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + display: block; + -ms-touch-action: none; + touch-action: none +} + +.ui-resizable-disabled .ui-resizable-handle, +.ui-resizable-autohide .ui-resizable-handle { + display: none +} + +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0 +} + +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0 +} + +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0; + height: 100% +} + +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100% +} + +.ui-resizable-se { + cursor: se-resize; + width: 16px; + height: 16px; + right: -5px; + bottom: -5px +} + +.ui-resizable-sw { + cursor: sw-resize; + width: 16px; + height: 16px; + left: -5px; + bottom: -5px +} + +.ui-resizable-nw { + cursor: nw-resize; + width: 16px; + height: 16px; + left: -5px; + top: -5px +} + +.ui-resizable-ne { + cursor: ne-resize; + width: 16px; + height: 16px; + right: -5px; + top: -5px +} + +.ui-selectable { + -ms-touch-action: none; + touch-action: none +} + +.ui-selectable-helper { + position: absolute; + z-index: 100; + border: 1px dotted black +} + +.ui-sortable-handle { + -ms-touch-action: none; + touch-action: none +} + +.ui-accordion .ui-accordion-header { + display: block; + cursor: pointer; + position: relative; + margin: 2px 0 0 0; + padding: .5em .5em .5em .7em; + font-size: 100% +} + +.ui-accordion .ui-accordion-content { + padding: 1em 2.2em; + border-top: 0; + overflow: auto +} + +.ui-autocomplete { + position: absolute; + top: 0; + left: 0; + cursor: default +} + +.ui-dialog .ui-resizable-se, +.ui-dialog .ui-resizable-sw, +.ui-dialog .ui-resizable-ne, +.ui-dialog .ui-resizable-nw { + width: 7px; + height: 7px +} + +.ui-dialog .ui-resizable-se { + right: 0; + bottom: 0 +} + +.ui-dialog .ui-resizable-sw { + left: 0; + bottom: 0 +} + +.ui-dialog .ui-resizable-ne { + right: 0; + top: 0 +} + +.ui-dialog .ui-resizable-nw { + left: 0; + top: 0 +} + +.ui-draggable .ui-dialog-titlebar { + cursor: move +} + +.ui-progressbar { + height: 2em; + text-align: left; + overflow: hidden +} + +.ui-progressbar .ui-progressbar-value { + margin: -1px; + height: 100% +} + +.ui-progressbar .ui-progressbar-overlay { + background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=="); + height: 100%; + filter: alpha(opacity=25); + opacity: 0.25 +} + +.ui-progressbar-indeterminate .ui-progressbar-value { + background-image: none +} + +.ui-tooltip { + padding: 8px; + position: absolute; + z-index: 9999; + max-width: 300px +} + +body .ui-tooltip { + border-width: 2px +} + +.ui-widget { + font-family: Arial, Helvetica, sans-serif; + font-size: 1em +} + +.ui-widget .ui-widget { + font-size: 1em +} + +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Arial, Helvetica, sans-serif; + font-size: 1em +} + +.ui-widget.ui-widget-content { + border: 1px solid #c5c5c5 +} + +.ui-widget-content { + border: 1px solid #ddd; + background: #fff; + color: #333 +} + +.ui-widget-content a { + color: #333 +} + +.ui-widget-header { + border: 1px solid #ddd; + background: #e9e9e9; + color: #333; + font-weight: bold +} + +.ui-widget-header a { + color: #333 +} + +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default, +.ui-button, +html .ui-button.ui-state-disabled:hover, +html .ui-button.ui-state-disabled:active { + border: 1px solid #c5c5c5; + background: #f6f6f6; + font-weight: normal; + color: #454545 +} + +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited, +a.ui-button, +a:link.ui-button, +a:visited.ui-button, +.ui-button { + color: #454545; + text-decoration: none +} + +.ui-state-hover, +.ui-widget-content .ui-state-hover, +.ui-widget-header .ui-state-hover, +.ui-state-focus, +.ui-widget-content .ui-state-focus, +.ui-widget-header .ui-state-focus, +.ui-button:hover, +.ui-button:focus { + border: 1px solid #ccc; + background: #ededed; + font-weight: normal; + color: #2b2b2b +} + +.ui-state-hover a, +.ui-state-hover a:hover, +.ui-state-hover a:link, +.ui-state-hover a:visited, +.ui-state-focus a, +.ui-state-focus a:hover, +.ui-state-focus a:link, +.ui-state-focus a:visited, +a.ui-button:hover, +a.ui-button:focus { + color: #2b2b2b; + text-decoration: none +} + +.ui-visual-focus { + box-shadow: 0 0 3px 1px rgb(94, 158, 214) +} + +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, +.ui-button.ui-state-active:hover { + border: 1px solid #003eff; + background: #007fff; + font-weight: normal; + color: #fff +} + +.ui-icon-background, +.ui-state-active .ui-icon-background { + border: #003eff; + background-color: #fff +} + +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #fff; + text-decoration: none +} + +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #dad55e; + background: #fffa90; + color: #777620 +} + +.ui-state-checked { + border: 1px solid #dad55e; + background: #fffa90 +} + +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #777620 +} + +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #f1a899; + background: #fddfdf; + color: #5f3f3f +} + +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #5f3f3f +} + +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #5f3f3f +} + +.ui-priority-primary, +.ui-widget-content .ui-priority-primary, +.ui-widget-header .ui-priority-primary { + font-weight: bold +} + +.ui-priority-secondary, +.ui-widget-content .ui-priority-secondary, +.ui-widget-header .ui-priority-secondary { + opacity: .7; + filter: Alpha(Opacity=70); + font-weight: normal +} + +.ui-state-disabled, +.ui-widget-content .ui-state-disabled, +.ui-widget-header .ui-state-disabled { + opacity: .35; + filter: Alpha(Opacity=35); + background-image: none +} + +.ui-state-disabled .ui-icon { + filter: Alpha(Opacity=35) +} + +.ui-icon { + width: 16px; + height: 16px +} + + +.ui-icon-blank { + background-position: 16px 16px +} + + +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 3px +} + +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 3px +} + +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 3px +} + +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 3px +} + +.ui-widget-overlay { + background: #aaa; + opacity: .3; + filter: Alpha(Opacity=30) +} + +.ui-widget-shadow { + -webkit-box-shadow: 0 0 5px #666; + box-shadow: 0 0 5px #666 +} +} \ No newline at end of file diff --git a/nonpacks/static/vendor/blockbench/css/panels.css b/nonpacks/static/vendor/blockbench/css/panels.css new file mode 100644 index 0000000..20d46b2 --- /dev/null +++ b/nonpacks/static/vendor/blockbench/css/panels.css @@ -0,0 +1,3273 @@ +@layer base { +/*Panel*/ + .panel_container { + background-color: var(--color-ui); + display: flex; + flex-direction: column; + position: relative; + } + .panel_container.hidden { + display: none !important; + } + .panel_container.grow { + display: flex; + flex-direction: column; + flex-grow: 1; + height: 40px; + min-height: 133px; + } + + .panel { + background-color: var(--color-ui); + display: flex; + flex-direction: column; + position: relative; + } + .panel.grow { + flex-grow: 1; + height: calc(100% - 40px); + } + .panel.grow > .panel_vue_wrapper:not(.list) { + flex-grow: 1; + display: flex; + flex-direction: column; + overflow: hidden; + min-height: 0; + } + .panel_container.floating { + position: absolute; + border: 1px solid var(--color-border); + box-shadow: 0 0 10px rgb(0 0 0 / 40%); + box-sizing: content-box; + z-index: 14; + border-radius: 5px; + } + .panel_container.floating > .panel_vue_wrapper:not(.list) { + overflow: hidden; + } + .panel_container.floating.dragging { + opacity: 0.6; + border-color: var(--color-accent); + } + .panel.attached { + min-height: var(--main-panel-height); + } + .panel.attached.grow { + height: var(--main-panel-height); + } + body.is_mobile .panel { + overflow-y: auto; + overflow-x: hidden; + } + .panel_tab_bar { + display: flex; + width: 100%; + height: 40px; + flex-shrink: 0; + margin: 0; + padding: 0; + align-items: center; + background-color: var(--color-back); + position: relative; + } + .panel_container.floating .panel_tab_bar { + border-top-left-radius: inherit; + border-top-right-radius: inherit; + } + .panel_container.floating > .panel { + border-bottom-left-radius: inherit; + border-bottom-right-radius: inherit; + } + #right_bar .panel_container.topmost_panel .panel_tab_bar:not(.single_tab)::before { + content: ""; + position: absolute; + left: -10px; + top: 0; + width: 10px; + height: 10px; + background-color: var(--color-back); + pointer-events: none; + } + .panel_tab_bar.single_tab { + background-color: var(--color-ui); + } + .panel_container.attach_target .panel_tab_bar { + background-color: color-mix(in srgb, var(--color-accent) 40%, transparent 60%); + } + .panel_tab_list { + display: flex; + overflow: hidden; + margin-right: auto; + height: 100%; + height: calc(100% - 3px); + margin-top: 3px; + } + body.is_mobile .panel_tab_list { + flex-grow: 1; + } + .panel_tab_list > .panel_handle { + display: flex; + flex: 1 1 auto; + min-width: 58px; + overflow: hidden; + font-size: 1.1em; + letter-spacing: -0.5px; + text-transform: uppercase; + color: var(--color-subtle_text); + padding: 8px 10px; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + cursor: pointer; + align-items: center; + } + .panel_tab_list > .panel_handle:hover { + color: var(--color-text); + } + .panel_tab_list > .panel_handle.selected { + background-color: var(--color-ui); + } + .panel_tab_list > .panel_handle span { + flex-shrink: 1; + overflow: hidden; + } + .panel_tab_list > .panel_handle[order] { + position: relative; + } + .panel_tab_list > .panel_handle[order="1"]::after { + content: ""; + display: block; + position: absolute; + width: 3px; + height: 30px; + border-radius: 2px; + background-color: var(--color-accent); + top: 4px; + right: 0px; + } + /*h3.panel_handle { + display: flex; + width: 100%; + height: 40px; + flex-shrink: 0; + margin: 0; + padding: 0; + font-size: inherit; + background: var(--color-ui); + place-content: space-between; + align-items: center; + } + h3.panel_handle > label { + flex: 1 1 auto; + overflow: hidden; + font-size: 1.06em; + letter-spacing: -0.5px; + text-transform: uppercase; + color: var(--color-subtle_text); + margin-left: 8px; + padding: 0 4px; + cursor: move; + } + #center h3.panel_handle { + height: 32px; + } + h3.panel_handle > label > span { + cursor: inherit; + } + body.is_mobile.is_landscape h3.panel_handle > label > span::before { + content: "\f337"; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; + display: inline-block; + pointer-events: none; + margin-right: 7px; + } + body.is_mobile:not(.is_landscape) h3.panel_handle > label > span::after { + content: "\f338"; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; + display: inline-block; + pointer-events: none; + margin-left: 7px; + } + h3.panel_handle > .tool.panel_control { + flex: 0 0 24px; + opacity: 0.7; + cursor: pointer; + } + h3.panel_handle > .tool.panel_control:hover { + opacity: 1; + } + body.is_touch h3.panel_handle > .tool.panel_control { + flex-basis: 36px; + }*/ + .panel_menu_button { + width: 25px; + height: 25px; + float: none; + display: inline-block; + vertical-align: top; + text-align: center; + cursor: pointer; + color: var(--color-subtle_text); + padding-top: 2px; + margin-right: -10px; + } + .panel_handle:not(.selected) .panel_menu_button { + display: none; + } + .panel_menu_button > i { + font-size: 20px; + pointer-events: none; + } + .tool.panel_control { + flex: 0 0 24px; + opacity: 0.7; + cursor: pointer; + } + .tool.panel_control:hover { + opacity: 1; + } + .panel p { + margin-left: 12px; + } + .panel p.panel_toolbar_label { + margin-bottom: -4px; + color: var(--color-subtle_text); + } + .panel > .form { + margin: 0 8px; + } + + .panel_container.folded { + min-height: auto; + flex-grow: 0; + } + .panel_container.folded > .panel { + display: none !important; + } + .panel_container.fixed_height { + flex-grow: 0; + } + .panel_container.bottommost_panel:not(.topmost_panel) { + margin-top: auto; + } + + .panel_container[order]::before { + content: ''; + height: 2px; + left: 0; + right: 0; + background-color: var(--color-accent); + z-index: 3; + display: block; + position: absolute; + box-shadow: 0 0 20px #ffffff80; + } + .panel_container[order] { + position: relative; + } + .panel_container[order="-1"]::before { + margin-top: 0; + } + .panel_container[order="1"]::before { + bottom: 0px; + } + +/* Panel Resize Lines */ + .panel_sidebar_resize_handle { + cursor: ns-resize; + top: unset; + bottom: -3px; + width: 100%; + height: 6px; + position: absolute; + z-index: 10; + } + .panel_container.bottommost_panel > .panel_sidebar_resize_handle { + top: -3px; + bottom: unset; + } + .panel_sidebar_resize_handle:hover:not(.dragging) { + animation: resize_line_fade_in 500ms; + } + .panel_sidebar_resize_handle:hover, .panel_sidebar_resize_handle.dragging { + background-color: var(--color-accent); + opacity: 0.3; + } + .panel_container:not(.floating) > .panel_resize_handle_wrapper { + display: none; + } + .panel_resize_side { + width: 6px; + height: 6px; + position: absolute; + top: 3px; + bottom: 3px; + left: 3px; + right: 3px; + } + .panel_resize_corner { + width: 8px; + height: 8px; + position: absolute; + } + .panel_resize_side.resize_top { + cursor: ns-resize; + top: -3px; + bottom: unset; + width: auto; + } + .panel_resize_side.resize_bottom { + cursor: ns-resize; + top: unset; + bottom: -3px; + width: auto; + } + .panel_resize_side.resize_left { + cursor: ew-resize; + left: -3px; + right: unset; + height: auto; + } + .panel_resize_side.resize_right { + cursor: ew-resize; + left: unset; + right: -3px; + height: auto; + } + .panel_resize_corner.resize_top_left { + cursor: nw-resize; + left: -4px; + top: -4px; + } + .panel_resize_corner.resize_top_right { + cursor: ne-resize; + right: -4px; + top: -4px; + } + .panel_resize_corner.resize_bottom_left { + cursor: sw-resize; + left: -4px; + bottom: -4px; + } + .panel_resize_corner.resize_bottom_right { + cursor: se-resize; + right: -4px; + bottom: -4px; + } + +/*Snapping*/ + .sidebar.drop_target { + position: relative; + } + .sidebar.drop_target::after { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: var(--color-accent); + opacity: 0.1; + } + #center[snapside]::after { + content: ""; + display: block; + position: absolute; + background-color: var(--color-accent); + box-shadow: 0 0 20px #ffffff80; + top: 0; + bottom: 0; + right: 0; + left: 0; + z-index: 6; + } + #center[snapside=top]::after { + bottom: unset; + height: 3px; + } + #center[snapside=bottom]::after { + top: unset; + height: 3px; + } + #center[snapside=left_bar]::after { + right: unset; + width: 3px; + } + #center[snapside=right_bar]::after { + left: unset; + width: 3px; + } + #center[snapside=top]::before, + #center[snapside=bottom]::before { + content: ""; + position: absolute; + right: 0; + top: 0; + left: 0; + background-color: var(--color-accent); + opacity: 0.1; + height: 64px; + z-index: 6; + } + #center[snapside=bottom]::before { + top: unset; + bottom: 0; + } + + body.is_mobile #panel_uv, + body.is_mobile #panel_color { + overflow: hidden; + } + +/*Display*/ + + .tabs_small input[type="radio"]:checked+label { + border-bottom: 3px solid var(--color-accent); + } + .tabs_small input[type="radio"] { + display: none; + } + .tabs_small label { + display: inline-block; + height: 30px; + cursor: default; + text-align: center; + flex-grow: 1; + overflow: hidden; + cursor: pointer; + } + #color .tabs_small label { + font-size: 1em; + } + div.tabs_small:not(.icon_bar) label { + padding-top: 4px; + } + .tabs_small { + background-color: transparent; + height: 30px; + display: flex; + } + .tabs_small label:hover { + color: var(--color-light); + } + #display_bar .tool, #display_ref_bar > div { + width: calc(100% / 9 - 2px); + max-width: 52px; + } + #display_ref_bar > div > label { + width: 100%; + } + .bar.slider_input_combo { + position: relative; + display: flex; + margin-right: 2px; + } + .bar.slider_input_combo input.tool[type="range"] { + float: none; + flex-grow: 1; + flex-shrink: 1; + } + .bar.slider_input_combo > .numeric_input { + width: 72px; + float: none; + flex-grow: 0; + flex-shrink: 0; + } + .bar.slider_input_combo > .numeric_input > input { + padding-left: 8px; + padding-bottom: 3px; + border: none; + background-color: transparent; + } + .bar.slider_input_combo > input.tool[type="number"] { + width: 52px; + float: none; + flex-grow: 0; + flex-shrink: 0; + text-align: left; + padding-left: 8px; + padding-bottom: 3px; + } + .tool.display_scale_invert { + position: relative; + } + .bar.display_slot_section_bar { + display: flex; + margin-right: 2px; + margin-top: 2px; + } + .bar.display_slot_section_bar p { + flex-grow: 1; + margin-top: 6px; + } + .bar.display_inline_inputs { + display: flex; + gap: 1px; + } + + input#preset_name { + background-color: var(--color-back); + } + #create_preset .dialog_bar > * { + float: left; + margin-left: 8px; + } + #display_settings p { + padding-left: 6px; + } + div.display_crosshair:after { + content: ""; + width: 20px; + height: 2px; + background-color: var(--color-grid); + position: absolute; + margin-left: -9px; + margin-top: 9px; + } + div.display_crosshair { + width: 2px; + height: 20px; + background-color: var(--color-grid); + position: absolute; + top: calc(50% - 10px); + margin-left: 50%; + margin-right: auto; + } + + + +/*Outliner*/ + .search_bar.panel_search_bar { + width: 100%; + } + #cubes_list { + padding-top: 1px; + overflow-y: scroll; + --indentation-offset: 16px; + --color-scope: transparent; + } + #cubes_list > li:last-child { + margin-bottom: 180px; + } + .outliner_object > i { + flex: 0 0 20px; + text-align: center; + padding-top: 4px; + overflow: hidden; + } + .outliner_object > i.fa_big { + font-size: unset; + } + .outliner_object > i[class*=" icon-"]:not(.fa) { + padding-top: 0px; + } + .outliner_object > i.icon_off { + color: var(--color-subtle_text); + } + .outliner_object > i.material-icons, + #outliner_drag_helper > i.material-icons { + padding-top: 2px; + width: 20px; + font-size: 19px; + } + .outliner_opener_placeholder { + width: 18px; + height: 14px; + float: left; + } + .outliner_object { + display: flex; + width: 100%; + padding: 2px; + box-sizing: border-box; + } + div.outliner_object { /* Higher prio to override older themes */ + padding-left: calc(var(--indentation) * var(--indentation-offset)); + border-left: 3px solid var(--color-scope); + } + .outliner_object:active { + background-color: var(--color-ui); + } + .outliner_object.selected { + background-color: var(--color-selected); + } + .outliner_object:hover { + color: var(--color-light); + } + #cubes_list.drag_hover > li:last-child { + position: relative; + } + #cubes_list.drag_hover > li:last-child::after { + content: ''; + width: calc(100% - 12px); + height: 2px; + margin-left: 6px; + background: var(--color-accent); + z-index: 3; + display: block; + position: absolute; + bottom: 0px; + } + #cubes_list ul { + position: relative; + } + #cubes_list .outliner_line_guide { + position: absolute; + left: calc(var(--indentation) * var(--indentation-offset) - 1px); + top: -4px; + bottom: 4px; + width: 4px; + margin-left: 10px; + border-left: 2px solid var(--color-guidelines); + pointer-events: none; + } + .drag_hover[order]::before { + content: ''; + width: calc(100% - 12px); + height: 2px; + margin-left: 6px; + background: var(--color-accent); + z-index: 3; + display: block; + position: absolute; + } + .drag_hover[order] { + position: relative; + } + .drag_hover[order="-1"]::before { + margin-top: -1px; + top: 0; + } + .drag_hover[order="1"]::before { + bottom: -1px; + } + .drag_hover[order="0"]::before { + width: 5px; + height: 28px; + margin-left: 0; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + } + .drag_hover_level, .drag_hover[order="0"] { + background-color: var(--color-ui); + } + #outliner_drag_helper { + position: absolute; + width: auto; + min-width: 150px; + height: 28px; + pointer-events: none; + background-color: var(--color-selected); + box-shadow: 0 0.4px 3.5px rgba(0, 0, 0, 0.6); + display: flex; + padding: 2px 15px 2px 8px; + z-index: 18; + } + #outliner_drag_helper > i { + padding: 4px; + } + #outliner_drag_helper > label { + padding-right: 5px; + padding-left: 5px; + } + input.cube_name { + width: 0; + flex: 1 0 0; + padding-right: 5px; + padding-left: 5px; + pointer-events: none; + color: inherit; + -webkit-text-fill-color: unset; + opacity: 1; /* required on iOS */ + } + input.cube_name.renaming { + pointer-events: auto; + } + input.cube_name.locked { + color: var(--color-subtle_text); + } + i.outliner_toggle { + font-size: 15px; + } + i.icon-open-state { + opacity: 0.7; + } + i.icon-open-state:hover { + opacity: 1; + } + + div#outliner_stats { + float: right; + margin-right: 16px; + margin-top: 4px; + font-weight: normal; + } + #particle_label { + float: right; + margin-right: 10px; + margin-top: 8px; + font-weight: normal; + opacity: 0.8; + font-size: 0.9em; + cursor: default; + } + .outliner_drag_number { + color: var(--color-accent_text); + background-color: var(--color-accent); + text-align: center; + padding: 0 5px 0 5px; + font-weight: normal; + position: absolute; + top: -20px; + left: 20px; + box-shadow: 0 0 3px black; + } + #options .bar .nslide, #options .bar .tool.wide { + width: 83px; + } +/*Collections*/ + .collection { + display: flex; + padding: 2px 10px; + gap: 5px; + align-items: center; + position: relative; + padding-left: 7px; + border-left: 3px solid var(--color-scope); + --color-scope: transparent; + } + .collection:active { + background-color: var(--color-ui); + } + .collection:hover { + color: var(--color-light); + } + .collection.selected { + color: var(--color-light); + background-color: var(--color-selected); + } + .collection.drag_hover::before { + content: ''; + display: block; + position: absolute; + background: var(--color-accent); + width: 5px; + top: 0; + bottom: 0; + left: -3px; + margin-left: 0; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + z-index: 7; + } + .collection > i { + width: 25px; + max-width: unset; + } + .collection_center_wrapper { + height: 48px; + flex-grow: 1; + overflow: hidden; + } + .collection_center_wrapper > label { + padding-left: 5px; + } + .collection_content_list { + display: flex; + gap: 4px; + } + .collection_content_list > li { + display: flex; + gap: 4px; + align-items: center; + border-radius: 10px; + background-color: var(--color-ui); + height: 22px; + padding: 0 7px; + white-space: nowrap; + } + .collection_content_list > li > i { + scale: 0.9; + } + .collection_content_list > li > i.fa_big { + transform-origin: bottom; + } + .collection i.toggle_disabled { + color: var(--color-subtle_text); + } + +/*Textures*/ + #texture_list { + padding-bottom: 20px; + } + .texture { + display: flex; + height: 48px; + white-space: nowrap; + position: relative; + vertical-align: middle; + padding-left: 5px; + padding-right: 8px; + box-sizing: border-box; + border-left: 3px solid var(--color-scope); + --color-scope: transparent; + } + .texture.multi_selected { + color: var(--color-light); + background-color: var(--color-button); + } + .texture.selected { + background: var(--color-selected); + color: var(--color-light); + } + .texture > i { + margin-top: 12px; + } + .texture > i.clickable:hover { + color: var(--color-light); + } + .texture > i.icon_off.clickable:hover { + color: var(--color-text); + } + .texture > i:not(.clickable), + .texture_group_material_config > i:not(.clickable) { + color: var(--color-subtle_text); + } + .texture i.icon_off { + color: var(--color-subtle_text); + } + div.texture_icon_wrapper { + height: 48px; + width: 48px; + flex-grow: 0; + flex-shrink: 0; + overflow: hidden; + position: relative; + pointer-events: none; + } + .texture.selected img.texture_icon { + margin-top: 0; + } + .texture > i.texture_multi_select_icon { + color: var(--color-accent); + position: absolute; + font-size: 26px; + right: 10px; + } + .texture.selected > i.texture_multi_select_icon { + display: none; + } + .texture_drag_helper { + z-index: 100; + border: 2px solid var(--color-accent); + box-shadow: 0 0 16px black; + height: 48px; + width: 48px; + position: absolute; + pointer-events: none; + } + .texture_group_drag_helper { + position: absolute; + z-index: 100; + min-height: 24px; + min-width: 120px; + padding: 4px; + border: 2px solid var(--color-accent); + background-color: var(--color-ui); + box-shadow: 0 0 16px black; + pointer-events: none; + } + .icon_placeholder { + width: 48px; + height: 48px; + } + .texture_description_wrapper { + flex-grow: 1; + overflow-x: hidden; + } + .texture_name { + margin-top: 2px; + margin-left: 6px; + margin-right: 4px; + overflow: hidden; + cursor: default; + } + .texture:hover .texture_name { + color: var(--color-light); + } + .texture_res { + margin-top: -3px; + margin-left: 6px; + margin-right: 4px; + width: 100%; + height: 20px; + overflow: hidden; + font-size: 0.9em; + color: var(--color-subtle_text); + cursor: default; + } + .texture_error { + position: absolute; + color: var(--color-error); + margin-left: 21px; + margin-top: 21px; + text-shadow: 0 0 5px #000; + } + .texture_movie { + position: absolute; + margin-left: -26px; + margin-top: 24px; + text-shadow: 0 0 5px #000; + } + .texture[order]::before { + content: ''; + height: 2px; + left: 0; + right: 0; + background: var(--color-accent); + z-index: 3; + display: block; + position: absolute; + } + .texture[order] { + position: relative; + } + .texture[order="-1"]::before { + margin-top: -1px; + } + .texture[order="1"]::before { + bottom: 0px; + } + .texture[order="0"]::before { + width: 5px; + height: 30px; + margin-left: 0; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + } + .pbr_channel_icon { + position: absolute; + left: -17px; + z-index: 1; + } + + .texture_group { + padding-bottom: 4px; + } + .texture_group_head { + height: 32px; + padding: 4px; + padding-right: 8px; + display: flex; + gap: 5px; + color: var(--color-subtle_text); + } + .texture_group_head:hover { + color: var(--color-text); + } + .texture_group_head > .icon-open-state { + text-align: center; + width: 21px; + margin-top: 4px; + flex-shrink: 0; + } + .texture_group_head .texture_group_material_icon { + height: 20px; + width: 20px; + margin-top: 2px; + border-radius: 50%; + background: rgb(108,174,235); + background: linear-gradient(137deg, rgba(108, 174, 235, 1) 0%, rgb(198 55 215) 100%); + } + .texture_group_head > label { + flex-shrink: 1; + overflow: hidden; + white-space: nowrap; + } + .texture_group_head.folded > label { + max-width: calc(60% - 50px); + min-width: 30px; + } + .texture_group_head > .in_list_button { + margin-left: auto; + } + .texture_group_mini_icon_list { + display: flex; + gap: 2px; + margin-right: auto; + margin-left: 4px; + max-width: 36%; + overflow: hidden; + padding-right: 7px; + } + .texture_group_mini_icon_list > .texture_mini_icon { + width: 24px; + height: 24px; + border-radius: 50%; + flex-shrink: 0; + overflow: hidden; + background-color: var(--color-ui); + flex-shrink: 0; + margin-right: -8px; + border: 1px solid var(--color-border); + } + .texture_group_list { + margin-left: 14px; + padding-left: 6px; + border-left: 2px solid var(--color-guidelines); + } + .texture_group_material_config { + display: flex; + align-items: center; + height: 30px; + padding: 4px 8px; + gap: 3px; + } + .texture_group_material_config i:first-child { + width: 50px; + max-width: unset; + text-align: center; + } + .texture_group_material_config label { + width: 0; + flex-grow: 1; + } + + #texture_animation_playback { + display: flex; + } + #texture_animation_timeline { + display: flex; + position: relative; + width: 0; + flex-grow: 1; + padding-left: 6px; + padding-right: 2px; + background-color: var(--color-back); + border: 1px solid var(--color-border); + border-bottom: none; + touch-action: none; + } + #texture_animation_timeline .texture_animation_frame { + flex-grow: 1; + width: 1px; + height: 8px; + margin-top: 20px; + border-left: 1px solid var(--color-text); + opacity: 0.3; + pointer-events: none; + } + #texture_animation_timeline #animated_texture_playhead { + position: absolute; + height: 28px; + border-style: solid; + border-width: 8px; + border-color: transparent; + border-top-color: var(--color-accent); + border-radius: 3px; + margin-left: -2px; + pointer-events: none; + } + #texture_animation_timeline #animated_texture_playhead::before { + position: absolute; + content: ""; + height: 28px; + border-left: 2px solid var(--color-accent); + top: -8px; + left: -1px; + } +/* Layers */ + #layers_list { + display: flex; + flex-direction: column-reverse; + justify-content: flex-start; + padding-bottom: 20px; + } + .texture_layer { + display: flex; + height: 40px; + white-space: nowrap; + position: relative; + padding-left: 8px; + padding-right: 8px; + box-sizing: border-box; + align-items: center; + gap: 6px; + } + .texture_layer:first-child { + margin-bottom: auto; + } + .texture_layer:hover { + color: var(--color-light); + } + .texture_layer.selected { + background-color: var(--color-selected); + } + .texture_layer.in_limbo { + border: 2px dashed var(--color-accent); + font-style: italic; + } + .layer_icon_wrapper { + height: 40px; + width: 40px; + flex-grow: 0; + flex-shrink: 0; + overflow: hidden; + } + .layer_icon_wrapper canvas { + width: 100%; + } + .texture_layer > label { + flex-grow: 1; + overflow: hidden; + } + .texture_layer i.toggle_disabled { + color: var(--color-subtle_text); + } + .texture_layer i.icon { + font-size: 19px; + margin-top: 1px; + } + .texture_layer.drag_hover[order]::before { + left: -6px; + } + #layers_list > .activate_layers_button { + display: flex; + height: 40px; + width: 100%; + margin: auto; + margin-top: 0; + align-items: center; + cursor: pointer; + text-align: center; + justify-content: center; + } + #layers_list > .activate_layers_button:hover { + text-decoration: underline; + } + +/*Animations*/ + #panel_animations #animations_list { + padding-bottom: 12px; + } + .animation { + height: 38px; + display: flex; + white-space: nowrap; + position: relative; + vertical-align: middle; + padding: 8px; + box-sizing: border-box; + padding-left: 5px; + border-left: 3px solid var(--color-scope); + --color-scope: transparent; + } + .animation:hover { + color: var(--color-light); + } + .animation.selected { + background: var(--color-selected); + } + ul.indented .animation { + padding-left: 16px; + } + .animation > i { + margin-right: 4px; + } + .animation > * { + flex-grow: 0; + flex-shrink: 0; + } + .animation > label { + flex-grow: 1; + flex-shrink: 1; + overflow: hidden; + } + .animation > label > span { + color: var(--color-subtle_text); + font-size: 0.92em; + } + .in_list_button { + width: 22px; + color: var(--color-text); + } + .in_list_button:hover { + color: var(--color-light); + } + .in_list_button { + width: 22px; + height: 22px; + color: var(--color-text); + } + .in_list_button:hover { + color: var(--color-light); + } + .in_list_button.unclickable { + color: var(--color-subtle_text) !important; + pointer-events: none; + } + + .animation_file_head { + height: 28px; + padding: 2px; + padding-right: 8px; + display: flex; + color: var(--color-subtle_text); + } + .animation_file_head:hover { + color: var(--color-text); + } + .animation_file_head > .icon-open-state { + text-align: center; + width: 21px; + margin-top: 4px; + } + .animation_file_head > label { + flex-grow: 1; + flex-shrink: 1; + overflow: hidden; + } + + .animation[order]::before { + content: ''; + height: 2px; + left: 0; + right: 0; + background: var(--color-accent); + z-index: 3; + display: block; + position: absolute; + } + .animation[order] { + position: relative; + } + .animation[order="-1"]::before { + margin-top: -9px; + } + .animation[order="1"]::before { + bottom: -1px; + } + #animation_drag_helper { + position: absolute; + height: 38px; + display: flex; + white-space: nowrap; + vertical-align: middle; + padding: 8px; + box-sizing: border-box; + width: auto; + min-width: 150px; + pointer-events: none; + background-color: var(--color-selected); + box-shadow: 0 0.4px 3.5px rgba(0, 0, 0, 0.6); + z-index: 18; + } + +/* Keyframe Panel */ + #panel_keyframe .bar { + margin-top: 2px; + } + #panel_keyframe .tabs_small label { + font-size: 1em; + height: 30px; + width: 25%; + } + #keyframe_type_label { + display: flex; + padding: 4px 8px; + height: 30px; + } + #keyframe_type_label label { + flex: 1 0 40px; + } + .keyframe_data_point_header { + display: flex; + padding: 2px 8px; + height: 26px; + } + .keyframe_data_point_header label { + flex: 0 0 auto; + } + .flex_fill_line { + flex: 1 0 0; + border-bottom: 2px solid var(--color-text); + height: 0; + margin: 0 10px; + margin-top: 11px; + opacity: 0.5; + } + .keyframe_data_point { + display: flex; + flex-direction: column; + max-height: 250px; + } + #panel_keyframe .bar.flex { + height: auto; + min-height: 30px; + } + #panel_keyframe .bar.flex label { + padding: 3px 8px; + min-width: 20px; + flex-shrink: 0; + background-color: var(--color-elevated); + } + #panel_keyframe .bar.flex label.axis { + text-align: center; + font-family: 'Font Awesome 6 Free'; + font-size: 13px; + line-height: 24px; + } + #panel_keyframe .bar.flex label.slidable_input { + cursor: ew-resize; + } + #panel_keyframe .bar input.dark_bordered { + width: 100%; + flex-shrink: 1; + } + #panel_keyframe .list { + max-height: 260px; + overflow-y: auto; + background-color: transparent; + } + #keyframe_bar_effect .tool { + padding-top: 3px; + width: 34px; + text-align: center; + } + #keyframe_bar_effect .tool > i { + margin-top: 0; + } + + .bar.flex > .prism-editor-component { + width: 20px; + flex-grow: 1; + } + .molang_input.prism-editor-component { + caret-color: var(--color-text); + min-height: 0; + } + .molang_input .prism-editor-placeholder { + font-family: var(--font-code); + margin-top: 2px; + } + .molang_input pre { + padding: 2px; + padding-bottom: 1px; + height: 100%; + min-height: 28px; + background-color: transparent; + border-radius: 0; + cursor: default; + } + .molang_input pre code { + color: #bec2ca; + padding: 0; + cursor: auto; + display: inline-block; + width: 100%; + min-height: 24px; + vertical-align: top; + } + + .molang_input pre .token.punctuation { + color: #5ba8c5 + } + .molang_input pre .token.operator, .molang_input pre .token.keyword { + color: #fc2f40 + } + .molang_input pre .token.number, .molang_input pre .token.boolean { + color: #b99cff + } + .molang_input pre .token.function-name { + color: #94e400 + } + .molang_input pre .token.selector { + color: #92dcff; + } + .molang_input pre .string { + color: #e8df6a; + } + +/* Placeholders */ + #panel_variable_placeholders .prism-editor-component { + flex-shrink: 1; + flex-grow: 1; + height: 50%; + } + ul#placeholder_buttons { + max-height: 32%; + overflow: auto; + } + ul#placeholder_buttons:has(> li) { + min-height: 32px; + } + #placeholder_buttons li { + display: flex; + padding: 0px 8px; + height: 30px; + margin: 1px; + padding: 0 8px; + float: left; + max-width: 100%; + background-color: var(--color-button); + border-radius: 5px; + } + #placeholder_buttons li[buttontype="impulse"] { + cursor: pointer; + } + #placeholder_buttons li[buttontype="impulse"]:hover { + color: var(--color-light); + } + #placeholder_buttons li > label { + padding: 4px 3px; + cursor: inherit; + } + #placeholder_buttons li > i { + padding-top: 4px; + cursor: inherit; + } + #placeholder_buttons li input.dark_bordered { + width: 54px; + height: 26px; + margin-top: 2px; + } + #placeholder_buttons li.placeholder_slider label { + cursor: ew-resize; + margin-left: 4px; + min-width: 22px; + display: inline-block; + text-align: center; + } + #placeholder_buttons li.placeholder_slider label:hover { + color: var(--color-light); + } + + + +/*Timeline*/ + #panel_timeline { + display: block; + height: 300px; + background-color: var(--color-ui); + display: flex; + flex-direction: column; + min-height: 120px; + } + #timeline_vue { + flex-grow: 1; + position: relative; + overflow: hidden; + } + #timeline_body { + overflow-y: scroll; + overflow-x: scroll; + position: relative; + background-color: var(--color-back); + height: calc(100% - 30px); + } + .timeline_marker { + position: absolute; + top: 11px; + margin-left: -9px; + z-index: 5; + height: 16px; + width: 20px; + cursor: pointer; + } + .timeline_marker > i { + position: relative; + pointer-events: none; + top: -4px; + font-size: 17px; + color: var(--color); + } + .timeline_marker > i::after { + content: ""; + width: 9px; + height: 9px; + position: absolute; + top: 3px; + left: 5px; + background-color: var(--color); + } + .timeline_marker:hover > i { + top: -3px; + } + .timeline_marker:hover > .tooltip { + visibility: visible; + margin-top: -10px; + right: 0; + left: 0; + } + #timeline_time.holding_ctrl .timeline_marker { + cursor: ew-resize; + } + #timeline_playhead { + position: absolute; + z-index: 3; + cursor: ew-resize; + + height: 26px; + width: 18px; + top: 0; + margin-left: -8px; + + border-right: 9px solid transparent; + border-left: 9px solid transparent; + border-top: 12px solid var(--color-accent); + border-radius: 2px; + } + #timeline_playhead::after { + content: ""; + display: block; + position: absolute; + width: 2px; + background-color: var(--color-accent); + pointer-events: none; + margin-left: -1px; + margin-top: -2px; + height: calc(var(--timeline-height) - 24px); + } + #timeline_onion_skin_point { + position: absolute; + z-index: 2; + cursor: ew-resize; + + height: 26px; + width: 18px; + top: 0; + margin-left: -8px; + + border-right: 9px solid transparent; + border-left: 9px solid transparent; + border-top: 12px solid var(--color-text); + border-radius: 2px; + } + #timeline_endbracket { + position: absolute; + z-index: 2; + cursor: col-resize; + + height: 26px; + width: 8px; + top: 0; + margin-left: -7px; + + border: 1px solid var(--color-accent); + border-left-width: 0; + border-right-width: 2px; + } + div#timeline_endbracket::after { + content: ""; + width: 16px; + height: 100%; + display: block; + margin-left: -2px; + } + #timeline_custom_range_indicator { + position: absolute; + z-index: 0; + pointer-events: none; + height: 100%; + top: 0; + opacity: 0.86; + border-radius: 3px; + background-color: var(--color-button); + border-right: 1px solid var(--color-border); + border-left: 1px solid var(--color-border); + } + + #panel_timeline .keyframe { + position: absolute; + margin-left: -6px; + z-index: 3; + text-align: center; + width: 13.5px; + height: 23px; + } + #panel_timeline .keyframe i { + margin-top: 4px; + font-size: 14px; + margin-left: -1px; + pointer-events: none; + display: block; + } + #panel_timeline .keyframe.has_expressions::after { + content: "M"; + position: absolute; + width: 100%; + text-align: center; + font-size: 10px; + color: var(--color-back); + top: 3px; + left: -0.4px; + font-weight: 600; + } + #timeline_body .animator_head_bar .keyframe { + z-index: 1; + pointer-events: none; + } + #timeline_body .animator_head_bar .keyframe i { + transform: none; + font-size: 6pt; + color: #495061; + } + #panel_timeline .keyframe.selected i { + color: var(--color-accent) !important; + z-index: 4; + } + #panel_timeline .keyframe:hover { + z-index: 4; + } + + .keyframe_bezier_handle { + background-color: var(--color-back); + border: 2px solid var(--color-text); + border-radius: 50%; + height: 10px; + width: 10px; + margin: 1px; + margin-top: 3px; + cursor: move; + position: absolute; + } + .keyframe_bezier_handle:hover, .keyframe_bezier_handle:active { + border-color: var(--color-accent); + } + .keyframe_bezier_handle::after { + content: ""; + display: block; + position: relative; + background-color: var(--color-grid); + height: 2px; + width: var(--length); + transform-origin: left; + transform: rotate(var(--angle)); + top: 2px; + left: 3px; + pointer-events: none; + } + + #timeline_header { + height: 28px; + display: flex; + border-bottom: 1px solid var(--color-border); + border-top: 1px solid var(--color-border); + position: relative; + } + #timeline_corner { + display: flex; + justify-content: space-between; + width: 144px; + flex-shrink: 0; + background-color: var(--color-ui); + z-index: 6; + border-right: 1px solid var(--color-border); + height: calc(100% + 1px); + } + #timeline_timestamp { + font-family: var(--font-code); + padding: 2px; + padding-left: 8px; + overflow: hidden; + } + #timeline_corner > span { + color: var(--color-subtle_text); + font-family: var(--font-code); + text-align: center; + padding: 2px; + width: 24px; + flex-shrink: 100; + } + #timeline_framenumber { + color: var(--color-subtle_text); + font-family: var(--font-code); + margin-right: auto; + padding: 2px; + white-space: nowrap; + } + #timeline_corner > .tool { + height: 26px; + } + #timeline_corner > .tool > i { + margin-top: 3px; + } + #timeline_time_wrapper { + height: 100%; + position: relative; + background-color: var(--color-back); + } + #timeline_time { + height: 100%; + position: relative; + margin-left: 8px; + border-bottom: 1px solid var(--color-selected); + } + .timeline_timecode { + padding-left: 4px; + padding-top: 2px; + height: 100%; + position: absolute; + pointer-events: none; + } + .timeline_timecode > span { + display: block; + margin-top: -4px; + font-size: 0.9em; + margin-left: -6px; + } + .timeline_timecode > .substeps { + width: 100%; + height: 8px; + position: absolute; + bottom: 0; + left: 0; + display: flex; + } + .timeline_timecode > .substeps > div { + border-left: 1px solid var(--color-text); + height: 4px; + flex-grow: 1; + margin-top: 4px; + opacity: 0.3; + } + .timeline_timecode > .substeps > div:first-child { + height: 100%; + margin-top: 0; + opacity: 0.48; + } + + + #timeline_body_inner { + min-height: 100%; + position: relative; + display: flex; + flex-direction: column; + } + #timeline_selector { + display: none; + } + #timeline_body li > div { + display: flex; + min-height: 24px; + } + #timeline_vue.graph_editor li.animator { + width: fit-content; + position: sticky; + left: 0; + z-index: 5; + } + #timeline_vue.graph_editor li.animator > div { + width: fit-content !important; + background-color: var(--color-ui); + } + .channel_head { + position: sticky; + left: 0; + display: flex; + width: 144px; + background-color: var(--color-ui); + border-right: 1px solid var(--color-border); + box-shadow: 1px 8px 10px 0 #00000038; + z-index: 5; + } + #timeline_vue.graph_editor .channel_head { + flex-wrap: wrap; + justify-content: flex-start; + } + .drag_hover[order]::before { + z-index: 7; + } + .channel_axis_selector { + height: 26px; + margin-right: 1px; + display: flex; + } + .channel_axis_selector > div { + font-weight: bolder; + text-align: center; + width: 22px; + height: inherit; + padding-top: 2px; + font-family: 'Font Awesome 6 Free'; + font-size: 13px; + line-height: 23px; + cursor: pointer; + border-radius: 5px; + } + .channel_axis_selector > div:hover { + background-color: var(--color-dark); + } + .channel_axis_selector > div.selected { + background-color: var(--color-button); + } + #timeline_body li > .animator_head_bar .channel_head:hover { + color: var(--color-light); + } + body:not(.is_mobile) #timeline_body li > .animator_channel_bar .channel_head { + padding-left: 16px; + } + .animator.selected .animator_head_bar .channel_head { + border-radius: 5px; + background-color: var(--color-selected); + } + .channel_head.selected { + background-color: var(--color-elevated); + border-radius: 5px; + } + .channel_head .text_button { + width: 26px; + height: 24px; + text-align: center; + float: left; + flex-shrink: 0; + } + .animator_channel_bar .channel_head .text_button { + float: right; + } + .animator_channel_bar .channel_head .text_button.off { + color: var(--color-subtle_text); + } + .animator_channel_bar .channel_head .text_button .channel_mute { + font-size: 14pt; + margin-top: 3px; + } + .animator_channel_bar .channel_head .text_button .channel_mute.disabled { + color: var(--color-subtle_text); + } + .animator_channel_bar .channel_head .text_button .fa-eye-slash, + .animator_channel_bar .channel_head .text_button .fa-volume-mute { + color: var(--color-subtle_text); + } + .animator_channel_bar .channel_head .text_button.rotation_global { + width: 20px; + } + .animator_channel_bar .channel_head .text_button.rotation_global > i { + font-size: 18px; + margin: 2px; + } + .channel_head > i { + font-size: 19px; + padding-top: 2px; + } + .channel_head span { + flex-grow: 1; + flex-shrink: 1; + overflow: hidden; + white-space: nowrap; + } + .channel_head span.timeline_animator_name { + padding-left: 5px; + } + .animator_channel_bar .channel_head span { + font-size: 0.93em; + line-height: 23px; + } + .animator_channel_bar .channel_head:not(.selected) span { + color: var(--color-subtle_text); + } + .animator.boneless .animator_head_bar .channel_head span { + color: #ff6b6b; + } + .keyframe_section { + flex-grow: 1; + position: relative; + border-bottom: 1px solid var(--color-border); + } + .animator_channel_bar > .keyframe_section { + background-color: var(--color-ui); + } + .animator_close_button:hover { + background-color: var(--color-close); + } + #timeline_empty_head { + flex-grow: 1; + } + + .keyframe .keyframe_waveform { + height: 23px; + width: 8000px; + position: absolute; + top: 0; + pointer-events: none; + } + .keyframe .keyframe_waveform > polygon { + fill: var(--color-grid); + stroke: none; + stroke-width: 0; + } + .keyframe .keyframe_waveform > polygon:hover { + fill: var(--color-accent); + } + + #timeline_graph_editor { + position: absolute; + top: 0px; + bottom: 0px; + left: 0px; + right: 0px; + overflow: hidden; + } + #timeline_graph_editor svg { + width: 100%; + height: 100%; + margin-left: 9px; + pointer-events: none; + --color-loop_graph: #495061; + } + #timeline_graph_editor svg path { + stroke: #f72858; + stroke-width: 2px; + fill: none; + } + #timeline_graph_editor svg text { + fill: var(--color-subtle_text); + opacity: 0.8; + font-size: 0.9em; + } + #timeline_graph_editor svg .main_graph:not(.selected) { + opacity: 0.35; + } + #timeline_graph_editor svg .loop_graph:not(.selected) { + opacity: 0.25; + } + #timeline_graph_editor .keyframe { + height: 16px; + width: 11px; + } + #timeline_graph_editor .keyframe > i { + font-size: 12px; + margin-top: 2px; + margin-left: -2px; + } + + #timeline_graph_editor_amplifier { + position: absolute; + width: 14px; + border-radius: 7px; + background-color: var(--color-ui); + right: 12px; + margin-top: 29px; + z-index: 5; + } + #timeline_graph_editor_amplifier > div { + position: absolute; + top: 0; + bottom: auto; + width: 14px; + height: 14px; + border-radius: 7px; + cursor: ns-resize; + background-color: var(--color-button); + } + #timeline_graph_editor_amplifier > div:hover { + background-color: var(--color-accent); + } + #timeline_graph_editor_amplifier > div:last-child { + top: auto; + bottom: 0; + } + +/* Animation Controllers */ +#animation_controllers_wrapper { + flex-grow: 1; + background-color: var(--color-back); + overflow: auto; +} +#animation_controller_presets { + width: 240px; + position: absolute; + margin: auto; + left: 0; + right: 0; + margin-top: 16px; +} +#animation_controller_presets li { + cursor: pointer; + margin-bottom: 2px; + text-decoration: underline; +} +#animation_controller_presets li:hover { + color: var(--color-light); +} +#animation_controllers_wrapper > ul { + display: flex; + flex-direction: row; + min-width: fit-content; + justify-content: center; + gap: 12px; + padding-left: 12px; + padding-right: 12px; +} +#animation_controllers_wrapper .controller_state { + width: 300px; + flex-shrink: 0; + padding-bottom: 8px; + background-color: var(--color-ui); + box-shadow: 0 0 10px rgb(0 0 0 / 22%); + border: 1px solid transparent; + transition: width 100ms ease-in-out; + position: relative; + border-radius: 6px; +} +#animation_controllers_wrapper .controller_state.selected { + width: min(100vw, 300px); + border-color: var(--color-accent); + z-index: 19; +} +#animation_controllers_wrapper .controller_state:focus-within { + z-index: 20; +} +#animation_controllers_wrapper .controller_state.folded { + width: 54px; +} +.controller_state_title_bar { + height: 30px; + background-color: var(--color-elevated); + border-radius: inherit; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12); + display: flex; + cursor: pointer; + transition: background-color var(--blend-transition) linear, color var(--blend-transition) linear; +} +.controller_state_title_bar > label { + padding: 3px 10px; + flex-grow: 1; + cursor: inherit; + overflow: hidden; +} +.controller_state_title_bar.folded > label { + padding: 3px 4px; +} +.initial_state .controller_state_title_bar > label { + text-decoration: underline; +} +.controller_state_title_bar > .tool { + width: 28px; + color: inherit; +} +.controller_state.selected .controller_state_title_bar { + background-color: var(--color-accent); + color: var(--color-accent_text); +} +.controller_state_section_title { + cursor: pointer; + padding: 2px 10px; + padding-right: 5px; + height: 30px; + display: flex; + margin-top: 6px; +} +.controller_state_section_title:hover > i.icon-open-state { + color: var(--color-light); +} +.controller_state_section_title > i { + width: 18px; + margin-top: 3px; +} +.controller_state_section_title > label { + cursor: inherit; + color: var(--color-subtle_text); +} +.controller_state_section_title > .text_button { + width: 24px; + text-align: center; +} +.controller_state_section_title > .text_button:first-of-type { + margin-left: auto; +} +.controller_state > .prism-editor-component:focus-within { + width: calc(200% + 20px); + box-shadow: 0 0 0 1px var(--color-accent); +} +.controller_animation { + display: flex; + gap: 3px; + margin-bottom: 2px; +} +.controller_animation input { + background-color: transparent; + border: none; + width: 50%; +} +.controller_transition { + display: flex; + gap: 3px; + margin-bottom: 2px; +} +.controller_transition:focus-within, +.controller_animation:focus-within { + width: calc(200% + 20px); + box-shadow: 0 0 0 1px var(--color-accent); +} +.controller_transition .bb-select { + flex-grow: 1; +} +.controller_transition .prism-editor-component { + width: calc(100% - 110px); +} +.controller_particle:not(:last-child), +.controller_sound:not(:last-child) { + margin-bottom: 10px; + padding-bottom: 8px; + border-bottom: 2px solid var(--color-button); +} +.controller_particle > .bar, +.controller_sound > .bar { + height: auto; + min-height: 30px; + margin-top: 2px; +} +.controller_particle > .bar > label, +.controller_sound > .bar > label { + padding: 3px 8px; + min-width: 20px; + text-align: center; + flex-shrink: 0; + background-color: var(--color-button); +} + +.controller_item_drag_handle { + width: 15px; + flex-grow: 0; + flex-shrink: 0; + cursor: grab; + background-color: var(--color-button); + margin-right: 2px; +} +.controller_transition .controller_item_drag_handle { + background-color: var(--color-marker); +} +.blend_transition_curve_button { + margin-left: 4px; + cursor: pointer; + display: flex; + width: 42px; + justify-content: start; + align-items: center; +} +.blend_transition_curve_button > span { + color: var(--color-subtle_text); +} +span.controller_state_section_info { + margin: 0 8px; + color: var(--color-subtle_text); +} +.controller_state_input_bar { + display: flex; + padding-right: 8px; +} +.controller_state_input_bar label { + flex-grow: 1; + padding: 3px 8px; + color: var(--color-subtle_text); +} +.controller_state .prism-editor-wrapper { + font-size: 0.9em; + padding-top: 2px; +} +.controller_state input[type=text] { + font-size: 0.96em; + flex-grow: 1; +} +.controller_state input[type=checkbox] { + width: 38px; +} +.controller_add_column { + width: 20px; + cursor: pointer; + vertical-align: middle; + margin: 12px 0px; + position: relative; +} +.controller_add_column > i { + top: calc(50% - 26px); + left: -1px; + position: absolute; +} +.controller_add_column:hover { + color: var(--color-light); + background-color: var(--color-ui); +} + +.controller_state_gate { + --height: 10px; + background-color: var(--color-button); + height: var(--height); + min-width: 28px; + max-width: 210px; + border-radius: calc(var(--height) * 0.5); + position: absolute; + cursor: crosshair; + left: 0; + right: 0; + margin: auto; + z-index: 19; +} +.controller_state.selected .controller_state_gate { + background-color: var(--color-accent); +} +.controller_state_gate:hover { + background-color: var(--color-selected); +} +.controller_state_gate_top { + top: calc(var(--height) * -0.5); + box-shadow: 0 1px 0 var(--color-ui); +} +.controller_state_gate_bottom { + bottom: calc(var(--height) * -0.5); +} +#animation_controllers_pickwhip { + position: relative; + height: 2px; + transform-origin: left; + background-color: var(--color-accent); + pointer-events: none; + z-index: 50; +} +#animation_controllers_pickwhip::before { + content: "\f0da"; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; + font-size: 20px; + display: block; + position: absolute; + right: 0; + top: -5px; + height: 13px; + width: 10px; + line-height: 11px; + color: var(--color-accent); +} +#animation_controllers_wrapper.connecting_controllers .controller_state:hover:not(.selected) { + border-color: var(--color-accent); +} + +.controller_state_connection_wrapper_top, +.controller_state_connection_wrapper_bottom { + height: calc(20px + var(--max-layer) * 10px); + min-height: calc(20px + var(--max-layer) * 10px); + position: relative; +} +.controller_state_connection { + position: absolute; + height: calc(15px + var(--layer) * 10px); + --color-connection: var(--color-grid); + border: 2px solid var(--color-connection); + --corner-radius: 5px; + cursor: pointer; + transition: border-color var(--blend-transition) linear; +} +.controller_state_connection_wrapper_top > .controller_state_connection { + border-bottom: none; + border-top-left-radius: var(--corner-radius); + border-top-right-radius: var(--corner-radius); + bottom: 0; +} +.controller_state_connection_wrapper_bottom > .controller_state_connection { + border-top: none; + border-bottom-left-radius: var(--corner-radius); + border-bottom-right-radius: var(--corner-radius); +} +.controller_state_connection::before { + content: "\f0d9"; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; + font-size: 20px; + display: block; + position: absolute; + text-align: center; + left: 0; + right: 0; + height: 13px; + line-height: 11px; + color: var(--color-connection); +} +.controller_state_connection_wrapper_top > .controller_state_connection::before { + content: "\f0d9"; + top: -7px; +} +.controller_state_connection_wrapper_bottom > .controller_state_connection::before { + content: "\f0da"; + bottom: -8px; +} +.controller_state_connection::after { + content: "\f0d9"; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; + font-size: 21px; + display: block; + position: absolute; + width: 12px; + line-height: 11px; + height: 10px; + color: var(--color-connection); +} +.controller_state_connection_wrapper_top > .controller_state_connection::after { + content: "\f0d7"; + bottom: -2px; + left: -8px; +} +.controller_state_connection_wrapper_bottom > .controller_state_connection::after { + content: "\f0d8"; + top: -2px; + right: -6px; +} +.controller_state_connection.relevant { + --color-connection: var(--color-text); +} +.controller_state_connection.selected { + --color-connection: var(--color-marker); + z-index: 1; +} +.controller_state_connection:hover { + --color-connection: var(--color-light); +} + + +/*UV*/ + .UVEditor { + position: relative; + --color-background: var(--color-back); + --color-frame: var(--color-ui); + } + #preview > .UVEditor { + --color-background: var(--color-dark); + --color-frame: var(--color-back); + background-color: var(--color-background); + } + #preview > .UVEditor > #uv_title_bar, + #preview > .UVEditor #toggle_uv_overlay_anchor + { + display: none; + } + .UVEditor > .toolbar { + margin-top: 3px; + } + #uv_resolution_status { + margin: 2px; + padding: 0px 5px; + pointer-events: auto; + } + #uv_resolution_status:hover { + color: var(--color-light); + } + + #uv_viewport { + height: 320px; + width: 320px; + margin: auto; + position: relative; + overflow: hidden; + scrollbar-color: var(--color-selected) var(--color-background); + touch-action: none; + } + #uv_frame { + height: 320px; + width: 320px; + margin-bottom: 0; + position: relative; + border: 4px solid var(--color-frame); + box-shadow: 0 0 0 1800px var(--color-background); + box-sizing: content-box; + touch-action: none; + --color-uv-unselected: var(--color-grid); + --color-uv-selected: white; + --color-uv-hover: var(--color-accent); + --color-uv-background: rgba(50, 70, 240, 0.14); + --color-uv-background-hover: rgba(50, 70, 240, 0.3); + --uv-line-width: 2px; + } + #uv_frame .selection_rectangle { + z-index: 8; + } + #uv_frame.overlay_mode { + --color-uv-unselected: var(--color-grid); + --color-uv-selected: var(--color-grid); + --color-uv-hover: var(--color-grid); + --color-uv-background: transparent; + --uv-line-width: 1px; + } + #uv_frame.overlay_mode .uv_face, + #uv_frame.overlay_mode .uv_face * { + pointer-events: none; + touch-action: none; + } + + body[mode=paint] #uv_frame, + body[mode=paint] #uv_viewport.tiled_mode { + cursor: crosshair; + } + #uv_frame > #texture_canvas_wrapper > canvas, + #uv_frame > img { + position: absolute; + pointer-events: none; + width: 100%; + height: 100%; + top: 0; + left: 0; + object-fit: cover; + object-position: 0 0; + } + #uv_frame > #texture_canvas_wrapper > canvas.overlay_canvas[overlay_mode=tiled] { + width: 300%; + height: 300%; + margin-top: calc(-1 * var(--inner-height)); + margin-left: calc(-1 * var(--inner-width)); + } + body[mode="edit"] #uv_frame > #texture_canvas_wrapper > canvas.overlay_canvas { + opacity: 0.3; + } + #uv_frame > #texture_canvas_wrapper > canvas.overlay_canvas[overlay_mode=onion_skin] { + width: 100%; + height: 100%; + } + #uv_frame > #texture_canvas_wrapper > canvas.overlay_canvas.above { + z-index: 1; + } + /* Fix in Firefox + iPadOS */ + #uv_frame_spacer { + width: 1px; + height: 1px; + pointer-events: none; + position: relative; + } + #uv_texture_grid { + position: absolute; + pointer-events: none; + width: 100%; + height: 100%; + top: 0; + left: 0; + object-fit: cover; + object-position: 0 0; + margin: -1px; + border: 1px solid var(--color-grid); + } + #uv_texture_grid path { + fill: none; + stroke-width: 0.4px; + stroke: var(--color-grid); + } + #uv_texture_grid path.bold_grid { + stroke-width: 0.86px; + } + div#uv_brush_outline { + border: 2px solid white; + width: calc(var(--radius) * 2px); + height: calc(var(--radius) * 2px); + margin: calc(var(--radius) * -1px); + position: absolute; + pointer-events: none; + touch-action: none; + mix-blend-mode: difference; + z-index: 1; + } + div#uv_brush_outline.circle { + border-radius: 50%; + } + div#uv_copy_brush_outline { + border: 2px dashed white; + width: calc(var(--radius) * 2px); + height: calc(var(--radius) * 2px); + margin: calc(var(--radius) * -1px); + position: absolute; + pointer-events: none; + touch-action: none; + mix-blend-mode: difference; + z-index: 1; + } + div#uv_copy_brush_outline::after { + content: "\2b"; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; + font-size: 19px; + position: absolute; + margin: auto; + top: calc(50% - 15px); + right: -10px; + left: -10px; + color: white; + width: 16px; + } + div#uv_brush_line_preview { + margin: calc(var(--radius) * 1px - 2px); + position: relative; + height: 2px; + transform-origin: left; + background-color: #cccccc; + pointer-events: none; + } + canvas.move_texture_with_uv { + position: absolute; + pointer-events: none; + width: 100%; + height: 100%; + top: 0; + left: 0; + } + .uv_panel_texture_name:hover { + color: var(--color-light); + cursor: pointer; + } + #uv_selection_frame { + border: 2px dashed var(--color-grid); + pointer-events: none; + position: relative; + z-index: 1; + margin-top: -1px; + } + #uv_rotate_handle { + width: 21.4px; + height: 21.4px; + left: -21px; + top: -21px; + position: absolute; + text-align: center; + cursor: url('../assets/rotate_cursor.png') 9 9, auto; + background: var(--color-back); + border-radius: 12px; + pointer-events: initial; + } + #uv_rotate_handle:hover { + color: var(--color-light); + } + #uv_scale_handle { + width: 18px; + height: 18px; + right: -16px; + bottom: -16px; + position: absolute; + text-align: center; + cursor: nw-resize; + background-color: var(--color-back); + pointer-events: initial; + } + #uv_scale_handle:hover { + color: var(--color-light); + } + #uv_scale_handle i { + transform: scaleY(-1); + font-size: 16px; + padding-top: 2px; + } + .uv_navigator { + position: fixed; + height: 25px; + width: 25px; + cursor: pointer; + z-index: 16; + border-radius: 50%; + color: var(--color-accent); + padding: 1px; + } + .uv_navigator:hover { + color: var(--color-light); + } + .uv_navigator > .icon { + transform-origin: center; + transform: rotate(var(--rotation)); + text-shadow: 1px 1px 2px black; + } + #uv_selection_outline { + --color-selection-outline-a: black; + --color-selection-outline-b: white; + position: absolute; + pointer-events: none; + width: calc(100% + 2px); + height: calc(100% + 2px); + top: -1px; + left: -1px; + object-fit: cover; + object-position: 0 0; + } + #uv_selection_outline path { + fill: none; + stroke-width: 2px; + stroke: var(--color-selection-outline-a); + } + #uv_selection_outline path.dash_overlay { + stroke: var(--color-selection-outline-b); + stroke-dasharray: 6px 4px; + stroke-dashoffset: 0; + animation: selection-outline-shift 700ms linear infinite; + animation-timing-function: steps(3, end); + } + @keyframes selection-outline-shift { + 0% { + stroke-dashoffset: 0; + } + 100% { + stroke-dashoffset: -10px; + } + } + #texture_selection_polygon { + position: absolute; + pointer-events: none; + width: calc(100% + 2px); + height: calc(100% + 2px); + top: -1px; + left: -1px; + object-fit: cover; + object-position: 0 0; + } + #texture_selection_polygon path { + fill: none; + stroke-width: 2px; + stroke: var(--color-light); + stroke-dasharray: 5px 3px; + stroke-dashoffset: 0; + animation: selection-outline-shift 700ms linear infinite; + animation-timing-function: steps(3, end); + } + #texture_selection_polygon circle { + fill: var(--color-ui); + stroke-width: 1; + stroke: var(--color-border); + } + #texture_selection_polygon circle.closed { + fill: var(--color-accent); + } + + .face_properties_toggle { + width: 32px; + flex-grow: 0 !important; + } + .face_properties_toggle > i { + margin: 1px auto; + } + #face_properties_header_bar { + display: flex; + height: 28px; + color: var(--color-subtle_text); + } + #face_properties_header_bar li:first-child { + flex-grow: 1; + text-align: center; + } + #uv_face_properties > ul { + overflow-y: auto; + margin-bottom: 8px; + } + .uv_face_properties_labels { + height: 28px; + display: flex; + align-items: center; + padding: 0 6px; + gap: 2px; + text-align: center; + color: var(--color-subtle_text); + white-space: nowrap; + } + .uv_face_properties_labels > .flexible { + flex-grow: 1; + flex-shrink: 1; + width: 50px; + overflow: hidden; + } + .uv_face_properties_labels label > i { + vertical-align: top; + } + .uv_face_properties_line { + height: 44px; + display: flex; + align-items: center; + padding: 0 6px; + gap: 2px; + } + .uv_face_properties_line.selected > label:first-of-type { + text-decoration: underline; + } + .uv_face_properties_line:nth-child(even) { + background-color: var(--color-back); + } + .uv_face_properties_line:nth-child(even) .dark_bordered { + background-color: var(--color-ui); + } + .uv_face_properties_line.disabled { + color: var(--color-subtle_text); + opacity: 0.64; + } + .uv_face_properties_line > * { + flex-grow: 0; + flex-shrink: 0; + } + .uv_face_properties_line > .flexible { + flex-grow: 1; + flex-shrink: 1; + width: 50px; + } + .uv_face_properties_line label { + width: 48px; + } + .uv_face_properties_line input[type=checkbox] { + width: 28px; + text-align: center; + } + .face_properties_texture { + width: 120px; + flex-grow: 1; + overflow: hidden; + white-space: nowrap; + cursor: pointer; + color: var(--color-subtle_text); + } + .face_properties_texture:hover { + color: var(--color-text); + } + .face_properties_texture img { + vertical-align: middle; + pointer-events: none; + object-fit: cover; + margin-right: 2px; + } + .face_properties_texture .texture_dummy_icon { + vertical-align: middle; + pointer-events: none; + margin-right: 2px; + display: inline-block; + width: 32px; + height: 32px; + background-color: var(--color-dark); + } + + .cube_box_uv { + position: absolute; + z-index: 2; + } + .cube_box_uv > div { + position: absolute; + z-index: 2; + cursor: move; + border: var(--uv-line-width) solid var(--color-accent); + box-sizing: border-box; + } + .cube_box_uv > div.uv_fill { + background-color: var(--color-uv-background); + } + .cube_box_uv:hover > div { + border-color: var(--color-uv-selected); + z-index: 3; + } + .cube_uv_face { + position: absolute; + z-index: 2; + width: var(--width); + height: var(--height); + cursor: move; + border: var(--uv-line-width) solid var(--color-text); + box-sizing: border-box; + background-color: var(--color-uv-background); + text-align: center; + color: var(--color-subtle_text); + font-size: 13px; + } + .cube_uv_face:hover { + border-color: var(--color-uv-hover); + background-color: var(--color-uv-background-hover); + z-index: 3; + } + .cube_uv_face.selected:not(.unselected) { + border-color: var(--color-uv-hover); + z-index: 4; + outline: 1px solid var(--color-border); + } + .cube_uv_face.unselected, + .cube_box_uv.unselected { + pointer-events: none; + z-index: 1; + } + .cube_uv_face.unselected > div, + .cube_box_uv.unselected > div { + border-color: var(--color-uv-unselected) !important; + } + + .uv_resize_side { + position: absolute; + top: 0; + left: 0; + } + .uv_resize_side.horizontal { + cursor: n-resize; + height: 6px; + margin-top: -4px; + } + .uv_resize_side.vertical { + cursor: w-resize; + width: 6px; + margin-left: -4px; + } + .uv_resize_corner { + position: absolute; + margin: -6px; + height: 9px; + width: 9px; + background-color: white; + border: 1px solid black; + z-index: 3; + } + .uv_resize_corner.uv_c_nw {cursor: nw-resize;} + .uv_resize_corner.uv_c_ne {cursor: ne-resize;} + .uv_resize_corner.uv_c_sw {cursor: sw-resize;} + .uv_resize_corner.uv_c_se {cursor: se-resize;} + .uv_resize_corner.uv_c_n {cursor: n-resize;} + .uv_resize_corner.uv_c_s {cursor: s-resize;} + .uv_resize_corner.uv_c_w {cursor: w-resize;} + .uv_resize_corner.uv_c_e {cursor: e-resize;} + + #uv_seleced_faces { + display: flex; + } + #uv_seleced_faces li { + padding: 0 5px; + } + + .mesh_uv_face { + position: absolute; + pointer-events: none; + z-index: 1; + } + .mesh_uv_face.selected { + z-index: 2; + } + .mesh_uv_face svg { + height: 100%; + width: 100%; + position: absolute; + } + .mesh_uv_face polygon { + pointer-events: initial; + fill: var(--color-uv-background); + stroke: var(--color-uv-unselected); + stroke-width: var(--uv-line-width); + } + .mesh_uv_face:hover polygon { + stroke: var(--color-uv-hover); + fill: var(--color-uv-background-hover); + } + .mesh_uv_face.selected polygon { + stroke: var(--color-uv-selected); + } + .uv_mesh_vertex { + position: absolute; + pointer-events: initial; + z-index: 3; + margin: -4px; + height: 10px; + width: 10px; + background-color: white; + border: 1px solid black; + border-radius: 5px; + cursor: move; + } + .uv_mesh_vertex.selected { + background-color: var(--color-accent); + } + .uv_helper_line_x { + top: 0; + left: 0; + position: absolute; + background-color: var(--color-accent); + width: 1px; + height: 100%; + z-index: 1; + } + .uv_helper_line_y { + top: 0; + left: 0; + position: absolute; + background-color: var(--color-accent); + width: 100%; + height: 1px; + z-index: 1; + } + + .bar.uv_editor_sliders { + display: flex; + } + .bar.uv_editor_sliders > .nslide_tool { + flex-grow: 1; + } + .bar.uv_editor_sliders > .edit_mode_uv_overlay { + flex-grow: 0; + margin-left: auto; + } + .uv_painter_info { + display: flex; + } + .uv_painter_info span { + margin: 3px 6px; + flex: 1 1 100px; + overflow: hidden; + white-space: nowrap; + text-align: center; + } + + .main_corner { + position: absolute; + } + .main_corner::after { + content: ""; + display: block; + margin: -2px; + height: 12px; + width: 12px; + border: 1px solid white; + border-radius: 5px; + } + .cube_uv_face > .main_corner::after { + height: 11px; + width: 11px; + border-radius: 2px; + } + .main_corner.selected::after { + border-color: var(--color-accent); + } + .uv_rotate_field { + position: absolute; + width: 15px; + height: 15px; + bottom: 6px; + right: 6px; + cursor: url('../assets/rotate_cursor.png') 9 9, auto; + } + + .joined_uv_bar { + display: flex; + } + .joined_uv_bar > * { + flex: 1 0 0; + } + + .panel .bar.next_to_title { + margin-top: -34px; + margin-right: 78px; + position: relative; + float: right; + pointer-events: none; + } + body.is_mobile .panel .bar.next_to_title { + margin-right: 32px; + } + .panel .bar.next_to_title > .tool { + float: right; + pointer-events: initial; + } + + #uv_cube_face_bar { + display: flex; + height: 28px; + } + #uv_cube_face_bar li { + flex-grow: 1; + text-align: center; + padding: 2px; + margin: 0 1px; + } + #uv_cube_face_bar li:hover { + color: var(--color-light); + } + #uv_cube_face_bar li.selected { + border-radius: 3px; + background: var(--color-selected); + } + #uv_cube_face_bar li.disabled { + color: var(--color-subtle_text); + } + + #texture_selection_rect { + position: absolute; + pointer-events: none; + border: 1px dashed white; + margin: -1px; + box-sizing: content-box; + background-color: color-mix(in srgb, var(--color-accent) 30%, transparent); + } + #texture_selection_rect.ellipse { + border-radius: 50%; + } + #texture_pasting_overlay { + position: absolute; + pointer-events: initial !important; + } + #texture_pasting_overlay canvas { + pointer-events: initial !important; + } + #texture_pasting_overlay::before { + content: ""; + display: block; + box-sizing: content-box; + position: absolute; + border: 1px dashed white; + margin: -1px; + pointer-events: none; + z-index: 6; + width: 100%; + height: 100%; + } + #texture_pasting_overlay > canvas { + box-shadow: 1px 1px 20px black; + cursor: move; + z-index: 5; + float: left; + } + .uv_transparent_face { + margin: 8px auto auto; + color: var(--color-subtle_text); + max-width: fit-content; + } + .copy_paste_tool_control { + height: 30px; + flex-grow: 1; + } + .copy_paste_tool_control .tool.button_place { + color: var(--color-confirm); + float: right; + } + .copy_paste_tool_control .tool.button_cancel { + color: var(--color-close); + float: right; + } + .uv_layer_limbo_options { + position: absolute; + bottom: 52px; + left: 0; + right: 0; + margin: auto; + padding: 0 4px; + width: fit-content; + z-index: 20; + } + .uv_layer_limbo_options > button { + box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); + } + .uv_layer_transform_handles { + border: 1px solid var(--color-text); + position: absolute; + cursor: move; + } + +/*Chat*/ + #panel_chat { + z-index: 16; + flex-grow: 0; + flex-shrink: 0; + } + #chat_history { + background: var(--color-back); + color: var(--color-text); + min-height: 81px; + max-height: 320px; + padding: 5px; + font-size: 12pt; + overflow-y: scroll; + overflow-x: hidden; + word-break: break-word; + } + #chat_history li { + padding-top: 1px; + padding-left: 7px; + clear: both; + } + #chat_history li b { + margin-left: -6px; + user-select: text; + -webkit-user-select: text; + color: var(--color-text); + background-color: var(--color-button); + border-radius: 4px; + padding: 1px 4px; + } + #chat_history li b.self { + color: var(--color-accent_text); + background-color: var(--color-accent); + } + #chat_history li span.text { + user-select: text; + -webkit-user-select: text; + } + #chat_history li span.timestamp { + color: var(--color-subtle_text); + font-size: 0.8em; + margin-top: 2px; + float: right; + } + #chat_bar { + height: 32px; + margin-bottom: 6px; + margin-top: 5px; + } + #chat_input { + padding: 5px; + width: calc(100% - 36px); + margin-left: 2px; + } + #chat_bar > i { + margin: 4px; + } + #chat_bar > i:hover { + color: var(--color-light); + } + +/*Color*/ + #color_panel_head { + display: flex; + width: 100%; + height: 50px; + padding: 0 8px; + margin-top: 4px; + } + #color_panel_head .chosen { + width: 56px; + flex-shrink: 0; + position: relative; + } + #color_panel_head .chosen > .main, + #color_panel_head .chosen > .secondary { + width: 32px; + height: 28px; + border-radius: 5px; + border: 1px solid var(--color-border); + position: absolute; + } + #color_panel_head .chosen > .main { + top: 2px; + left: 0; + width: 34px; + height: 30px; + box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); + } + #color_panel_head .chosen > .secondary { + top: 18px; + left: 18px; + } + #color_panel_head .chosen > .selected { + border-color: var(--color-accent); + border-width: 2px; + } + #color_panel_head .chosen > .switcher { + top: 0; + right: 0; + position: absolute; + height: 22px; + width: 22px; + } + #color_panel_head .chosen > .switcher > .icon { + margin-top: 0; + font-size: 19px; + } + + #color_panel_head .side { + height: 100%; + flex-grow: 1; + overflow: hidden; + } + #color_panel_head .side input { + width: 100%; + height: 26px; + padding: 0 8px; + font-family: var(--font-code); + background-color: var(--color-back); + } + #color_history { + width: 100%; + height: 17px; + margin-top: 1px; + display: flex; + } + #color_history > li { + vertical-align: top; + display: inline-block; + width: 30px; + height: 100%; + min-width: 18px; + cursor: pointer; + } + #color_history > li:hover { + border: 1px solid var(--color-back); + } + + #main_colorpicker_preview { + margin-top: -35px; + border: 1px solid var(--color-border); + height: 20px; + } + #main_colorpicker_preview > div { + height: 100%; + width: 36px; + } + #palette_list { + padding: 2px; + min-height: 160px; + line-height: 0; + } + #palette_list .color { + display: inline-block; + width: 25px; + height: 25px; + vertical-align: top; + } + #palette_list .color:hover { + padding: 1px; + } + #palette_list .color.selected { + padding: 3px; + } + #palette_list .color.secondary { + padding: 1.25px; + } + #palette_list .color.contrast { + background-color: var(--color-text); + } + #palette_list .color .color_inner { + width: 100%; + height: 100%; + } + #panel_color input.sp-input { + width: calc(100% - 40px); + float: left; + } + #panel_color .sp-container.sp-flat { + overflow: visible; + margin: 2px 4px 0 4px; + width: calc(100% - 8px); + } + #center #panel_color .sp-top.sp-cf { + height: var(--height); + } +/* Skin Pose */ + #skin_pose_selector { + display: flex; + } + #skin_pose_selector > li { + flex-grow: 1; + height: 48px; + cursor: pointer; + text-align: center; + } + #skin_pose_selector > li:hover { + color: var(--color-light); + } + #skin_pose_selector > li.selected { + border-bottom: 3px solid var(--color-accent); + } + #skin_pose_selector > li:active { + padding-top: 1px; + } + #skin_pose_selector > li .pose_icon { + background-color: var(--color-text); + pointer-events: none; + width: 100%; + height: 44px; + mask-size: contain; + mask-repeat: no-repeat; + mask-position: center; + -webkit-mask-size: contain; + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + } + #skin_pose_selector > li:hover .pose_icon { + background-color: var(--color-light); + } +} diff --git a/nonpacks/static/vendor/blockbench/css/prism.css b/nonpacks/static/vendor/blockbench/css/prism.css new file mode 100644 index 0000000..5b535f2 --- /dev/null +++ b/nonpacks/static/vendor/blockbench/css/prism.css @@ -0,0 +1,219 @@ +/* PrismJS 1.17.1 +https://prismjs.com/download.html#themes=prism-okaidia&languages=css+json */ +/** + * okaidia theme for JavaScript, CSS and HTML + * Loosely based on Monokai textmate theme by http://www.monokai.nl/ + * @author ocodia + */ +@layer lib { + .prism-editor-wrapper code { + font-family: inherit; + line-height: inherit; + display: block; + } + .prism-editor-component { + height: auto; + max-height: 100%; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + position: relative; + } + .prism-editor-component, + .prism-editor-wrapper { + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } + .prism-editor-wrapper { + height: 100%; + overflow: auto; + -o-tab-size: 1.5em; + tab-size: 1.5em; + -moz-tab-size: 1.5em; + } + .prism-editor-wrapper pre { + display: inline-block; + width: 100%; + } + div.prism-editor-wrapper .prism-editor-placeholder { + color: #6f7276; + pointer-events: none; + width: 0; + overflow: visible; + display: inline-block; + } + div.prism-editor-wrapper:focus-within .prism-editor-placeholder { + visibility: hidden; + } + .prism-editor__line-numbers { + height: 100%; + overflow: hidden; + -ms-flex-negative: 0; + flex-shrink: 0; + padding-top: 4px; + margin-top: 0; + border-right: 1px solid var(--color-border); + margin-right: 4px; + padding-right: 4px; + } + .prism-editor__line-number { + text-align: right; + white-space: nowrap; + } + .prism-editor__autocomplete { + position: absolute; + min-width: 100px; + width: 100%; + max-width: 250px; + top: 25px; + min-height: 12px; + max-height: 180px; + overflow-y: auto; + z-index: 4; + } + .prism-editor__autocomplete li { + overflow: hidden; + white-space: nowrap; + padding: 1px 5px; + cursor: pointer; + } + .prism-editor__code { + margin-top: 0 !important; + margin-bottom: 0 !important; + -webkit-box-flex: 2; + -ms-flex-positive: 2; + flex-grow: 2; + min-height: 100%; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -o-tab-size: 4; + tab-size: 4; + -moz-tab-size: 4; + outline: none; + } + pre.prism-editor__code:focus { + outline: none; + } +} + +@layer base { + code[class*='language-'], + pre[class*='language-'] { + color: #f8f8f2; + background: none; + text-shadow: 0 1px rgba(0, 0, 0, 0.3); + font-family: var(--font-code); + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + cursor: text; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; + } + + /* Code blocks */ + pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + border-radius: 0.3em; + } + + :not(pre) > code[class*='language-'], + pre[class*='language-'] { + background: var(--color-back); + } + + /* Inline code */ + :not(pre) > code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; + } + + .token.comment, + .token.prolog, + .token.doctype, + .token.cdata { + color: slategray; + } + + .token.punctuation { + color: var(--color-text); + } + + .namespace { + opacity: 0.7; + } + + .token.property, + .token.tag, + .token.constant, + .token.symbol, + .token.deleted { + color: #f92672; + } + + .token.boolean, + .token.number { + color: #ae81ff; + } + + .token.selector, + .token.attr-name, + .token.string, + .token.char, + .token.builtin, + .token.inserted { + color: #a6e22e; + } + + .token.operator, + .token.entity, + .token.url, + .language-css .token.string, + .style .token.string, + .token.variable { + color: #f8f8f2; + } + + .token.atrule, + .token.attr-value, + .token.function, + .token.class-name { + color: #e6db74; + } + + .token.keyword { + color: #66d9ef; + } + + .token.regex, + .token.important { + color: #fd971f; + } + + .token.important, + .token.bold { + font-weight: bold; + } + .token.italic { + font-style: italic; + } + + .token.entity { + cursor: help; + } +} diff --git a/nonpacks/static/vendor/blockbench/css/setup.css b/nonpacks/static/vendor/blockbench/css/setup.css new file mode 100644 index 0000000..5dae772 --- /dev/null +++ b/nonpacks/static/vendor/blockbench/css/setup.css @@ -0,0 +1,862 @@ +@layer reset, lib, base, plugin, theme, theme-override; +@layer reset { + * { + margin: 0; + padding: 0; + outline: none; + outline-color: rgba(0, 0, 0, 0); + } + body { + user-select: none; + -webkit-user-select: none; + } + div { + cursor: default; + box-sizing: border-box; + } + a { + text-decoration: none; + cursor: default; + color: inherit; + } + i { + cursor: inherit; + } + + b { + font-weight: bolder; + } + li { + list-style: none; + cursor: default; + } +} +@layer base { +/*INIT*/ + body.is_mobile * { + user-select: none; + -webkit-user-select: none; + } + [hidden], template { + display: none; + } + /*Webkit*/ + a[href] { + color: inherit; + text-decoration: underline; + cursor: pointer; + } + a[href]:hover { + color: var(--color-light); + } + .bright_ui a[href]:hover { + color: var(--color-accent); + } + + /* SCROLLBARS */ + /* webkit */ + ::-webkit-scrollbar { + width: 8px; + height: 8px; + } + ::-webkit-scrollbar-track { + background: var(--color-ui); + } + ::-webkit-scrollbar-corner { + background: var(--color-ui); + } + + ::-webkit-scrollbar-thumb { + background: var(--color-selected); + border-radius: 4px; + } + + ::-webkit-scrollbar-thumb:hover { + background: var(--color-accent); + } + /* Web standard */ + * { + scrollbar-width: thin; + scrollbar-color: var(--color-selected) transparent; + } + + ::selection { + background: var(--color-accent); + } + body.is_mobile ::-webkit-scrollbar { + width: 0; + height: 0; + } + body.is_mobile * { + scrollbar-width: none; + } + body.is_mobile .mobile_scrollbar { + scrollbar-width: initial; + } + body.is_mobile .mobile_scrollbar::-webkit-scrollbar { + width: 20px; + height: 20px; + } + body.is_mobile .mobile_scrollbar::-webkit-scrollbar-thumb { + border-radius: 10px; + } + /*Assistant Font*/ + @font-face { + font-family: 'Assistant'; + font-style: normal; + font-weight: 200; + src: local('Assistant-ExtraLight'), + url(../font/Assistant-ExtraLight.ttf) format('truetype'); + } + @font-face { + font-family: 'Assistant'; + font-style: normal; + font-weight: 300; + src: local('Assistant-Light'), + url(../font/Assistant-Light.ttf) format('truetype'); + } + @font-face { + font-family: 'Assistant'; + font-style: normal; + font-weight: 400; + src: local('Assistant-Regular'), + url(../font/Assistant-Regular.ttf) format('truetype'); + } + @font-face { + font-family: 'Assistant'; + font-style: normal; + font-weight: 600; + src: local('Assistant-SemiBold'), + url(../font/Assistant-SemiBold.ttf) format('truetype'); + } + @font-face { + font-family: 'Assistant'; + font-style: normal; + font-weight: 600; + src: local('Assistant-Bold'), + url(../font/Assistant-Bold.ttf) format('truetype'); + } + @font-face { + font-family: 'Assistant'; + font-style: normal; + font-weight: 700; + src: local('Assistant-ExtraBold'), + url(../font/Assistant-ExtraBold.ttf) format('truetype'); + } + @font-face { + font-family: 'Montserrat'; + font-style: normal; + font-weight: 100 1000; + src: local('Montserrat-VariableFont'), + url(../font/Montserrat-VariableFont_wght.ttf) format('truetype'), + url(../font/Montserrat-VariableFont_wght.ttf) format('truetype'); + } + + /* https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:FILL@1 */ + @font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url(../font/material-icons.woff2) format('woff'); + } + @font-face { + font-family: 'icomoon'; + font-weight: normal; + font-style: normal; + src: url('../font/icomoon.ttf') format('truetype'), + url('../font/icomoon.woff') format('woff'); + } + +/*Icons*/ + [class^="icon-"]:not(.fa), [class*=" icon-"]:not(.fa) { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'icomoon' !important; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + font-size: 1.4em; + max-width: 24px; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + + .icon-keyframe_discontinuous_bezier:before { + content: "\e92d"; + } + .icon-keyframe_smooth:before { + content: "\e92c"; + } + .icon-keyframe_step:before { + content: "\e92b"; + } + .icon-keyframe_bezier:before { + content: "\e92a"; + } + .icon-collada:before { + content: "\e926"; + } + .icon-fbx:before { + content: "\e927"; + } + .icon-format_bedrock_block:before { + content: "\e928"; + } + .icon-format_bedrock_entity:before { + content: "\e929"; + } + .icon-keyframe:before { + content: "\e924"; + } + .icon-keyframe_discontinuous:before { + content: "\e925"; + } + .icon-gizmo:before { + content: "\e922"; + } + .icon-gltf:before { + content: "\e923"; + } + .icon-format_bedrock_legacy:before { + content: "\e91a"; + } + .icon-crossbow:before { + content: "\e91b"; + } + .icon-format_bedrock:before { + content: "\e91c"; + } + .icon-format_block:before { + content: "\e91d"; + } + .icon-format_free:before { + content: "\e91e"; + } + .icon-format_hytale:before { + content: "\e91f"; + } + .icon-format_java:before { + content: "\e920"; + } + .icon-format_optifine:before { + content: "\e921"; + } + .icon-sketchfab:before { + content: "\e919"; + } + .icon-blockbench_file:before { + content: "\e900"; + } + .icon-vertexsnap:before { + content: "\e901"; + } + .icon-create_bitmap:before { + content: "\e902"; + } + .icon-objects:before { + content: "\e903"; + } + .icon-bow:before { + content: "\e904"; + } + .icon-bb_interface:before { + content: "\e905"; + } + .icon-blockbench:before { + content: "\e906"; + } + .icon-x11:before { + content: "\e907"; + } + .icon-baby_zombie:before { + content: "\e908"; + } + .icon-armor_stand:before { + content: "\e909"; + } + .icon-armor_stand_small:before { + content: "\e90a"; + } + .icon-ground:before { + content: "\e90b"; + } + .icon-hud:before { + content: "\e90c"; + } + .icon-inventory_full:before { + content: "\e90d"; + } + .icon-inventory_nine:before { + content: "\e90e"; + } + .icon-inventory_single:before { + content: "\e90f"; + } + .icon-player_head:before { + content: "\e910"; + } + .icon-zombie:before { + content: "\e911"; + } + .icon-blockbench_inverted:before { + content: "\e912"; + } + .icon-optifine_file:before { + content: "\e913"; + } + .icon-saved:before { + content: "\e914"; + } + .icon-player:before { + content: "\e915"; + } + .icon-mirror_x:before { + content: "\e916"; + } + .icon-mirror_y:before { + content: "\e917"; + } + .icon-mirror_z:before { + content: "\e918"; + } + + + + .icon { + user-select: none; + } + .material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 22px; + max-width: 22px; + display: inline-block; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + overflow: hidden; + flex-shrink: 0; + } + i.fa_big { + font-size: 18px; + height: 22px; + width: 22px; + padding-top: 1px; + text-align: center; + vertical-align: text-top; + } + .dialog .message_box_icon { + font-size: 40pt; + float: left; + padding-right: 8px; + height: 54px; + min-width: 61px; + max-width: 62px; + } + .dialog .message_box_icon.fa { + font-size: 35pt; + } + .dialog img.message_box_icon { + min-width: auto; + } + +/*Vars*/ + body { + --color-back: #181b1f; + --color-dark: #101316; + --color-border: #101316; + --color-ui: #1e2127; + --color-accent: #3e90ff; + --color-button: #33383f; + --color-selected: #3b3e49; + --color-elevated: #272a31; + --color-frame: #121418; + --color-text: #cacad4; + --color-light: #f4f3ff; + --color-accent_text: #000006; + --color-bright_ui_text: #000006; + --color-subtle_text: #848891; + --color-bright_ui: #f4f3ff; + --color-bright_border: var(--color-text); + --color-grid: #30333d; + --color-wireframe: #576f82; + --color-checkerboard: #14171b; + + --color-menu_separator: #b0afba; + --color-guidelines: rgba(136, 150, 157, 0.35); + + --color-close: #d62e3f; + --color-confirm: #90ee90; + --color-error: #ff2a51; + --color-warning: #ffc400; + --color-stream: #6442A4; + + --color-axis-x: #ff1242; + --color-axis-y: #23d400; + --color-axis-z: #0894ed; + --color-axis-u: #23d4ed; + --color-axis-v: #ff12ed; + --color-axis-w: #ffd442; + + --color-spline-handle-mirrored: #ff1242; + --color-spline-handle-aligned: #F0B000; + --color-spline-handle-free: #00D123; + + --font-custom-main: ''; + --font-custom-headline: ''; + --font-custom-code: ''; + + --font-main: var(--font-custom-main), Assistant, segoe ui, sans-serif; + --font-headline: var(--font-custom-headline), Montserrat, segoe ui, sans-serif; + --font-code: var(--font-custom-code), Consolas, Monospace; + } + +/*Elements*/ + + html { + height: 100%; + overflow-y: hidden; + } + body { + height: 100%; + width: 100%; + position: fixed; + + font-family: var(--font-main); + font-size: 16px; + font-weight: normal; + + color: var(--color-text); + outline-color: var(--color-accent); + background-color: var(--color-dark); + image-rendering: pixelated; + forced-color-adjust: none; + } + hr { + border-top: 1px solid var(--color-border); + margin: 12px 0; + } + h1, h2, h3, h4, h5, h6 { + font-family: var(--font-headline); + margin: 12px 0 8px 0; + } + h1 { + letter-spacing: -0.03em; + font-weight: 800; + } + h2 { + font-weight: 200; + margin: 0; + } + h3 { + font-size: 1.28em; + font-weight: inherit; + margin-left: 16px; + min-width: 10px; + } + h4 { + font-size: 1.2em; + font-weight: inherit; + } + +/*Inputs*/ + input { + -webkit-appearance: none; + appearance: none; + border: none; + background: transparent; + color: inherit; + font-size: 1em; + font-family: inherit; + outline: none; + -webkit-user-select: initial; + } + button { + border: none; + background: var(--color-button); + display: inline-block; + text-align: center; + vertical-align: middle; + cursor: default; + outline: none; + height: 32px; + min-width: 100px; + width: auto; + color: var(--color-text); + padding-right: 16px; + padding-left: 16px; + font-weight: normal; + cursor: pointer; + border-radius: 5px; + box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); + } + button.disabled { + opacity: 0.5; + pointer-events: none; + } + button:hover { + background: var(--color-accent); + color: var(--color-accent_text) !important; + } + button:focus { + text-decoration: underline; + } + button.minor { + background: transparent; + border: none; + text-decoration: underline; + } + button.minor:hover { + color: var(--color-light) !important; + } + button > i { + pointer-events: none; + vertical-align: sub; + margin-right: 4px; + } + select { + -webkit-appearance: none; + appearance: none; + outline: none; + outline-color: var(--color-accent); + border: none; + background-color: var(--color-button); + height: 30px; + padding-top: 2px; + padding-left: 10px; + padding-right: 10px; + color: var(--color-text); + } + select:hover{ + color: var(--color-light); + } + select:focus{ + text-decoration: underline; + } + select option { + -webkit-appearance: none; + appearance: none; + background-color: var(--color-back); + outline: none; + border: none; + } + textarea { + width: 100%; + height: -webkit-fill-available; + padding: 4px; + border: 1px solid var(--color-border); + background: var(--color-back); + color: var(--color-text); + border-radius: 5px; + resize: none; + outline: none; + user-select: initial; + -webkit-user-select: initial; + } + div[contenteditable="true"] { + user-select: initial; + -webkit-user-select: initial; + } + div.bb-select, + select { + display: block; + position: relative; + background-color: var(--color-button); + text-align: left; + height: 30px; + min-width: 50px; + padding-top: 4px; + padding-left: 8px; + padding-right: 24px; + border-radius: 5px; + color: var(--color-text); + white-space: nowrap; + overflow: hidden; + } + div.bb-select:hover, + select { + color: var(--color-light); + } + + div.bb-select::before { + content: "\f0d7"; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; + display: block; + position: absolute; + height: 12px; + width: 16px; + pointer-events: none; + right: 3px; + top: 3px; + } + input[type="number"]::-webkit-outer-spin-button, input[type="number"]::-webkit-inner-spin-button { + -webkit-appeareance: none; + } + input[type=range] { + background-color: transparent; + height: 30px; + position: relative; + --color-track: var(--color-grid); + --color-thumb: var(--color-accent); + --color-center: var(--color-back); + } + input[type=range]::-webkit-slider-thumb { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + height: 20px; + width: 20px; + margin-top: -9px; + border: none; + background-color: var(--color-center); + border: 2px solid var(--color-thumb); + border-radius: 50%; + cursor: pointer; + z-index: 3; + } + input[type=range]::-moz-range-thumb { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + height: 20px; + width: 20px; + border:none; + background-color: var(--color-center); + border: 2px solid var(--color-thumb); + border-radius: 50%; + cursor: pointer; + z-index: 3; + } + input[type=range]:not([disabled=disabled])::-webkit-slider-thumb:hover { + background-color: var(--color-thumb); + border: none; + } + input[type=range]:not([disabled=disabled])::-moz-range-thumb:hover { + background-color: var(--color-thumb); + border: none; + } + input[type=range][disabled=disabled]::-webkit-slider-thumb { + background-color: var(--color-button); + } + input[type=range][disabled=disabled]::-moz-range-thumb { + background-color: var(--color-button); + } + input[type=range]::-webkit-slider-runnable-track { + width: 100%; + height: 3px; + cursor: pointer; + background: var(--color-track); + } + input[type=range]::-moz-range-track { + width: 100%; + height: 2px; + cursor: pointer; + background: var(--color-track); + border-radius: 3px; + } + input[type=text].dark_bordered:read-only { + color: var(--color-subtle_text); + } + input:-webkit-autofill, + input:-webkit-autofill:hover, + input:-webkit-autofill:focus, + input:-webkit-autofill:active { + -webkit-box-shadow: 0 0 0 30px var(--color-back) inset !important; + } + input:-webkit-autofill { + -webkit-text-fill-color: var(--color-text) !important; + border-left: 4px solid var(--color-confirm); + } + input[type=password] { + font-size: 1.2em; + } + input[type=checkbox] { + min-width: 30px; + text-align: center; + } + input[type=checkbox]::before { + content: "\f0c8"; + font-family: 'Font Awesome 6 Free'; + font-weight: 300; + font-size: 15pt; + } + input[type=checkbox]:checked::before { + content: "\f14a"; + font-family: 'Font Awesome 6 Free'; + font-weight: 600; + } + input[type=checkbox]:focus, input[type=radio]:focus { + color: var(--color-light); + } + input[type=checkbox][disabled=disabled] { + color: var(--color-subtle_text); + } + input[type=checkbox].toggle_switch { + height: 22px; + width: 46px; + background-color: var(--color-button); + position: relative; + --color: var(--color-text); + border-radius: 12px; + box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2); + cursor: pointer; + transition: background-color 70ms ease-out; + } + input[type=checkbox].toggle_switch:checked { + background-color: var(--color-accent); + --color: var(--color-light); + } + input[type=checkbox].toggle_switch::before { + content: ""; + width: 10px; + height: 10px; + border-radius: 50%; + margin: 6px; + position: absolute; + left: 0; + transition: left 120ms ease-out, background-color 120ms ease-out; + background-color: var(--color); + } + input[type=checkbox].toggle_switch:checked::before { + left: calc(100% - 22px); + } + + input[type=radio]::before { + content: "\f111"; + font-family: 'Font Awesome 6 Free'; + font-weight: 300; + font-size: 15pt; + } + input[type=radio]:checked::before { + content: "\f192"; + } + input[type=radio][disabled=disabled] { + color: var(--color-subtle_text); + } + input:-webkit-autofill, + input:-webkit-autofill:focus { + transition: background-color 600000s 0s, color 600000s 0s; + } + .numeric_input { + position: relative; + flex-shrink: 1; + flex-grow: 1; + } + .numeric_input > input { + position: relative; + width: 100%; + } + .numeric_input > div.tool { + position: absolute; + width: 18px; + right: 1px; + top: 0; + color: var(--color-subtle_text); + cursor: ew-resize; + } + .numeric_input > div.tool > i { + font-size: 18px; + margin-top: 6px; + } + + div.nslide { + position: relative; + height: 28px; + width: 100%; + padding: 3px; + padding-left: 6px; + cursor: e-resize; + overflow: hidden; + white-space: nowrap; + outline: none; + background-color: var(--color-elevated); + border-radius: 4px; + box-shadow: 0 1px 6px rgba(0, 0, 0, 0.1); + } + .tool.nslide_tool.has_percentage_bar .nslide::after { + content: ""; + position: absolute; + pointer-events: none; + bottom: 0; + left: 0; + height: 3px; + width: calc(var(--percentage) * 1%); + background-color: var(--color-accent); + } + .tool.nslide_tool.is_colored .nslide::before { + content: ""; + position: absolute; + pointer-events: none; + top: 0; + right: 0; + border-width: 4px; + border-style: solid; + border-color: var(--corner-color); + border-bottom-color: transparent !important; + border-left-color: transparent !important; + } + div.nslide_arrow { + position: absolute; + z-index: 17; + display: inline-block; + width: 20px; + height: 24px; + margin-top: -29px; + user-select: none; + margin-left: -42px; + overflow: hidden; + text-align: center; + } + div.nslide.editing { + cursor: text; + } + .numeric_input.is_colored::before { + content: ""; + position: absolute; + pointer-events: none; + top: 0; + right: 0; + z-index: 1; + border-width: 4px; + border-style: solid; + border-color: var(--corner-color); + border-bottom-color: transparent !important; + border-left-color: transparent !important; + } + + input.toggle_panel { + display: none; + } + label.toggle_panel { + height: 30px; + width: 56px; + padding: 4px; + display: inline-block; + text-align: center; + cursor: pointer; + flex-grow: 1; + margin: 2px; + } + label.toggle_panel:hover { + color: var(--color-light); + } + input:checked + label.toggle_panel { + background-color: var(--color-button); + } + input:checked + label.toggle_panel:hover { + background-color: var(--color-selected); + } + .y_scrollable { + overflow-y: scroll; + } +} diff --git a/nonpacks/static/vendor/blockbench/css/spectrum.css b/nonpacks/static/vendor/blockbench/css/spectrum.css new file mode 100644 index 0000000..02f1aa7 --- /dev/null +++ b/nonpacks/static/vendor/blockbench/css/spectrum.css @@ -0,0 +1,488 @@ +/*** +Spectrum Colorpicker v1.8.0 +https://github.com/bgrins/spectrum +Author: Brian Grinstead +License: MIT +***/ +@layer lib { +.sp-container { + position:absolute; + top:0; + left:0; + display:inline-block; + /* https://github.com/bgrins/spectrum/issues/40 */ + z-index: 1; + overflow: hidden; +} +.sp-container:not(.sp-flat) { + z-index: 42; +} +.sp-container.sp-flat { + position: relative; + background: transparent; + box-shadow: none; + border: none; + width: 100%; +} +.sp-container.sp-flat { + position: relative; + background: transparent; + box-shadow: none; +} +.sp-container.sp-flat .sp-picker-container { + width: calc(100% - 4px); + padding: 2px; + padding-bottom: 0; + margin-bottom: -12px; +} +.sp-container.sp-flat .sp-button-container { + display: none; +} +.sp-container.sp-flat .sp-input-container { + width: 100%; +} + +/* Fix for * { box-sizing: border-box; } */ +.sp-container, +.sp-container * { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +/* http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio */ +.sp-top { + position:relative; + width: 100%; + display:inline-block; +} +.sp-top-inner { + position:absolute; + top:0; + left:0; + bottom: 4px; + right:0; +} +.sp-alpha-enabled .sp-top-inner { + bottom: 16px; +} +.sp-color { + position: absolute; + top:0; + left:0; + bottom:0; + right: 32px; +} +.sp-hue { + position: absolute; + top:0; + right:0; + bottom:0; + width: 24px; + height: 100%; +} + +.sp-clear-enabled .sp-hue { + top:30px; + height: 77.5%; +} + +.sp-fill { + padding-top: 80%; +} +.sp-sat, .sp-val { + position: absolute; + top:0; + left:0; + right:0; + bottom:0; +} + +.sp-alpha-enabled .sp-top { + margin-bottom: 12px; +} +.sp-alpha-enabled .sp-alpha { + display: block; +} +.sp-alpha-handle { + position: absolute; + top: 0px; + bottom: -4px; + left: 50%; + cursor: pointer; + display: block; + height: 30px; + width: 12px; + margin-top: -6px; + background-color: var(--color-ui); + border: 1px solid var(--color-border); +} +.sp-alpha-inner:hover .sp-alpha-handle { + background-color: var(--color-accent); +} +.sp-alpha { + display: none; + position: absolute; + bottom: -14px; + right: 0; + left: 0; + height: 22px; + margin-top: 16px; +} + +.sp-clear { + display: none; +} + +.sp-clear.sp-clear-display { + background-position: center; +} + +.sp-clear-enabled .sp-clear { + display: block; + position:absolute; + top:0px; + right:0; + bottom:0; + left:84%; + height: 28px; +} + +/* Don't allow text selection */ +.sp-container, .sp-replacer, .sp-preview, .sp-dragger, .sp-slider, .sp-alpha, .sp-clear, .sp-alpha-handle, .sp-container.sp-dragging .sp-input, .sp-container button { + -webkit-user-select:none; + -moz-user-select: -moz-none; + -o-user-select:none; + user-select: none; +} + +.sp-container.sp-input-disabled .sp-input-container { + display: none; +} +.sp-container.sp-buttons-disabled .sp-button-container { + display: none; +} +.sp-container.sp-palette-buttons-disabled .sp-palette-button-container { + display: none; +} +.sp-palette-only .sp-picker-container { + display: none; +} +.sp-palette-disabled .sp-palette-container { + display: none; +} + +.sp-initial-disabled .sp-initial { + display: none; +} + + +/* Gradients for hue, saturation and value instead of images. Not pretty... but it works */ +.sp-sat { + background-image: -webkit-gradient(linear, 0 0, 100% 0, from(#FFF), to(rgba(204, 154, 129, 0))); + background-image: -webkit-linear-gradient(left, #FFF, rgba(204, 154, 129, 0)); + background-image: -moz-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); + background-image: -o-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); + background-image: -ms-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); + background-image: linear-gradient(to right, #fff, rgba(204, 154, 129, 0)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)"; + filter : progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr='#FFFFFFFF', endColorstr='#00CC9A81'); +} +.sp-val { + background-image: -webkit-gradient(linear, 0 100%, 0 0, from(#000000), to(rgba(204, 154, 129, 0))); + background-image: -webkit-linear-gradient(bottom, #000000, rgba(204, 154, 129, 0)); + background-image: -moz-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); + background-image: -o-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); + background-image: -ms-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); + background-image: linear-gradient(to top, #000, rgba(204, 154, 129, 0)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)"; + filter : progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81', endColorstr='#FF000000'); +} + +.sp-hue { + background: -moz-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); + background: -ms-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); + background: -o-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); + background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), color-stop(0.17, #ffff00), color-stop(0.33, #00ff00), color-stop(0.5, #00ffff), color-stop(0.67, #0000ff), color-stop(0.83, #ff00ff), to(#ff0000)); + background: -webkit-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); + background: linear-gradient(to bottom, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); +} + +/* IE filters do not support multiple color stops. + Generate 6 divs, line them up, and do two color gradients for each. + Yes, really. + */ +.sp-1 { + height:17%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000', endColorstr='#ffff00'); +} +.sp-2 { + height:16%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00', endColorstr='#00ff00'); +} +.sp-3 { + height:17%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00', endColorstr='#00ffff'); +} +.sp-4 { + height:17%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff', endColorstr='#0000ff'); +} +.sp-5 { + height:16%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff', endColorstr='#ff00ff'); +} +.sp-6 { + height:17%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff', endColorstr='#ff0000'); +} + +.sp-hidden { + display: none !important; +} + +/* Clearfix hack */ +.sp-cf:before, .sp-cf:after { content: ""; display: table; } +.sp-cf:after { clear: both; } + +body.is_touch .sp-fill { padding-top: 64%; } + +.sp-dragger { + border-radius: 6px; + height: 8px; + width: 8px; + border: 1px solid var(--color-border); + background: var(--color-light); + cursor: pointer; + position:absolute; + top:0; + left: 0; + margin-top: 3px; + margin-left: 3px; +} +.sp-slider { + position: absolute; + top:0; + cursor:pointer; + height: 0; + left: -3px; + right: -3px; + margin-top: -8px; + border-color: var(--color-light); + border-style: solid; + border-width: 8px; + border-top-color: transparent; + border-bottom-color: transparent; + margin-top: -8px; + border-radius: 3px; +} + +/* +Theme authors: +Here are the basic themeable display options (colors, fonts, global widths). +See http://bgrins.github.io/spectrum/themes/ for instructions. +*/ + +.sp-container { + border-radius: 0; + background-color: var(--color-ui); + box-shadow: 0 0px 20px rgba(0, 0, 0, 0.56); + border-radius: 6px; + padding: 0; +} +.sp-container, .sp-container button, .sp-container input, .sp-color, .sp-hue, .sp-clear { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +/* Input */ +.sp-input-container { + float: left; + width: 48%; + margin-top: -3px; +} +.sp-input { + height: 30px; + width: 100%; + padding-left: 4px; + background-color: var(--color-back); + border: 1px solid var(--color-border); + font-family: var(--font-code); + font-size: 0.8em; + border-radius: 5px; +} +.sp-input.sp-validation-error { + border: 1px solid red; +} +.sp-picker-container , .sp-palette-container { + float:left; + position: relative; + padding: 10px; +} +.sp-picker-container { + width: 172px; + padding-left: 8px; +} + +/* Palettes */ +.sp-palette-container { + padding-right: 0; +} + +.sp-palette-only .sp-palette-container { + border: 0; +} + +.sp-palette .sp-thumb-el { + display: block; + position:relative; + float:left; + width: 24px; + height: 15px; + margin: 3px; + cursor: pointer; + border:solid 2px transparent; +} +.sp-palette .sp-thumb-el:hover, .sp-palette .sp-thumb-el.sp-thumb-active { + border-color: var(--color-accent); +} +.sp-thumb-el { + position:relative; +} + +/* Initial */ +.sp-initial { + float: left; + border: solid 1px #333; +} +.sp-initial span { + width: 30px; + height: 25px; + border:none; + display:block; + float:left; + margin:0; +} + +.sp-initial .sp-clear-display { + background-position: center; +} + +/* Buttons */ +.sp-palette-button-container, +.sp-button-container { + float: right; + height: 27px; +} +.sp-button-container a:hover { + color: var(--color-light); +} + +/* Replacer (the little preview div that shows up instead of the ) */ +.sp-replacer { + margin:0; + overflow:hidden; + cursor:pointer; + padding: 6px; + height: 30px; + display:inline-block; + color: var(--color-text); + vertical-align: middle; + outline: none; + border-radius: 5px; +} +.sp-replacer:hover, .sp-replacer.sp-active { + color: var(--color-light); +} +.sp-replacer.sp-disabled { + cursor:default; + border-color: silver; + color: silver; +} +.sp-dd { + padding: 2px 0; + height: 16px; + line-height: 16px; + float:left; + font-size:10px; + pointer-events: none; +} +.sp-preview { + position:relative; + width:25px; + height: 20px; + margin-right: 5px; + float:left; + z-index: 0; + pointer-events: none; +} + +.sp-palette { + width: 40px; + max-height: 220px; + overflow-y: scroll; +} +.sp-palette .sp-thumb-el { + width: 26px; + height: 20px; + margin: 1px; + border: 2px solid var(--color-border); +} + + +.sp-reset { + font-size: 11px; + margin:0; + padding:2px; + margin-right: 5px; + vertical-align: middle; + text-decoration:none; +} +.sp-cancel { + font-size: 11px; + margin:0; + padding:2px; + margin-right: 5px; + vertical-align: middle; + text-decoration:none; +} +.sp-choose { + vertical-align: middle; +} + + + +.sp-palette span:hover, .sp-palette span.sp-thumb-active { + border-color: #000; +} + +.sp-preview, .sp-alpha, .sp-thumb-el { + position:relative; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==); +} +.sp-preview-inner, .sp-alpha-inner, .sp-thumb-inner { + display:block; + position:absolute; + top:0;left:0;bottom:0;right:0; +} + +.sp-palette .sp-thumb-inner { + background-position: 50% 50%; + background-repeat: no-repeat; +} + +.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=); +} + +.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=); +} + +.sp-clear-display { + background-repeat:no-repeat; + background-position: center; +} +} \ No newline at end of file diff --git a/nonpacks/static/vendor/blockbench/css/start_screen.css b/nonpacks/static/vendor/blockbench/css/start_screen.css new file mode 100644 index 0000000..9cb26e6 --- /dev/null +++ b/nonpacks/static/vendor/blockbench/css/start_screen.css @@ -0,0 +1,612 @@ +@layer base { + +/*Start Screen*/ + #mode_screen_start { + flex-grow: 1; + } + #start_screen { + min-height: 300px; + flex-grow: 1; + width: 100%; + padding: 36px 0; + overflow-y: auto; + background: linear-gradient(180deg, var(--color-ui) 5%, var(--color-dark) 60%); + } + body.is_mobile #start_screen { + padding: 0; + } + #start_screen h3 { + margin: 0; + } + #start_screen .start_screen_features h3 { + font-weight: 800; + } + #start_screen .bar.next_to_title { + position: absolute; + right: 8px; + } + #start_screen button { + margin-right: 4px; + margin-top: 4px; + } + #start_screen .recent_project { + margin: 2px 0; + display: flex; + align-items: center; + cursor: pointer; + } + #start_screen .recent_project:hover { + color: var(--color-light); + } + #start_screen .recent_project .icon_wrapper { + flex-shrink: 0; + margin-top: 1px; + } + #start_screen .recent_project_name { + font-size: 1.1em; + overflow-x: hidden; + flex-shrink: 1; + flex-grow: 1; + margin: 0 4px; + } + #start_screen .recent_project_date { + flex-shrink: 0; + position: relative; + color: var(--color-subtle_text); + } + span.recent_project_date:before { + content: ""; + display: block; + position: absolute; + width: 16px; + height: 26px; + margin-left: -20px; + } + #start_screen .recent_favorite_button { + color: var(--color-subtle_text); + visibility: hidden; + cursor: pointer; + --color-active-favorite: #f9c300; + } + #start_screen .recent_project:hover .recent_favorite_button { + color: var(--color-subtle_text); + visibility: visible; + } + #start_screen .recent_project.thumbnail .recent_favorite_button { + color: var(--color-text); + position: absolute; + top: 4px; + right: 4px; + padding: 2px 4px; + } + #start_screen .recent_project .recent_favorite_button:hover { + color: var(--color-light); + visibility: visible; + } + #start_screen .recent_favorite_button.favorite_enabled { + visibility: visible; + color: #ffda24; + } + #start_screen div.start_screen_right .recent_favorite_button > i { + font-size: 16px; + vertical-align: bottom; + } + #start_screen .recent_favorite_button.favorite_enabled > i { + color: var(--color-active-favorite); + } + + #start_screen_view_menu { + height: 30px; + position: absolute; + top: 32px; + right: 20px; + } + #start_screen_view_menu li.selected { + border-bottom: 3px solid var(--color-accent); + } + + #start_screen .recent_project.thumbnail { + display: block; + margin: 0; + height: 130px; + position: relative; + background-color: var(--color-elevated); + box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); + border-radius: 5px; + cursor: pointer; + } + #start_screen .recent_project.thumbnail .thumbnail_image { + display: block; + width: 180px; + height: 100px; + margin: auto; + pointer-events: none; + } + #start_screen .recent_project.thumbnail:hover { + background-color: var(--color-selected); + } + #start_screen .recent_project.thumbnail .recent_project_name { + font-size: 1em; + overflow: hidden; + height: 30px; + right: 0px; + left: 0px; + bottom: 0; + margin: 0; + padding-top: 2px; + position: absolute; + text-align: center; + white-space: nowrap; + } + #start_screen .recent_project.thumbnail .icon_wrapper { + position: absolute; + display: none; + pointer-events: none; + padding: 2px; + color: var(--color-text); + top: 4px; + left: 5px; + } + #start_screen .recent_project.thumbnail:hover .recent_project_name { + color: var(--color-light); + } + #start_files ul.redact li.recent_project.thumbnail .thumbnail_image { + background: transparent !important; + } + #start_screen .recent_project.thumbnail:hover .icon_wrapper { + display: block; + } + #start_screen_view_menu .search_bar { + min-width: 38px; + height: 100%; + float: left; + margin-right: 10px; + } + + #start_screen > content { + display: block; + max-width: 1000px; + height: auto; + margin-left: auto; + margin-right: auto; + background: linear-gradient(180deg, var(--color-ui) 160px, var(--color-back) 1000px); + box-shadow: 0 0 18px #00000060; + overflow-x: hidden; + image-rendering: auto; + border-radius: 6px; + } + #start_screen > content > section { + width: 100%; + height: auto; + display: flex; + position: relative; + } + #start_screen > content > section.vertical { + flex-direction: column; + } + div.start_screen_left, div.start_screen_right { + display: block; + padding: 24px; + max-height: 606px; + } + div.start_screen_right > ul { + max-height: 470px; + padding-right: 5px; + overflow-x: hidden; + overflow-y: auto; + grid-template-columns: repeat(auto-fit, minmax(170px ,1fr)); + grid-gap: 5px; + margin-left: -10px; + } + div.start_screen_right > ul.recent_list_grid { + display: grid; + margin-left: 0; + padding: 4px; + gap: 8px; + } + #start_screen div.start_screen_left { + max-width: 100%; + flex-grow: 0; + } + #start_screen div.graphic:not(.graphic_icon) { + background-size: cover; + position: relative; + padding: 0; + } + #start_screen div.graphic p { + position: absolute; + font-size: 0.96em; + } + #start_screen div.graphic.graphic_icon i { + font-size: 40px; + width: 42px; + max-width: unset; + margin-top: 4px; + margin-right: -20px; + } + #start_screen .start_screen_graphic_description { + bottom: 15px; + right: 0; + padding: 2px; + padding-right: 15px; + padding-left: 100px; + background: linear-gradient(90deg, rgba(3,86,112,0) 0%, rgba(0,10,22,0.63) 34%, rgba(0,9,20,0.72) 45%); + color: #d5d5d5; + position: absolute; + } + #start_screen div.start_screen_right { + flex-grow: 1; + width: 70%; + } + #start_screen section.vertical div.start_screen_right { + width: auto; + text-align: center; + } + #start_screen i.start_screen_close_button { + position: absolute; + top: 8px; + right: 8px; + cursor: pointer; + } + #start_screen i.start_screen_close_button:not(:hover) { + opacity: 0.8; + } + #start_screen section.vertical .start_screen_right { + box-shadow: 0 0 40px rgba(0, 0, 0, 0.4); + } + #start_screen section.vertical.bright_ui .start_screen_right { + box-shadow: 0 0 14px #00103030; + } + #start_screen .start_screen_features { + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + padding: 12px; + } + #start_screen .start_screen_features > li { + width: 100%; + box-sizing: border-box; + margin: 7px; + padding: 7px; + display: flex; + gap: 20px; + } + #start_screen .start_screen_features > li:nth-child(odd) { + flex-direction: row-reverse; + text-align: right; + } + #start_screen .start_screen_features > li > * { + max-width: 100%; + font-weight: 300; + display: block; + margin: auto; + width: 50%; + } + #start_screen .start_screen_features > li > img { + max-height: 230px; + width: 58%; + border-radius: 11px; + -webkit-user-drag: none; + } + #start_screen .start_screen_features > li > h3 { + font-size: 1.4em; + } + @media (max-device-width: 640px) { + #start_screen { + width: 100%; + } + #start_screen > content { + margin-top: 0px; + margin-top: 0px; + margin-left: 0; + margin-right: 0; + max-height: 100%; + } + #start_screen > content > section { + display: block; + } + #start_screen > content > section > div.start_screen_right { + width: 100% !important; + float: none; + } + #start_screen > content > section > div.start_screen_left { + width: 100% !important; + float: none; + } + #start_screen > content > section > div.start_screen_left { + width: 100% !important; + float: none; + } + #start_screen .start_screen_features > li { + flex-direction: column !important; + text-align: center !important; + } + #start_screen .start_screen_features > li > * { + width: 100% !important; + } + } + + + #splash_screen { + aspect-ratio: 21/9; + width: 100%; + min-height: 100px; + } + #splash_screen .splash_art_slideshow_image { + width: 100%; + height: 100%; + background-size: cover; + background-position: center; + } + #splash_screen .splash_art_slideshow_image.slideshow_previous { + position: absolute; + top: 0; + bottom: 0; + animation: fade_out_slideshow 500ms forwards; + } + @keyframes fade_out_slideshow { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } + } + .splash_art_slideshow_points { + position: absolute; + bottom: 10px; + left: 0; + right: 0; + margin: auto; + width: fit-content; + height: 24px; + display: flex; + opacity: 0; + transition: opacity 300ms ease-in-out; + } + #splash_screen:hover .splash_art_slideshow_points { + opacity: 1; + } + .splash_art_slideshow_points > li { + color: var(--color-text); + cursor: pointer; + width: 24px; + height: 24px; + text-align: center; + } + .splash_art_slideshow_points > li::after { + content: ""; + display: block; + width: 10px; + height: 10px; + border-radius: 50%; + margin: auto; + margin-top: 9px; + background-color: var(--color-text); + opacity: 0.8; + } + .splash_art_slideshow_points > li:hover::after { + background-color: var(--color-light); + } + .splash_art_slideshow_points > li.selected::after { + background-color: var(--color-accent); + } + + + #start_files div.start_screen_left { + width: 30%; + padding: 20px 0 0px 0; + position: relative; + display: flex; + flex-direction: column; + } + #start_files div.start_screen_right { + position: relative; + min-height: 250px; + } + #start_files div.start_screen_left h2 { + margin-left: 24px; + } + #start_files div.start_screen_left > ul { + padding-bottom: 16px; + overflow-y: auto; + } + #start_files div.start_screen_right i { + vertical-align: sub; + } + .tool.quickstart_button i { + font-size: 17pt; + } + + + #start_files li.format_category { + margin-top: 16px; + padding-left: 6px; + padding-right: 6px; + } + #start_files li.format_category > label { + color: var(--color-subtle_text); + font-size: 18px; + margin-left: 24px; + } + #start_files li.format_entry { + padding: 4px 0; + cursor: pointer; + font-size: 18px; + padding-left: 18px; + border-radius: 6px; + } + #start_files li.format_entry span.icon_wrapper { + height: 30px; + width: 32px; + display: flex; + } + #start_files li.format_entry > * { + cursor: inherit; + } + #start_files li.format_entry:hover { + color: var(--color-light); + } + #start_files li.format_entry.selected { + background-color: var(--color-accent); + color: var(--color-accent_text); + } + #start_files li.format_entry.selected::after { + float: right; + content: "\f105"; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; + margin-right: 10px; + } + .format_entry i { + font-size: 18pt; + height: 22px; + margin: 2px 8px 0px 0; + display: inline-block; + } + .format_entry i.fa_big { + font-size: 16pt; + } + .format_entry.start_screen_link:hover { + text-decoration: underline; + } + .format_entry.start_screen_link::after { + float: right; + content: "\f08e"; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; + color: var(--color-subtle_text); + font-size: 15px; + margin-right: 10px; + } + #start_screen .start_screen_format_page { + display: flex; + flex-direction: column; + } + .format_target { + padding: 10px 0; + margin-bottom: 22px; + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 4px; + } + .format_target span { + padding: 2px 10px; + background-color: var(--color-accent); + border-radius: 16px; + color: var(--color-accent_text); + } + #start_files .button_bar { + text-align: left; + padding-right: 14px; + margin-top: auto; + } + #start_files .format_page_close_button { + margin-top: 8px; + margin-left: -2px; + cursor: pointer; + width: 28px; + position: absolute; + right: 18px; + } + .start_screen_format_page button#create_new_model_button { + width: 100%; + height: 40px; + } + .start_screen_format_page button#create_new_model_button > i { + vertical-align: bottom; + margin-right: 3px; + margin-bottom: 2px; + } + + section#keymap_preference { + display: block !important; + } + section#keymap_preference > ul { + display: grid; + grid-template-columns: auto auto auto; + grid-gap: 6px; + padding: 12px; + } + section#keymap_preference > h2 { + padding: 12px 20px; + } + section#keymap_preference > p { + padding: 0 20px; + } + section#keymap_preference .keymap_select_box { + display: inline-block; + padding: 12px; + min-height: 132px; + background-color: var(--color-back); + cursor: pointer; + border: 2px solid transparent; + } + section#keymap_preference .keymap_select_box:hover { + color: var(--color-light); + border-color: var(--color-accent); + background-color: var(--color-ui); + } + section#keymap_preference .keymap_select_box p { + color: var(--color-subtle_text); + } + + #start_screen section#quick_setup { + padding: 20px 24px; + display: block; + border-bottom: 5px solid var(--color-border); + border-top: 5px solid var(--color-border); + } + section#quick_setup > h2 { + display: block; + } + section#quick_setup > div { + display: inline-flex; + align-items: center; + flex-wrap: wrap; + width: 420px; + max-width: 100%; + margin-right: 48px; + margin-top: 16px; + margin-bottom: 8px; + } + section#quick_setup > div > label { + min-width: 120px; + display: inline-block; + } + section#quick_setup > div .bb-select { + flex-grow: 1; + } + section#quick_setup > div > p { + color: var(--color-subtle_text); + } + .quick_setup_theme { + cursor: pointer; + flex-basis: 0; + flex-grow: 1; + white-space: nowrap; + } + .quick_setup_theme > div { + height: 36px; + width: 36px; + border-radius: 50%; + margin-right: 6px; + display: inline-block; + vertical-align: middle; + border: 2px solid var(--color-border); + color: var(--color-text); + padding-top: 8px; + background-color: var(--color-ui); + cursor: inherit; + text-align: center; + } + .quick_setup_theme:hover, + .quick_setup_theme.selected { + color: var(--color-light); + } + .quick_setup_theme:hover > div, + .quick_setup_theme.selected > div { + border-color: var(--color-accent); + } +} \ No newline at end of file diff --git a/nonpacks/static/vendor/blockbench/css/w3.css b/nonpacks/static/vendor/blockbench/css/w3.css new file mode 100644 index 0000000..c53fc90 --- /dev/null +++ b/nonpacks/static/vendor/blockbench/css/w3.css @@ -0,0 +1,33 @@ +/* W3.CSS 4.04 Apr 2017 by Jan Egil and Borge Refsnes */ +@layer reset { +html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit} +/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */ +html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0} +article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block} +audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline} +audio:not([controls]){display:none;height:0}[hidden],template{display:none} +a{background-color:transparent;-webkit-text-decoration-skip:objects} +a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted} +dfn{font-style:italic}mark{background:#ff0;color:#000} +small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} +sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none}svg:not(:root){overflow:hidden} +code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible} +button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:bold} +button,input{overflow:visible}button,select{text-transform:none} +button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button} +button::-moz-focus-inner, [type=button]::-moz-focus-inner, [type=reset]::-moz-focus-inner, [type=submit]::-moz-focus-inner{border-style:none;padding:0} +button:-moz-focusring, [type=button]:-moz-focusring, [type=reset]:-moz-focusring, [type=submit]:-moz-focusring{outline:1px dotted ButtonText} +fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em} +legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto} +[type=checkbox],[type=radio]{padding:0} +[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto} +[type=search]{-webkit-appearance:textfield;outline-offset:-2px} +[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none} +::-webkit-input-placeholder{color:inherit;opacity:0.54} +::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} +/* End extract */ +html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden} +h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px}.w3-serif{font-family:serif} +h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px} +hr{border:0;border-top:1px solid #eee;margin:20px 0} +} \ No newline at end of file diff --git a/nonpacks/static/vendor/blockbench/css/window.css b/nonpacks/static/vendor/blockbench/css/window.css new file mode 100644 index 0000000..255b0c4 --- /dev/null +++ b/nonpacks/static/vendor/blockbench/css/window.css @@ -0,0 +1,1293 @@ +#loading_error_message { + height: 100%; + width: 100%; + background-color: var(--color-dark, gray); + border: 2px solid var(--color-accent); + text-align: center; + padding-top: 160px; + position: absolute; + z-index: 250; +} +#loading_error_message > div { + margin: 8px 0; +} + +@layer base { +/*Layout*/ + #page_wrapper { + height: calc(100% - var(--menu-bar-height)); + width: 100%; + border: 2px solid var(--color-frame); + border-top: none; + background-color: var(--color-dark); + display: flex; + flex-direction: column; + } + #page_wrapper.invisible { + visibility: hidden; + } + #page_wrapper.accept_detached_tab > * { + filter: brightness(0.4); + } + #page_wrapper.accept_detached_tab::after { + content: "+"; + font-weight: 300; + font-size: 120px; + position: absolute; + margin: auto; + top: calc(50% - 100px); + right: -10px; + left: -10px; + width: 50px; + color: var(--color-text); + } + body { + background-image: url('../assets/logo_cutout.svg'); + background-repeat: no-repeat; + background-size: 128px; + background-position: center; + --menu-bar-height: 30px; + --status-bar-height: 26px; + } + #work_screen { + --toolbar-height: 40px; + position: relative; + display: grid; + overflow: hidden; + grid-template-columns: 332px auto 314px; + grid-template-rows: var(--toolbar-height) minmax(200px, 5000px) var(--status-bar-height); + grid-template-areas: + "left_bar toolbar toolbar" + "left_bar center right_bar" + "left_bar status_bar right_bar"; + width: 100%; + min-height: 300px; + background-color: var(--color-ui); + } + + #tab_bar { + height: 34px; + } + .sidebar { + background-color: var(--color-ui);; + display: flex; + flex-direction: column; + } + #left_bar { + grid-area: left_bar; + } + #right_bar { + grid-area: right_bar; + } + + #center { + grid-area: center; + background-color: var(--custom-preview-background, var(--color-dark)); + min-width: 100px; + display: flex; + flex-direction: column; + position: relative; + border-radius: 6px; + } + div#center > div { + max-height: 100%; + } + #preview { + flex-grow: 1; + background-repeat: no-repeat; + background-size: 1000px; + position: relative; + + --color-solid: #c1c1c1; + --color-outline: var(--color-accent); + --color-gizmohover: var(--color-outline); + --color-ground: var(--color-back); + --color-brush-outline: #ffffff; + --color-axis-x: #fd3043; + --color-axis-y: #26ec45; + --color-axis-z: #2d5ee8; + --color-axis-u: #23d4ed; + --color-axis-v: #ff12ed; + --color-axis-w: #ffd442; + } + #status_bar { + grid-area: status_bar; + } + #top_slot, + #bottom_slot { + background-color: var(--color-ui); + } + .single_canvas_wrapper { + height: 100%; + width: 100%; + position: absolute; + cursor: inherit; + z-index: 1; + } + .split_screen_wrapper { + cursor: inherit; + } + #preview.image_mode > .single_canvas_wrapper, + #preview.image_mode > .split_screen_wrapper { + display: none !important; + } +/* Resizers */ + + + .resizer { + position: absolute !important; + z-index: 12; + opacity: 0; + touch-action: none; + border-radius: 3px; + } + .resizer.vertical { /* | */ + cursor: ew-resize; + width: 6px; + margin-left: -4px; + } + .resizer.horizontal { /* __ */ + cursor: ns-resize; + height: 6px; + margin-top: -4px; + } + .resizer.disabled { + pointer-events: none; + } + .resizer:hover, .resizer.dragging { + background-color: var(--color-accent); + opacity: 0.3; + } + .resizer:hover:not(.dragging) { + animation: resize_line_fade_in 500ms; + } + @keyframes resize_line_fade_in { + 0% { + opacity: 0; + } + 75% { + opacity: 0; + } + 100% { + opacity: 0.3; + } + } + +/* Split Screen */ + + #preview[split_screen_mode] { + display: grid; + } + #preview[split_screen_mode=double_horizontal] { + grid-template: + "preview_0" + "preview_1"; + grid-template-columns: 100%; + grid-template-rows: var(--split-y) calc(100% - var(--split-y)); + } + #preview[split_screen_mode=double_vertical] { + grid-template: + "preview_1 preview_0"; + grid-template-columns: var(--split-x) calc(100% - var(--split-x)); + grid-template-rows: 100%; + } + #preview[split_screen_mode=quad] { + grid-template: + "preview_0 preview_1" + "preview_2 preview_3"; + grid-template-columns: var(--split-x) calc(100% - var(--split-x)); + grid-template-rows: var(--split-y) calc(100% - var(--split-y)); + } + #preview[split_screen_mode=triple_left] { + grid-template: + "preview_0 preview_1" + "preview_0 preview_2"; + grid-template-columns: var(--split-x) calc(100% - var(--split-x)); + grid-template-rows: var(--split-y) calc(100% - var(--split-y)); + } + #preview[split_screen_mode=triple_right] { + grid-template: + "preview_1 preview_0" + "preview_2 preview_0"; + grid-template-columns: var(--split-x) calc(100% - var(--split-x)); + grid-template-rows: var(--split-y) calc(100% - var(--split-y)); + } + #preview[split_screen_mode=triple_top] { + grid-template: + "preview_0 preview_0" + "preview_1 preview_2"; + grid-template-columns: var(--split-x) calc(100% - var(--split-x)); + grid-template-rows: var(--split-y) calc(100% - var(--split-y)); + } + #preview[split_screen_mode=triple_bottom] { + grid-template: + "preview_1 preview_2" + "preview_0 preview_0"; + grid-template-columns: var(--split-x) calc(100% - var(--split-x)); + grid-template-rows: var(--split-y) calc(100% - var(--split-y)); + } + + + .split_screen_wrapper { + border-width: 0; + border-style: solid; + border-color: var(--color-grid); + } + #preview[split_screen_mode=double_horizontal] > .split_screen_wrapper_0, + #preview[split_screen_mode=triple_right] > .split_screen_wrapper_1, + #preview[split_screen_mode=triple_left] > .split_screen_wrapper_1, + #preview[split_screen_mode=triple_top] > .split_screen_wrapper_0, + #preview[split_screen_mode=triple_bottom] > .split_screen_wrapper_1, + #preview[split_screen_mode=triple_bottom] > .split_screen_wrapper_2, + #preview[split_screen_mode=quad] > .split_screen_wrapper_0, + #preview[split_screen_mode=quad] > .split_screen_wrapper_1 + { + border-bottom-width: 2px; + } + #preview[split_screen_mode=double_vertical] > .split_screen_wrapper_0, + #preview[split_screen_mode=triple_right] > .split_screen_wrapper_0, + #preview[split_screen_mode=triple_left] > .split_screen_wrapper_1, + #preview[split_screen_mode=triple_left] > .split_screen_wrapper_2, + #preview[split_screen_mode=quad] > .split_screen_wrapper_1, + #preview[split_screen_mode=quad] > .split_screen_wrapper_3, + #preview[split_screen_mode=triple_top] > .split_screen_wrapper_2, + #preview[split_screen_mode=triple_bottom] > .split_screen_wrapper_2 + { + border-left-width: 2px; + } + + +/*Head Bars*/ + #main_toolbar { + background-color: var(--color-ui);; + grid-area: toolbar; + overflow: hidden; + white-space: nowrap; + display: flex; + padding: 5px; + } + #main_toolbar > * { + display: inline-block; + } + .toolbar_wrapper.tool_options { + flex-grow: 1; + } + header { + background-color: var(--color-frame); + grid-area: titlebar; + overflow: hidden; + display: flex; + white-space: nowrap; + height: var(--menu-bar-height); + } + header > * { + display: inline-block; + height: 100%; + } + header ::-webkit-scrollbar { + height: 0; + } + div#corner_logo { + width: auto; + height: 100%; + padding-right: 8px; + padding-left: 6px; + margin-left: 4px; + font-size: 1.2em; + font-weight: normal; + color: var(--color-light); + vertical-align: top; + margin-top: -0.6px; + } + div#corner_logo img { + margin-top: 4px; + width: 134px; + } + @media (max-width:950px) { + div#corner_logo { + width: 36px; + overflow: hidden; + } + } + + .app-drag-region { + -webkit-app-region: drag; + } + div#header_free_bar.app-drag-region { + flex-grow: 1; + overflow: hidden; + height: auto; + padding: 3px; + color: var(--color-subtle_text); + text-align: center; + } + div#header_free_bar.app-drag-region.resize_space { + margin-top: 4px; + padding-top: 0; + height: calc(100% - 4px); + } + body.is_mobile div#header_free_bar.app-drag-region { + display: none; + } + #web_download_button { + margin-left: auto; + height: 100%; + padding: 0; + cursor: pointer; + background: transparent; + } + #web_download_button a { + text-decoration: none !important; + height: 100%; + width: 100%; + padding: 0 12px; + cursor: inherit; + } + #web_download_button a > i { + vertical-align: top; + } + #web_download_button a > * { + pointer-events: none; + } + #web_download_button:hover a { + color: var(--color-light); + } + #windows_window_menu { + margin-left: auto; + flex-shrink: 0; + } + #windows_window_menu li { + display: block; + width: 42px; + height: 100%; + text-align: center; + float: left; + } + #windows_window_menu li:hover { + color: var(--color-light); + background-color: var(--color-selected); + } + #windows_window_menu li.wwm_r:hover { + color: var(--color-accent_text); + background-color: var(--color-close); + } + #windows_window_menu svg { + margin-top: 5px; + } + body:not(.maximized) #windows_window_menu svg.restore { + display: none; + } + body.maximized #windows_window_menu svg.maximize { + display: none; + } + #mac_window_menu { + width: 68px; + flex-shrink: 0; + } + body:not(.is_mobile) #settings_profiles_header_menu { + width: 24px; + text-align: center; + padding-top: 2px; + margin-right: 4px; + opacity: 0.9; + } + #settings_profiles_header_menu:hover { + opacity: 1.0; + color: var(--color-light); + } + +/*Mobile*/ + body.is_mobile { + --menu-bar-height: 38px; + --status-bar-height: 31px; + } + body.is_mobile #page_wrapper { + border: none; + } + body.is_mobile #work_screen { + display: grid; + grid-template-rows: auto minmax(200px, 5000px) var(--status-bar-height) 38px !important; + grid-template-areas: + "toolbar" + "center" + "status_bar" + "panel_selector"; + grid-template-columns: auto !important; + position: relative; + } + body.is_mobile.is_landscape #work_screen { + grid-template-columns: auto 48px !important; + grid-template-rows: auto minmax(200px, 5000px) var(--status-bar-height) !important; + grid-template-areas: + "toolbar panel_selector" + "center panel_selector" + "status_bar panel_selector"; + position: relative; + } + body.is_mobile.is_landscape.mobile_sidebar_left #work_screen { + grid-template-columns: 48px auto !important; + grid-template-areas: + "panel_selector toolbar" + "panel_selector center" + "panel_selector status_bar"; + } + body.is_mobile.is_landscape #work_screen #center { + flex-direction: row; + } + body.is_mobile.is_landscape.mobile_sidebar_left #work_screen #center { + flex-direction: row-reverse; + } + body.is_mobile #main_toolbar { + display: block; + } + body.is_mobile.is_landscape #main_toolbar { + display: flex; + height: fit-content; + } + body.is_mobile #main_toolbar > * { + display: block; + } + body.is_mobile .toolbar_wrapper.narrow.tools { + position: absolute; + z-index: 2; + top: 0; + bottom: 0px; + right: 0px; + display: flex; + align-items: end; + } + body.is_mobile .toolbar_wrapper.narrow.tools .toolbar { + height: auto; + max-height: 100%; + } + body.is_mobile .preview .preview_menu { + left: 0; + right: unset; + flex-direction: row-reverse; + } + body.is_mobile .resizer.vertical { + display: none; + } + body.is_mobile .sidebar { + overflow-y: auto; + } + body.is_mobile #left_bar, body.is_mobile #right_bar { + display: none; + } + + body.is_mobile #preview { + overflow: hidden; + } + body.is_mobile #panel_selector_bar { + display: flex; + grid-area: panel_selector; + background-color: var(--color-frame); + padding: 2px; + } + body.is_mobile.is_landscape #panel_selector_bar { + flex-direction: column; + } + body.is_mobile #panel_selector_bar .panel_selector { + height: 35px; + flex: 36px 1 0; + text-align: center; + cursor: default; + color: var(--color-text); + border-radius: 6px; + } + body.is_mobile.is_landscape #panel_selector_bar .panel_selector { + display: flex; + justify-content: center; + align-items: center; + } + body.is_mobile #panel_selector_bar .panel_selector.selected { + background-color: var(--color-ui); + color: var(--color-light); + } + .panel_selector:only-child { + display: none; + } + #panel_selector_bar .panel_selector .icon_wrapper { + margin-top: 7px; + } + #mobile_keyboard_menu { + width: 48px; + text-align: center; + padding: 6px; + position: relative; + color: var(--color-accent); + } + #mobile_keyboard_menu:hover { + color: var(--color-light); + } + #mobile_keyboard_menu.enabled::after { + content: ""; + display: block; + position: absolute; + height: 8px; + width: 8px; + border-radius: 50%; + background-color: var(--color-accent); + bottom: 2px; + right: 19px; + } + #status_bar #mobile_keyboard_menu.enabled::after { + right: 4px; + bottom: 9px; + } + + +/*Menu Bar*/ + ul#menu_bar { + height: 28px; + } + li.menu_bar_point { + font-size: 17px; + padding: 0 8px; + padding-top: 2px; + display: inline-block; + height: 100%; + min-width: 42px; + text-align: center; + font-weight: normal; + } + li.menu_bar_point.opened { + color: var(--color-accent_text); + background: var(--color-accent); + } + li.menu_bar_point.highlighted { + animation: menu_item_highlight 1s infinite ease-in-out; + } + body.is_mobile header .tool { + height: 100%; + width: 42px; + } + body.is_mobile header .tool > .icon { + margin-top: 7px; + } + body:not(.is_mobile) header .tool > .icon { + margin-top: 2px; + } + header .tool.hidden { + display: none; + } + + #mode_selector { + height: 30px; + margin-left: auto; + margin-right: 0; + text-align: right; + } + #mode_selector > li { + display: inline-block; + height: 30px; + overflow: hidden; + padding: 2px 7px; + border-radius: 5px; + font-size: 1.1em; + cursor: pointer; + } + #mode_selector > li:hover { + color: var(--color-light); + background-color: var(--color-elevated); + } + #mode_selector > li.selected { + background-color: var(--color-accent); + color: var(--color-accent_text); + box-shadow: 0 0 3px 1px inset #ffffff30; + } + #mode_selector > li > .icon { + vertical-align: text-bottom; + } + #mode_selector > li:not(.selected) > .icon { + color: var(--color-accent); + } + #update_menu .tool > .icon { + margin-top: 3px; + } + + #mobile_menu_bar { + position: absolute; + margin: auto; + top: 50px; + left: 0; + right: 0; + width: fit-content; + max-width: 100%; + display: flex; + flex-wrap: wrap; + justify-content: space-around; + background-color: var(--color-bright_ui); + box-shadow: 0 0px 8px rgba(0, 0, 0, 0.64); + border-radius: 4px; + padding: 0 5px; + z-index: 30; + } + #mobile_menu_bar > .tool { + color: var(--color-bright_ui_text); + width: 42px; + height: 36px; + padding-top: 3px; + border-radius: 5px; + } + #mobile_menu_bar > .tool.selected { + background-color: var(--color-accent); + color: var(--color-accent_text); + } + #mobile_menu_bar > label { + height: 20px; + width: 0; + flex-basis: 100%; + text-align: center; + color: var(--color-bright_ui_text); + opacity: 0.8; + } + @media (max-height: 400px) { + #mobile_menu_bar { + top: 0; + } + } + +/* Tab Bar */ + #tab_bar { + display: flex; + flex-direction: row; + position: relative; + white-space: nowrap; + padding-left: 4px; + background: var(--color-frame); + } + #tab_bar #tab_bar_list { + display: flex; + flex-direction: row; + flex-grow: 1; + position: relative; + white-space: nowrap; + overflow-x: auto; + overflow-y: hidden; + margin-right: auto; + scrollbar-width: none; + scroll-behavior: smooth; + } + #tab_bar .project_tab { + cursor: pointer; + width: 240px; + min-width: 120px; + height: 100%; + padding: 6px 6px; + position: relative; + display: inline-flex; + margin-left: 2px; + left: 0; + --tabwidth: 242px; + transition: background-color 120ms ease; + } + #tab_bar.drag_mode .project_tab { + transition: left 100ms ease; + } + #tab_bar .project_tab.selected { + background-color: var(--color-ui); + color: var(--color-text); + cursor: default; + border-top-left-radius: 8px; + border-top-right-radius: 8px; + } + #tab_bar .project_tab.selected::before, + #tab_bar .project_tab.selected::after { + position: absolute; + content: ""; + height: 8px; + width: 8px; + bottom: -0px; + background: inherit; + } + #tab_bar .project_tab.selected::before { + left: -8px; + clip-path: path("M 8 0 Q 8 8, 0 8 H 8 Z"); + } + #tab_bar .project_tab.selected::after { + right: -8px; + clip-path: path("M 0 0 Q 0 8, 8 8 H 0 Z"); + } + #tab_bar .project_tab:not(.selected):hover { + background-color: var(--color-back); + color: var(--color-light); + border-top-left-radius: 8px; + border-top-right-radius: 8px; + } + #tab_bar .project_tab.dragging { + background-color: var(--color-button); + color: var(--color-light); + position: relative; + z-index: 5; + box-shadow: 0 0 10px #00000080; + transition: none; + } + #tab_bar .project_tab.move_back { + left: calc(var(--tabwidth) * -1); + } + #tab_bar .project_tab.move_forth { + left: var(--tabwidth); + } + #tab_bar .project_tab > .icon { + pointer-events: none; + } + #tab_bar .project_tab > label { + overflow: hidden; + width: calc(100% - 20px); + flex: 1 1 auto; + padding: 0 4px; + pointer-events: none; + } + .project_tab label span { + color: var(--color-subtle_text); + } + #tab_bar .project_tab > * { + cursor: inherit + } + #tab_bar .project_tab_close_button { + flex: 0 0 21px; + text-align: center; + cursor: pointer; + display: none; + color: var(--color-text); + } + #tab_bar .project_tab_close_button > * { + pointer-events: none; + font-size: 19px; + padding-top: 2px; + } + #tab_bar .project_tab:hover .project_tab_close_button, + #tab_bar .project_tab.selected .project_tab_close_button, + #tab_bar .project_tab .project_tab_close_button.unsaved { + display: block; + } + #tab_bar .project_tab_close_button:hover { + color: var(--color-light); + } + #tab_bar .project_tab_close_button.unsaved > i.unsaved_icon { + font-size: 13px; + text-align: center; + padding-top: 5px; + } + #tab_bar .project_tab_close_button.unsaved:hover > i.unsaved_icon, + #tab_bar .project_tab_close_button.unsaved:not(:hover) > i.close_icon { + display: none; + } + #new_tab_button { + height: 100%; + width: 32px; + text-align: center; + cursor: pointer; + padding-top: 6px; + flex-shrink: 0; + } + #new_tab_button:hover { + color: var(--color-light); + } + #search_tab_button { + height: 100%; + width: 32px; + text-align: center; + cursor: pointer; + padding-top: 6px; + flex-shrink: 0; + } + #search_tab_button:hover { + color: var(--color-light); + } + #tab_bar .project_tab > label.project_tab_session_badge { + display: flex; + flex-grow: 0; + width: auto; + color: var(--color-accent); + flex-shrink: 0; + padding-right: 0; + } + #tab_bar.invisible { + visibility: hidden; + } + .project_thumbnail { + z-index: 50; + background-color: var(--color-back); + position: absolute; + box-shadow: 0 0 10px rgb(0 0 0 / 40%); + min-width: 200px; + max-width: 240px; + image-rendering: auto; + animation: fade_in_thumbnail 700ms; + transition: left 100ms ease-in-out; + } + .project_thumbnail.pixelated { + image-rendering: inherit; + } + @keyframes fade_in_thumbnail { + 0% { + opacity: 0; + } + 80% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + #drag_out_window_helper { + width: 200px; + height: 120px; + position: absolute; + margin: -14px -40px; + background-color: var(--color-ui); + border: 3px solid var(--color-frame); + box-shadow: 1px 1px 10px rgb(0 0 0 / 40%); + background-image: url('../assets/logo_cutout.svg'); + background-position: center 48px; + background-size: 40px; + background-repeat: no-repeat; + z-index: 200; + cursor: pointer; + } + #drag_out_window_helper > div { + width: 100%; + height: 26px; + text-align: center; + overflow: hidden; + white-space: nowrap; + background-color: var(--color-frame); + } + +/* Toast Notification */ + #toast_notification_list { + position: absolute; + left: 0; + right: 0; + top: 0; + z-index: 8; + } + .toast_notification { + position: relative; + display: flex; + align-items: center; + background-color: var(--color-accent); + color: var(--color-accent_text); + min-height: 34px; + margin: 4px; + gap: 4px; + padding: 5px 5px 5px 10px; + box-shadow: 0.4px 0.4px 4px rgba(0, 0, 0, 0.7); + border-radius: 6px; + } + .toast_notification > span { + flex-grow: 1; + } + .toast_close_button { + height: 28px; + padding-top: 2px; + cursor: pointer; + } + .toast_close_button:hover { + color: var(--color-light); + } + + + +/*Status Bar*/ + #status_bar { + position: relative; + display: flex; + align-items: center; + background: var(--color-ui); + overflow: hidden; + } + #status_bar > div { + padding-left: 6px; + padding-right: 6px; + padding-top: 1px; + flex-shrink: 0; + } + #status_bar > div#status_saved { + padding-top: 2px; + } + #status_bar > div#status_name { + width: 0; + flex-grow: 1; + overflow: hidden; + } + #status_bar #status_progress { + position: absolute; + height: 4px; + background: var(--color-accent); + bottom: 0; + left: 0; + } + #status_bar .status_bar_modifier_key { + flex-grow: 0.06; + flex-shrink: 1; + text-align: center; + padding-top: 2px; + font-size: 0.92em; + overflow: hidden; + white-space: nowrap; + } + #status_bar .status_bar_modifier_key kbd { + font-family: inherit; + border-radius: 4px; + background-color: var(--color-button); + padding: 1px 5px; + } + #status_bar .status_bar_modifier_key span { + color: var(--color-subtle_text); + } + #status_bar .status_selection_info { + color: var(--color-subtle_text); + } + #status_bar #validator_status { + cursor: pointer; + } + #status_bar #validator_status i { + vertical-align: sub; + margin-left: 2px; + margin-right: 2px; + font-size: 20px; + } + #status_bar .sidebar_toggle_button { + cursor: pointer; + height: 100%; + padding-top: 2px; + padding-right: 0; + padding-left: 0; + } + .sidebar_toggle_button > i { + cursor: inherit; + } + .sidebar_toggle_button:hover { + color: var(--color-light); + } + +/* Preview */ + .orbit_gizmo { + position: absolute; + border-radius: 50%; + width: 80px; + height: 80px; + bottom: 0; + right: 0; + opacity: 0.6; + overflow: hidden; + } + .orbit_gizmo:hover, .orbit_gizmo.mouse_active { + background-color: #00000040; + opacity: 1; + } + .orbit_gizmo > svg { + width: 100%; + height: 100%; + display: block; + pointer-events: none; + filter: brightness(0.7); + } + .orbit_gizmo > svg path { + stroke-width: 2px; + fill: none; + } + .orbit_gizmo_side { + color: var(--color-accent_text); + position: absolute; + width: 16px; + height: 16px; + margin: -8px; + border-radius: 50%; + z-index: 1; + text-align: center; + font-size: 12px; + line-height: 16px; + font-family: Consolas, Assistant, system-ui; + } + .orbit_gizmo.mouse_active .orbit_gizmo_side { + pointer-events: none; + } + .orbit_gizmo_side[axis="x"], .orbit_gizmo > svg path[axis="x"] { + background-color: var(--color-axis-x); + stroke: var(--color-axis-x); + } + .orbit_gizmo_side[axis="y"], .orbit_gizmo > svg path[axis="y"] { + background-color: var(--color-axis-y); + stroke: var(--color-axis-y); + } + .orbit_gizmo_side[axis="z"], .orbit_gizmo > svg path[axis="z"] { + background-color: var(--color-axis-z); + stroke: var(--color-axis-z); + } + .orbit_gizmo_side.background { + z-index: 0; + filter: brightness(0.7); + } + .orbit_gizmo:not(.mouse_active) .orbit_gizmo_side:hover { + background-color: var(--color-bright_ui) !important; + filter: brightness(1); + } + div#preview_copy_brush_outline { + height: 20px; + width: 20px; + margin: -10px; + position: absolute; + pointer-events: none; + mix-blend-mode: difference; + z-index: 1; + } + div#preview_copy_brush_outline::after { + content: "\2b"; + font-family: 'Font Awesome 6 Free'; + font-weight: 900; + font-size: 19px; + position: absolute; + margin: auto; + top: calc(50% - 15px); + right: -10px; + left: -10px; + color: white; + width: 16px; + } + #center_first_person_button { + position: absolute; + margin: auto; + right: 0; + left: 0; + bottom: 7px; + width: fit-content; + z-index: 2; + } + + .reference_image { + position: absolute; + top: 0; + left: 0; + pointer-events: none; + } + .reference_image[reference_layer=viewport] { + z-index: 2; + } + .reference_image[reference_layer=float] { + z-index: 8; + } + .reference_image.selected[reference_layer=float] > .image_content { + box-shadow: 3px 3px 10px rgb(0 0 0 / 70%); + } + #work_screen.reference_image_mode .reference_image { + pointer-events: initial; + } + #work_screen.reference_image_mode .single_canvas_wrapper, + #work_screen.reference_image_mode .split_screen_wrapper { + pointer-events: none; + } + #work_screen.reference_image_mode .reference_image.invisible:not(.selected):not(:hover) { + outline: 1px solid var(--color-grid); + } + .reference_image.selected { + z-index: 9; + pointer-events: initial; + cursor: move; + clip-path: none !important; + } + .reference_image.selected, .reference_image:hover { + outline: 1px solid var(--color-accent); + } + .reference_image > .image_content { + width: 100%; + height: 100%; + pointer-events: none; + } + .reference_image.flip_x > .image_content { + transform: scaleX(-1); + } + .reference_image.flip_y > .image_content { + transform: scaleY(-1); + } + .reference_image.flip_y.flip_x > .image_content { + transform: scaleX(-1) scaleY(-1); + } + + .reference_image_resize_corner { + position: absolute; + width: 10px; + height: 10px; + background-color: var(--color-text); + border: 1px solid var(--color-border); + } + .reference_image_resize_corner:hover { + background-color: var(--color-light); + } + .reference_image_resize_corner.nw { + top: -5px; + left: -5px; + cursor: nw-resize; + } + .reference_image_resize_corner.ne { + top: -5px; + right: -5px; + cursor: ne-resize; + } + .reference_image_resize_corner.sw { + bottom: -5px; + left: -5px; + cursor: sw-resize; + } + .reference_image_resize_corner.se { + bottom: -5px; + right: -5px; + cursor: se-resize; + } + .reference_image_rotate_handle { + width: 25px; + height: 25px; + top: 4px; + left: 4px; + position: absolute; + cursor: url('../assets/rotate_cursor.png') 9 9, auto; + text-shadow: 1px 1px 0px black; + } + .reference_image_rotate_handle:hover { + color: var(--color-light); + } + body.light_mode .reference_image_rotate_handle { + text-shadow: none; + } + .reference_image_toolbar { + position: absolute; + margin: auto; + height: auto; + bottom: 0; + right: -150px; + left: -150px; + background-color: var(--color-ui); + max-width: fit-content; + display: flex; + width: fit-content; + padding: 4px; + border-radius: 6px; + margin-bottom: -5px; + } + + .toolbar[toolbar_id=reference_images] { + position: absolute; + width: 280px; + max-width: 100vw; + margin: auto; + left: 0; + right: 0; + top: 45px; + background-color: var(--color-ui); + border: 2px solid var(--color-accent); + z-index: 4; + padding: 4px; + border-radius: 7px; + overflow: visible; + } + + + .clamped_reference_images { + height: 100%; + width: 100%; + overflow: hidden; + position: absolute; + pointer-events: none; + } + + +/* GIF Recorder */ + #gif_recording_frame { + pointer-events: none; + position: absolute; + border: 2px dashed var(--color-accent); + top: 0; + right: 0; + left: 0; + bottom: 0; + } + #gif_recording_frame.recording { + pointer-events: none; + } + #gif_recording_frame_label { + text-align: center; + color: var(--color-subtle_text); + font-family: var(--font-code); + pointer-events: initial; + cursor: move; + } + #gif_recording_controls { + pointer-events: initial; + background-color: var(--color-ui); + box-shadow: 0 0 8px #00000040; + height: 30px; + width: fit-content; + margin: auto; + position: absolute; + display: flex; + bottom: 0; + right: 0; + left: 0; + } + .gif_recording_frame_handle { + pointer-events: initial; + position: absolute; + width: 22px; + height: 22px; + cursor: move; + } + #gif_recording_frame.recording .gif_recording_frame_handle { + display: none; + } + .gif_recording_frame_handle:hover { + color: var(--color-light); + } + #gif_recording_controls .gif_record_button:hover { + filter: brightness(1.2); + } + #gif_recording_frame.recording .gif_record_button { + animation: record_button_blink 0.5s infinite; + pointer-events: none; + } + @keyframes record_button_blink { + 0% {opacity: 0;} + 50% {opacity: 0;} + 51% {opacity: 1;} + } + .gif_recording_frame_handle.gif_resize_ne {cursor: ne-resize} + .gif_recording_frame_handle.gif_resize_nw {cursor: nw-resize} + .gif_recording_frame_handle.gif_resize_se {cursor: se-resize} + .gif_recording_frame_handle.gif_resize_sw {cursor: sw-resize} + .gif_recording_frame_handle.gif_resize_ne i {transform: rotate(-45deg);} + .gif_recording_frame_handle.gif_resize_nw i {transform: rotate(225deg);} + .gif_recording_frame_handle.gif_resize_se i {transform: rotate(45deg);} + .gif_recording_frame_handle.gif_resize_sw i {transform: rotate(135deg);} + +/* Amend Edit Menu */ + #amend_edit_menu { + position: absolute; + bottom: 1px; + left: 0; + right: 0; + padding-right: 30px; + margin: auto; + width: fit-content; + z-index: 3; + } + #amend_edit_menu > div.form { + background-color: var(--color-ui); + padding: 2px 10px; + border-radius: 6px; + } + .amend_edit_close_button { + position: absolute; + right: 0px; + top: 6px; + height: 30px; + width: 30px; + padding: 4px; + cursor: pointer; + } + .amend_edit_close_button:hover { + color: var(--color-light); + } +} + diff --git a/nonpacks/static/vendor/blockbench/dist/bundle.js b/nonpacks/static/vendor/blockbench/dist/bundle.js new file mode 100644 index 0000000..e8dcfa4 --- /dev/null +++ b/nonpacks/static/vendor/blockbench/dist/bundle.js @@ -0,0 +1,16420 @@ +var I6=Object.create;var Nf=Object.defineProperty;var D6=Object.getOwnPropertyDescriptor;var V6=Object.getOwnPropertyNames;var F6=Object.getPrototypeOf,U6=Object.prototype.hasOwnProperty;var OB=i=>{throw TypeError(i)};var O6=(i,e,t)=>e in i?Nf(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t;var or=(i=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(i,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):i)(function(i){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+i+'" is not supported')});var L6=(i,e)=>()=>(i&&(e=i(i=0)),e);var Ft=(i,e)=>()=>(e||i((e={exports:{}}).exports,e),e.exports),cu=(i,e)=>{for(var t in e)Nf(i,t,{get:e[t],enumerable:!0})},LB=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of V6(e))!U6.call(i,a)&&a!==t&&Nf(i,a,{get:()=>e[a],enumerable:!(n=D6(e,a))||n.enumerable});return i};var Vl=(i,e,t)=>(t=i!=null?I6(F6(i)):{},LB(e||!i||!i.__esModule?Nf(t,"default",{value:i,enumerable:!0}):t,i)),N6=i=>LB(Nf({},"__esModule",{value:!0}),i);var W=(i,e,t)=>O6(i,typeof e!="symbol"?e+"":e,t),H6=(i,e,t)=>e.has(i)||OB("Cannot "+t);var Mp=(i,e,t)=>e.has(i)?OB("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(i):e.set(i,t);var pd=(i,e,t)=>(H6(i,e,"access private method"),t);var eR=Ft((QB,Xy)=>{(function(i,e){"use strict";typeof Xy=="object"&&typeof Xy.exports=="object"?Xy.exports=i.document?e(i,!0):function(t){if(!t.document)throw new Error("jQuery requires a window with a document");return e(t)}:e(i)})(typeof window<"u"?window:QB,function(i,e){"use strict";var t=[],n=Object.getPrototypeOf,a=t.slice,o=t.flat?function(M){return t.flat.call(M)}:function(M){return t.concat.apply([],M)},r=t.push,s=t.indexOf,l={},c=l.toString,d=l.hasOwnProperty,u=d.toString,p=u.call(Object),m={},_=function(D){return typeof D=="function"&&typeof D.nodeType!="number"&&typeof D.item!="function"},f=function(D){return D!=null&&D===D.window},g=i.document,v={type:!0,src:!0,nonce:!0,noModule:!0};function b(M,D,N){N=N||g;var Y,ae,oe=N.createElement("script");if(oe.text=M,D)for(Y in v)ae=D[Y]||D.getAttribute&&D.getAttribute(Y),ae&&oe.setAttribute(Y,ae);N.head.appendChild(oe).parentNode.removeChild(oe)}function x(M){return M==null?M+"":typeof M=="object"||typeof M=="function"?l[c.call(M)]||"object":typeof M}var w="3.7.1",E=/HTML$/i,y=function(M,D){return new y.fn.init(M,D)};y.fn=y.prototype={jquery:w,constructor:y,length:0,toArray:function(){return a.call(this)},get:function(M){return M==null?a.call(this):M<0?this[M+this.length]:this[M]},pushStack:function(M){var D=y.merge(this.constructor(),M);return D.prevObject=this,D},each:function(M){return y.each(this,M)},map:function(M){return this.pushStack(y.map(this,function(D,N){return M.call(D,N,D)}))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(y.grep(this,function(M,D){return(D+1)%2}))},odd:function(){return this.pushStack(y.grep(this,function(M,D){return D%2}))},eq:function(M){var D=this.length,N=+M+(M<0?D:0);return this.pushStack(N>=0&&N0&&D-1 in M}function R(M,D){return M.nodeName&&M.nodeName.toLowerCase()===D.toLowerCase()}var j=t.pop,F=t.sort,O=t.splice,L="[\\x20\\t\\r\\n\\f]",U=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g");y.contains=function(M,D){var N=D&&D.parentNode;return M===N||!!(N&&N.nodeType===1&&(M.contains?M.contains(N):M.compareDocumentPosition&&M.compareDocumentPosition(N)&16))};var J=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;function ie(M,D){return D?M==="\0"?"\uFFFD":M.slice(0,-1)+"\\"+M.charCodeAt(M.length-1).toString(16)+" ":"\\"+M}y.escapeSelector=function(M){return(M+"").replace(J,ie)};var te=g,me=r;(function(){var M,D,N,Y,ae,oe=me,fe,Ne,De,Ze,gt,wt=y.expando,rt=0,Pt=0,qi=l_(),Cn=l_(),tn=l_(),tr=l_(),La=function(Pe,$e){return Pe===$e&&(ae=!0),0},dl="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",Is="(?:\\\\[\\da-fA-F]{1,6}"+L+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",hn="\\["+L+"*("+Is+")(?:"+L+"*([*^$|!~]?=)"+L+`*(?:'((?:\\\\.|[^\\\\'])*)'|"((?:\\\\.|[^\\\\"])*)"|(`+Is+"))|)"+L+"*\\]",Do=":("+Is+`)(?:\\((('((?:\\\\.|[^\\\\'])*)'|"((?:\\\\.|[^\\\\"])*)")|((?:\\\\.|[^\\\\()[\\]]|`+hn+")*)|.*)\\)|)",Dn=new RegExp(L+"+","g"),Na=new RegExp("^"+L+"*,"+L+"*"),bp=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),Bf=new RegExp(L+"|>"),ul=new RegExp(Do),yp=new RegExp("^"+Is+"$"),pl={ID:new RegExp("^#("+Is+")"),CLASS:new RegExp("^\\.("+Is+")"),TAG:new RegExp("^("+Is+"|[*])"),ATTR:new RegExp("^"+hn),PSEUDO:new RegExp("^"+Do),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+dl+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},hc=/^(?:input|select|textarea|button)$/i,fc=/^h\d$/i,gs=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Rf=/[+~]/,Il=new RegExp("\\\\[\\da-fA-F]{1,6}"+L+"?|\\\\([^\\r\\n\\f])","g"),ml=function(Pe,$e){var at="0x"+Pe.slice(1)-65536;return $e||(at<0?String.fromCharCode(at+65536):String.fromCharCode(at>>10|55296,at&1023|56320))},K1=function(){Dl()},Ay=au(function(Pe){return Pe.disabled===!0&&R(Pe,"fieldset")},{dir:"parentNode",next:"legend"});function iu(){try{return fe.activeElement}catch{}}try{oe.apply(t=a.call(te.childNodes),te.childNodes),t[te.childNodes.length].nodeType}catch{oe={apply:function($e,at){me.apply($e,a.call(at))},call:function($e){me.apply($e,a.call(arguments,1))}}}function On(Pe,$e,at,ht){var kt,Ot,oi,mi,Zt,fn,Wi,Yi=$e&&$e.ownerDocument,kn=$e?$e.nodeType:9;if(at=at||[],typeof Pe!="string"||!Pe||kn!==1&&kn!==9&&kn!==11)return at;if(!ht&&(Dl($e),$e=$e||fe,De)){if(kn!==11&&(Zt=gs.exec(Pe)))if(kt=Zt[1]){if(kn===9)if(oi=$e.getElementById(kt)){if(oi.id===kt)return oe.call(at,oi),at}else return at;else if(Yi&&(oi=Yi.getElementById(kt))&&On.contains($e,oi)&&oi.id===kt)return oe.call(at,oi),at}else{if(Zt[2])return oe.apply(at,$e.getElementsByTagName(Pe)),at;if((kt=Zt[3])&&$e.getElementsByClassName)return oe.apply(at,$e.getElementsByClassName(kt)),at}if(!tr[Pe+" "]&&(!Ze||!Ze.test(Pe))){if(Wi=Pe,Yi=$e,kn===1&&(Bf.test(Pe)||bp.test(Pe))){for(Yi=Rf.test(Pe)&&c_($e.parentNode)||$e,(Yi!=$e||!m.scope)&&((mi=$e.getAttribute("id"))?mi=y.escapeSelector(mi):$e.setAttribute("id",mi=wt)),fn=nu(Pe),Ot=fn.length;Ot--;)fn[Ot]=(mi?"#"+mi:":scope")+" "+u_(fn[Ot]);Wi=fn.join(",")}try{return oe.apply(at,Yi.querySelectorAll(Wi)),at}catch{tr(Pe,!0)}finally{mi===wt&&$e.removeAttribute("id")}}}return Ry(Pe.replace(U,"$1"),$e,at,ht)}function l_(){var Pe=[];function $e(at,ht){return Pe.push(at+" ")>D.cacheLength&&delete $e[Pe.shift()],$e[at+" "]=ht}return $e}function cr(Pe){return Pe[wt]=!0,Pe}function Jr(Pe){var $e=fe.createElement("fieldset");try{return!!Pe($e)}catch{return!1}finally{$e.parentNode&&$e.parentNode.removeChild($e),$e=null}}function jf(Pe){return function($e){return R($e,"input")&&$e.type===Pe}}function $1(Pe){return function($e){return(R($e,"input")||R($e,"button"))&&$e.type===Pe}}function Cy(Pe){return function($e){return"form"in $e?$e.parentNode&&$e.disabled===!1?"label"in $e?"label"in $e.parentNode?$e.parentNode.disabled===Pe:$e.disabled===Pe:$e.isDisabled===Pe||$e.isDisabled!==!Pe&&Ay($e)===Pe:$e.disabled===Pe:"label"in $e?$e.disabled===Pe:!1}}function gc(Pe){return cr(function($e){return $e=+$e,cr(function(at,ht){for(var kt,Ot=Pe([],at.length,$e),oi=Ot.length;oi--;)at[kt=Ot[oi]]&&(at[kt]=!(ht[kt]=at[kt]))})})}function c_(Pe){return Pe&&typeof Pe.getElementsByTagName<"u"&&Pe}function Dl(Pe){var $e,at=Pe?Pe.ownerDocument||Pe:te;return at==fe||at.nodeType!==9||!at.documentElement||(fe=at,Ne=fe.documentElement,De=!y.isXMLDoc(fe),gt=Ne.matches||Ne.webkitMatchesSelector||Ne.msMatchesSelector,Ne.msMatchesSelector&&te!=fe&&($e=fe.defaultView)&&$e.top!==$e&&$e.addEventListener("unload",K1),m.getById=Jr(function(ht){return Ne.appendChild(ht).id=y.expando,!fe.getElementsByName||!fe.getElementsByName(y.expando).length}),m.disconnectedMatch=Jr(function(ht){return gt.call(ht,"*")}),m.scope=Jr(function(){return fe.querySelectorAll(":scope")}),m.cssHas=Jr(function(){try{return fe.querySelector(":has(*,:jqfake)"),!1}catch{return!0}}),m.getById?(D.filter.ID=function(ht){var kt=ht.replace(Il,ml);return function(Ot){return Ot.getAttribute("id")===kt}},D.find.ID=function(ht,kt){if(typeof kt.getElementById<"u"&&De){var Ot=kt.getElementById(ht);return Ot?[Ot]:[]}}):(D.filter.ID=function(ht){var kt=ht.replace(Il,ml);return function(Ot){var oi=typeof Ot.getAttributeNode<"u"&&Ot.getAttributeNode("id");return oi&&oi.value===kt}},D.find.ID=function(ht,kt){if(typeof kt.getElementById<"u"&&De){var Ot,oi,mi,Zt=kt.getElementById(ht);if(Zt){if(Ot=Zt.getAttributeNode("id"),Ot&&Ot.value===ht)return[Zt];for(mi=kt.getElementsByName(ht),oi=0;Zt=mi[oi++];)if(Ot=Zt.getAttributeNode("id"),Ot&&Ot.value===ht)return[Zt]}return[]}}),D.find.TAG=function(ht,kt){return typeof kt.getElementsByTagName<"u"?kt.getElementsByTagName(ht):kt.querySelectorAll(ht)},D.find.CLASS=function(ht,kt){if(typeof kt.getElementsByClassName<"u"&&De)return kt.getElementsByClassName(ht)},Ze=[],Jr(function(ht){var kt;Ne.appendChild(ht).innerHTML="",ht.querySelectorAll("[selected]").length||Ze.push("\\["+L+"*(?:value|"+dl+")"),ht.querySelectorAll("[id~="+wt+"-]").length||Ze.push("~="),ht.querySelectorAll("a#"+wt+"+*").length||Ze.push(".#.+[+~]"),ht.querySelectorAll(":checked").length||Ze.push(":checked"),kt=fe.createElement("input"),kt.setAttribute("type","hidden"),ht.appendChild(kt).setAttribute("name","D"),Ne.appendChild(ht).disabled=!0,ht.querySelectorAll(":disabled").length!==2&&Ze.push(":enabled",":disabled"),kt=fe.createElement("input"),kt.setAttribute("name",""),ht.appendChild(kt),ht.querySelectorAll("[name='']").length||Ze.push("\\["+L+"*name"+L+"*="+L+`*(?:''|"")`)}),m.cssHas||Ze.push(":has"),Ze=Ze.length&&new RegExp(Ze.join("|")),La=function(ht,kt){if(ht===kt)return ae=!0,0;var Ot=!ht.compareDocumentPosition-!kt.compareDocumentPosition;return Ot||(Ot=(ht.ownerDocument||ht)==(kt.ownerDocument||kt)?ht.compareDocumentPosition(kt):1,Ot&1||!m.sortDetached&&kt.compareDocumentPosition(ht)===Ot?ht===fe||ht.ownerDocument==te&&On.contains(te,ht)?-1:kt===fe||kt.ownerDocument==te&&On.contains(te,kt)?1:Y?s.call(Y,ht)-s.call(Y,kt):0:Ot&4?-1:1)}),fe}On.matches=function(Pe,$e){return On(Pe,null,null,$e)},On.matchesSelector=function(Pe,$e){if(Dl(Pe),De&&!tr[$e+" "]&&(!Ze||!Ze.test($e)))try{var at=gt.call(Pe,$e);if(at||m.disconnectedMatch||Pe.document&&Pe.document.nodeType!==11)return at}catch{tr($e,!0)}return On($e,fe,null,[Pe]).length>0},On.contains=function(Pe,$e){return(Pe.ownerDocument||Pe)!=fe&&Dl(Pe),y.contains(Pe,$e)},On.attr=function(Pe,$e){(Pe.ownerDocument||Pe)!=fe&&Dl(Pe);var at=D.attrHandle[$e.toLowerCase()],ht=at&&d.call(D.attrHandle,$e.toLowerCase())?at(Pe,$e,!De):void 0;return ht!==void 0?ht:Pe.getAttribute($e)},On.error=function(Pe){throw new Error("Syntax error, unrecognized expression: "+Pe)},y.uniqueSort=function(Pe){var $e,at=[],ht=0,kt=0;if(ae=!m.sortStable,Y=!m.sortStable&&a.call(Pe,0),F.call(Pe,La),ae){for(;$e=Pe[kt++];)$e===Pe[kt]&&(ht=at.push(kt));for(;ht--;)O.call(Pe,at[ht],1)}return Y=null,Pe},y.fn.uniqueSort=function(){return this.pushStack(y.uniqueSort(a.apply(this)))},D=y.expr={cacheLength:50,createPseudo:cr,match:pl,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(Pe){return Pe[1]=Pe[1].replace(Il,ml),Pe[3]=(Pe[3]||Pe[4]||Pe[5]||"").replace(Il,ml),Pe[2]==="~="&&(Pe[3]=" "+Pe[3]+" "),Pe.slice(0,4)},CHILD:function(Pe){return Pe[1]=Pe[1].toLowerCase(),Pe[1].slice(0,3)==="nth"?(Pe[3]||On.error(Pe[0]),Pe[4]=+(Pe[4]?Pe[5]+(Pe[6]||1):2*(Pe[3]==="even"||Pe[3]==="odd")),Pe[5]=+(Pe[7]+Pe[8]||Pe[3]==="odd")):Pe[3]&&On.error(Pe[0]),Pe},PSEUDO:function(Pe){var $e,at=!Pe[6]&&Pe[2];return pl.CHILD.test(Pe[0])?null:(Pe[3]?Pe[2]=Pe[4]||Pe[5]||"":at&&ul.test(at)&&($e=nu(at,!0))&&($e=at.indexOf(")",at.length-$e)-at.length)&&(Pe[0]=Pe[0].slice(0,$e),Pe[2]=at.slice(0,$e)),Pe.slice(0,3))}},filter:{TAG:function(Pe){var $e=Pe.replace(Il,ml).toLowerCase();return Pe==="*"?function(){return!0}:function(at){return R(at,$e)}},CLASS:function(Pe){var $e=qi[Pe+" "];return $e||($e=new RegExp("(^|"+L+")"+Pe+"("+L+"|$)"))&&qi(Pe,function(at){return $e.test(typeof at.className=="string"&&at.className||typeof at.getAttribute<"u"&&at.getAttribute("class")||"")})},ATTR:function(Pe,$e,at){return function(ht){var kt=On.attr(ht,Pe);return kt==null?$e==="!=":$e?(kt+="",$e==="="?kt===at:$e==="!="?kt!==at:$e==="^="?at&&kt.indexOf(at)===0:$e==="*="?at&&kt.indexOf(at)>-1:$e==="$="?at&&kt.slice(-at.length)===at:$e==="~="?(" "+kt.replace(Dn," ")+" ").indexOf(at)>-1:$e==="|="?kt===at||kt.slice(0,at.length+1)===at+"-":!1):!0}},CHILD:function(Pe,$e,at,ht,kt){var Ot=Pe.slice(0,3)!=="nth",oi=Pe.slice(-4)!=="last",mi=$e==="of-type";return ht===1&&kt===0?function(Zt){return!!Zt.parentNode}:function(Zt,fn,Wi){var Yi,kn,Vi,Ui,Vr,ir=Ot!==oi?"nextSibling":"previousSibling",kr=Zt.parentNode,Ds=mi&&Zt.nodeName.toLowerCase(),vc=!Wi&&!mi,dr=!1;if(kr){if(Ot){for(;ir;){for(Vi=Zt;Vi=Vi[ir];)if(mi?R(Vi,Ds):Vi.nodeType===1)return!1;Vr=ir=Pe==="only"&&!Vr&&"nextSibling"}return!0}if(Vr=[oi?kr.firstChild:kr.lastChild],oi&&vc){for(kn=kr[wt]||(kr[wt]={}),Yi=kn[Pe]||[],Ui=Yi[0]===rt&&Yi[1],dr=Ui&&Yi[2],Vi=Ui&&kr.childNodes[Ui];Vi=++Ui&&Vi&&Vi[ir]||(dr=Ui=0)||Vr.pop();)if(Vi.nodeType===1&&++dr&&Vi===Zt){kn[Pe]=[rt,Ui,dr];break}}else if(vc&&(kn=Zt[wt]||(Zt[wt]={}),Yi=kn[Pe]||[],Ui=Yi[0]===rt&&Yi[1],dr=Ui),dr===!1)for(;(Vi=++Ui&&Vi&&Vi[ir]||(dr=Ui=0)||Vr.pop())&&!((mi?R(Vi,Ds):Vi.nodeType===1)&&++dr&&(vc&&(kn=Vi[wt]||(Vi[wt]={}),kn[Pe]=[rt,dr]),Vi===Zt)););return dr-=kt,dr===ht||dr%ht===0&&dr/ht>=0}}},PSEUDO:function(Pe,$e){var at,ht=D.pseudos[Pe]||D.setFilters[Pe.toLowerCase()]||On.error("unsupported pseudo: "+Pe);return ht[wt]?ht($e):ht.length>1?(at=[Pe,Pe,"",$e],D.setFilters.hasOwnProperty(Pe.toLowerCase())?cr(function(kt,Ot){for(var oi,mi=ht(kt,$e),Zt=mi.length;Zt--;)oi=s.call(kt,mi[Zt]),kt[oi]=!(Ot[oi]=mi[Zt])}):function(kt){return ht(kt,0,at)}):ht}},pseudos:{not:cr(function(Pe){var $e=[],at=[],ht=p_(Pe.replace(U,"$1"));return ht[wt]?cr(function(kt,Ot,oi,mi){for(var Zt,fn=ht(kt,null,mi,[]),Wi=kt.length;Wi--;)(Zt=fn[Wi])&&(kt[Wi]=!(Ot[Wi]=Zt))}):function(kt,Ot,oi){return $e[0]=kt,ht($e,null,oi,at),$e[0]=null,!at.pop()}}),has:cr(function(Pe){return function($e){return On(Pe,$e).length>0}}),contains:cr(function(Pe){return Pe=Pe.replace(Il,ml),function($e){return($e.textContent||y.text($e)).indexOf(Pe)>-1}}),lang:cr(function(Pe){return yp.test(Pe||"")||On.error("unsupported lang: "+Pe),Pe=Pe.replace(Il,ml).toLowerCase(),function($e){var at;do if(at=De?$e.lang:$e.getAttribute("xml:lang")||$e.getAttribute("lang"))return at=at.toLowerCase(),at===Pe||at.indexOf(Pe+"-")===0;while(($e=$e.parentNode)&&$e.nodeType===1);return!1}}),target:function(Pe){var $e=i.location&&i.location.hash;return $e&&$e.slice(1)===Pe.id},root:function(Pe){return Pe===Ne},focus:function(Pe){return Pe===iu()&&fe.hasFocus()&&!!(Pe.type||Pe.href||~Pe.tabIndex)},enabled:Cy(!1),disabled:Cy(!0),checked:function(Pe){return R(Pe,"input")&&!!Pe.checked||R(Pe,"option")&&!!Pe.selected},selected:function(Pe){return Pe.parentNode&&Pe.parentNode.selectedIndex,Pe.selected===!0},empty:function(Pe){for(Pe=Pe.firstChild;Pe;Pe=Pe.nextSibling)if(Pe.nodeType<6)return!1;return!0},parent:function(Pe){return!D.pseudos.empty(Pe)},header:function(Pe){return fc.test(Pe.nodeName)},input:function(Pe){return hc.test(Pe.nodeName)},button:function(Pe){return R(Pe,"input")&&Pe.type==="button"||R(Pe,"button")},text:function(Pe){var $e;return R(Pe,"input")&&Pe.type==="text"&&(($e=Pe.getAttribute("type"))==null||$e.toLowerCase()==="text")},first:gc(function(){return[0]}),last:gc(function(Pe,$e){return[$e-1]}),eq:gc(function(Pe,$e,at){return[at<0?at+$e:at]}),even:gc(function(Pe,$e){for(var at=0;at<$e;at+=2)Pe.push(at);return Pe}),odd:gc(function(Pe,$e){for(var at=1;at<$e;at+=2)Pe.push(at);return Pe}),lt:gc(function(Pe,$e,at){var ht;for(at<0?ht=at+$e:at>$e?ht=$e:ht=at;--ht>=0;)Pe.push(ht);return Pe}),gt:gc(function(Pe,$e,at){for(var ht=at<0?at+$e:at;++ht<$e;)Pe.push(ht);return Pe})}},D.pseudos.nth=D.pseudos.eq;for(M in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})D.pseudos[M]=jf(M);for(M in{submit:!0,reset:!0})D.pseudos[M]=$1(M);function d_(){}d_.prototype=D.filters=D.pseudos,D.setFilters=new d_;function nu(Pe,$e){var at,ht,kt,Ot,oi,mi,Zt,fn=Cn[Pe+" "];if(fn)return $e?0:fn.slice(0);for(oi=Pe,mi=[],Zt=D.preFilter;oi;){(!at||(ht=Na.exec(oi)))&&(ht&&(oi=oi.slice(ht[0].length)||oi),mi.push(kt=[])),at=!1,(ht=bp.exec(oi))&&(at=ht.shift(),kt.push({value:at,type:ht[0].replace(U," ")}),oi=oi.slice(at.length));for(Ot in D.filter)(ht=pl[Ot].exec(oi))&&(!Zt[Ot]||(ht=Zt[Ot](ht)))&&(at=ht.shift(),kt.push({value:at,type:Ot,matches:ht}),oi=oi.slice(at.length));if(!at)break}return $e?oi.length:oi?On.error(Pe):Cn(Pe,mi).slice(0)}function u_(Pe){for(var $e=0,at=Pe.length,ht="";$e1?function($e,at,ht){for(var kt=Pe.length;kt--;)if(!Pe[kt]($e,at,ht))return!1;return!0}:Pe[0]}function Py(Pe,$e,at){for(var ht=0,kt=$e.length;ht-1&&(oi[Wi]=!(mi[Wi]=kn))}}else Vi=kp(Vi===mi?Vi.splice(ir,Vi.length):Vi),kt?kt(null,mi,Vi,fn):oe.apply(mi,Vi)})}function wp(Pe){for(var $e,at,ht,kt=Pe.length,Ot=D.relative[Pe[0].type],oi=Ot||D.relative[" "],mi=Ot?1:0,Zt=au(function(Yi){return Yi===$e},oi,!0),fn=au(function(Yi){return s.call($e,Yi)>-1},oi,!0),Wi=[function(Yi,kn,Vi){var Ui=!Ot&&(Vi||kn!=N)||(($e=kn).nodeType?Zt(Yi,kn,Vi):fn(Yi,kn,Vi));return $e=null,Ui}];mi1&&xp(Wi),mi>1&&u_(Pe.slice(0,mi-1).concat({value:Pe[mi-2].type===" "?"*":""})).replace(U,"$1"),at,mi0,ht=Pe.length>0,kt=function(Ot,oi,mi,Zt,fn){var Wi,Yi,kn,Vi=0,Ui="0",Vr=Ot&&[],ir=[],kr=N,Ds=Ot||ht&&D.find.TAG("*",fn),vc=rt+=kr==null?1:Math.random()||.1,dr=Ds.length;for(fn&&(N=oi==fe||oi||fn);Ui!==dr&&(Wi=Ds[Ui])!=null;Ui++){if(ht&&Wi){for(Yi=0,!oi&&Wi.ownerDocument!=fe&&(Dl(Wi),mi=!De);kn=Pe[Yi++];)if(kn(Wi,oi||fe,mi)){oe.call(Zt,Wi);break}fn&&(rt=vc)}at&&((Wi=!kn&&Wi)&&Vi--,Ot&&Vr.push(Wi))}if(Vi+=Ui,at&&Ui!==Vi){for(Yi=0;kn=$e[Yi++];)kn(Vr,ir,oi,mi);if(Ot){if(Vi>0)for(;Ui--;)Vr[Ui]||ir[Ui]||(ir[Ui]=j.call(Zt));ir=kp(ir)}oe.apply(Zt,ir),fn&&!Ot&&ir.length>0&&Vi+$e.length>1&&y.uniqueSort(Zt)}return fn&&(rt=vc,N=kr),Vr};return at?cr(kt):kt}function p_(Pe,$e){var at,ht=[],kt=[],Ot=tn[Pe+" "];if(!Ot){for($e||($e=nu(Pe)),at=$e.length;at--;)Ot=wp($e[at]),Ot[wt]?ht.push(Ot):kt.push(Ot);Ot=tn(Pe,By(kt,ht)),Ot.selector=Pe}return Ot}function Ry(Pe,$e,at,ht){var kt,Ot,oi,mi,Zt,fn=typeof Pe=="function"&&Pe,Wi=!ht&&nu(Pe=fn.selector||Pe);if(at=at||[],Wi.length===1){if(Ot=Wi[0]=Wi[0].slice(0),Ot.length>2&&(oi=Ot[0]).type==="ID"&&$e.nodeType===9&&De&&D.relative[Ot[1].type]){if($e=(D.find.ID(oi.matches[0].replace(Il,ml),$e)||[])[0],$e)fn&&($e=$e.parentNode);else return at;Pe=Pe.slice(Ot.shift().value.length)}for(kt=pl.needsContext.test(Pe)?0:Ot.length;kt--&&(oi=Ot[kt],!D.relative[mi=oi.type]);)if((Zt=D.find[mi])&&(ht=Zt(oi.matches[0].replace(Il,ml),Rf.test(Ot[0].type)&&c_($e.parentNode)||$e))){if(Ot.splice(kt,1),Pe=ht.length&&u_(Ot),!Pe)return oe.apply(at,ht),at;break}}return(fn||p_(Pe,Wi))(ht,$e,!De,at,!$e||Rf.test(Pe)&&c_($e.parentNode)||$e),at}m.sortStable=wt.split("").sort(La).join("")===wt,Dl(),m.sortDetached=Jr(function(Pe){return Pe.compareDocumentPosition(fe.createElement("fieldset"))&1}),y.find=On,y.expr[":"]=y.expr.pseudos,y.unique=y.uniqueSort,On.compile=p_,On.select=Ry,On.setDocument=Dl,On.tokenize=nu,On.escape=y.escapeSelector,On.getText=y.text,On.isXML=y.isXMLDoc,On.selectors=y.expr,On.support=y.support,On.uniqueSort=y.uniqueSort})();var Q=function(M,D,N){for(var Y=[],ae=N!==void 0;(M=M[D])&&M.nodeType!==9;)if(M.nodeType===1){if(ae&&y(M).is(N))break;Y.push(M)}return Y},H=function(M,D){for(var N=[];M;M=M.nextSibling)M.nodeType===1&&M!==D&&N.push(M);return N},re=y.expr.match.needsContext,K=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function pe(M,D,N){return _(D)?y.grep(M,function(Y,ae){return!!D.call(Y,ae,Y)!==N}):D.nodeType?y.grep(M,function(Y){return Y===D!==N}):typeof D!="string"?y.grep(M,function(Y){return s.call(D,Y)>-1!==N}):y.filter(D,M,N)}y.filter=function(M,D,N){var Y=D[0];return N&&(M=":not("+M+")"),D.length===1&&Y.nodeType===1?y.find.matchesSelector(Y,M)?[Y]:[]:y.find.matches(M,y.grep(D,function(ae){return ae.nodeType===1}))},y.fn.extend({find:function(M){var D,N,Y=this.length,ae=this;if(typeof M!="string")return this.pushStack(y(M).filter(function(){for(D=0;D1?y.uniqueSort(N):N},filter:function(M){return this.pushStack(pe(this,M||[],!1))},not:function(M){return this.pushStack(pe(this,M||[],!0))},is:function(M){return!!pe(this,typeof M=="string"&&re.test(M)?y(M):M||[],!1).length}});var xe,le=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,Be=y.fn.init=function(M,D,N){var Y,ae;if(!M)return this;if(N=N||xe,typeof M=="string")if(M[0]==="<"&&M[M.length-1]===">"&&M.length>=3?Y=[null,M,null]:Y=le.exec(M),Y&&(Y[1]||!D))if(Y[1]){if(D=D instanceof y?D[0]:D,y.merge(this,y.parseHTML(Y[1],D&&D.nodeType?D.ownerDocument||D:g,!0)),K.test(Y[1])&&y.isPlainObject(D))for(Y in D)_(this[Y])?this[Y](D[Y]):this.attr(Y,D[Y]);return this}else return ae=g.getElementById(Y[2]),ae&&(this[0]=ae,this.length=1),this;else return!D||D.jquery?(D||N).find(M):this.constructor(D).find(M);else{if(M.nodeType)return this[0]=M,this.length=1,this;if(_(M))return N.ready!==void 0?N.ready(M):M(y)}return y.makeArray(M,this)};Be.prototype=y.fn,xe=y(g);var X=/^(?:parents|prev(?:Until|All))/,ne={children:!0,contents:!0,next:!0,prev:!0};y.fn.extend({has:function(M){var D=y(M,this),N=D.length;return this.filter(function(){for(var Y=0;Y-1:N.nodeType===1&&y.find.matchesSelector(N,M))){oe.push(N);break}}return this.pushStack(oe.length>1?y.uniqueSort(oe):oe)},index:function(M){return M?typeof M=="string"?s.call(y(M),this[0]):s.call(this,M.jquery?M[0]:M):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(M,D){return this.pushStack(y.uniqueSort(y.merge(this.get(),y(M,D))))},addBack:function(M){return this.add(M==null?this.prevObject:this.prevObject.filter(M))}});function Me(M,D){for(;(M=M[D])&&M.nodeType!==1;);return M}y.each({parent:function(M){var D=M.parentNode;return D&&D.nodeType!==11?D:null},parents:function(M){return Q(M,"parentNode")},parentsUntil:function(M,D,N){return Q(M,"parentNode",N)},next:function(M){return Me(M,"nextSibling")},prev:function(M){return Me(M,"previousSibling")},nextAll:function(M){return Q(M,"nextSibling")},prevAll:function(M){return Q(M,"previousSibling")},nextUntil:function(M,D,N){return Q(M,"nextSibling",N)},prevUntil:function(M,D,N){return Q(M,"previousSibling",N)},siblings:function(M){return H((M.parentNode||{}).firstChild,M)},children:function(M){return H(M.firstChild)},contents:function(M){return M.contentDocument!=null&&n(M.contentDocument)?M.contentDocument:(R(M,"template")&&(M=M.content||M),y.merge([],M.childNodes))}},function(M,D){y.fn[M]=function(N,Y){var ae=y.map(this,D,N);return M.slice(-5)!=="Until"&&(Y=N),Y&&typeof Y=="string"&&(ae=y.filter(Y,ae)),this.length>1&&(ne[M]||y.uniqueSort(ae),X.test(M)&&ae.reverse()),this.pushStack(ae)}});var Ue=/[^\x20\t\r\n\f]+/g;function et(M){var D={};return y.each(M.match(Ue)||[],function(N,Y){D[Y]=!0}),D}y.Callbacks=function(M){M=typeof M=="string"?et(M):y.extend({},M);var D,N,Y,ae,oe=[],fe=[],Ne=-1,De=function(){for(ae=ae||M.once,Y=D=!0;fe.length;Ne=-1)for(N=fe.shift();++Ne-1;)oe.splice(rt,1),rt<=Ne&&Ne--}),this},has:function(gt){return gt?y.inArray(gt,oe)>-1:oe.length>0},empty:function(){return oe&&(oe=[]),this},disable:function(){return ae=fe=[],oe=N="",this},disabled:function(){return!oe},lock:function(){return ae=fe=[],!N&&!D&&(oe=N=""),this},locked:function(){return!!ae},fireWith:function(gt,wt){return ae||(wt=wt||[],wt=[gt,wt.slice?wt.slice():wt],fe.push(wt),D||De()),this},fire:function(){return Ze.fireWith(this,arguments),this},fired:function(){return!!Y}};return Ze};function Qe(M){return M}function Ge(M){throw M}function Ie(M,D,N,Y){var ae;try{M&&_(ae=M.promise)?ae.call(M).done(D).fail(N):M&&_(ae=M.then)?ae.call(M,D,N):D.apply(void 0,[M].slice(Y))}catch(oe){N.apply(void 0,[oe])}}y.extend({Deferred:function(M){var D=[["notify","progress",y.Callbacks("memory"),y.Callbacks("memory"),2],["resolve","done",y.Callbacks("once memory"),y.Callbacks("once memory"),0,"resolved"],["reject","fail",y.Callbacks("once memory"),y.Callbacks("once memory"),1,"rejected"]],N="pending",Y={state:function(){return N},always:function(){return ae.done(arguments).fail(arguments),this},catch:function(oe){return Y.then(null,oe)},pipe:function(){var oe=arguments;return y.Deferred(function(fe){y.each(D,function(Ne,De){var Ze=_(oe[De[4]])&&oe[De[4]];ae[De[1]](function(){var gt=Ze&&Ze.apply(this,arguments);gt&&_(gt.promise)?gt.promise().progress(fe.notify).done(fe.resolve).fail(fe.reject):fe[De[0]+"With"](this,Ze?[gt]:arguments)})}),oe=null}).promise()},then:function(oe,fe,Ne){var De=0;function Ze(gt,wt,rt,Pt){return function(){var qi=this,Cn=arguments,tn=function(){var La,dl;if(!(gt=De&&(rt!==Ge&&(qi=void 0,Cn=[La]),wt.rejectWith(qi,Cn))}};gt?tr():(y.Deferred.getErrorHook?tr.error=y.Deferred.getErrorHook():y.Deferred.getStackHook&&(tr.error=y.Deferred.getStackHook()),i.setTimeout(tr))}}return y.Deferred(function(gt){D[0][3].add(Ze(0,gt,_(Ne)?Ne:Qe,gt.notifyWith)),D[1][3].add(Ze(0,gt,_(oe)?oe:Qe)),D[2][3].add(Ze(0,gt,_(fe)?fe:Ge))}).promise()},promise:function(oe){return oe!=null?y.extend(oe,Y):Y}},ae={};return y.each(D,function(oe,fe){var Ne=fe[2],De=fe[5];Y[fe[1]]=Ne.add,De&&Ne.add(function(){N=De},D[3-oe][2].disable,D[3-oe][3].disable,D[0][2].lock,D[0][3].lock),Ne.add(fe[3].fire),ae[fe[0]]=function(){return ae[fe[0]+"With"](this===ae?void 0:this,arguments),this},ae[fe[0]+"With"]=Ne.fireWith}),Y.promise(ae),M&&M.call(ae,ae),ae},when:function(M){var D=arguments.length,N=D,Y=Array(N),ae=a.call(arguments),oe=y.Deferred(),fe=function(Ne){return function(De){Y[Ne]=this,ae[Ne]=arguments.length>1?a.call(arguments):De,--D||oe.resolveWith(Y,ae)}};if(D<=1&&(Ie(M,oe.done(fe(N)).resolve,oe.reject,!D),oe.state()==="pending"||_(ae[N]&&ae[N].then)))return oe.then();for(;N--;)Ie(ae[N],fe(N),oe.reject);return oe.promise()}});var Ke=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;y.Deferred.exceptionHook=function(M,D){i.console&&i.console.warn&&M&&Ke.test(M.name)&&i.console.warn("jQuery.Deferred exception: "+M.message,M.stack,D)},y.readyException=function(M){i.setTimeout(function(){throw M})};var z=y.Deferred();y.fn.ready=function(M){return z.then(M).catch(function(D){y.readyException(D)}),this},y.extend({isReady:!1,readyWait:1,ready:function(M){(M===!0?--y.readyWait:y.isReady)||(y.isReady=!0,!(M!==!0&&--y.readyWait>0)&&z.resolveWith(g,[y]))}}),y.ready.then=z.then;function C(){g.removeEventListener("DOMContentLoaded",C),i.removeEventListener("load",C),y.ready()}g.readyState==="complete"||g.readyState!=="loading"&&!g.documentElement.doScroll?i.setTimeout(y.ready):(g.addEventListener("DOMContentLoaded",C),i.addEventListener("load",C));var S=function(M,D,N,Y,ae,oe,fe){var Ne=0,De=M.length,Ze=N==null;if(x(N)==="object"){ae=!0;for(Ne in N)S(M,D,Ne,N[Ne],!0,oe,fe)}else if(Y!==void 0&&(ae=!0,_(Y)||(fe=!0),Ze&&(fe?(D.call(M,Y),D=null):(Ze=D,D=function(gt,wt,rt){return Ze.call(y(gt),rt)})),D))for(;Ne1,null,!0)},removeData:function(M){return this.each(function(){He.remove(this,M)})}}),y.extend({queue:function(M,D,N){var Y;if(M)return D=(D||"fx")+"queue",Y=Se.get(M,D),N&&(!Y||Array.isArray(N)?Y=Se.access(M,D,y.makeArray(N)):Y.push(N)),Y||[]},dequeue:function(M,D){D=D||"fx";var N=y.queue(M,D),Y=N.length,ae=N.shift(),oe=y._queueHooks(M,D),fe=function(){y.dequeue(M,D)};ae==="inprogress"&&(ae=N.shift(),Y--),ae&&(D==="fx"&&N.unshift("inprogress"),delete oe.stop,ae.call(M,fe,oe)),!Y&&oe&&oe.empty.fire()},_queueHooks:function(M,D){var N=D+"queueHooks";return Se.get(M,N)||Se.access(M,N,{empty:y.Callbacks("once memory").add(function(){Se.remove(M,[D+"queue",N])})})}}),y.fn.extend({queue:function(M,D){var N=2;return typeof M!="string"&&(D=M,M="fx",N--),arguments.length\x20\t\r\n\f]*)/i,fi=/^$|^module$|\/(?:java|ecma)script/i;(function(){var M=g.createDocumentFragment(),D=M.appendChild(g.createElement("div")),N=g.createElement("input");N.setAttribute("type","radio"),N.setAttribute("checked","checked"),N.setAttribute("name","t"),D.appendChild(N),m.checkClone=D.cloneNode(!0).cloneNode(!0).lastChild.checked,D.innerHTML="",m.noCloneChecked=!!D.cloneNode(!0).lastChild.defaultValue,D.innerHTML="",m.option=!!D.lastChild})();var vi={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};vi.tbody=vi.tfoot=vi.colgroup=vi.caption=vi.thead,vi.th=vi.td,m.option||(vi.optgroup=vi.option=[1,""]);function ri(M,D){var N;return typeof M.getElementsByTagName<"u"?N=M.getElementsByTagName(D||"*"):typeof M.querySelectorAll<"u"?N=M.querySelectorAll(D||"*"):N=[],D===void 0||D&&R(M,D)?y.merge([M],N):N}function ji(M,D){for(var N=0,Y=M.length;N-1){ae&&ae.push(oe);continue}if(Ze=xt(oe),fe=ri(wt.appendChild(oe),"script"),Ze&&ji(fe),N)for(gt=0;oe=fe[gt++];)fi.test(oe.type||"")&&N.push(oe)}return wt}var xa=/^([^.]*)(?:\.(.+)|)/;function da(){return!0}function po(){return!1}function Te(M,D,N,Y,ae,oe){var fe,Ne;if(typeof D=="object"){typeof N!="string"&&(Y=Y||N,N=void 0);for(Ne in D)Te(M,Ne,N,Y,D[Ne],oe);return M}if(Y==null&&ae==null?(ae=N,Y=N=void 0):ae==null&&(typeof N=="string"?(ae=Y,Y=void 0):(ae=Y,Y=N,N=void 0)),ae===!1)ae=po;else if(!ae)return M;return oe===1&&(fe=ae,ae=function(De){return y().off(De),fe.apply(this,arguments)},ae.guid=fe.guid||(fe.guid=y.guid++)),M.each(function(){y.event.add(this,D,ae,Y,N)})}y.event={global:{},add:function(M,D,N,Y,ae){var oe,fe,Ne,De,Ze,gt,wt,rt,Pt,qi,Cn,tn=Se.get(M);if(be(M))for(N.handler&&(oe=N,N=oe.handler,ae=oe.selector),ae&&y.find.matchesSelector(Ee,ae),N.guid||(N.guid=y.guid++),(De=tn.events)||(De=tn.events=Object.create(null)),(fe=tn.handle)||(fe=tn.handle=function(tr){return typeof y<"u"&&y.event.triggered!==tr.type?y.event.dispatch.apply(M,arguments):void 0}),D=(D||"").match(Ue)||[""],Ze=D.length;Ze--;)Ne=xa.exec(D[Ze])||[],Pt=Cn=Ne[1],qi=(Ne[2]||"").split(".").sort(),Pt&&(wt=y.event.special[Pt]||{},Pt=(ae?wt.delegateType:wt.bindType)||Pt,wt=y.event.special[Pt]||{},gt=y.extend({type:Pt,origType:Cn,data:Y,handler:N,guid:N.guid,selector:ae,needsContext:ae&&y.expr.match.needsContext.test(ae),namespace:qi.join(".")},oe),(rt=De[Pt])||(rt=De[Pt]=[],rt.delegateCount=0,(!wt.setup||wt.setup.call(M,Y,qi,fe)===!1)&&M.addEventListener&&M.addEventListener(Pt,fe)),wt.add&&(wt.add.call(M,gt),gt.handler.guid||(gt.handler.guid=N.guid)),ae?rt.splice(rt.delegateCount++,0,gt):rt.push(gt),y.event.global[Pt]=!0)},remove:function(M,D,N,Y,ae){var oe,fe,Ne,De,Ze,gt,wt,rt,Pt,qi,Cn,tn=Se.hasData(M)&&Se.get(M);if(!(!tn||!(De=tn.events))){for(D=(D||"").match(Ue)||[""],Ze=D.length;Ze--;){if(Ne=xa.exec(D[Ze])||[],Pt=Cn=Ne[1],qi=(Ne[2]||"").split(".").sort(),!Pt){for(Pt in De)y.event.remove(M,Pt+D[Ze],N,Y,!0);continue}for(wt=y.event.special[Pt]||{},Pt=(Y?wt.delegateType:wt.bindType)||Pt,rt=De[Pt]||[],Ne=Ne[2]&&new RegExp("(^|\\.)"+qi.join("\\.(?:.*\\.|)")+"(\\.|$)"),fe=oe=rt.length;oe--;)gt=rt[oe],(ae||Cn===gt.origType)&&(!N||N.guid===gt.guid)&&(!Ne||Ne.test(gt.namespace))&&(!Y||Y===gt.selector||Y==="**"&>.selector)&&(rt.splice(oe,1),gt.selector&&rt.delegateCount--,wt.remove&&wt.remove.call(M,gt));fe&&!rt.length&&((!wt.teardown||wt.teardown.call(M,qi,tn.handle)===!1)&&y.removeEvent(M,Pt,tn.handle),delete De[Pt])}y.isEmptyObject(De)&&Se.remove(M,"handle events")}},dispatch:function(M){var D,N,Y,ae,oe,fe,Ne=new Array(arguments.length),De=y.event.fix(M),Ze=(Se.get(this,"events")||Object.create(null))[De.type]||[],gt=y.event.special[De.type]||{};for(Ne[0]=De,D=1;D=1)){for(;Ze!==this;Ze=Ze.parentNode||this)if(Ze.nodeType===1&&!(M.type==="click"&&Ze.disabled===!0)){for(oe=[],fe={},N=0;N-1:y.find(ae,this,null,[Ze]).length),fe[ae]&&oe.push(Y);oe.length&&Ne.push({elem:Ze,handlers:oe})}}return Ze=this,De\s*$/g;function Ai(M,D){return R(M,"table")&&R(D.nodeType!==11?D:D.firstChild,"tr")&&y(M).children("tbody")[0]||M}function Ii(M){return M.type=(M.getAttribute("type")!==null)+"/"+M.type,M}function Wt(M){return(M.type||"").slice(0,5)==="true/"?M.type=M.type.slice(5):M.removeAttribute("type"),M}function ti(M,D){var N,Y,ae,oe,fe,Ne,De;if(D.nodeType===1){if(Se.hasData(M)&&(oe=Se.get(M),De=oe.events,De)){Se.remove(D,"handle events");for(ae in De)for(N=0,Y=De[ae].length;N1&&typeof Pt=="string"&&!m.checkClone&&ft.test(Pt))return M.each(function(Cn){var tn=M.eq(Cn);qi&&(D[0]=Pt.call(this,Cn,tn.html())),Ci(tn,D,N,Y)});if(wt&&(ae=Ni(D,M[0].ownerDocument,!1,M,Y),oe=ae.firstChild,ae.childNodes.length===1&&(ae=oe),oe||Y)){for(fe=y.map(ri(ae,"script"),Ii),Ne=fe.length;gt0&&ji(fe,!De&&ri(M,"script")),Ne},cleanData:function(M){for(var D,N,Y,ae=y.event.special,oe=0;(N=M[oe])!==void 0;oe++)if(be(N)){if(D=N[Se.expando]){if(D.events)for(Y in D.events)ae[Y]?y.event.remove(N,Y):y.removeEvent(N,Y,D.handle);N[Se.expando]=void 0}N[He.expando]&&(N[He.expando]=void 0)}}}),y.fn.extend({detach:function(M){return zi(this,M,!0)},remove:function(M){return zi(this,M)},text:function(M){return S(this,function(D){return D===void 0?y.text(this):this.empty().each(function(){(this.nodeType===1||this.nodeType===11||this.nodeType===9)&&(this.textContent=D)})},null,M,arguments.length)},append:function(){return Ci(this,arguments,function(M){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var D=Ai(this,M);D.appendChild(M)}})},prepend:function(){return Ci(this,arguments,function(M){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var D=Ai(this,M);D.insertBefore(M,D.firstChild)}})},before:function(){return Ci(this,arguments,function(M){this.parentNode&&this.parentNode.insertBefore(M,this)})},after:function(){return Ci(this,arguments,function(M){this.parentNode&&this.parentNode.insertBefore(M,this.nextSibling)})},empty:function(){for(var M,D=0;(M=this[D])!=null;D++)M.nodeType===1&&(y.cleanData(ri(M,!1)),M.textContent="");return this},clone:function(M,D){return M=M??!1,D=D??M,this.map(function(){return y.clone(this,M,D)})},html:function(M){return S(this,function(D){var N=this[0]||{},Y=0,ae=this.length;if(D===void 0&&N.nodeType===1)return N.innerHTML;if(typeof D=="string"&&!ot.test(D)&&!vi[(Yt.exec(D)||["",""])[1].toLowerCase()]){D=y.htmlPrefilter(D);try{for(;Y=0&&(De+=Math.max(0,Math.ceil(M["offset"+D[0].toUpperCase()+D.slice(1)]-oe-De-Ne-.5))||0),De+Ze}function dn(M,D,N){var Y=Ji(M),ae=!m.boxSizingReliable()||N,oe=ae&&y.css(M,"boxSizing",!1,Y)==="border-box",fe=oe,Ne=ua(M,D,Y),De="offset"+D[0].toUpperCase()+D.slice(1);if(en.test(Ne)){if(!N)return Ne;Ne="auto"}return(!m.boxSizingReliable()&&oe||!m.reliableTrDimensions()&&R(M,"tr")||Ne==="auto"||!parseFloat(Ne)&&y.css(M,"display",!1,Y)==="inline")&&M.getClientRects().length&&(oe=y.css(M,"boxSizing",!1,Y)==="border-box",fe=De in M,fe&&(Ne=M[De])),Ne=parseFloat(Ne)||0,Ne+Ei(M,D,N||(oe?"border":"content"),fe,Y,Ne)+"px"}y.extend({cssHooks:{opacity:{get:function(M,D){if(D){var N=ua(M,"opacity");return N===""?"1":N}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(M,D,N,Y){if(!(!M||M.nodeType===3||M.nodeType===8||!M.style)){var ae,oe,fe,Ne=ce(D),De=Un.test(D),Ze=M.style;if(De||(D=mo(Ne)),fe=y.cssHooks[D]||y.cssHooks[Ne],N!==void 0){if(oe=typeof N,oe==="string"&&(ae=ue.exec(N))&&ae[1]&&(N=We(M,D,ae),oe="number"),N==null||N!==N)return;oe==="number"&&!De&&(N+=ae&&ae[3]||(y.cssNumber[Ne]?"":"px")),!m.clearCloneStyle&&N===""&&D.indexOf("background")===0&&(Ze[D]="inherit"),(!fe||!("set"in fe)||(N=fe.set(M,N,Y))!==void 0)&&(De?Ze.setProperty(D,N):Ze[D]=N)}else return fe&&"get"in fe&&(ae=fe.get(M,!1,Y))!==void 0?ae:Ze[D]}},css:function(M,D,N,Y){var ae,oe,fe,Ne=ce(D),De=Un.test(D);return De||(D=mo(Ne)),fe=y.cssHooks[D]||y.cssHooks[Ne],fe&&"get"in fe&&(ae=fe.get(M,!0,N)),ae===void 0&&(ae=ua(M,D,Y)),ae==="normal"&&D in er&&(ae=er[D]),N===""||N?(oe=parseFloat(ae),N===!0||isFinite(oe)?oe||0:ae):ae}}),y.each(["height","width"],function(M,D){y.cssHooks[D]={get:function(N,Y,ae){if(Y)return Qo.test(y.css(N,"display"))&&(!N.getClientRects().length||!N.getBoundingClientRect().width)?jo(N,Io,function(){return dn(N,D,ae)}):dn(N,D,ae)},set:function(N,Y,ae){var oe,fe=Ji(N),Ne=!m.scrollboxSize()&&fe.position==="absolute",De=Ne||ae,Ze=De&&y.css(N,"boxSizing",!1,fe)==="border-box",gt=ae?Ei(N,D,ae,Ze,fe):0;return Ze&&Ne&&(gt-=Math.ceil(N["offset"+D[0].toUpperCase()+D.slice(1)]-parseFloat(fe[D])-Ei(N,D,"border",!1,fe)-.5)),gt&&(oe=ue.exec(Y))&&(oe[3]||"px")!=="px"&&(N.style[D]=Y,Y=y.css(N,D)),ui(N,Y,gt)}}}),y.cssHooks.marginLeft=jn(m.reliableMarginLeft,function(M,D){if(D)return(parseFloat(ua(M,"marginLeft"))||M.getBoundingClientRect().left-jo(M,{marginLeft:0},function(){return M.getBoundingClientRect().left}))+"px"}),y.each({margin:"",padding:"",border:"Width"},function(M,D){y.cssHooks[M+D]={expand:function(N){for(var Y=0,ae={},oe=typeof N=="string"?N.split(" "):[N];Y<4;Y++)ae[M+Fe[Y]+D]=oe[Y]||oe[Y-2]||oe[0];return ae}},M!=="margin"&&(y.cssHooks[M+D].set=ui)}),y.fn.extend({css:function(M,D){return S(this,function(N,Y,ae){var oe,fe,Ne={},De=0;if(Array.isArray(Y)){for(oe=Ji(N),fe=Y.length;De1)}});function ai(M,D,N,Y,ae){return new ai.prototype.init(M,D,N,Y,ae)}y.Tween=ai,ai.prototype={constructor:ai,init:function(M,D,N,Y,ae,oe){this.elem=M,this.prop=N,this.easing=ae||y.easing._default,this.options=D,this.start=this.now=this.cur(),this.end=Y,this.unit=oe||(y.cssNumber[N]?"":"px")},cur:function(){var M=ai.propHooks[this.prop];return M&&M.get?M.get(this):ai.propHooks._default.get(this)},run:function(M){var D,N=ai.propHooks[this.prop];return this.options.duration?this.pos=D=y.easing[this.easing](M,this.options.duration*M,0,1,this.options.duration):this.pos=D=M,this.now=(this.end-this.start)*D+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),N&&N.set?N.set(this):ai.propHooks._default.set(this),this}},ai.prototype.init.prototype=ai.prototype,ai.propHooks={_default:{get:function(M){var D;return M.elem.nodeType!==1||M.elem[M.prop]!=null&&M.elem.style[M.prop]==null?M.elem[M.prop]:(D=y.css(M.elem,M.prop,""),!D||D==="auto"?0:D)},set:function(M){y.fx.step[M.prop]?y.fx.step[M.prop](M):M.elem.nodeType===1&&(y.cssHooks[M.prop]||M.elem.style[mo(M.prop)]!=null)?y.style(M.elem,M.prop,M.now+M.unit):M.elem[M.prop]=M.now}}},ai.propHooks.scrollTop=ai.propHooks.scrollLeft={set:function(M){M.elem.nodeType&&M.elem.parentNode&&(M.elem[M.prop]=M.now)}},y.easing={linear:function(M){return M},swing:function(M){return .5-Math.cos(M*Math.PI)/2},_default:"swing"},y.fx=ai.prototype.init,y.fx.step={};var Xn,Ma,pc=/^(?:toggle|show|hide)$/,Rl=/queueHooks$/;function fs(){Ma&&(g.hidden===!1&&i.requestAnimationFrame?i.requestAnimationFrame(fs):i.setTimeout(fs,y.fx.interval),y.fx.tick())}function mc(){return i.setTimeout(function(){Xn=void 0}),Xn=Date.now()}function jl(M,D){var N,Y=0,ae={height:M};for(D=D?1:0;Y<4;Y+=2-D)N=Fe[Y],ae["margin"+N]=ae["padding"+N]=M;return D&&(ae.opacity=ae.width=M),ae}function fp(M,D,N){for(var Y,ae=(Dr.tweeners[D]||[]).concat(Dr.tweeners["*"]),oe=0,fe=ae.length;oe1)},removeAttr:function(M){return this.each(function(){y.removeAttr(this,M)})}}),y.extend({attr:function(M,D,N){var Y,ae,oe=M.nodeType;if(!(oe===3||oe===8||oe===2)){if(typeof M.getAttribute>"u")return y.prop(M,D,N);if((oe!==1||!y.isXMLDoc(M))&&(ae=y.attrHooks[D.toLowerCase()]||(y.expr.match.bool.test(D)?_c:void 0)),N!==void 0){if(N===null){y.removeAttr(M,D);return}return ae&&"set"in ae&&(Y=ae.set(M,N,D))!==void 0?Y:(M.setAttribute(D,N+""),N)}return ae&&"get"in ae&&(Y=ae.get(M,D))!==null?Y:(Y=y.find.attr(M,D),Y??void 0)}},attrHooks:{type:{set:function(M,D){if(!m.radioValue&&D==="radio"&&R(M,"input")){var N=M.value;return M.setAttribute("type",D),N&&(M.value=N),D}}}},removeAttr:function(M,D){var N,Y=0,ae=D&&D.match(Ue);if(ae&&M.nodeType===1)for(;N=ae[Y++];)M.removeAttribute(N)}}),_c={set:function(M,D,N){return D===!1?y.removeAttr(M,N):M.setAttribute(N,N),N}},y.each(y.expr.match.bool.source.match(/\w+/g),function(M,D){var N=js[D]||y.find.attr;js[D]=function(Y,ae,oe){var fe,Ne,De=ae.toLowerCase();return oe||(Ne=js[De],js[De]=fe,fe=N(Y,ae,oe)!=null?De:null,js[De]=Ne),fe}});var Vt=/^(?:input|select|textarea|button)$/i,Ce=/^(?:a|area)$/i;y.fn.extend({prop:function(M,D){return S(this,y.prop,M,D,arguments.length>1)},removeProp:function(M){return this.each(function(){delete this[y.propFix[M]||M]})}}),y.extend({prop:function(M,D,N){var Y,ae,oe=M.nodeType;if(!(oe===3||oe===8||oe===2))return(oe!==1||!y.isXMLDoc(M))&&(D=y.propFix[D]||D,ae=y.propHooks[D]),N!==void 0?ae&&"set"in ae&&(Y=ae.set(M,N,D))!==void 0?Y:M[D]=N:ae&&"get"in ae&&(Y=ae.get(M,D))!==null?Y:M[D]},propHooks:{tabIndex:{get:function(M){var D=y.find.attr(M,"tabindex");return D?parseInt(D,10):Vt.test(M.nodeName)||Ce.test(M.nodeName)&&M.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(y.propHooks.selected={get:function(M){var D=M.parentNode;return D&&D.parentNode&&D.parentNode.selectedIndex,null},set:function(M){var D=M.parentNode;D&&(D.selectedIndex,D.parentNode&&D.parentNode.selectedIndex)}}),y.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){y.propFix[this.toLowerCase()]=this});function nt(M){var D=M.match(Ue)||[];return D.join(" ")}function Mt(M){return M.getAttribute&&M.getAttribute("class")||""}function pi(M){return Array.isArray(M)?M:typeof M=="string"?M.match(Ue)||[]:[]}y.fn.extend({addClass:function(M){var D,N,Y,ae,oe,fe;return _(M)?this.each(function(Ne){y(this).addClass(M.call(this,Ne,Mt(this)))}):(D=pi(M),D.length?this.each(function(){if(Y=Mt(this),N=this.nodeType===1&&" "+nt(Y)+" ",N){for(oe=0;oe-1;)N=N.replace(" "+ae+" "," ");fe=nt(N),Y!==fe&&this.setAttribute("class",fe)}}):this):this.attr("class","")},toggleClass:function(M,D){var N,Y,ae,oe,fe=typeof M,Ne=fe==="string"||Array.isArray(M);return _(M)?this.each(function(De){y(this).toggleClass(M.call(this,De,Mt(this),D),D)}):typeof D=="boolean"&&Ne?D?this.addClass(M):this.removeClass(M):(N=pi(M),this.each(function(){if(Ne)for(oe=y(this),ae=0;ae-1)return!0;return!1}});var Fi=/\r/g;y.fn.extend({val:function(M){var D,N,Y,ae=this[0];return arguments.length?(Y=_(M),this.each(function(oe){var fe;this.nodeType===1&&(Y?fe=M.call(this,oe,y(this).val()):fe=M,fe==null?fe="":typeof fe=="number"?fe+="":Array.isArray(fe)&&(fe=y.map(fe,function(Ne){return Ne==null?"":Ne+""})),D=y.valHooks[this.type]||y.valHooks[this.nodeName.toLowerCase()],(!D||!("set"in D)||D.set(this,fe,"value")===void 0)&&(this.value=fe))})):ae?(D=y.valHooks[ae.type]||y.valHooks[ae.nodeName.toLowerCase()],D&&"get"in D&&(N=D.get(ae,"value"))!==void 0?N:(N=ae.value,typeof N=="string"?N.replace(Fi,""):N??"")):void 0}}),y.extend({valHooks:{option:{get:function(M){var D=y.find.attr(M,"value");return D??nt(y.text(M))}},select:{get:function(M){var D,N,Y,ae=M.options,oe=M.selectedIndex,fe=M.type==="select-one",Ne=fe?null:[],De=fe?oe+1:ae.length;for(oe<0?Y=De:Y=fe?oe:0;Y-1)&&(N=!0);return N||(M.selectedIndex=-1),oe}}}}),y.each(["radio","checkbox"],function(){y.valHooks[this]={set:function(M,D){if(Array.isArray(D))return M.checked=y.inArray(y(M).val(),D)>-1}},m.checkOn||(y.valHooks[this].get=function(M){return M.getAttribute("value")===null?"on":M.value})});var Di=i.location,ka={guid:Date.now()},Qa=/\?/;y.parseXML=function(M){var D,N;if(!M||typeof M!="string")return null;try{D=new i.DOMParser().parseFromString(M,"text/xml")}catch{}return N=D&&D.getElementsByTagName("parsererror")[0],(!D||N)&&y.error("Invalid XML: "+(N?y.map(N.childNodes,function(Y){return Y.textContent}).join(` +`):M)),D};var lr=/^(?:focusinfocus|focusoutblur)$/,eo=function(M){M.stopPropagation()};y.extend(y.event,{trigger:function(M,D,N,Y){var ae,oe,fe,Ne,De,Ze,gt,wt,rt=[N||g],Pt=d.call(M,"type")?M.type:M,qi=d.call(M,"namespace")?M.namespace.split("."):[];if(oe=wt=fe=N=N||g,!(N.nodeType===3||N.nodeType===8)&&!lr.test(Pt+y.event.triggered)&&(Pt.indexOf(".")>-1&&(qi=Pt.split("."),Pt=qi.shift(),qi.sort()),De=Pt.indexOf(":")<0&&"on"+Pt,M=M[y.expando]?M:new y.Event(Pt,typeof M=="object"&&M),M.isTrigger=Y?2:3,M.namespace=qi.join("."),M.rnamespace=M.namespace?new RegExp("(^|\\.)"+qi.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,M.result=void 0,M.target||(M.target=N),D=D==null?[M]:y.makeArray(D,[M]),gt=y.event.special[Pt]||{},!(!Y&>.trigger&>.trigger.apply(N,D)===!1))){if(!Y&&!gt.noBubble&&!f(N)){for(Ne=gt.delegateType||Pt,lr.test(Ne+Pt)||(oe=oe.parentNode);oe;oe=oe.parentNode)rt.push(oe),fe=oe;fe===(N.ownerDocument||g)&&rt.push(fe.defaultView||fe.parentWindow||i)}for(ae=0;(oe=rt[ae++])&&!M.isPropagationStopped();)wt=oe,M.type=ae>1?Ne:gt.bindType||Pt,Ze=(Se.get(oe,"events")||Object.create(null))[M.type]&&Se.get(oe,"handle"),Ze&&Ze.apply(oe,D),Ze=De&&oe[De],Ze&&Ze.apply&&be(oe)&&(M.result=Ze.apply(oe,D),M.result===!1&&M.preventDefault());return M.type=Pt,!Y&&!M.isDefaultPrevented()&&(!gt._default||gt._default.apply(rt.pop(),D)===!1)&&be(N)&&De&&_(N[Pt])&&!f(N)&&(fe=N[De],fe&&(N[De]=null),y.event.triggered=Pt,M.isPropagationStopped()&&wt.addEventListener(Pt,eo),N[Pt](),M.isPropagationStopped()&&wt.removeEventListener(Pt,eo),y.event.triggered=void 0,fe&&(N[De]=fe)),M.result}},simulate:function(M,D,N){var Y=y.extend(new y.Event,N,{type:M,isSimulated:!0});y.event.trigger(Y,null,D)}}),y.fn.extend({trigger:function(M,D){return this.each(function(){y.event.trigger(M,D,this)})},triggerHandler:function(M,D){var N=this[0];if(N)return y.event.trigger(M,D,N,!0)}});var ta=/\[\]$/,to=/\r?\n/g,Sf=/^(?:submit|button|image|reset|file)$/i,zy=/^(?:input|select|textarea|keygen)/i;function zf(M,D,N,Y){var ae;if(Array.isArray(D))y.each(D,function(oe,fe){N||ta.test(M)?Y(M,fe):zf(M+"["+(typeof fe=="object"&&fe!=null?oe:"")+"]",fe,N,Y)});else if(!N&&x(D)==="object")for(ae in D)zf(M+"["+ae+"]",D[ae],N,Y);else Y(M,D)}y.param=function(M,D){var N,Y=[],ae=function(oe,fe){var Ne=_(fe)?fe():fe;Y[Y.length]=encodeURIComponent(oe)+"="+encodeURIComponent(Ne??"")};if(M==null)return"";if(Array.isArray(M)||M.jquery&&!y.isPlainObject(M))y.each(M,function(){ae(this.name,this.value)});else for(N in M)zf(N,M[N],D,ae);return Y.join("&")},y.fn.extend({serialize:function(){return y.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var M=y.prop(this,"elements");return M?y.makeArray(M):this}).filter(function(){var M=this.type;return this.name&&!y(this).is(":disabled")&&zy.test(this.nodeName)&&!Sf.test(M)&&(this.checked||!Xt.test(M))}).map(function(M,D){var N=y(this).val();return N==null?null:Array.isArray(N)?y.map(N,function(Y){return{name:D.name,value:Y.replace(to,`\r +`)}}):{name:D.name,value:N.replace(to,`\r +`)}}).get()}});var H1=/%20/g,G1=/#.*$/,Ey=/([?&])_=[^&]*/,Ef=/^(.*?):[ \t]*([^\r\n]*)$/mg,My=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,sd=/^(?:GET|HEAD)$/,Ty=/^\/\//,Mf={},gp={},Tf="*/".concat("*"),Xr=g.createElement("a");Xr.href=Di.href;function cl(M){return function(D,N){typeof D!="string"&&(N=D,D="*");var Y,ae=0,oe=D.toLowerCase().match(Ue)||[];if(_(N))for(;Y=oe[ae++];)Y[0]==="+"?(Y=Y.slice(1)||"*",(M[Y]=M[Y]||[]).unshift(N)):(M[Y]=M[Y]||[]).push(N)}}function r_(M,D,N,Y){var ae={},oe=M===gp;function fe(Ne){var De;return ae[Ne]=!0,y.each(M[Ne]||[],function(Ze,gt){var wt=gt(D,N,Y);if(typeof wt=="string"&&!oe&&!ae[wt])return D.dataTypes.unshift(wt),fe(wt),!1;if(oe)return!(De=wt)}),De}return fe(D.dataTypes[0])||!ae["*"]&&fe("*")}function Qd(M,D){var N,Y,ae=y.ajaxSettings.flatOptions||{};for(N in D)D[N]!==void 0&&((ae[N]?M:Y||(Y={}))[N]=D[N]);return Y&&y.extend(!0,M,Y),M}function Af(M,D,N){for(var Y,ae,oe,fe,Ne=M.contents,De=M.dataTypes;De[0]==="*";)De.shift(),Y===void 0&&(Y=M.mimeType||D.getResponseHeader("Content-Type"));if(Y){for(ae in Ne)if(Ne[ae]&&Ne[ae].test(Y)){De.unshift(ae);break}}if(De[0]in N)oe=De[0];else{for(ae in N){if(!De[0]||M.converters[ae+" "+De[0]]){oe=ae;break}fe||(fe=ae)}oe=oe||fe}if(oe)return oe!==De[0]&&De.unshift(oe),N[oe]}function Cf(M,D,N,Y){var ae,oe,fe,Ne,De,Ze={},gt=M.dataTypes.slice();if(gt[1])for(fe in M.converters)Ze[fe.toLowerCase()]=M.converters[fe];for(oe=gt.shift();oe;)if(M.responseFields[oe]&&(N[M.responseFields[oe]]=D),!De&&Y&&M.dataFilter&&(D=M.dataFilter(D,M.dataType)),De=oe,oe=gt.shift(),oe){if(oe==="*")oe=De;else if(De!=="*"&&De!==oe){if(fe=Ze[De+" "+oe]||Ze["* "+oe],!fe){for(ae in Ze)if(Ne=ae.split(" "),Ne[1]===oe&&(fe=Ze[De+" "+Ne[0]]||Ze["* "+Ne[0]],fe)){fe===!0?fe=Ze[ae]:Ze[ae]!==!0&&(oe=Ne[0],gt.unshift(Ne[1]));break}}if(fe!==!0)if(fe&&M.throws)D=fe(D);else try{D=fe(D)}catch(wt){return{state:"parsererror",error:fe?wt:"No conversion from "+De+" to "+oe}}}}return{state:"success",data:D}}y.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Di.href,type:"GET",isLocal:My.test(Di.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Tf,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":y.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(M,D){return D?Qd(Qd(M,y.ajaxSettings),D):Qd(y.ajaxSettings,M)},ajaxPrefilter:cl(Mf),ajaxTransport:cl(gp),ajax:function(M,D){typeof M=="object"&&(D=M,M=void 0),D=D||{};var N,Y,ae,oe,fe,Ne,De,Ze,gt,wt,rt=y.ajaxSetup({},D),Pt=rt.context||rt,qi=rt.context&&(Pt.nodeType||Pt.jquery)?y(Pt):y.event,Cn=y.Deferred(),tn=y.Callbacks("once memory"),tr=rt.statusCode||{},La={},dl={},Is="canceled",hn={readyState:0,getResponseHeader:function(Dn){var Na;if(De){if(!oe)for(oe={};Na=Ef.exec(ae);)oe[Na[1].toLowerCase()+" "]=(oe[Na[1].toLowerCase()+" "]||[]).concat(Na[2]);Na=oe[Dn.toLowerCase()+" "]}return Na==null?null:Na.join(", ")},getAllResponseHeaders:function(){return De?ae:null},setRequestHeader:function(Dn,Na){return De==null&&(Dn=dl[Dn.toLowerCase()]=dl[Dn.toLowerCase()]||Dn,La[Dn]=Na),this},overrideMimeType:function(Dn){return De==null&&(rt.mimeType=Dn),this},statusCode:function(Dn){var Na;if(Dn)if(De)hn.always(Dn[hn.status]);else for(Na in Dn)tr[Na]=[tr[Na],Dn[Na]];return this},abort:function(Dn){var Na=Dn||Is;return N&&N.abort(Na),Do(0,Na),this}};if(Cn.promise(hn),rt.url=((M||rt.url||Di.href)+"").replace(Ty,Di.protocol+"//"),rt.type=D.method||D.type||rt.method||rt.type,rt.dataTypes=(rt.dataType||"*").toLowerCase().match(Ue)||[""],rt.crossDomain==null){Ne=g.createElement("a");try{Ne.href=rt.url,Ne.href=Ne.href,rt.crossDomain=Xr.protocol+"//"+Xr.host!=Ne.protocol+"//"+Ne.host}catch{rt.crossDomain=!0}}if(rt.data&&rt.processData&&typeof rt.data!="string"&&(rt.data=y.param(rt.data,rt.traditional)),r_(Mf,rt,D,hn),De)return hn;Ze=y.event&&rt.global,Ze&&y.active++===0&&y.event.trigger("ajaxStart"),rt.type=rt.type.toUpperCase(),rt.hasContent=!sd.test(rt.type),Y=rt.url.replace(G1,""),rt.hasContent?rt.data&&rt.processData&&(rt.contentType||"").indexOf("application/x-www-form-urlencoded")===0&&(rt.data=rt.data.replace(H1,"+")):(wt=rt.url.slice(Y.length),rt.data&&(rt.processData||typeof rt.data=="string")&&(Y+=(Qa.test(Y)?"&":"?")+rt.data,delete rt.data),rt.cache===!1&&(Y=Y.replace(Ey,"$1"),wt=(Qa.test(Y)?"&":"?")+"_="+ka.guid+++wt),rt.url=Y+wt),rt.ifModified&&(y.lastModified[Y]&&hn.setRequestHeader("If-Modified-Since",y.lastModified[Y]),y.etag[Y]&&hn.setRequestHeader("If-None-Match",y.etag[Y])),(rt.data&&rt.hasContent&&rt.contentType!==!1||D.contentType)&&hn.setRequestHeader("Content-Type",rt.contentType),hn.setRequestHeader("Accept",rt.dataTypes[0]&&rt.accepts[rt.dataTypes[0]]?rt.accepts[rt.dataTypes[0]]+(rt.dataTypes[0]!=="*"?", "+Tf+"; q=0.01":""):rt.accepts["*"]);for(gt in rt.headers)hn.setRequestHeader(gt,rt.headers[gt]);if(rt.beforeSend&&(rt.beforeSend.call(Pt,hn,rt)===!1||De))return hn.abort();if(Is="abort",tn.add(rt.complete),hn.done(rt.success),hn.fail(rt.error),N=r_(gp,rt,D,hn),!N)Do(-1,"No Transport");else{if(hn.readyState=1,Ze&&qi.trigger("ajaxSend",[hn,rt]),De)return hn;rt.async&&rt.timeout>0&&(fe=i.setTimeout(function(){hn.abort("timeout")},rt.timeout));try{De=!1,N.send(La,Do)}catch(Dn){if(De)throw Dn;Do(-1,Dn)}}function Do(Dn,Na,bp,Bf){var ul,yp,pl,hc,fc,gs=Na;De||(De=!0,fe&&i.clearTimeout(fe),N=void 0,ae=Bf||"",hn.readyState=Dn>0?4:0,ul=Dn>=200&&Dn<300||Dn===304,bp&&(hc=Af(rt,hn,bp)),!ul&&y.inArray("script",rt.dataTypes)>-1&&y.inArray("json",rt.dataTypes)<0&&(rt.converters["text script"]=function(){}),hc=Cf(rt,hc,hn,ul),ul?(rt.ifModified&&(fc=hn.getResponseHeader("Last-Modified"),fc&&(y.lastModified[Y]=fc),fc=hn.getResponseHeader("etag"),fc&&(y.etag[Y]=fc)),Dn===204||rt.type==="HEAD"?gs="nocontent":Dn===304?gs="notmodified":(gs=hc.state,yp=hc.data,pl=hc.error,ul=!pl)):(pl=gs,(Dn||!gs)&&(gs="error",Dn<0&&(Dn=0))),hn.status=Dn,hn.statusText=(Na||gs)+"",ul?Cn.resolveWith(Pt,[yp,gs,hn]):Cn.rejectWith(Pt,[hn,gs,pl]),hn.statusCode(tr),tr=void 0,Ze&&qi.trigger(ul?"ajaxSuccess":"ajaxError",[hn,rt,ul?yp:pl]),tn.fireWith(Pt,[hn,gs]),Ze&&(qi.trigger("ajaxComplete",[hn,rt]),--y.active||y.event.trigger("ajaxStop")))}return hn},getJSON:function(M,D,N){return y.get(M,D,N,"json")},getScript:function(M,D){return y.get(M,void 0,D,"script")}}),y.each(["get","post"],function(M,D){y[D]=function(N,Y,ae,oe){return _(Y)&&(oe=oe||ae,ae=Y,Y=void 0),y.ajax(y.extend({url:N,type:D,dataType:oe,data:Y,success:ae},y.isPlainObject(N)&&N))}}),y.ajaxPrefilter(function(M){var D;for(D in M.headers)D.toLowerCase()==="content-type"&&(M.contentType=M.headers[D]||"")}),y._evalUrl=function(M,D,N){return y.ajax({url:M,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(Y){y.globalEval(Y,D,N)}})},y.fn.extend({wrapAll:function(M){var D;return this[0]&&(_(M)&&(M=M.call(this[0])),D=y(M,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&D.insertBefore(this[0]),D.map(function(){for(var N=this;N.firstElementChild;)N=N.firstElementChild;return N}).append(this)),this},wrapInner:function(M){return _(M)?this.each(function(D){y(this).wrapInner(M.call(this,D))}):this.each(function(){var D=y(this),N=D.contents();N.length?N.wrapAll(M):D.append(M)})},wrap:function(M){var D=_(M);return this.each(function(N){y(this).wrapAll(D?M.call(this,N):M)})},unwrap:function(M){return this.parent(M).not("body").each(function(){y(this).replaceWith(this.childNodes)}),this}}),y.expr.pseudos.hidden=function(M){return!y.expr.pseudos.visible(M)},y.expr.pseudos.visible=function(M){return!!(M.offsetWidth||M.offsetHeight||M.getClientRects().length)},y.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch{}};var eu={0:200,1223:204},tu=y.ajaxSettings.xhr();m.cors=!!tu&&"withCredentials"in tu,m.ajax=tu=!!tu,y.ajaxTransport(function(M){var D,N;if(m.cors||tu&&!M.crossDomain)return{send:function(Y,ae){var oe,fe=M.xhr();if(fe.open(M.type,M.url,M.async,M.username,M.password),M.xhrFields)for(oe in M.xhrFields)fe[oe]=M.xhrFields[oe];M.mimeType&&fe.overrideMimeType&&fe.overrideMimeType(M.mimeType),!M.crossDomain&&!Y["X-Requested-With"]&&(Y["X-Requested-With"]="XMLHttpRequest");for(oe in Y)fe.setRequestHeader(oe,Y[oe]);D=function(Ne){return function(){D&&(D=N=fe.onload=fe.onerror=fe.onabort=fe.ontimeout=fe.onreadystatechange=null,Ne==="abort"?fe.abort():Ne==="error"?typeof fe.status!="number"?ae(0,"error"):ae(fe.status,fe.statusText):ae(eu[fe.status]||fe.status,fe.statusText,(fe.responseType||"text")!=="text"||typeof fe.responseText!="string"?{binary:fe.response}:{text:fe.responseText},fe.getAllResponseHeaders()))}},fe.onload=D(),N=fe.onerror=fe.ontimeout=D("error"),fe.onabort!==void 0?fe.onabort=N:fe.onreadystatechange=function(){fe.readyState===4&&i.setTimeout(function(){D&&N()})},D=D("abort");try{fe.send(M.hasContent&&M.data||null)}catch(Ne){if(D)throw Ne}},abort:function(){D&&D()}}}),y.ajaxPrefilter(function(M){M.crossDomain&&(M.contents.script=!1)}),y.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(M){return y.globalEval(M),M}}}),y.ajaxPrefilter("script",function(M){M.cache===void 0&&(M.cache=!1),M.crossDomain&&(M.type="GET")}),y.ajaxTransport("script",function(M){if(M.crossDomain||M.scriptAttrs){var D,N;return{send:function(Y,ae){D=y(" + +`]},media:void 0})},$ae=void 0,Yae=void 0,Xae=!1;function Jae(i,e,t,n,a,o,r,s,l,c){let d=(typeof t=="function"?t.options:t)||{};d.__file="js/texturing/ColorPickerNormal.vue",d.render||(d.render=i.render,d.staticRenderFns=i.staticRenderFns,d._compiled=!0,a&&(d.functional=!0)),d._scopeId=n;{let u;if(e&&(u=r?function(p){e.call(this,c(p,this.$root.$options.shadowRoot))}:function(p){e.call(this,s(p))}),u!==void 0)if(d.functional){let p=d.render;d.render=function(_,f){return u.call(f),p(_,f)}}else{let p=d.beforeCreate;d.beforeCreate=p?[].concat(p,u):[u]}}return d}function WC(){let i=WC.styles||(WC.styles={}),e=typeof navigator<"u"&&/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());return function(n,a){if(document.querySelector('style[data-vue-ssr-id~="'+n+'"]'))return;let o=e?a.media||"default":n,r=i[o]||(i[o]={ids:[],parts:[],element:void 0});if(!r.ids.includes(n)){let s=a.source,l=r.ids.length;if(r.ids.push(n),e&&(r.element=r.element||document.querySelector("style[data-group="+o+"]")),!r.element){let c=document.head||document.getElementsByTagName("head")[0],d=r.element=document.createElement("style");d.type="text/css",a.media&&d.setAttribute("media",a.media),e&&(d.setAttribute("data-group",o),d.setAttribute("data-next-index","0")),c.appendChild(d)}if(e&&(l=parseInt(r.element.getAttribute("data-next-index")),r.element.setAttribute("data-next-index",l+1)),r.element.styleSheet)r.parts.push(s),r.element.styleSheet.cssText=r.parts.filter(Boolean).join(` +`);else{let c=document.createTextNode(s),d=r.element.childNodes;d[l]&&r.element.removeChild(d[l]),d.length?r.element.insertBefore(c,d[l]):r.element.appendChild(c)}}}}var Zae=Jae({render:E5,staticRenderFns:Wae},Kae,qae,$ae,Xae,Yae,!1,WC,void 0,void 0),M5=Zae;StateMemory.init("color_palettes","array");var j1={default:["#1a1a1b","#353637","#464849","#5d5f60","#757677","#868788","#979b9d","#b8bdbe","#dadedf","#ffffff","#9a080f","#b40a1a","#d21129","#ef2142","#ff5774","#bb7907","#cc9104","#edb508","#fcd720","#fef364","#0d7e36","#12933d","#11aa38","#1cc93d","#29e64d","#044b8f","#0955a8","#126bc3","#1782db","#339afc","#cd3e00","#e65b00","#f37800","#f89520","#fdaf40","#02a8c1","#0cc3ca","#17d1c7","#38debd","#5be9b7"],material:["#ffebee","#ffcdd2","#ef9a9a","#e57373","#ef5350","#f44336","#e53935","#d32f2f","#c62828","#b71c1c","#ff5252","#ff1744","#fce4ec","#f8bbd0","#f48fb1","#f06292","#ec407a","#e91e63","#d81b60","#c2185b","#ad1457","#880e4f","#ff4081","#f50057","#f3e5f5","#e1bee7","#ce93d8","#ba68c8","#ab47bc","#9c27b0","#8e24aa","#7b1fa2","#6a1b9a","#4a148c","#e040fb","#d500f9","#ede7f6","#d1c4e9","#b39ddb","#9575cd","#7e57c2","#673ab7","#5e35b1","#512da8","#4527a0","#311b92","#7c4dff","#651fff","#e8eaf6","#c5cae9","#9fa8da","#7986cb","#5c6bc0","#3f51b5","#3949ab","#303f9f","#283593","#1a237e","#536dfe","#3d5afe","#e3f2fd","#bbdefb","#90caf9","#64b5f6","#42a5f5","#2196f3","#1e88e5","#1976d2","#1565c0","#0d47a1","#448aff","#2979ff","#e1f5fe","#b3e5fc","#81d4fa","#4fc3f7","#29b6f6","#03a9f4","#039be5","#0288d1","#0277bd","#01579b","#40c4ff","#00b0ff","#e0f7fa","#b2ebf2","#80deea","#4dd0e1","#26c6da","#00bcd4","#00acc1","#0097a7","#00838f","#006064","#18ffff","#00e5ff","#e0f2f1","#b2dfdb","#80cbc4","#4db6ac","#26a69a","#009688","#00897b","#00796b","#00695c","#004d40","#64ffda","#1de9b6","#e8f5e9","#c8e6c9","#a5d6a7","#81c784","#66bb6a","#4caf50","#43a047","#388e3c","#2e7d32","#1b5e20","#69f0ae","#00e676","#f1f8e9","#dcedc8","#c5e1a5","#aed581","#9ccc65","#8bc34a","#7cb342","#689f38","#558b2f","#33691e","#b2ff59","#76ff03","#f9fbe7","#f0f4c3","#e6ee9c","#dce775","#d4e157","#cddc39","#c0ca33","#afb42b","#9e9d24","#827717","#eeff41","#c6ff00","#fffde7","#fff9c4","#fff59d","#fff176","#ffee58","#ffeb3b","#fdd835","#fbc02d","#f9a825","#f57f17","#ffff00","#ffea00","#fff8e1","#ffecb3","#ffe082","#ffd54f","#ffca28","#ffc107","#ffb300","#ffa000","#ff8f00","#ff6f00","#ffd740","#ffc400","#fff3e0","#ffe0b2","#ffcc80","#ffb74d","#ffa726","#ff9800","#fb8c00","#f57c00","#ef6c00","#e65100","#ffab40","#ff9100","#fbe9e7","#ffccbc","#ffab91","#ff8a65","#ff7043","#ff5722","#f4511e","#e64a19","#d84315","#bf360c","#ff6e40","#ff3d00","#efebe9","#d7ccc8","#bcaaa4","#a1887f","#8d6e63","#795548","#6d4c41","#5d4037","#4e342e","#3e2723","#6d422d","#593022","#fafafa","#f5f5f5","#eeeeee","#e0e0e0","#bdbdbd","#9e9e9e","#757575","#616161","#424242","#212121","#ffffff","#000000","#eceff1","#cfd8dc","#b0bec5","#90a4ae","#78909c","#607d8b","#546e7a","#455a64","#37474f","#263238"],endesga64:["#ff0040","#131313","#1b1b1b","#272727","#3d3d3d","#5d5d5d","#858585","#b4b4b4","#ffffff","#c7cfdd","#92a1b9","#657392","#424c6e","#2a2f4e","#1a1932","#0e071b","#1c121c","#391f21","#5d2c28","#8a4836","#bf6f4a","#e69c69","#f6ca9f","#f9e6cf","#edab50","#e07438","#c64524","#8e251d","#ff5000","#ed7614","#ffa214","#ffc825","#ffeb57","#d3fc7e","#99e65f","#5ac54f","#33984b","#1e6f50","#134c4c","#0c2e44","#00396d","#0069aa","#0098dc","#00cdf9","#0cf1ff","#94fdff","#fdd2ed","#f389f5","#db3ffd","#7a09fa","#3003d9","#0c0293","#03193f","#3b1443","#622461","#93388f","#ca52c9","#c85086","#f68187","#f5555d","#ea323c","#c42430","#891e2b","#571c27"]},rd=localStorage.getItem("colors");if(rd)try{rd=JSON.parse(rd)}catch{rd=null}StateMemory.init("color_picker_tab","string");StateMemory.init("color_picker_rgb","boolean");StateMemory.init("color_palette_locked","boolean");var jt={updateFromHsv:function(){jt.panel.vue.editing_hsv=!0,jt.change({h:jt.panel.vue._data.hsv.h,s:jt.panel.vue._data.hsv.s/100,v:jt.panel.vue._data.hsv.v/100})},hexToHsv(i){var e=new tinycolor(i),t=e.toHsv();return{h:t.h,s:t.s*100,v:t.v*100}},addToHistory(i){i=i.toLowerCase();var e=jt.panel.vue._data.history;if(i!=e[0]&&i.match(/#[a-f0-9]{6}/g)){var t=18;e.remove(i),e.splice(0,0,i),e.length>t&&(e.length=t);let n=document.getElementById("color_history");n&&(n.scrollLeft=0),jt.saveLocalStorages()}},change(i,e){var t=new tinycolor(i);jt.panel.vue[e?"second_color":"main_color"]=t.toHexString()},set(i,e,t){jt.change(i,e),jt.addToHistory(jt.panel.vue.main_color)},get(i){let e=i?jt.panel.vue.second_color:jt.panel.vue.main_color;return jt.addToHistory(e),e},saveLocalStorages(){localStorage.setItem("colors",JSON.stringify({palette:jt.palette,history:jt.panel.vue._data.history}))},importPalette(i){let e=pathToExtension(i.path);if(e=="png"){var t=new Image;t.src=i.content||i.path.replace(/#/g,"%23"),t.onload=function(){var d=document.createElement("canvas"),u=d.getContext("2d");d.width=t.naturalWidth,d.height=t.naturalHeight,u.drawImage(t,0,0),jt.generatePalette(u,!1)};return}var n=[];if(e==="ase"){let d=i.content,u=Buffer.from(d),p=u.toString("utf-8",0,4),m=u.slice(4,6).readInt16BE(0),_=u.slice(6,8).readInt16BE(0),f=u.slice(8,12).readInt32BE(0);if(u.length>12&&p!=="ASEF"&&m!==1&&_!==0){console.log("Invalid ASE swatch file");return}let g=12;for(;gm*10+8&&u.slice(4+m*10,6+m*10).readUInt16BE(0)===2&&u.slice(6+m*10,8+m*10).readUInt16BE(0)===m)for(_=4+m*10+4,p===2&&(_=4);_{d=d.substr(-6).toLowerCase(),n.safePush("#"+d)});var s=o.match(/\(\s*\d{1,3},\s*\d{1,3},\s*\d{1,3}\s*\)/g);s&&s.forEach(d=>{d=tinycolor("rgb"+d),n.safePush(d.toHexString())});var l=o.match(/\n\s*\d{1,3}\s+\d{1,3}\s+\d{1,3}/g);l&&l.forEach(d=>{d=tinycolor(`rgb(${d.replace(/^[\n\s]*/,"").replace(/\s+/g,",")})`),n.safePush(d.toHexString())})}if(jt.palette.length){var c=new Dialog({id:"palette_import",title:"action.import_palette",width:400,form:{replace:{label:"message.import_palette.replace_palette",type:"checkbox",value:!0}},onConfirm(d){d.replace?(jt.palette.purge(),jt.palette.push(...n)):n.forEach(u=>{jt.palette.safePush(u)}),jt.saveLocalStorages(),c.hide()}});c.show()}else n.forEach(d=>{jt.palette.push(d)}),jt.saveLocalStorages()},generatePalette(i,e=!0){var t={};let n;i||Texture.all.forEach((o,r)=>{o.error||(t[r]=o.name,o.selected&&(n=r))});var a=new Dialog({id:"generate_palette",title:"action.import_palette",width:460,form:{texture:{label:"data.texture",type:"select",options:t,value:n,condition:!i},selection_only:{label:"message.import_palette.selection_only",type:"checkbox",value:!1,condition:Texture.all[n]?.selection?.is_custom},replace:{label:"message.import_palette.replace_palette",type:"checkbox",value:!0},threshold:{label:"message.import_palette.threshold",type:"number",value:10,min:0,max:100,condition:e}},onConfirm(o){var r={},s=[];if(i)var c=i;else var l=Texture.all[o.texture],c=Painter.getCanvas(l).getContext("2d");if(Painter.scanCanvas(c,0,0,c.canvas.width,c.canvas.height,(w,E,y)=>{if(!(y[3]<12)&&!(o.selection_only&&l.selection.is_custom&&!l.selection.get(w,E))){var A=tinycolor({r:y[0],g:y[1],b:y[2]}),R=A.toHexString();r[R]?r[R].count++:(r[R]=A,A.count=1)}}),e){var d={gray:[],red:[],orange:[],yellow:[],green:[],blue:[],magenta:[]};for(var u in r){var p=r[u];if(Math.abs(p._r-p._g)+Math.abs(p._g-p._b)+Math.abs(p._r-p._b)<74)d.gray.push(p);else{var m={red:Wr(p,{_r:250,_g:0,_b:0}),orange:Wr(p,{_r:240,_g:127,_b:0})*1.4,yellow:Wr(p,{_r:265,_g:240,_b:0})*1.4,green:Wr(p,{_r:0,_g:255,_b:0}),blue:Wr(p,{_r:0,_g:50,_b:240}),magenta:Wr(p,{_r:255,_g:0,_b:255})*1.4},_=highestInObject(m,!0);d[_].push(p)}}for(var f in d){if(d[f].sort((w,E)=>w._r+w._g+w._b-(E._r+E._g+E._b)),d[f].length>1)for(var g=d[f].length-2;g>=0;g--){var v=d[f][g],b=d[f][g+1],x=Wr(v,b);x{s.push(w.toHexString())})}}else for(var u in r)s.push(u);o.replace?(jt.palette.purge(),jt.palette.push(...s)):s.forEach(w=>{jt.palette.safePush(w)}),jt.saveLocalStorages(),a.hide()}});a.show()}};he.addDragHandler("palette",{extensions:["gpl","css","txt","hex","png","aco","act","ase","bbpalette"],readtype:i=>{switch(pathToExtension(i)){case"png":return"image";case"ase":return"binary";case"act":return"binary";case"aco":return"binary";default:return"text"}},element:"#color",propagate:!0},function(i){i&&i[0]&&jt.importPalette(i[0])});SharedActions.add("delete",{condition:()=>Prop.active_panel=="palette",run(){if(StateMemory.color_palette_locked){he.showQuickMessage("message.palette_locked");return}jt.palette.includes(jt.panel.vue.selected_color)&&(jt.palette.remove(jt.panel.vue.selected_color),jt.saveLocalStorages())}});Interface.definePanels(()=>{jt.panel=new Panel("color",{icon:"palette",condition:{modes:["paint"]},default_position:{slot:"right_bar",float_position:[0,0],float_size:[300,400],height:400,sidebar_index:4},toolbars:[new Toolbar("color_picker",{children:["slider_color_h","slider_color_s","slider_color_v","slider_color_red","slider_color_green","slider_color_blue","add_to_palette","pick_screen_color"]})],onResize(){Panels.color.vue.width=0,Vue.nextTick(()=>{let i=this.vue.$refs.square_picker.style.display;if(this.vue.$refs.square_picker.style.display="none",Panels.color.vue.width=Math.clamp(this.width,100,1e3),!this.isInSidebar())if(this.vue.picker_type=="box"){let e=this.height-this.vue.$el.clientHeight-this.handle.clientHeight-6;Panels.color.vue.picker_height=Math.clamp(e,100,1e3)}else{let e=Math.min(1e3,(this.height-this.vue.$el.clientHeight-this.handle.clientHeight)*(this.vue.picker_type=="box"?1.25:1));Interface.Panels.color.vue.width=Math.clamp(this.width,100,e)}this.vue.$refs.square_picker.style.display=i,Vue.nextTick(()=>{Panels.color.picker.spectrum("reflow")})})},component:{components:{ColorPickerNormal:M5},data:{width:100,picker_height:100,picker_type:Settings.get("color_picker_style"),main_color:"#ffffff",second_color:"#000000",hover_color:"",second_color_selected:!1,get color_code(){return this.hover_color||(this.second_color_selected?this.second_color:this.main_color)},set color_code(i){this.second_color_selected==!1?this.main_color=i.toLowerCase().replace(/[^a-f0-9#]/g,""):this.second_color=i.toLowerCase().replace(/[^a-f0-9#]/g,"")},text_input:"#ffffff",hsv:{h:0,s:0,v:0},editing_hsv:!1,history:rd&&rd.history instanceof Array?rd.history:[]},methods:{colorPickerMenu(i){new Menu("color_picker_menu",[{id:"picker_type",name:"menu.color_picker.picker_type",icon:"palette",children:[{name:"menu.color_picker.picker_type.square",icon:Settings.get("color_picker_style")=="box"?"far.fa-dot-circle":"far.fa-circle",click:()=>{settings.color_picker_style.set("box"),Panels.color.onResize()}},{name:"menu.color_picker.picker_type.wheel",icon:Settings.get("color_picker_style")=="wheel"?"far.fa-dot-circle":"far.fa-circle",click:()=>{settings.color_picker_style.set("wheel"),Panels.color.onResize()}},{name:"menu.color_picker.picker_type.normal",icon:Settings.get("color_picker_style")=="normal"?"far.fa-dot-circle":"far.fa-circle",click:()=>{settings.color_picker_style.set("normal"),Panels.color.onResize()}}]},{id:"slider_mode",name:"menu.color_picker.slider_mode",icon:"tune",children:[{name:"menu.color_picker.slider_mode.hsv",icon:StateMemory.color_picker_rgb?"far.fa-circle":"far.fa-dot-circle",click:()=>{StateMemory.set("color_picker_rgb",!1),BARS.updateConditions(),this.updateSliders()}},{name:"menu.color_picker.slider_mode.rgb",icon:StateMemory.color_picker_rgb?"far.fa-dot-circle":"far.fa-circle",click:()=>{StateMemory.set("color_picker_rgb",!0),BARS.updateConditions(),this.updateSliders()}}]}]).open(i.target)},updateSliders(){StateMemory.color_picker_rgb?(BarItems.slider_color_red.update(),BarItems.slider_color_green.update(),BarItems.slider_color_blue.update()):(BarItems.slider_color_h.update(),BarItems.slider_color_s.update(),BarItems.slider_color_v.update()),BarItems.slider_palette_color.update()},onMouseWheel(i){if(i.target&&(settings.color_picker_style.value=="wheel"||i.target.classList.contains("sp-hue")||i.target.classList.contains("sp-slider"))){let e=Math.sign(i.deltaY);i.shiftKey&&(e*=4),BarItems.slider_color_h.change(t=>t+e)}},setColor(i,e=this.second_color_selected){jt.set(i,e)},changeColor(i,e=this.second_color_selected){this[e?"second_color":"main_color"]=i},swapColors(){BarItems.swap_colors.click()},getSwapColorsTooltip(){return`${BarItems.swap_colors.name} (${BarItems.swap_colors.keybind})`},selectMainOrSecondary(i){this.second_color_selected!=i&&(this.second_color_selected=!!i,Object.assign(this.hsv,jt.hexToHsv(this.selected_color)),this.updateSliders(),Panels.color.picker.spectrum("set",this.selected_color),this.text_input=this.selected_color)},validateMainColor(){var i=this.main_color;i.match(/^#[0-9a-f]{6}$/)||(this.main_color=tinycolor(i).toHexString())},tl},computed:{selected_color(){return this.second_color_selected?this.second_color:this.main_color}},watch:{main_color:function(i){this.hover_color="",this.second_color_selected||(this.editing_hsv||Object.assign(this.hsv,jt.hexToHsv(i)),this.updateSliders(),Panels.color.picker.spectrum("set",i),this.text_input=i,this.editing_hsv=!1),he.dispatchEvent("change_color",{color:i})},second_color:function(i){this.hover_color="",this.second_color_selected&&(this.editing_hsv||Object.assign(this.hsv,jt.hexToHsv(i)),this.updateSliders(),Panels.color.picker.spectrum("set",i),this.text_input=i,this.editing_hsv=!1),he.dispatchEvent("change_color",{color:i,secondary:!0})}},template:` +
+
+
+
+
+
+ swap_vert +
+
+
+ +
+
  • +
    +
    +
    + settings +
    +
    + +
    +
    + +
    + + +
    +
    +
    + `,mounted(){Panels.color.picker=$(this.$el).find("#main_colorpicker").spectrum({preferredFormat:"hex",color:"ffffff",flat:!0,localStorageKey:"brush_color_palette",move:i=>{jt.change(i,this.second_color_selected)}})}}}),$("#color_history").on("wheel",function(i){var e=i.originalEvent.deltaY<0?-90:90;this.scrollLeft+=e}),jt.palette_panel=new Panel("palette",{icon:"apps",condition:{modes:["paint"]},default_position:{slot:"right_bar",float_position:[0,0],float_size:[300,400],height:400,attached_to:"color",attached_index:1,sidebar_index:5},growable:!0,resizable:!0,toolbars:[new Toolbar("palette",{children:["import_palette","export_palette","generate_palette","sort_palette","save_palette","load_palette"]})],component:{data:{get main_color(){return Panels.color.vue.main_color},set main_color(i){Panels.color.vue.main_color=i},get second_color(){return Panels.color.vue.second_color},set second_color(i){Panels.color.vue.second_color=i},hover_color:"",second_color_selected:!1,get color_code(){return this.hover_color||(this.second_color_selected?this.second_color:this.main_color)},set color_code(i){this.second_color_selected==!1?this.main_color=i.toLowerCase().replace(/[^a-f0-9#]/g,""):this.second_color=i.toLowerCase().replace(/[^a-f0-9#]/g,"")},palette:rd&&rd.palette instanceof Array?rd.palette:j1.default.slice()},methods:{sortChoose(){StateMemory.color_palette_locked&&he.showQuickMessage("message.palette_locked")},sortMove(){if(StateMemory.color_palette_locked)return!1},sort(i){var e=this.palette.splice(i.oldIndex,1)[0];this.palette.splice(i.newIndex,0,e),jt.saveLocalStorages()},drop(i){},setColor(i,e=this.second_color_selected){jt.set(i,e)},changeColor(i,e=this.second_color_selected){this[e?"second_color":"main_color"]=i},swapColors(){BarItems.swap_colors.click()},getSwapColorsTooltip(){return`${BarItems.swap_colors.name} (${BarItems.swap_colors.keybind})`},isDarkColor(i){if(i){let e=new tinycolor(i).getBrightness(),t=new tinycolor(CustomTheme.data.colors.back).getBrightness();return Math.abs(e-t)<=50}},openContextMenu(i){Panels.palette.menu.open(i)},tl},computed:{selected_color(){return this.second_color_selected?this.second_color:this.main_color}},template:` +
      +
    • +
      +
    • +
    + `},menu:new Menu([new MenuSeparator("options"),{id:"lock_palette",name:"menu.palette.lock_palette",icon:()=>StateMemory.color_palette_locked,click(){StateMemory.color_palette_locked=!StateMemory.color_palette_locked,StateMemory.save("color_palette_locked")}},new MenuSeparator("file"),"sort_palette","save_palette","load_palette"])}),Toolbars.palette.toPlace(),Toolbars.color_picker.toPlace(),jt.palette=jt.palette_panel.vue._data.palette});BARS.defineActions(function(){new Action("add_to_palette",{icon:"add",category:"color",click:function(){let r=jt.get();StateMemory.color_palette_locked?he.showQuickMessage("message.palette_locked"):jt.palette.includes(r)||(jt.palette.push(r),jt.saveLocalStorages(),he.showQuickMessage("message.add_to_palette"))}}),new Action("swap_colors",{icon:"swap_vert",category:"color",condition:{modes:["paint"]},keybind:new Keybind({key:"x"}),click(){let r=jt.panel.vue.main_color;jt.panel.vue.main_color=jt.panel.vue.second_color,jt.panel.vue.second_color=r}}),new Action("import_palette",{icon:"palette",category:"color",click:function(){he.import({resource_id:"palette",extensions:["gpl","css","txt","hex","png","aco","act","ase","bbpalette"],type:"Blockbench Palette",readtype:r=>{switch(pathToExtension(r)){case"png":return"image";case"ase":return"binary";case"act":return"binary";case"aco":return"binary";default:return"text"}}},function(r){r&&r[0]&&jt.importPalette(r[0])})}}),new Action("export_palette",{icon:"fas.fa-dice-four",category:"color",click:function(){let r=`GIMP Palette +Name: Blockbench palette +Columns: 10 +`;jt.palette.forEach(s=>{let l=new tinycolor(s);r+=`${l._r} ${l._g} ${l._b} ${s} +`}),he.export({resource_id:"palette",extensions:["gpl"],type:"GPL Palette",content:r},s=>{he.showQuickMessage(tl("message.save_file",pathToName(s)))})}}),new Action("generate_palette",{icon:"blur_linear",category:"color",click:function(){jt.generatePalette()}}),new Action("sort_palette",{icon:"fa-sort-amount-down",category:"color",click:function(){var r={};jt.palette.forEach(m=>{r[m]=tinycolor(m)}),jt.palette.empty();var s={gray:[],red:[],orange:[],yellow:[],green:[],blue:[],magenta:[]};for(var l in r){var c=r[l];if(Math.abs(c._r-c._g)+Math.abs(c._g-c._b)+Math.abs(c._r-c._b)<74)s.gray.push(c);else{var d={red:Wr(c,{_r:250,_g:0,_b:0}),orange:Wr(c,{_r:240,_g:127,_b:0})*1.4,yellow:Wr(c,{_r:265,_g:240,_b:0})*1.4,green:Wr(c,{_r:0,_g:255,_b:0}),blue:Wr(c,{_r:0,_g:50,_b:240}),magenta:Wr(c,{_r:255,_g:0,_b:255})*1.4},u=highestInObject(d,!0);s[u].push(c)}}for(var p in s)s[p].sort((m,_)=>m._r+m._g+m._b-(_._r+_._g+_._b)),s[p].forEach(m=>{jt.palette.push(m.toHexString())});jt.saveLocalStorages()}});async function i(r){jt.palette.length&&await new Promise((l,c)=>{he.showMessageBox({translateKey:"load_palette",buttons:["dialog.confirm","dialog.cancel"]},l)})!=0||(jt.palette.splice(0,1/0,...r),jt.saveLocalStorages())}new Action("load_palette",{icon:"fa-tasks",category:"color",condition:{modes:["paint"]},click:function(r){new Menu(this.children()).open(r.target)},children(){let r=this.default_palettes.slice();return StateMemory.color_palettes.forEach((s,l)=>{let c={name:s.name,icon:"bubble_chart",id:l.toString(),click(){i(s.colors)},children:[{icon:"update",name:"menu.palette.load.update",description:"menu.palette.load.update.desc",click(){s.colors.replace(jt.palette),StateMemory.save("color_palettes")}},{icon:"delete",name:"generic.delete",click(){StateMemory.color_palettes.remove(s),StateMemory.save("color_palettes")}}]};r.push(c)}),r.push("_",{name:"menu.palette.load.empty",icon:"clear",id:"empty",click:()=>{i([])}}),r}}),BarItems.load_palette.default_palettes=[{name:"menu.palette.load.default",icon:"bubble_chart",id:"default",click:()=>{i(j1.default)}},{name:"Endesga 64",description:"Pixel art palette created by lospec.com/endesga",icon:"bubble_chart",id:"endesga64",click:()=>{i(j1.endesga64)}},{name:"Material",icon:"bubble_chart",id:"material",click:()=>{i(j1.material)}},"_"],new Action("save_palette",{icon:"playlist_add",category:"color",condition:{modes:["paint"]},click(r){new Dialog({id:"save_palette",title:"action.save_palette",width:540,form:{name:{label:"generic.name"}},onConfirm:function(l){if(!l.name)return;let c={name:l.name,colors:jt.palette.slice()};StateMemory.color_palettes.push(c),StateMemory.save("color_palettes")}}).show()}}),new NumSlider("slider_color_h",{condition:()=>Modes.paint&&!StateMemory.color_picker_rgb,category:"color",sensitivity:15,settings:{min:0,max:360,default:0,show_bar:!0},getInterval(r){return r.shiftKey||Pressing.overrides.shift?4:1},get:function(){return Math.round(jt.panel.vue._data.hsv.h)},change:function(r){var s=r(jt.panel.vue._data.hsv.h);jt.panel.vue._data.hsv.h=Math.clamp(s,this.settings.min,this.settings.max),jt.updateFromHsv()}}),new NumSlider("slider_color_s",{condition:()=>Modes.paint&&!StateMemory.color_picker_rgb,category:"color",sensitivity:20,settings:{min:0,max:100,default:0,show_bar:!0},getInterval(r){return r.shiftKey||Pressing.overrides.shift?10:1},get:function(){return Math.round(jt.panel.vue._data.hsv.s)},change:function(r){var s=r(jt.panel.vue._data.hsv.s);jt.panel.vue._data.hsv.s=Math.clamp(s,this.settings.min,this.settings.max),jt.updateFromHsv()}}),new NumSlider("slider_color_v",{condition:()=>Modes.paint&&!StateMemory.color_picker_rgb,category:"color",sensitivity:20,settings:{min:0,max:100,default:100,show_bar:!0},getInterval(r){return r.shiftKey||Pressing.overrides.shift?10:1},get:function(){return Math.round(jt.panel.vue._data.hsv.v)},change:function(r){var s=r(jt.panel.vue._data.hsv.v);jt.panel.vue._data.hsv.v=Math.clamp(s,this.settings.min,this.settings.max),jt.updateFromHsv()}});let e=[BarItems.slider_color_h,BarItems.slider_color_s,BarItems.slider_color_v];e.forEach(r=>r.slider_vector=e);let t=new NumSlider("slider_color_red",{condition:()=>Modes.paint&&StateMemory.color_picker_rgb,category:"color",color:"#ff0000",settings:{min:0,max:255,default:0,show_bar:!0,step:1},get(){return parseInt(jt.panel.vue.main_color.substring(1,3),16)},change:function(r){var s=Math.clamp(r(this.get()),0,255);let l=parseInt(s).toString(16);l.length==1&&(l="0"+l),jt.panel.vue.main_color=jt.panel.vue.main_color.substring(0,1)+l+jt.panel.vue.main_color.substring(3)}}),n=new NumSlider("slider_color_green",{condition:()=>Modes.paint&&StateMemory.color_picker_rgb,category:"color",color:"#00db3d",settings:{min:0,max:255,default:0,show_bar:!0,step:1},get(){return parseInt(jt.panel.vue.main_color.substring(3,5),16)},change:function(r){var s=Math.clamp(r(this.get()),0,255);let l=parseInt(s).toString(16);l.length==1&&(l="0"+l),jt.panel.vue.main_color=jt.panel.vue.main_color.substring(0,3)+l+jt.panel.vue.main_color.substring(5)}}),a=new NumSlider("slider_color_blue",{condition:()=>Modes.paint&&StateMemory.color_picker_rgb,category:"color",color:"#2c73ff",settings:{min:0,max:255,default:0,show_bar:!0,step:1},get(){return parseInt(jt.panel.vue.main_color.substring(5),16)},change:function(r){var s=Math.clamp(r(this.get()),0,255);let l=parseInt(s).toString(16);l.length==1&&(l="0"+l),jt.panel.vue.main_color=jt.panel.vue.main_color.substring(0,5)+l}}),o=[t,n,a];o.forEach(r=>r.slider_vector=o),new NumSlider("slider_palette_color",{condition:{modes:["paint"]},category:"color",invert_scroll_direction:!0,get(){return jt.palette.indexOf(jt.panel.vue.main_color)+1},getInterval(){return 1},change(r){let s=Math.clamp(r(this.get()),1,jt.palette.length),l=jt.palette[s-1];jt.set(l)}}),new Action("pick_screen_color",{icon:"colorize",category:"color",condition:()=>typeof EyeDropper=="function"&&he.platform!="linux",click:async function(){if(he.platform=="win32")null.send("request-color-picker",{sync:!1});else if(typeof EyeDropper=="function"){let r=new EyeDropper,{sRGBHex:s}=await r.open();jt.set(s)}}})});Object.assign(window,{ColorPanel:jt});new ModelFormat("free",{icon:"icon-format_free",category:"general",target:["Godot","Unity","Unreal Engine","Sketchfab","Blender",tl("format.free.info.3d_printing")],format_page:{content:[{type:"h3",text:tl("mode.start.format.informations")},{text:`* ${tl("format.free.info.meshes")} + * ${tl("format.free.info.limitation")}`.replace(/\t+/g,"")},{type:"h3",text:tl("mode.start.format.resources")},{text:"* [Low-Poly Modeling Tutorial](https://www.youtube.com/watch?v=WbyCbA1c8BM)"}]},meshes:!0,billboards:!0,armature_rig:!0,splines:!0,rotate_cubes:!0,bone_rig:!0,centered_grid:!0,optional_box_uv:!0,per_texture_uv_size:!0,per_texture_wrap_mode:!0,uv_rotation:!0,animation_mode:!0,per_animator_rotation_interpolation:!0,animated_textures:!0,locators:!0,pbr:!0});var C5="5.0";function T5(i){if(!i.meta){Blockbench.showMessageBox({translateKey:"invalid_model",icon:"error"});return}if(i.meta.format_version||(i.meta.format_version=i.meta.format),vo.compare(i.meta.format_version,">",C5)){Blockbench.showMessageBox({title:"message.newer_project_format_version.title",message:tl("message.newer_project_format_version.message",[i.meta.format_version]),icon:"error"});return}}function A5(i){if(i.meta.model_format||(i.meta.bone_rig?i.meta.model_format="bedrock_old":i.meta.model_format="java_block"),i.cubes&&!i.elements&&(i.elements=i.cubes),i.geometry_name&&(i.model_identifier=i.geometry_name),i.elements&&i.meta.box_uv&&vo.compare(i.meta.format_version,"<","4.5")&&i.elements.forEach(e=>{e.shade===!1&&(e.mirror_uv=!0)}),i.outliner&&vo.compare(i.meta.format_version,"<","3.2")){let e=function(t){for(var n of t)typeof n=="object"&&(e(n.children),n.rotation&&(n.rotation[2]*=-1))};e(i.outliner)}if(i.textures,i.animations&&vo.compare(i.meta.format_version,"<","5.0"))for(let e of i.animations)for(let t in e.animators){let n=e.animators[t];for(let a of n.keyframes??[]){for(let o of a.data_points)(a.channel=="position"||a.channel=="rotation")&&o.x&&(o.x=Zs(o.x)),a.channel=="rotation"&&o.y&&(o.y=Zs(o.y));a.interpolation=="bezier"&&((a.channel=="position"||a.channel=="rotation")&&a.bezier_left_value&&(a.bezier_left_value[0]*=-1,a.bezier_right_value[0]*=-1),a.channel=="rotation"&&a.bezier_left_value&&(a.bezier_left_value[1]*=-1,a.bezier_right_value[1]*=-1))}}}var hs=new Codec("project",{name:"Blockbench Project",extension:"bbmodel",remember:!0,support_partial_export:!0,load_filter:{type:"json",extensions:["bbmodel"]},load(i,e){if(!i||!i.meta)return Blockbench.showMessageBox({translateKey:"invalid_model"});setupProject(Formats[i.meta.model_format]||Formats.free);var t=pathToName(e.path,!0);Project.name=pathToName(t,!1),e.path,this.parse(i,e.path),Modes.animate&&!AnimationItem.selected&&AnimationItem.all[0]&&AnimationItem.all[0].select()},export(){Blockbench.export({resource_id:"model",type:this.name,extensions:[this.extension],name:this.fileName(),startpath:this.startPath(),content:this.compile(),custom_writer:null},i=>this.afterDownload(i))},async exportCollection(i){this.context=i,Blockbench.export({resource_id:"model",type:this.name,extensions:[this.extension],name:this.fileName(),startpath:this.startPath(),content:this.compile({collection_only:i}),custom_writer:null},e=>this.afterDownload(e))},async writeCollection(i){if(!i.export_path){console.warn("No path specified");return}this.context=i;let e=Project.save_path,t=this.compile({collection_only:i});this.write(t,i.export_path),this.context=null,i.saved=!0,Project.save_path=e},compile(i){i||(i=0),Blockbench.addFlag("compiling_bbmodel");let e={meta:{format_version:C5,backup:i.backup?!0:void 0,model_format:Format.id,box_uv:Project.box_uv}},t=settings.export_asset_paths.value=="relative"||settings.export_asset_paths.value=="both",n=settings.export_asset_paths.value=="absolute"||settings.export_asset_paths.value=="both";typeof i.absolute_paths=="boolean"&&(n=i.absolute_paths);for(var a in ModelProject.properties)ModelProject.properties[a].export!=!1&&ModelProject.properties[a].copy(Project,e);if(Project.overrides&&(e.overrides=Project.overrides),e.resolution={width:Project.texture_width||16,height:Project.texture_height||16},i.flag&&(e.flag=i.flag),i.editor_state&&(Project.saveEditorState(),e.editor_state={save_path:Project.save_path,export_path:Project.export_path,saved:Project.saved,added_models:Project.added_models,mode:Project.mode,tool:Project.tool,exploded_view:Project.exploded_view,uv_viewport:Project.uv_viewport,previews:JSON.parse(JSON.stringify(Project.previews)),selected_elements:Project.selected_elements.map(m=>m.uuid),selected_groups:Project.selected_groups.map(m=>m.uuid),mesh_selection:JSON.parse(JSON.stringify(Project.mesh_selection)),selected_texture:Project.selected_texture?.uuid}),!(Format.id=="skin"&&e.skin_model)){if(i.collection_only)var o=i.collection_only.getAllChildren();if(e.elements=[],Outliner.elements.forEach(m=>{if(i.collection_only&&!o.includes(m))return;let _=m.getSaveCopy(e.meta);e.elements.push(_)}),e.groups=[],Group.all.forEach(m=>{if(i.collection_only&&!o.includes(m))return;let _=m.getSaveCopy(!1);e.groups.push(_)}),e.outliner=Outliner.toJSON(),i.collection_only){let m=function(_){_.forEachReverse(f=>{typeof f=="string"?o.find(g=>g.uuid==f)||_.remove(f):(f.children instanceof Array&&m(f.children),f.uuid&&!o.find(g=>g.uuid==f.uuid)&&(!f.children||f.children.length==0)&&_.remove(f))})};m(e.outliner)}}function r(m,_,f){let g=m[_];i.absolute_paths==!1&&(m[_]=void 0)}e.textures=[],Texture.all.forEach(m=>{let _=m.getSaveCopy();r(_,"path","relative_path"),i.bitmaps!=!1&&(Settings.get("embed_textures")||i.backup||i.bitmaps==!0)&&(_.source=m.getDataURL(),_.internal=!0),e.textures.push(_)});for(let m of TextureGroup.all){e.texture_groups||(e.texture_groups=[]);let _=m.getSaveCopy();e.texture_groups.push(_)}let s=[];for(let m of Collection.all){let _=m.getSaveCopy();s.push(_)}if(s.length&&(e.collections=s),Animation.all.length&&(e.animations=[],Animation.all.forEach(m=>{let _=m.getUndoCopy({absolute_paths:i.absolute_paths},!0);e.animations.push(_),r(_,"path")})),AnimationController.all.length&&(e.animation_controllers=[],AnimationController.all.forEach(m=>{let _=m.getUndoCopy();r(_,"path"),e.animation_controllers.push(_)})),Interface.Panels.variable_placeholders.inside_vue._data.text&&(e.animation_variable_placeholders=Interface.Panels.variable_placeholders.inside_vue._data.text),Format.display_mode&&Object.keys(Project.display_settings).length>=1){var l={},c=0;for(var d in DisplayMode.slots){var a=DisplayMode.slots[d];DisplayMode.slots.hasOwnProperty(d)&&Project.display_settings[a]&&Project.display_settings[a].export&&(l[a]=Project.display_settings[a].export(),c++)}c&&(e.display=l)}if(!i.backup&&i.reference_images!=!1){let m=[];for(let _ of Project.reference_images)m.push(_.getSaveCopy());m.length&&(e.reference_images=m)}if(Object.keys(Project.export_options).length){e.export_options={};for(let m in Project.export_options)Object.keys(Project.export_options[m]).length&&(e.export_options[m]=Object.assign({},Project.export_options[m]))}if(i.history&&(e.history=[],Undo.history.forEach(m=>{var _={before:omitKeys(m.before,["aspects"]),post:omitKeys(m.post,["aspects"]),action:m.action,time:m.time};e.history.push(_)}),e.history_index=Undo.index),Blockbench.dispatchEvent("save_project",{model:e,options:i}),this.dispatchEvent("compile",{model:e,options:i}),Blockbench.removeFlag("compiling_bbmodel"),i.raw)return e;if(i.compressed){var u=compileJSON(e,{small:!0}),p=""+hw.compress(u,{outputEncoding:"StorageBinaryString"});return p}else return compileJSON(e,{small:Settings.get("minify_bbmodel")||i.minify})},parse(i,e){if(T5(i),A5(i),i.meta.model_format){if(!Formats[i.meta.model_format]){let a=Plugins.all.filter(r=>r.contributes?.formats?.includes(i.meta.model_format)),o={};for(let r of a)o[r.id]={icon:r.icon,text:tl("message.invalid_format.install_plugin",[r.title])};Blockbench.showMessageBox({translateKey:"invalid_format",message:tl("message.invalid_format.message",[i.meta.model_format]),commands:o},r=>{let s=r&&a.find(l=>l.id==r);s&&(BarItems.plugins_window.click(),Plugins.dialog.content_vue.selectPlugin(s))})}var t=Formats[i.meta.model_format]||Formats.free;t.select()}Blockbench.dispatchEvent("load_project",{model:i,path:e}),this.dispatchEvent("parse",{model:i}),i.meta.box_uv!==void 0&&Format.optional_box_uv&&(Project.box_uv=i.meta.box_uv);for(var n in ModelProject.properties)ModelProject.properties[n].merge(Project,i);if(e&&e!="backup.bbmodel"&&(Project.name=pathToName(e,!1)),i.overrides&&(Project.overrides=i.overrides),i.resolution!==void 0&&(Project.texture_width=i.resolution.width,Project.texture_height=i.resolution.height),i.texture_groups&&i.texture_groups.forEach(a=>{new TextureGroup(a,a.uuid).add(!1)}),i.textures&&i.textures.forEach(a=>{var o=new Texture(a,a.uuid).add(!1);a.source&&a.source.substr(0,5)=="data:"&&o.fromDataURL(a.source)}),i.skin_model&&Codecs.skin_model.rebuild(i.skin_model,i.skin_pose),i.elements){let a=Texture.getDefault();i.elements.forEach(o=>{let r=OutlinerElement.fromSave(o,!0);for(let s in r.faces)if(!Format.single_texture&&o.faces){let l=o.faces[s].texture!==null&&Texture.all[o.faces[s].texture];l&&(r.faces[s].texture=l.uuid)}else a&&r.faces&&r.faces[s].texture!==null&&!Format.single_texture_default&&(r.faces[s].texture=a.uuid);r.init()})}if(i.groups&&i.groups.forEach(a=>{new Group(a,a.uuid).init()}),i.outliner&&Outliner.loadJSON(i.outliner),i.collections instanceof Array)for(let a of i.collections)new Collection(a,a.uuid).add();if(i.animations&&i.animations.forEach(a=>{var o=new Animation;o.uuid=a.uuid,o.extend(a).add()}),i.animation_controllers&&i.animation_controllers.forEach(a=>{var o=new AnimationController;o.uuid=a.uuid,o.extend(a).add()}),i.animation_variable_placeholders&&(Interface.Panels.variable_placeholders.inside_vue._data.text=i.animation_variable_placeholders),i.display!==void 0&&DisplayMode.loadJSON(i.display),i.backgrounds)for(let a in i.backgrounds){let o=i.backgrounds[a],r=new ReferenceImage({position:[o.x,o.y+o.size/2],size:[o.size/2,o.size/2],layer:"background",is_blueprint:o.lock,source:o.image,name:o.image&&!o.image.startsWith("data:")?o.image.split([/[/\\]/]).last():"Reference"}).addAsReference()}if(i.reference_images&&i.reference_images.forEach(a=>{new ReferenceImage(a).addAsReference()}),i.export_options)for(let a in i.export_options)Project.export_options[a]=Object.assign({},i.export_options[a]);if(i.history&&(Undo.history=i.history.slice(),Undo.index=i.history_index),Canvas.updateAllBones(),Canvas.updateAllPositions(),Canvas.updateAllFaces(),ReferenceImage.updateAll(),Validator.validate(),this.dispatchEvent("parsed",{model:i}),i.editor_state){let a=i.editor_state;if(Merge.string(Project,a,"save_path"),Merge.string(Project,a,"export_path"),Merge.boolean(Project,a,"saved"),Merge.number(Project,a,"added_models"),Merge.string(Project,a,"mode"),Merge.string(Project,a,"tool"),Merge.boolean(Project,a,"exploded_view"),a.uv_viewport&&(Merge.number(Project.uv_viewport,a.uv_viewport,"zoom"),Merge.arrayVector2(Project.uv_viewport=a.uv_viewport,"offset")),a.previews)for(let o in a.previews)Project.previews[o]=a.previews[o];a.selected_elements.forEach(o=>{let r=Outliner.elements.find(s=>s.uuid==o);Project.selected_elements.push(r)}),a.selected_groups&&(Group.multi_selected=a.selected_groups.map(o=>Group.all.find(r=>r.uuid==o)).filter(o=>o instanceof Group)),(a.selected_texture&&Texture.all.find(o=>o.uuid==a.selected_texture))?.select(),Project.loadEditorState()}},merge(i,e){T5(i),A5(i),Blockbench.dispatchEvent("merge_project",{model:i,path:e}),this.dispatchEvent("merge",{model:i}),Project.added_models++;let t={},n={},a=[],o=[],r=[],s=[],l=Formats[i.meta.model_format];Undo.initEdit({elements:a,groups:o,textures:r,animations:Format.animation_mode&&s,outliner:!0,selection:!0,display_slots:Format.display_mode&&displayReferenceObjects.slots}),i.overrides instanceof Array&&Project.overrides instanceof Array&&Project.overrides.push(...i.overrides);let c=i.resolution.width||Project.texture_width,d=i.resolution.height||Project.texture_height;function u(m){Texture.all.find(g=>g.uuid==m.uuid)&&(n[m.uuid]=guid(),m.uuid=n[m.uuid]);var _=new Texture(m,m.uuid).add(!1);let f=0;for(;Texture.all.find(g=>g!==_&&g.id==f);)f++,_.id=f.toString();if(m.source&&m.source.substr(0,5)=="data:")return _.fromDataURL(m.source),_}if(i.texture_groups&&i.texture_groups.forEach(m=>{new TextureGroup(m,m.uuid).add(!1)}),i.textures&&r.replace(i.textures.map(u)),i.skin_model){let m=Outliner.elements.slice();Codecs.skin_model.rebuild(i.skin_model);for(let _ of Outliner.elements)m.includes(_)||a.push(_)}let p=!Format.per_texture_uv_size||!l?.per_texture_uv_size;if(i.elements){let m=r[0]||Texture.getDefault(),_=Formats[i.meta.model_format]||Format;i.elements.forEach(function(f){if(OutlinerElement.isTypePermitted(f.type)){if(Outliner.elements.find(x=>x.uuid==f.uuid)){let x=guid();t[f.uuid]=x,f.uuid=x}var g=OutlinerElement.fromSave(f,!0);if(g instanceof Cube)for(var v in g.faces){if(!_.single_texture&&f.faces){var b=f.faces[v].texture!==null&&r[f.faces[v].texture];b&&(g.faces[v].texture=b.uuid)}else m&&g.faces&&g.faces[v].texture!==null&&(g.faces[v].texture=m.uuid);if(!g.box_uv&&p){let x=g.faces[v].getTexture();x&&l?.per_texture_uv_size&&(c=x.uv_width,d=x.uv_height),g.faces[v].uv[0]*=Project.getUVWidth(x)/c,g.faces[v].uv[2]*=Project.getUVWidth(x)/c,g.faces[v].uv[1]*=Project.getUVHeight(x)/d,g.faces[v].uv[3]*=Project.getUVHeight(x)/d}}else if(g instanceof Mesh)for(let x in g.faces){if(!_.single_texture&&f.faces){var b=f.faces[x].texture!==null&&r[f.faces[x].texture];b&&(g.faces[x].texture=b.uuid)}else m&&g.faces&&g.faces[x].texture!==null&&(g.faces[x].texture=m.uuid);if(p)for(let w in g.faces[x].uv){let E=g.faces[x].getTexture();E&&l?.per_texture_uv_size&&(c=E.uv_width,d=E.uv_height),g.faces[x].uv[w][0]*=Project.getUVWidth(E)/c,g.faces[x].uv[w][1]*=Project.getUVHeight(E)/d}}g.init(),a.push(g)}})}if(i.groups&&i.groups.forEach(m=>{Group.all.find(f=>f.uuid==m.uuid)&&(m.uuid=t[m.uuid]=guid());let _=new Group(m,m.uuid).init();o.push(_)}),i.outliner){let m=function(_){_.forEach((f,g)=>{typeof f=="string"?t[f]&&(_[g]=t[f]):f&&f.uuid&&(t[f.uuid]&&(f.uuid=t[f.uuid]),f.children&&m(f.children))})};m(i.outliner),Outliner.loadJSON(i.outliner,!0)}if(i.collections instanceof Array)for(let m of i.collections){let _=new Collection(m,m.uuid);_.add();for(let f=0;f<_.children.length;f++)t[_.children[f]]&&(_.children[f]=t[_.children[f]])}if(i.animations&&Format.animation_mode&&i.animations.forEach(m=>{var _=new Animation;if(Animation.all.find(f=>f.uuid==m.uuid)&&(m.uuid=guid()),_.animators)for(let f in _.animators)t[f]&&(_.animators[t[f]]=_.animators[f],delete _.animators[f]);_.uuid=m.uuid,_.extend(m).add(),s.push(_)}),i.animation_controllers&&i.animation_controllers.forEach(m=>{var _=new AnimationController;AnimationController.all.find(f=>f.uuid==m.uuid)&&(m.uuid=guid()),_.uuid=m.uuid,_.extend(m).add()}),Format.bone_rig&&Group.all.forEachReverse(m=>m.createUniqueName()),i.animation_variable_placeholders){let m=Interface.Panels.variable_placeholders.inside_vue;m._data.text?m._data.text=m._data.text+` + +`+i.animation_variable_placeholders:m._data.text=i.animation_variable_placeholders}i.display!==void 0&&DisplayMode.loadJSON(i.display),Undo.finishEdit("Merge project"),Canvas.updateAllBones(),Canvas.updateAllPositions(),Canvas.updateAllFaces(),ReferenceImage.updateAll(),this.dispatchEvent("parsed",{model:i})}});Formats.free.codec=hs;BARS.defineActions(function(){hs.export_action=new Action("save_project",{icon:"save",category:"file",keybind:new Keybind({key:"s",ctrl:!0,alt:!0}),condition:()=>Project,click:function(){saveTextures(!0),hs.export()}}),new Action("save_project_incremental",{icon:"difference",category:"file",keybind:new Keybind({key:"s",shift:!0,alt:!0}),condition:!1,click:function(){saveTextures(!0);let i=/\.bbmodel$/,e=/([0-9]+)\.bbmodel$/,t=e.exec(Project.save_path),n;if(t){let r=parseInt(t[1]);n=Project.save_path.replace(e,`${r+1}.bbmodel`)}else n=Project.save_path.replace(i,"_1.bbmodel");let a=n,o=1;for(;null.existsSync(n)&&o<100;)n=a.replace(i,`_alt_${o==1?"":o}.bbmodel`),o++;hs.write(hs.compile(),n)}}),new Action("save_project_as",{icon:"save",category:"file",keybind:new Keybind({key:"s",ctrl:!0,alt:!0,shift:!0}),condition:()=>Project,click:function(){saveTextures(!0),hs.export()}}),new Action("export_legacy_project",{icon:"save",name:"Export Legacy Project",description:"Export bbmodel file for Blockbench 4",category:"file",condition:()=>Project,click:function(){saveTextures(!0);let i=hs.compile({raw:!0});i.meta.format_version="4.10";function e(n,a){var o=[];function r(s,l){var c=0;for(var d of s){if(d.type==="group"){var u=d.compile(n);d.children.length>0&&r(d.children,u.children),l.push(u)}else if(n)l.push(d.uuid);else{var p=elements.indexOf(d);p>=0&&l.push(p)}c++}}return r(Outliner.root,o),o}i.outliner=e(!0),delete i.groups;for(let n of i.animations??[])for(let a in n.animators)for(let o of n.animators[a].keyframes??[])for(let r of o.data_points??[])(o.channel=="rotation"||o.channel=="position")&&r.x&&(r.x=Zs(r.x)),o.channel=="rotation"&&r.y&&(r.y=Zs(r.y));let t=compileJSON(i,{small:Settings.get("minify_bbmodel")});Blockbench.export({resource_id:"model",type:hs.name,extensions:[hs.extension],name:hs.fileName(),startpath:hs.startPath(),content:t},n=>hs.afterDownload(n))}}),new Action("import_project",{icon:"icon-blockbench_file",category:"file",condition:()=>Format&&!Format.pose_mode,click:function(){Blockbench.import({resource_id:"model",extensions:[hs.extension],type:hs.name,multiple:!0},function(i){i.forEach(e=>{var t=autoParseJSON(e.content,{file_path:e.path});hs.merge(t)})})}})});var Qae=["item/generated","minecraft:item/generated","item/handheld","minecraft:item/handheld","item/handheld_rod","minecraft:item/handheld_rod","builtin/generated","minecraft:builtin/generated"],bf=new Codec("java_block",{name:"Java Block/Item Model",remember:!0,extension:"json",support_partial_export:!0,load_filter:{type:"json",extensions:["json"],condition(i){return i.parent||i.elements||i.textures}},compile(i){i===void 0&&(i={});var e=[],t=[],n=[],a=[];function o(f){if(f.export!=!1){var g={};if(n[Cube.all.indexOf(f)]=e.length,(i.cube_name!==!1&&!settings.minifiedout.value||i.cube_name===!0)&&f.name!=="cube"&&(g.name=f.name),g.from=f.from.slice(),g.to=f.to.slice(),f.inflate)for(var v=0;v<3;v++)g.from[v]-=f.inflate,g.to[v]+=f.inflate;if(f.shade===!1&&(g.shade=!1),f.light_emission&&(g.light_emission=f.light_emission),!f.rotation.allEqual(0)||!f.origin.allEqual(0)&&settings.java_export_pivots.value){if(g.rotation=new oneLiner({}),!Format.rotation_limit&&(f.rotation.positiveItems()>1||f.rotation.some(A=>Math.abs(A)>45)))g.rotation.x=f.rotation[0],g.rotation.y=f.rotation[1],g.rotation.z=f.rotation[2];else{let A=f.rotationAxis()||"y",R=f.rotation[getAxisNumber(A)];g.rotation.angle=Format.rotation_snap?Math.round(R/22.5)*22.5:R,g.rotation.axis=A}g.rotation.origin=f.origin.slice()}f.rescale&&(g.rotation?g.rotation.rescale=!0:g.rotation=new oneLiner({angle:0,axis:f.rotation_axis||"y",origin:f.origin,rescale:!0})),Format.rotation_limit&&f.rotation.positiveItems()>=2&&(g.rotated=f.rotation);var b,x={};for(var w in f.faces)if(f.faces.hasOwnProperty(w)&&f.faces[w].texture!==null){var E=new oneLiner;if(f.faces[w].enabled!==!1&&(E.uv=f.faces[w].uv.slice(),E.uv.forEach((A,R)=>{E.uv[R]=A*16/UVEditor.getResolution(R%2)})),f.faces[w].rotation&&(E.rotation=f.faces[w].rotation),f.faces[w].texture){var y=f.faces[w].getTexture();y&&(E.texture="#"+y.id,t.safePush(y)),b=!0}E.texture||(E.texture="#missing"),f.faces[w].cullface&&(E.cullface=f.faces[w].cullface),f.faces[w].tint>=0&&(E.tintindex=f.faces[w].tint),x[w]=E}if(b||(g.color=f.color),g.faces=x,Format.cube_size_limiter){let A=function(R){return R<-16||R>32};(A(g.from[0])||A(g.from[1])||A(g.from[2])||A(g.to[0])||A(g.to[1])||A(g.to[2]))&&a.push(f)}Object.keys(g.faces).length&&e.push(g)}}function r(f){if(!(!f||!f.length))for(let g=0;g0&&settings.dialog_larger_cubes.value&&Blockbench.showMessageBox({translateKey:"model_clipping",icon:"settings_overscan",message:tl("message.model_clipping.message",[a.length]),buttons:["dialog.scale.select_overflow","dialog.ok"],confirm:1,cancel:1},f=>{f==0&&(selected.splice(0,1/0,...a),updateSelection())});var d={format_version:Project.java_block_version};if(s("comment",Project.credit||settings.credit.value)&&(d.credit=Project.credit||settings.credit.value),s("parent",Project.parent!="")&&(d.parent=Project.parent),s("ambientocclusion",Project.ambientocclusion===!1)&&(d.ambientocclusion=!1),Project.unhandled_root_fields.render_type&&(d.render_type=Project.unhandled_root_fields.render_type),(Project.texture_width!==16||Project.texture_height!==16)&&(d.texture_size=[Project.texture_width,Project.texture_height]),s("textures",Object.keys(c).length>=1)&&(d.textures=c),s("elements",e.length>=1)&&(d.elements=e),s("front_gui_light",Project.front_gui_light)&&(d.gui_light="front"),s("overrides",Project.overrides instanceof Array&&Project.overrides.length)&&(Project.overrides.forEach(f=>delete f._uuid),d.overrides=Project.overrides.map(f=>new oneLiner(f))),s("display",Object.keys(Project.display_settings).length>=1)){var u={},p=0;for(var m in DisplayMode.slots){var _=DisplayMode.slots[m];DisplayMode.slots.hasOwnProperty(m)&&Project.display_settings[_]&&Project.display_settings[_].export&&(u[_]=Project.display_settings[_].export(),p++)}p&&(d.display=u)}if(s("groups",settings.export_groups.value&&Group.all.length)){let g=function(b,x){let w=0;for(let E of b){if(E.type==="group"){if(E.export===!0){let y=E.compile(!1);E.children.length>0&&g(E.children,y.children),x.push(y)}}else{let y=n[elements.indexOf(E)];y>=0&&x.push(y)}w++}},f=[];g(Outliner.root,f);for(var m=0;m1&&(v.id=Project.added_models+"_"+v.id)}Texture.all.length>0&&Texture.all.last().select()}var b=elements.length;if(i.elements&&i.elements.forEach(function(w){let E=new Cube(w);if(w.__comment&&(E.name=w.__comment),typeof w.rotation=="object")if(w.rotation.origin&&E.extend({origin:w.rotation.origin}),Merge.boolean(E,w.rotation,"rescale"),w.rotation.axis){if(w.rotation.angle&&w.rotation.axis){let L=getAxisNumber(w.rotation.axis);L>=0&&(E.rotation.V3_set(0),E.rotation[L]=w.rotation.angle)}w.rotation.origin&&(Merge.number(E.origin,w.rotation.origin,0),Merge.number(E.origin,w.rotation.origin,1),Merge.number(E.origin,w.rotation.origin,2)),typeof w.rotation.axis=="string"&&(E.rotation_axis=w.rotation.axis)}else(w.rotation.x||w.rotation.y||w.rotation.z)&&(E.extend({rotation:[w.rotation.x||0,w.rotation.y||0,w.rotation.z||0]}),a=!0);var y=!1;for(var A in E.faces)w.faces[A]&&!w.faces[A].uv&&(y=!0);y?(E.autouv=2,E.mapAutoUV()):E.autouv=0;for(var A in E.faces){var R=w.faces[A],j=E.faces[A];if(R===void 0)j.texture=null,j.uv=[0,0,0,0];else{if(typeof R.uv=="object"&&j.uv.forEach((U,J)=>{j.uv[J]=R.uv[J]*UVEditor.getResolution(J%2)/16}),R.texture==="#missing")j.texture=!1;else if(R.texture){var F=R.texture.replace(/^#/,""),O=c[F];if(!(O instanceof Texture))if(d[R.texture]){var O=d[R.texture];O.id==="particle"&&O.extend({id:F,name:"#"+F}).loadEmpty(3)}else{var O=new Texture({id:F,name:"#"+F}).add(!1).loadEmpty(3);c[F]=O,s.push(O)}j.texture=O.uuid}typeof R.tintindex=="number"&&(j.tint=R.tintindex)}}n?l&&(l.children.push(E),E.parent=l):(Outliner.root.push(E),E.parent="root"),E.init(),r.push(E)}),i.groups&&i.groups.length>0){let w=function(E,y,A){function R(j,F,O){for(var L=0;L0&&R(j[L].children,U.children,U),j[L].content&&j[L].content.length>0&&R(j[L].content,U.children,U)}L++}}y instanceof Group&&A!==void 0?R(E,y.children,y):(y||(Group.all.forEach(j=>{j.removeFromParent()}),Group.all.empty()),R(E,Outliner.root,"root"))};n?l&&w(i.groups,l,b):w(i.groups)}if(l&&l.addTo().select(),!i.elements&&Qae.includes(i.parent)&&i.textures&&typeof i.textures.layer0=="string"){let w=new TextureMesh({name:i.textures.layer0,rotation:[90,180,0],local_pivot:[0,-7.5,-16],locked:!0,export:!1}).init();w.locked=!0,r.push(w)}else!i.elements&&i.parent&&Blockbench.showMessageBox({translateKey:"child_model_only",icon:"info",message:tl("message.child_model_only.message",[i.parent]),commands:!1&&{open:"message.child_model_only.open",open_with_textures:{text:"message.child_model_only.open_with_textures",condition:Texture.all.length>0}}},async E=>{if(typeof E=="string"){let F=function(L){loadModelFile(L,t),E=="open_with_textures"&&Texture.all.forEachReverse(U=>{if(U.error==3&&U.name.startsWith("#")){let J=c[U.name.replace(/#/,"")];J&&(U.fromPath(J.path,t.externalDataLoader),U.namespace=J.namespace)}})},y=i.parent.replace(/\w+:/,""),A=e.split(osfs),R=A.length-A.indexOf("models");A.splice(-R),A.push("models",...y.split("/"));let j=A.join(osfs)+".json",O;if(t.externalDataLoader){let L=t.externalDataLoader(j.replaceAll("\\","/"));if(L){L instanceof Uint8Array&&(L=new TextDecoder().decode(L));try{F({name:PathModule.basename(j),path:j,content:L}),O=!0}catch{}}}O||Blockbench.read([j],{},L=>F(L[0]))}});updateSelection(),a&&VersionUtil.compare(Project.java_block_version,"<","1.21.11")&&(Project.java_block_version="1.21.11"),i.parent!==void 0&&(Project.parent=i.parent),i.ambientocclusion===!1&&(Project.ambientocclusion=!1),i.gui_light==="front"&&(Project.front_gui_light=!0);let x=new Set(["textures","elements","groups","parent","display","__comment","credit","texture_size","overrides","ambientocclusion","gui_light"]);for(let w in i)x.has(w)||(Project.unhandled_root_fields[w]=i[w]);this.dispatchEvent("parsed",{model:i}),n&&Undo.finishEdit("Add block model"),Validator.validate()}}),vy=new ModelFormat({id:"java_block",extension:"json",icon:"icon-format_block",category:"minecraft",target:"Minecraft: Java Edition",format_page:{content:[{type:"h3",text:tl("mode.start.format.informations")},{text:`* ${tl("format.java_block.info.size")} + * ${tl("format.java_block.info.animation")}`.replace(/\t+/g,"")}]},render_sides:"front",model_identifier:!1,parent_model_id:!0,vertex_color_ambient_occlusion:!0,rotate_cubes:!0,rotation_limit:!1,rotation_snap:!1,optional_box_uv:!0,uv_rotation:!0,java_cube_shading_properties:!0,java_face_properties:!0,cullfaces:!0,animated_textures:!0,select_texture_for_particles:!0,texture_mcmeta:!0,display_mode:!0,texture_folder:!0,pbr:!0,cube_size_limiter:{coordinate_limits:[-16,32],test(i,e=0){let t=e.from||i.from,n=e.to||i.to,a=e.inflate==null?i.inflate:e.inflate;return t.find((o,r)=>n[r]+a>32||n[r]+a<-16||t[r]-a>32||t[r]-a<-16)!==void 0},move(i,e=0){let t=e.from||i.from,n=e.to||i.to,a=e.inflate==null?i.inflate:e.inflate;[0,1,2].forEach(o=>{var r=n[o]+a-32;r>0?(t[o]-=r,n[o]-=r,16+t[o]-a<0&&(t[o]=-16+a)):(r=t[o]-a+16,r<0&&(t[o]-=r,n[o]-=r,n[o]+a>32&&(n[o]=32-a)))})},clamp(i,e=0){let t=e.from||i.from,n=e.to||i.to,a=e.inflate==null?i.inflate:e.inflate;[0,1,2].forEach(o=>{t[o]=Math.clamp(t[o]-a,-16,32)+a,n[o]=Math.clamp(n[o]+a,-16,32)-a})}},codec:bf});bf.format=vy;Object.defineProperty(vy,"rotation_snap",{get(){return Project.java_block_version=="1.9.0"}});Object.defineProperty(vy,"rotation_limit",{get(){try{return!VersionUtil.compare(Project.java_block_version,">=","1.21.11")}catch{return!0}}});BARS.defineActions(function(){bf.export_action=new Action({id:"export_blockmodel",icon:"icon-format_block",category:"file",condition:()=>Format==vy,click:function(){bf.export()}}),new Action("import_java_block_model",{icon:"assessment",category:"file",condition:()=>Format==vy,click:function(){Blockbench.import({resource_id:"model",extensions:["json"],type:bf.name,multiple:!0},function(i){i.forEach(e=>{var t=autoParseJSON(e.content,{file_path:e.path});bf.parse(t,e.path,{import_to_current_project:!0})})})}})});var by=new AnimationCodec("bedrock",{pickFile(){let i=Project.export_path;Blockbench.import({resource_id:"animation",extensions:["json"],type:"JSON Animation, JSON Animation Controller",multiple:!0,startpath:i},async e=>{for(let t of e)await this.importFile(t)})},importFile(i,e){let t=this,n={};e&&i.path&&(n._path={type:"info",text:i.path});let a=autoParseJSON(i.content,{file_path:i.path}),o=[],r=!!a.animation_controllers,s=a.animations||a.animation_controllers;for(var l in s){if(0)for(var c of r?AnimationController.all:Animation.all);n["anim"+l.hashCode()]={label:l,type:"checkbox",value:!0},o.push(l)}if(i.json=a,o.length==0)Blockbench.showQuickMessage("message.no_animation_to_import");else if(o.length==1){Undo.initEdit({animations:[]});let d=t.loadFile(i,o);Undo.finishEdit("Import animations",{animations:d})}else return new Promise(d=>{let u=["dialog.ok","dialog.ignore"];e&&Project?.memory_animation_files_to_load?.length>1&&u.push("dialog.ignore_all");let p=new Dialog({id:"animation_import",title:"dialog.animation_import.title",form:n,buttons:u,cancelIndex:1,onConfirm(m){this.hide();let _=[];for(var f of o)m["anim"+f.hashCode()]&&_.push(f);Undo.initEdit({animations:[]});let g=t.loadFile(i,_);Undo.finishEdit("Import animations",{animations:g}),d()},onCancel(m){Project.memory_animation_files_to_load&&Project.memory_animation_files_to_load.remove(i.path),d()},onButton(m){e&&m==2&&Project.memory_animation_files_to_load&&Project.memory_animation_files_to_load.empty(),d()}});n.select_all_none={type:"buttons",buttons:["generic.select_all","generic.select_none"],click(m){let _={};o.forEach(f=>_["anim"+f.hashCode()]=m==0),p.setFormValues(_)}},p.show()})},loadFile(i,e){var t=i.json||autoParseJSON(i.content,{file_path:i.path});let n=i.path,a=[];function o(b){return typeof b=="string"?b.replace(/;\s*(?!$)/g,`; +`):b}if(!t)return a;if(typeof t.animations=="object"){for(let b in t.animations)if(!(e&&!e.includes(b))){var r=t.animations[b],s=new Animation({name:b,saved_name:b,path:n,loop:r.loop&&(r.loop=="hold_on_last_frame"?"hold":"loop"),override:r.override_previous_animation,anim_time_update:o(r.anim_time_update),blend_weight:o(r.blend_weight),start_delay:o(r.start_delay),loop_delay:o(r.loop_delay),length:r.animation_length}).add();if(r.bones){let w=function(y){if(typeof y!="string")return;y=y.replace(/v\./,"variable.").replace(/q\./,"query.").replace(/t\./,"temp.").replace(/c\./,"context.").toLowerCase();let A=y.match(/(query|variable|context|temp)\.\w+(\([^)]*\))?/gi);A&&A.forEach(R=>{let j=Interface.Panels.variable_placeholders.inside_vue;if(x.includes(R)||j.text.split(` +`).find(L=>L.substr(0,R.length)==R))return;let[F,O]=R.split(/\./);j.text!=""&&j.text.substr(-1)!==` +`&&(j.text+=` +`),O=O.replace(/[')]/g,"").replace("(",":"),O=="modified_distance_moved"?j.text+=`${R} = time * 8`:O.match(/is_|has_|can_|blocking/)?j.text+=`${R} = toggle('${O}')`:j.text+=`${R} = slider('${O}')`})},E=function(y,A){if(y instanceof Array){y.forEach(w);let R={x:y[0],y:y[1],z:y[2]};return A=="position"&&(R.x=invertMolang(R.x)),A=="rotation"&&(R.x=invertMolang(R.x),R.y=invertMolang(R.y)),[R]}else{if(["number","string"].includes(typeof y))return w(y),[{x:y,y,z:y}];if(typeof y=="object"){let R=[];return y.pre&&R.push(E(y.pre,A)[0]),y.post&&!(y.pre instanceof Array&&y.post instanceof Array&&y.post.equals(y.pre))&&R.push(E(y.post,A)[0]),R}}},x=["query.anim_time","query.life_time","query.time_stamp","query.delta_time","query.camera_rotation","query.rotation_to_camera","query.distance_from_camera","query.lod_index","query.camera_distance_range_lerp"];for(var l in r.bones){var c=r.bones[l];let y=l.toLowerCase();var d=Group.all.find(R=>R.name.toLowerCase()==y);let A=d?d.uuid:guid();var u=new BoneAnimator(A,s,l);s.animators[A]=u;for(var p in c){if(!BoneAnimator.prototype.channels[p])continue;if(typeof c[p]=="string"||typeof c[p]=="number"||c[p]instanceof Array)u.addKeyframe({time:0,channel:p,uniform:!(c[p]instanceof Array),data_points:E(c[p],p)});else if(typeof c[p]=="object"&&c[p].post)u.addKeyframe({time:0,channel:p,interpolation:c[p].lerp_mode,uniform:!(c[p].post instanceof Array),data_points:E(c[p],p)});else if(typeof c[p]=="object")for(var m in c[p])u.addKeyframe({time:parseFloat(m),channel:p,interpolation:c[p][m].lerp_mode,uniform:!(c[p][m]instanceof Array),data_points:E(c[p][m],p)});let R=u[p].slice().sort((F,O)=>F.time-O.time),j=!1;R.forEach((F,O)=>{let L=R[O+1];L&&L.data_points.length==2&&F.getArray(1).equals(L.getArray(0))?(L.data_points.splice(0,1),F.interpolation="step",j=!0):!L&&j&&(F.interpolation="step")})}c.relative_to&&c.relative_to.rotation=="entity"&&(u.rotation_global=!0)}}if(r.sound_effects){s.animators.effects||(s.animators.effects=new EffectAnimator(s));for(var m in r.sound_effects){var _=r.sound_effects[m];_ instanceof Array||(_=[_]),s.animators.effects.addKeyframe({channel:"sound",time:parseFloat(m),data_points:_})}}if(r.particle_effects){s.animators.effects||(s.animators.effects=new EffectAnimator(s));for(var m in r.particle_effects){var f=r.particle_effects[m];f instanceof Array||(f=[f]),f.forEach(w=>{w&&(w.script=w.pre_effect_script)}),s.animators.effects.addKeyframe({channel:"particle",time:parseFloat(m),data_points:f})}}if(r.timeline){s.animators.effects||(s.animators.effects=new EffectAnimator(s));for(var m in r.timeline){var g=r.timeline[m],v=g instanceof Array?g.join(` +`):g;if(typeof v=="string"){let w=Interface.Panels.variable_placeholders.inside_vue,E=v.match(/(v|variable)\.texture\w*\s*=/);E&&!w.text.includes("preview.texture =")&&(w.text!=""&&w.text.substr(-1)!==` +`&&(w.text+=` +`),w.text+=`preview.texture = ${E[0].replace(/\s*=$/,"")}`)}s.animators.effects.addKeyframe({channel:"timeline",time:parseFloat(m),data_points:[{script:v}]})}}s.calculateSnappingFromKeyframes(),s.setScopeFromAnimators(),!Animation.selected&&Animator.open&&s.select(),a.push(s),Blockbench.dispatchEvent("load_animation",{animation:s,json:t})}}else typeof t.animation_controllers=="object"&&AnimationCodec.codecs.bedrock_animation_controller.loadFile(i,e);return a},reloadAnimation(i){Blockbench.read([i.path],{},([e])=>{Undo.initEdit({animations:[i]});let t=Animation.all.indexOf(i);i.remove(!1,!1);let[n]=by.loadFile(e,[i.name]);n?(Animation.all.remove(n),Animation.all.splice(t,0,n),Undo.finishEdit("Reload animation",{animations:[n]})):Undo.cancelEdit()})},reloadFile(i){let e=i,t=Animation.all.filter(r=>r.path==e&&r.saved),n=AnimationController.all.filter(r=>r.path==e&&r.saved);if(!t.length&&!n.length)return;Undo.initEdit({animations:t,animation_controllers:n});let a=[],o=AnimationItem.selected?.name;t.forEach(r=>{a.push(r.name),r.remove(!1,!1)}),n.forEach(r=>{a.push(r.name),r.remove(!1,!1)}),Blockbench.read([e],{},([r])=>{let s=by.loadFile(r,a),l=s.find(c=>c.name==o);l&&l.select(),s[0]instanceof AnimationController?Undo.finishEdit("Reload animation controller file",{animation_controllers:s,animations:[]}):Undo.finishEdit("Reload animation file",{animations:s,animation_controllers:[]})})},compileAnimation(i){let e={};i.loop=="hold"?e.loop="hold_on_last_frame":(i.loop=="loop"||i.getMaxLength()==0)&&(e.loop=!0),i.length&&(e.animation_length=Math.roundTo(i.length,4)),i.override&&(e.override_previous_animation=!0),i.anim_time_update&&(e.anim_time_update=exportMolang(i.anim_time_update)),i.blend_weight&&(e.blend_weight=exportMolang(i.blend_weight)),i.start_delay&&(e.start_delay=exportMolang(i.start_delay)),i.loop_delay&&e.loop&&(e.loop_delay=exportMolang(i.loop_delay)),e.bones={};for(var t in i.animators){var n=i.animators[t];if(!(!n.keyframes.length&&!n.rotation_global)){if(n instanceof EffectAnimator)n.sound.sort((c,d)=>c.time-d.time).forEach(c=>{e.sound_effects||(e.sound_effects={}),e.sound_effects[c.getTimecodeString()]=c.compileBedrockKeyframe()}),n.particle.sort((c,d)=>c.time-d.time).forEach(c=>{e.particle_effects||(e.particle_effects={}),e.particle_effects[c.getTimecodeString()]=c.compileBedrockKeyframe()}),n.timeline.sort((c,d)=>c.time-d.time).forEach(c=>{e.timeline||(e.timeline={}),e.timeline[c.getTimecodeString()]=c.compileBedrockKeyframe()});else if(n.type=="bone"){var a=n.getGroup(),o=e.bones[a?a.name:n.name]={};n.rotation_global&&(o.relative_to={rotation:"entity"},o.rotation=[0,0,.01]);for(var r in Animator.possible_channels){if(!n[r]?.length)continue;o[r]={};let c=n[r].slice().sort((u,p)=>u.time-p.time);c.forEach((u,p)=>{let m=u.getTimecodeString();o[r][m]=u.compileBedrockKeyframe(),n.rotation_global&&u.channel=="rotation"&&o[u.channel][m]instanceof Array&&o[u.channel][m].allEqual(0)&&(o[u.channel][m][2]=.01);let _=c[p+1];if(_&&(u.interpolation==="bezier"||_.interpolation==="bezier")){let f=1/i.snapping,g={};for(let w=u.time+f;w<_.time+f/2;w+=f){let E=trimFloatNumber(Timeline.snapTime(w,i)).toString();E.includes(".")||(E+=".0");let y=Math.getLerp(u.time,_.time,w),A=[0,1,2].map(R=>u.getBezierLerp(u,_,getAxisLetter(R),y));(r=="position"||r=="rotation")&&(A[0]=-A[0]),r=="rotation"&&(A[1]=-A[1]),g[E]=A}let v=Object.keys(g),b=0,x=r=="scale"?.005:r=="rotation"?.1:.01;v.forEach((w,E)=>{let y=g[w],A=g[v[E-1]]||o[r][m],R=g[v[E+1]];if(!R)return;let j=0;y.allAre((O,L)=>{let U=Math.abs(A[L]-O-(O-R[L]));return j=Math.max(j,U),U{let _=trimFloatNumber(Timeline.snapTime(m/l,i)).toString();_.includes(".")||(_+=".0"),p.array[0]=invertMolang(p.array[0]),p.array[1]=invertMolang(p.array[1]),o.rotation[_]=p.array})}return Object.keys(e.bones).length==0&&delete e.bones,Blockbench.dispatchEvent("compile_bedrock_animation",{animation:i,json:e}),e},compileFile(i){var e={};return i.forEach(t=>{let n=this.compileAnimation(t);e[t.name]=n}),{format_version:"1.8.0",animations:e}},saveAnimation(i){let e={format_version:"1.8.0",animations:{[i.name]:this.compileAnimation(i)}};if(0){if(null.existsSync(i.path))try{}catch(a){var t}}else Blockbench.export({resource_id:"animation",type:"JSON Animation",extensions:["json"],name:(Project.geometry_name||"model")+".animation",startpath:i.path,content:compileJSON(e)},n=>{i.path==n,i.saved=!0})},exportFile(i,e){let t=i||"";if(0)var n,a;let o=Animator.animations.filter(r=>r.path==t);{let r=this.compileFile(o);Blockbench.export({resource_id:"animation",type:"JSON Animation",extensions:["json"],name:(Project.geometry_name||"model")+".animation",startpath:i,content:autoStringify(r),custom_writer:!1},s=>{o.forEach(function(l){l.path=s,l.saved=!0})})}},deleteAnimationFromFile(i){let e=null.readFileSync(i.path,"utf-8"),t=autoParseJSON(e,!1);t&&t.animations&&t.animations[i.name]&&(delete t.animations[i.name],Blockbench.writeFile(i.path,{content:compileJSON(t)}),Undo.history.last().before.animations[i.uuid].saved=!1)}});Blockbench.on("edit_animation_properties",({animation:i})=>{AnimationCodec.getCodec()==by&&(i.name=i.name.trim().replace(/\s+/g,"_"))});var dye=new vf("bedrock_animation_controller",{multiple_per_file:!0,loadFile(i,e){var t=i.json||autoParseJSON(i.content,{file_path:i.path});let n=i.path,a=[];if(!t)return a;if(typeof t.animations=="object")return vf.codecs.bedrock.loadFile(i,e);if(typeof t.animation_controllers=="object")for(let o in t.animation_controllers){if(e&&!e.includes(o))continue;let r=t.animation_controllers[o],s=new AnimationController({name:o,saved_name:o,path:n,states:r.states,initial_state:r.initial_state||(r.states?.default?"default":void 0)}).add();!Animation.selected&&!AnimationController.selected&&Animator.open&&s.select(),a.push(s),Blockbench.dispatchEvent("load_animation_controller",{animation_controller:s,json:t})}return a},compileAnimation(i){return i.compileForBedrock()},compileFile(i){let e={};return i.forEach(function(t){let n=t.compileForBedrock();e[t.name]=n}),{format_version:"1.19.0",animation_controllers:e}},exportFile(i,e){let t=i||"";if(0)var n,a;{let o=Animator.animations.filter(s=>s.path==t||!s.path&&!t),r=this.compileFile(o);Blockbench.export({resource_id:"animation_controller",type:"JSON Animation Controller",extensions:["json"],name:(Project.geometry_name||"model")+".animation_controllers",startpath:i,content:autoStringify(r),custom_writer:!1},s=>{AnimationController.all.forEach(function(l){l.path==t&&(l.path=s,l.saved=!0)})})}},deleteAnimationFromFile(i){let e=null.readFileSync(i.path,"utf-8"),t=autoParseJSON(e,!1);t&&t.animation_controllers&&t.animation_controllers[i.name]&&(delete t.animation_controllers[i.name],Blockbench.writeFile(i.path,{content:compileJSON(t)}),Undo.history.last().before.animation_controllers[i.uuid].saved=!1)}});var I1=new Codec("bedrock_voxel_shape",{name:"Bedrock Voxel Shape",extension:"json",remember:!0,support_partial_export:!0,load_filter:{type:"json",extensions:["json"],condition(i){return i["minecraft:voxel_shape"]}},parse(i,e,t={}){this.dispatchEvent("parse",{model:i});let n=i["minecraft:voxel_shape"];n.description.identifier&&!t.import_to_current_project&&(Project.model_identifier=n.description.identifier);let a=[],o=[];t.import_to_current_project&&Undo.initEdit({elements:a,groups:o,outliner:!0});let r=new Group({name:"voxel_shape"}).init(),s=[-8,0,-8],l=0;for(let c of n.shape.boxes){let d=new Jo({from:c.min.slice().V3_add(s),to:c.max.slice().V3_add(s),color:6});d.init().addTo(r),a.push(d),l++}t.import_to_current_project&&(o.push(r),Undo.finishEdit("Import bounding box")),this.dispatchEvent("parsed",{model:i}),Validator.validate()},compile(i={}){let e={description:{identifier:Project.model_identifier},shape:{boxes:[]}},t=[-8,0,-8];for(let a of Jo.all){let o=a;if(o.export==!1)continue;let r={min:o.from.slice().V3_subtract(t),max:o.to.slice().V3_subtract(t)};e.shape.boxes.push(r)}let n={format_version:"1.21.110","minecraft:voxel_shape":e};return this.dispatchEvent("compile",{model:n,options:i}),i.raw?n:autoStringify(n)},fileName(){var i=Project.name||"model";return i.match(/\.geo$/)||(i+=".geo"),i}});function P5(i,e,t=!1){i instanceof Array||(i=[i]);let n=[];Outliner.selected.empty();for(let a of i){if(typeof a!="object"||!(a.origin instanceof Array)||!(a.size instanceof Array))return;n.length==0&&t&&Undo.initEdit({elements:n,outliner:!0});let o=new Jo({name:e,from:[-(a.origin[0]+a.size[0]),a.origin[1],a.origin[2]],to:[-a.origin[0],a.origin[1]+a.size[1],a.origin[2]+a.size[2]],function:[e=="selection"?"hitbox":"collision"],color:e=="selection"?0:2});o.addTo().init(),n.push(o),o.markAsSelected()}return updateSelection(),n.length&&t&&Undo.finishEdit("Paste bounding boxes"),n}BARS.defineActions(function(){I1.format=Formats.bedrock_block,I1.export_action=new Action("export_bedrock_voxel_shape",{icon:"fa-cubes",category:"file",condition:{formats:["bedrock_block"],method:()=>Jo.all.length>0},click(){I1.export()}}),new Action("import_bedrock_voxel_shape",{icon:"fa-cubes",category:"file",condition:{formats:["bedrock_block"]},click(){bn.importFile({resource_id:"bedrock_voxel_shape",extensions:["json"],type:"Voxel Shape",multiple:!0,readtype:"text"},e=>{for(let t of e){let n=autoParseJSON(t.content);I1.parse(n,t.path,{import_to_current_project:!0})}})}}),new Action("generate_bedrock_block_box",{icon:"fa-cubes",category:"file",condition:{formats:["bedrock_block"]},click(){if(!Jo.all.length)return Blockbench.showQuickMessage("dialog.bedrock_bounding_box.no_bounding_boxes");function e(t,n){let a=Jo.all;if(a.some(l=>l.function.length)){let l=t=="collision_box"?"collision":"hitbox";a=a.filter(c=>c.function.includes(l))}let o=a.map(l=>({origin:[-l.to[0],l.from[1],l.from[2]],size:l.size()}));if(t=="selection_box"){let{origin:l,size:c}=o[0],d=l[0],u=l[1],p=l[2],m=l[0]+c[0],_=l[1]+c[1],f=l[2]+c[2];for(let g=1;go.function.length)){let o=t=="collision_box"?"collision":"hitbox";a=a.filter(r=>r.function.includes(o))}if(t=="collision_box"){let o='"minecraft:collision_box": ',r=a[0],s={width:r.size(0)/16,height:r.size(1)/16};return o+compileJSON(s,{small:n})}else{let o='"minecraft:custom_hit_test": ',r=a.map(s=>{let l=s.to.slice().V3_add(s.from).V3_divide(2);return{width:s.size(0)/16,height:s.size(1)/16,pivot:[-l[0]/16,l[1]/16,l[2]/16]}});return o+compileJSON({hitboxes:r},{small:n})}}new Dialog({id:"generate_bedrock_entity_box",title:"action.generate_bedrock_entity_box",form:{type:{label:"dialog.bedrock_bounding_box.type",type:"inline_select",options:{collision_box:"dialog.bedrock_bounding_box.type.collision_box",hitbox:"dialog.bedrock_bounding_box.type.hitbox"}},minify:{type:"checkbox",label:"Minify"},output:{type:"textarea",style:"code",value:e("collision_box",!1),full_width:!0,readonly:!0,share_text:!0},collision_note:{type:"info",text:"dialog.bedrock_bounding_box.collision_note",condition:t=>t.type=="collision_box"},hitbox_note:{type:"info",text:"dialog.bedrock_bounding_box.hitbox_note",condition:t=>t.type=="hitbox"}},onFormChange(t){let n=e(t.type,t.minify);Dialog.open.setFormValues({output:n},!1)},singleButton:!0}).show()}});let i=["bedrock","bedrock_block"];Blockbench.on("drop_text paste_text",e=>{if(!Format||!i.includes(Format.id))return;let t=e.text.replace(/\s+/g,"");if(t.startsWith('"minecraft:selection_box"')||t.startsWith('"minecraft:collision_box"')){let n=t.replace(/^"[^"]*"\s*:\s*/,"").replace(/[,\s]+$/,""),a=autoParseJSON(n,!0);if(!a)return;let o=/minecraft:(\w+)/.exec(t)?.[1]??"box";P5(a,o,!0)}})});var eoe={loadBedrockCollisionFromJSON:P5};Object.assign(window,eoe);function B5(){var i=new THREE.Box3;Canvas.withoutGizmos(()=>{Cube.all.forEach(r=>{r.export&&r.mesh&&i.expandByObject(r.mesh)})});var e=new THREE.Vector3(8,8,8);i.max.add(e),i.min.add(e);var t=Math.max(i.max.x,i.max.z,-i.min.x,-i.min.z);Math.abs(t)===1/0&&(t=0);let n=Math.ceil(t*2/16);n=Math.max(n,Project.visible_box[0]),Project.visible_box[0]=n;let a=Math.floor(i.min.y/16),o=Math.ceil(i.max.y/16);return a===1/0&&(a=0),o===1/0&&(o=0),a=Math.min(a,Project.visible_box[2]-Project.visible_box[1]/2),o=Math.max(o,Project.visible_box[2]+Project.visible_box[1]/2),Project.visible_box.replace([n,o-a,(o+a)/2]),Project.visible_box}window.calculateVisibleBox=B5;function R5(i,e,t){var n=new Cube({name:i.name||e.name,autouv:0,color:e.color,rotation:i.rotation,origin:i.pivot});if(n.rotation.forEach(function(s,l){l!=2&&(n.rotation[l]*=-1)}),n.origin[0]*=-1,i.origin&&(n.from.V3_set(i.origin),n.from[0]=-(n.from[0]+i.size[0]),i.size&&(n.to[0]=i.size[0]+n.from[0],n.to[1]=i.size[1]+n.from[1],n.to[2]=i.size[2]+n.from[2])),i.uv instanceof Array)n.uv_offset[0]=i.uv[0],n.uv_offset[1]=i.uv[1],n.box_uv=!0;else if(i.uv){n.box_uv=!1;for(var a in n.faces){var o=n.faces[a];i.uv[a]?(o.extend({material_name:i.uv[a].material_instance,uv:[i.uv[a].uv[0],i.uv[a].uv[1]],rotation:i.uv[a].uv_rotation}),i.uv[a].uv_size?o.uv_size=[i.uv[a].uv_size[0],i.uv[a].uv_size[1]]:(n.autouv=1,n.mapAutoUV()),(a=="up"||a=="down")&&(o.uv=[o.uv[2],o.uv[3],o.uv[0],o.uv[1]])):(o.texture=null,o.uv=[0,0,0,0],o.rotation=0)}}let r=i.inflate??t?.inflate;return typeof r=="number"&&(n.inflate=r),i.mirror===void 0?n.mirror_uv=e.mirror_uv:n.mirror_uv=i.mirror===!0,n.addTo(e).init(),n}function j5(i,e,t){var n=new Group({name:i.name,origin:i.pivot,rotation:i.rotation,material:i.material,bedrock_binding:i.binding,color:Group.all.length%markerColors.length}).init();if(n.createUniqueName(),e[i.name]=n,i.pivot&&(n.origin[0]*=-1),n.rotation.forEach(function(o,r){r!==2&&(n.rotation[r]*=-1)}),n.mirror_uv=i.mirror===!0,n.reset=i.reset===!0,i.cubes&&i.cubes.forEach(function(o){R5(o,n,i)}),i.locators)for(let o in i.locators){let r,s,l;i.locators[o]instanceof Array?r=i.locators[o]:(r=i.locators[o].offset,s=i.locators[o].rotation,l=i.locators[o].ignore_inherited_scale),r[0]*=-1,s instanceof Array&&(s[0]*=-1,s[1]*=-1),o.substr(0,6)=="_null_"&&i.locators[o]instanceof Array?new NullObject({from:r,name:o.substr(6)}).addTo(n).init():new Locator({position:r,name:o,rotation:s,ignore_inherited_scale:l}).addTo(n).init()}i.texture_meshes instanceof Array&&i.texture_meshes.forEach(o=>{let r=Texture.all.find(l=>l.name==o.texture),s=new TextureMesh({texture_name:o.texture,texture:r?r.uuid:null,origin:o.position,rotation:o.rotation,local_pivot:o.local_pivot,scale:o.scale});s.local_pivot[2]*=-1,s.origin[1]*=-1,i.pivot&&(s.origin[1]+=i.pivot[1]),s.origin[0]*=-1,s.rotation[0]*=-1,s.rotation[1]*=-1,s.addTo(n).init()}),i.children&&i.children.forEach(function(o){o.addTo(n)});var a="root";i.parent&&(e[i.parent]?a=e[i.parent]:t.forEach(function(o){o.name===i.parent&&(o.children&&o.children.length?o.children.push(n):o.children=[n])})),n.addTo(a)}function yf(i,e={}){let{description:t}=i.object,n=t.identifier&&t.identifier.replace(/^geometry\./,"")||"";if(e.switch_to_existing_tab!=!1){let r=!1;if(r){Project.close().then(()=>{r.select()});return}}Bl.dispatchEvent("parse",{model:i.object}),e.import_to_current_project?e.collection&&(e.collection.model_identifier=n):(Project.model_identifier=n,Project.texture_width=16,Project.texture_height=16),typeof t.visible_bounds_width=="number"&&typeof t.visible_bounds_height=="number"&&(Project.visible_box[0]=Math.max(Project.visible_box[0],t.visible_bounds_width||0),Project.visible_box[1]=Math.max(Project.visible_box[1],t.visible_bounds_height||0),t.visible_bounds_offset&&typeof t.visible_bounds_offset[1]=="number"&&(Project.visible_box[2]=t.visible_bounds_offset[1]||0)),t.texture_width!==void 0&&(Project.texture_width=t.texture_width),t.texture_height!==void 0&&(Project.texture_height=t.texture_height),i.object.item_display_transforms!==void 0&&(DisplayMode.loadJSON(i.object.item_display_transforms),i.object.item_display_transforms.gui&&i.object.item_display_transforms.gui.fit_to_frame==null&&(Project.display_settings.gui.fit_to_frame=!0));var a={};if(i.object.bones){var o=[];i.object.bones.forEach(function(r){o.push(r.name)}),i.object.bones.forEach(function(r){j5(r,a,i.object.bones)})}Project.box_uv=Cube.all.filter(r=>r.box_uv).length>Cube.all.length/2,Bl.dispatchEvent("parsed",{model:i.object}),Canvas.updateAllBones(),setProjectTitle(),Validator.validate(),updateSelection()}function I5(i,e){var t={origin:i.from.slice(),size:i.size(),inflate:i.inflate||void 0};if(i.box_uv&&(t=new oneLiner(t)),t.origin[0]=-(t.origin[0]+t.size[0]),i.rotation.allEqual(0)||(t.pivot=i.origin.slice(),t.pivot[0]*=-1,t.rotation=i.rotation.slice(),t.rotation.forEach(function(o,r){r!=2&&(t.rotation[r]*=-1)})),i.box_uv)t.uv=i.uv_offset,i.mirror_uv===!e.mirror&&(t.mirror=i.mirror_uv);else{t.uv={};for(var n in i.faces){var a=i.faces[n];a.texture!==null&&(t.uv[n]=new oneLiner({uv:[a.uv[0],a.uv[1]],uv_size:[a.uv_size[0],a.uv_size[1]]}),a.rotation&&(t.uv[n].uv_rotation=a.rotation),a.material_name&&(t.uv[n].material_instance=a.material_name),(n=="up"||n=="down")&&(t.uv[n].uv[0]+=t.uv[n].uv_size[0],t.uv[n].uv[1]+=t.uv[n].uv_size[1],t.uv[n].uv_size[0]*=-1,t.uv[n].uv_size[1]*=-1))}}return t}function D5(i){if(i.type==="group"){if(i.export==!1){let r=function(s){for(let l of s.children)if(l.export==!0||"children"in l&&r(l))return!0};if(!r(i))return!1}if(!(!settings.export_empty_groups.value&&!i.children.find(r=>r.export))&&!(i.children.length&&i.children.allAre(r=>r instanceof BoundingBox))){var e={};e.name=i.name,i.parent.type==="group"&&(e.parent=i.parent.name),e.pivot=i.origin.slice(),e.pivot[0]*=-1,i.rotation.allEqual(0)||(e.rotation=i.rotation.slice(),e.rotation[0]*=-1,e.rotation[1]*=-1),i.bedrock_binding&&(e.binding=i.bedrock_binding),i.reset&&(e.reset=!0),i.mirror_uv&&Project.box_uv&&(e.mirror=!0),i.material&&(e.material=i.material);var t=[],n={},a=[];for(var o of i.children)if(o.export){if(o instanceof Cube){let r=I5(o,e);t.push(r)}else if(o instanceof Locator||o instanceof NullObject){let r=o.name;o instanceof NullObject&&(r="_null_"+r);let s=o.position.slice();s[0]*=-1,o.getTypeBehavior("rotatable")&&!o.rotation.allEqual(0)||o.ignore_inherited_scale?(n[r]={offset:s},o.getTypeBehavior("rotatable")&&(n[r].rotation=[-o.rotation[0],-o.rotation[1],o.rotation[2]]),o.ignore_inherited_scale&&(n[r].ignore_inherited_scale=!0)):n[r]=s}else if(o instanceof TextureMesh){let r={texture:o.texture_name,position:o.origin.slice()};r.position[0]*=-1,r.position[1]-=e.pivot[1],r.position[1]*=-1,o.rotation.allEqual(0)||(r.rotation=[-o.rotation[0],-o.rotation[1],o.rotation[2]]),o.local_pivot.allEqual(0)||(r.local_pivot=o.local_pivot.slice(),r.local_pivot[2]*=-1),o.scale.allEqual(1)||(r.scale=o.scale.slice()),a.push(r)}}return t.length&&(e.cubes=t),a.length&&(e.texture_meshes=a),Object.keys(n).length&&(e.locators=n),e}}}var Eye=new Codec("bedrock_entity_file",{name:"Bedrock Entity",extension:"json",remember:!1,support_partial_export:!0,support_offset:!0,load_filter:{type:"json",extensions:["json"],condition(i){return i.format_version&&(i["minecraft:client_entity"]||i["minecraft:attachable"])}},load(i,e,t){let n=i["minecraft:attachable"]!==void 0,a=(i["minecraft:client_entity"]||i["minecraft:attachable"]).description,o=[];for(let u in a.geometry){let p=a.geometry[u];o.push(p)}if(!o[0])return;let r=e.path.split(osfs),s=r.pop().replace(/(\.entity|\.attachable)?\.json$/,""),l=r.indexOf(n?"attachables":"entity");r.splice(l);let[c,d]=Blockbench.findFileFromContent([[...r,"models","entity"].join(osfs),[...r,"models","blocks"].join(osfs)],{filter_regex:/\.json$/i,priority_regex:new RegExp(s,"i"),json:!0},(u,p)=>{if(p["minecraft:geometry"]instanceof Array){if(p["minecraft:geometry"].find(_=>_.description?.identifier==o[0]))return[u,p]}else if(p[o[0]])return[u,p]})||[];c&&(BedrockEntityManager.CurrentContext={geometry:o[0],entity_file_path:e.path,type:"entity"},(d["minecraft:geometry"]?Codecs.bedrock:Codecs.bedrock_old).load(d,{path:c},!1),delete BedrockEntityManager.CurrentContext)}});function KC(){if(Format.display_mode)for(let i in DisplayMode.slots){let e=DisplayMode.slots[i];if(Project.display_settings[e]&&Project.display_settings[e].export&&Project.display_settings[e].export())return"1.21.110"}for(let i of Cube.all)if(!i.box_uv){for(let e in i.faces)if(i.faces[e].rotation)return"1.21.0"}return Group.all.find(i=>i.bedrock_binding)?"1.16.0":"1.12.0"}function toe(i,e){for(let t of i){t.pivot&&t.pivot.V3_add(e);for(let n of t.cubes??[])n.origin.V3_add(e),n.pivot?.V3_add(e);if(typeof t.locators=="object")for(let n in t.locators){let a=t.locators[n];a instanceof Array?a.V3_add(e):a.offset&&a.offset.V3_add(e)}}}var Bl=new Codec("bedrock",{name:"Bedrock Model",extension:"json",remember:!0,multiple_per_file:!0,support_partial_export:!0,support_offset:!0,load_filter:{type:"json",extensions:["json"],condition(i){return i["minecraft:geometry"]&&i.format_version&&vo.compare(i.format_version,">=","1.12.0")}},load(i,e,t={}){let n=Settings.get("default_bedrock_format")=="block";if(e.path&&(e.path.match(/[\\/]models[\\/]blocks[\\/]/)?n=!0:e.path.match(/[\\/]models[\\/]entity[\\/]/)&&(n=!1)),i["minecraft:geometry"]?.[0]?.item_display_transforms&&(n=!0),(typeof t=="boolean"?t:t.import_to_current_project)||setupProject(n?sl:yy),e.path&&!1)var o;this.parse(i,e.path,t),e.path},compile(i){i===void 0&&(i={});var e={},t={format_version:KC(),"minecraft:geometry":[e]};e.description={identifier:"geometry."+(this.context?.model_identifier||Project.geometry_name||"unknown"),texture_width:Project.texture_width||16,texture_height:Project.texture_height||16},i.collection;var n=[],a=getAllGroups(),o=[];if(Outliner.root.forEach(l=>{l instanceof OutlinerElement&&o.push(l)}),o.length){let l=new Group({name:"bb_main"});l.children.push(...o),l.is_catch_bone=!0,l.createUniqueName(),a.splice(0,0,l)}if(a.forEach(l=>{let c=D5(l);c&&n.push(c)}),n.length&&i.visible_box!==!1){let l=B5();e.description.visible_bounds_width=l[0]||0,e.description.visible_bounds_height=l[1]||0,e.description.visible_bounds_offset=[0,l[2]||0,0]}n.length&&(e.bones=n);let r=i.offset||this.context?.offset;r instanceof Array&&r.allEqual(0)==!1&&toe(n,r.slice().V3_multiply(1,-1,-1));let s={};for(let l in DisplayMode.slots){let c=DisplayMode.slots[l];if(Project.display_settings[c]&&Project.display_settings[c].exportBedrock){let d=Project.display_settings[c].exportBedrock();d&&(s[c]=d)}}return Object.keys(s).length&&(e.item_display_transforms=s),this.dispatchEvent("compile",{model:t,options:i}),i.raw?t:autoStringify(t)},overwrite(i,e,t){var n,a,o="geometry."+(this.context?.model_identifier||Project.geometry_name||"unknown");try{if(n=null.readFileSync(e,"utf-8"),n=autoParseJSON(n,!1),!(n["minecraft:geometry"]instanceof Array))throw"Incompatible format";var r=0;for(let c of n["minecraft:geometry"]){if(c.description&&c.description.identifier==o){a=r;break}r++}}catch(c){var s=null.showMessageBox(null,{type:"warning",buttons:[tl("message.bedrock_overwrite_error.overwrite"),tl("dialog.cancel")],title:"Blockbench",message:tl("message.bedrock_overwrite_error.message"),detail:c+"",noLink:!1});if(s===1)return}if(n&&a!==void 0){(!n.format_version||vo.compare(KC(),">",n.format_version))&&(n.format_version=KC()),n["minecraft:geometry"].forEach(c=>{c.bones instanceof Array&&c.bones.forEach(d=>{d.cubes instanceof Array&&d.cubes.forEach((u,p)=>{u.uv instanceof Array&&(d.cubes[p]=new oneLiner(u))})})});var l=this.compile({raw:!0})["minecraft:geometry"][0];a!=null?n["minecraft:geometry"][a]=l:n["minecraft:geometry"].push(l),i=autoStringify(n)}Blockbench.writeFile(e,{content:i},t)},parse(i,e,t={}){Format!=Formats.bedrock&&Format!=Formats.bedrock_block&&Formats.bedrock.select();let n=[];for(let o of i["minecraft:geometry"])typeof o=="object"&&n.push({object:o,name:o.description?.identifier||""});if(n.length===1)return yf(n[0],t);n.forEach(o=>{o.uuid=guid(),o.bonecount=0,o.cubecount=0,o.object.bones instanceof Array&&o.object.bones.forEach(r=>{o.bonecount++,r.cubes instanceof Array&&(o.cubecount+=r.cubes.length)})});let a=null;new Dialog({id:"bedrock_model_select",title:"dialog.select_model.title",buttons:["Import","dialog.cancel"],component:{data(){return{search_term:"",geometries:n,selected:null}},computed:{filtered_geometries(){if(!this.search_term)return this.geometries;let o=this.search_term.toLowerCase();return this.geometries.filter(r=>r.name.toLowerCase().includes(o))}},methods:{selectGeometry(o){this.selected=a=o},open(o){Dialog.open.hide(),yf(o,t)},tl},template:` +
    + +
      +
    • +

      {{ geometry.name }}

      + +
    • +
    +
    + `},onConfirm(){yf(a,t)}}).show()},fileName(){var i=Project.name||"model";return i.match(/\.geo$/)||(i+=".geo"),i}});Bl.parseCube=R5;Bl.parseBone=j5;Bl.parseGeometry=yf;Bl.compileCube=I5;Bl.compileGroup=D5;var yy=new ModelFormat({id:"bedrock",extension:"json",icon:"icon-format_bedrock",category:"minecraft",target:"Minecraft: Bedrock Edition",format_page:{content:[{type:"h3",text:tl("mode.start.format.informations")},{text:`* ${tl("format.bedrock.info.textures")}`},{type:"h3",text:tl("mode.start.format.resources")},{text:`* [Article on modeling and implementation](https://www.blockbench.net/wiki/guides/bedrock-modeling) + * [Modeling Tutorial Series](https://www.youtube.com/watch?v=U9FLteWmFzg&list=PLvULVkjBtg2SezfUA8kHcPUGpxIS26uJR)`.replace(/\t+/g,"")}]},node_name_regex:"\\w.-",rotate_cubes:!0,box_uv:!0,optional_box_uv:!0,uv_rotation:!0,single_texture:!0,bone_rig:!0,centered_grid:!0,animated_textures:!0,animation_files:!0,animation_mode:!0,animation_controllers:!0,bone_binding_expression:!0,locators:!0,texture_meshes:!0,bounding_boxes:!0,pbr:!0,codec:Bl,animation_codec:by,onSetup(i){}});Object.defineProperty(yy,"per_texture_uv_size",{get:i=>!!Project.multi_file_ruleset});var sl=new ModelFormat({id:"bedrock_block",category:"minecraft",extension:"json",icon:"icon-format_bedrock_block",target:"Minecraft: Bedrock Edition",format_page:{content:[{type:"h3",text:tl("mode.start.format.informations")},{text:`* ${tl("format.bedrock_block.info.size_limit")}`},{text:`* ${tl("format.bedrock_block.info.textures")}`},{type:"h3",text:tl("mode.start.format.resources")},{text:`* [Article on implementing custom blocks](https://learn.microsoft.com/en-us/minecraft/creator/documents/customblock) + * [Modeling Tutorial Series](https://www.youtube.com/watch?v=U9FLteWmFzg&list=PLvULVkjBtg2SezfUA8kHcPUGpxIS26uJR)`.replace(/\t+/g,"")}]},node_name_regex:"\\w.-",show_on_start_screen:new Date().dayOfYear()>=298||new Date().getYear()>122,rotate_cubes:!0,box_uv:!1,optional_box_uv:!0,uv_rotation:!0,single_texture_default:!0,bone_rig:!0,centered_grid:!0,animated_textures:!0,animation_files:!1,animation_mode:!1,display_mode:!0,texture_meshes:!0,bounding_boxes:!0,pbr:!0,cube_size_limiter:{rotation_affected:!0,box_marker_size:[30,30,30],updateBoxMarker(){let i=Format.cube_size_limiter.getModelCenter();three_grid.size_limit_box&&three_grid.size_limit_box.position.set(i[0]+i[3],i[1]+i[4],i[2]+i[5]).divideScalar(2)},getModelCenter(i=[]){let e=i.length>0?"cached_center":"cached_center_all";if(sl.cube_size_limiter[e])return sl.cube_size_limiter[e];let t=[-7,1,-7,7,15,7];return Cube.all.forEach(n=>{if(i.includes(n))return;sl.cube_size_limiter.getCubeVertexCoordinates(n,n).forEach(o=>{t[3]=Math.min(t[3],o[0]+15),t[0]=Math.max(t[0],o[0]-15),t[4]=Math.min(t[4],o[1]+15),t[1]=Math.max(t[1],o[1]-15),t[5]=Math.min(t[5],o[2]+15),t[2]=Math.max(t[2],o[2]-15)})}),sl.cube_size_limiter[e]=t,setTimeout(()=>{delete sl.cube_size_limiter[e]},2),t},getCubeVertexCoordinates(i,e){let{from:t,to:n,inflate:a}=e,o=[[t[0]-a,t[1]-a,t[2]-a],[t[0]-a,t[1]-a,n[2]+a],[t[0]-a,n[1]+a,t[2]-a],[t[0]-a,n[1]+a,n[2]+a],[n[0]+a,t[1]-a,t[2]-a],[n[0]+a,t[1]-a,n[2]+a],[n[0]+a,n[1]+a,t[2]-a],[n[0]+a,n[1]+a,n[2]+a]];return o.forEach(r=>{r.V3_subtract(i.origin);let s=Reusable.vec1.set(...r);i.mesh.localToWorld(s),r.replace(s.toArray())}),o},test(i,e=0){let t=e.from||i.from,n=e.to||i.to,a=e.inflate==null?i.inflate:e.inflate,o=sl.cube_size_limiter.getCubeVertexCoordinates(i,{from:t,to:n,inflate:a}),r=sl.cube_size_limiter.getModelCenter([i]);return o.find((l,c)=>l[0]>r[3]+15||l[0]r[4]+15||l[1]r[5]+15||l[2]{d.forEach((u,p)=>{u>r[p+3]+15&&(s[p]=Math.max(s[p],u-(r[p+3]+15))),u{p.forEach((_,f)=>{t!==void 0&&t!==f||(f==0&&m<4||f==1&&m%4<2||f==2&&m%2<1?(_>l[f+3]+15&&(c[f]=Math.max(c[f],_-(l[f+3]+15))),_l[f+3]+15&&(d[f]=Math.max(d[f],_-(l[f+3]+15))),_Format==yy||Format==sl,click:function(){Bl.export()}})});new ValidatorCheck("bedrock_binding",{condition:!1,update_triggers:["update_selection"],run(){Project.BedrockEntityManager?.client_entity?.type=="attachable"&&Group.all.length&&!Group.all.find(i=>i.bedrock_binding)&&this.warn({message:"The project is an attachable, but no bone is bound to the player. Define a binding on one of the root bones.",buttons:[{name:"Bind root bone to player hand",icon:"fa-paperclip",click(){let i=Outliner.root.find(e=>e instanceof Group);Undo.initEdit({group:i}),i.bedrock_binding="q.item_slot_to_bone_name(c.item_slot)",Undo.finishEdit("Set binding"),Validator.validate()}}]})}});function $C(i,e){let t=i.name.replace(/^geometry\./,""),n=!1;if(n){Project.close().then(()=>{n.select()});return}xf.dispatchEvent("parse",{model:i.object}),Project.geometry_name=t,Project.texture_width=i.object.texturewidth||64,Project.texture_height=i.object.textureheight||64,typeof i.object.visible_bounds_width=="number"&&typeof i.object.visible_bounds_height=="number"&&(Project.visible_box[0]=Math.max(Project.visible_box[0],i.object.visible_bounds_width||0),Project.visible_box[1]=Math.max(Project.visible_box[1],i.object.visible_bounds_height||0),i.object.visible_bounds_offset&&typeof i.object.visible_bounds_offset[1]=="number"&&(Project.visible_box[2]=i.object.visible_bounds_offset[1]||0));var a={};if(i.object.bones){var o=[];i.object.bones.forEach(function(r){o.push(r.name)}),i.object.bones.forEach(function(r,s){var l=new Group({name:r.name,origin:r.pivot,rotation:r.rotation,material:r.material,color:Group.all.length%markerColors.length}).init();if(a[r.name]=l,r.pivot&&(l.origin[0]*=-1),l.rotation[0]*=-1,l.rotation[1]*=-1,l.mirror_uv=r.mirror===!0,l.reset=r.reset===!0,r.cubes&&r.cubes.forEach(function(_){var f=new Cube({name:r.name,autouv:0,color:l.color});_.origin&&(f.from.V3_set(_.origin),f.from[0]=-(f.from[0]+_.size[0]),_.size&&(f.to[0]=_.size[0]+f.from[0],f.to[1]=_.size[1]+f.from[1],f.to[2]=_.size[2]+f.from[2])),_.uv&&(f.uv_offset[0]=_.uv[0],f.uv_offset[1]=_.uv[1]),_.inflate&&typeof _.inflate=="number"&&(f.inflate=_.inflate),_.mirror===void 0?f.mirror_uv=l.mirror_uv:f.mirror_uv=_.mirror===!0,f.addTo(l).init()}),r.children&&r.children.forEach(function(_){_.addTo(l)}),r.locators)for(var c in r.locators){var d,u;r.locators[c]instanceof Array?d=r.locators[c]:(d=r.locators[c].offset,u=r.locators[c].rotation),d[0]*=-1;var p=new Locator({position:d,name:c,rotation:u}).addTo(l).init()}var m="root";r.parent&&(a[r.parent]?m=a[r.parent]:i.object.bones.forEach(function(_){_.name===r.parent&&(_.children&&_.children.length?_.children.push(l):_.children=[l])})),l.addTo(m)})}xf.dispatchEvent("parsed",{model:i.object}),Canvas.updateAllBones(),setProjectTitle(),Validator.validate(),updateSelection()}var xf=new Codec("bedrock_old",{name:"Bedrock Entity Model",extension:"json",remember:!0,multiple_per_file:!0,load_filter:{type:"json",extensions:["json"],condition(i){return i.format_version&&VersionUtil.compare(i.format_version,"<","1.12.0")||Object.keys(i).find(e=>e.match(/^geometry\./))}},compile(i){i===void 0&&(i={});var e={};e.texturewidth=Project.texture_width,e.textureheight=Project.texture_height;var t=[],n=new THREE.Box3,a=getAllGroups(),o=[];if(Outliner.root.forEach(s=>{(s.type==="cube"||s.type=="locator")&&o.push(s)}),o.length){let s=new Group({name:"bb_main"});s.children.push(...o),s.is_catch_bone=!0,s.createUniqueName(),a.splice(0,0,s)}if(a.forEach(function(s){if(!(s.type!=="group"||s.export==!1)&&!(!settings.export_empty_groups.value&&!s.children.find(_=>_.export))){var l={};l.name=s.name,s.parent.type==="group"&&(l.parent=s.parent.name),l.pivot=s.origin.slice(),l.pivot[0]*=-1,s.rotation.allEqual(0)||(l.rotation=[-s.rotation[0],-s.rotation[1],s.rotation[2]]),s.reset&&(l.reset=!0),s.mirror_uv&&Project.box_uv&&(l.mirror=!0),s.material&&(l.material=s.material);var c=[],d={};for(var u of s.children)if(u.export)if(u instanceof Cube){var p=new oneLiner;p.origin=u.from.slice(),p.size=u.size(),p.origin[0]=-(p.origin[0]+p.size[0]),p.uv=u.uv_offset,u.inflate&&typeof u.inflate=="number"&&(p.inflate=u.inflate),u.mirror_uv===!l.mirror&&(p.mirror=u.mirror_uv);var m=u.mesh;m&&n.expandByObject(m),c.push(p)}else u instanceof Locator&&(d[u.name]=u.position.slice(),d[u.name][0]*=-1);c.length&&(l.cubes=c),Object.keys(d).length&&(l.locators=d),t.push(l)}}),t.length&&i.visible_box!==!1){let s=calculateVisibleBox();e.visible_bounds_width=s[0]||0,e.visible_bounds_height=s[1]||0,e.visible_bounds_offset=[0,s[2]||0,0]}if(t.length&&(e.bones=t),this.dispatchEvent("compile",{model:e,options:i}),i.raw)return e;var r="geometry."+(Project.geometry_name||Project.name||"unknown");return autoStringify({format_version:"1.10.0",[r]:e})},parse(i,e,t){let n=[];for(let o in i)typeof i[o]=="object"&&n.push({name:o,object:i[o]});if(n.length===1){$C(n[0],t);return}n.forEach(o=>{o.uuid=guid(),o.bonecount=0,o.cubecount=0,o.object.bones instanceof Array&&o.object.bones.forEach(r=>{o.bonecount++,r.cubes instanceof Array&&(o.cubecount+=r.cubes.length)})});let a=null;new Dialog({id:"bedrock_model_select",title:"dialog.select_model.title",buttons:["Import","dialog.cancel"],component:{data(){return{search_term:"",geometries:n,selected:null}},computed:{filtered_geometries(){if(!this.search_term)return this.geometries;let o=this.search_term.toLowerCase();return this.geometries.filter(r=>r.name.toLowerCase().includes(o))}},methods:{selectGeometry(o){this.selected=a=o},open(o){Dialog.open.hide(),$C(o,t)},tl},template:` +
    + +
      +
    • +

      {{ geometry.name }}

      + +
    • +
    +
    + `},onConfirm(){$C(a,t)}}).show()},export(){var i=this;Blockbench.export({resource_id:"model",type:this.name,extensions:[this.extension],name:this.fileName(),startpath:this.startPath(),content:this.compile({raw:!1}),custom_writer:null})},overwrite(i,e,t){var n="geometry."+(Project.geometry_name.replace(/^geometry\./,"")||"unknown"),a;try{a=null.readFileSync(e,"utf-8")}catch{}var o={format_version:"1.10.0"};if(a){try{o=autoParseJSON(a,!1)}catch(c){c=c+"";var r=null.showMessageBoxSync(null,{type:"warning",buttons:[tl("message.bedrock_overwrite_error.backup_overwrite"),tl("message.bedrock_overwrite_error.overwrite"),tl("dialog.cancel")],title:"Blockbench",message:tl("message.bedrock_overwrite_error.message"),detail:c,noLink:!1});if(r===0){var s=pathToName(e,!0)+" backup "+new Date().toLocaleString().split(":").join("_");s=e.replace(pathToName(e,!1),s),null.writeFile(s,a,function(d){d&&console.log("Error saving backup model: ",d)})}if(r===2)return}if(typeof o=="object")for(var l in o)o.hasOwnProperty(l)&&o[l].bones&&typeof o[l].bones=="object"&&o[l].bones.constructor.name==="Array"&&o[l].bones.forEach(function(c){typeof c.cubes=="object"&&c.cubes.constructor.name==="Array"&&c.cubes.forEach(function(d,u){c.cubes[u]=new oneLiner(d)})})}o[n]=this.compile({raw:!0}),i=autoStringify(o),Blockbench.writeFile(e,{content:i},t)}}),YC=new ModelFormat({id:"bedrock_old",extension:"json",icon:"icon-format_bedrock_legacy",category:"minecraft",show_on_start_screen:!1,box_uv:!0,single_texture:!0,bone_rig:!0,centered_grid:!0,animated_textures:!0,animation_files:!0,animation_controllers:!0,animation_mode:!0,locators:!0,pbr:!0,codec:xf,onSetup(i){}});xf.format=YC;BARS.defineActions(function(){xf.export_action=new Action({id:"export_entity",icon:YC.icon,category:"file",condition:()=>Format==YC,click:function(){xf.export()}})});var hp,ioe={north:[0,0,-1],east:[1,0,0],south:[0,0,1],west:[-1,0,0],up:[0,1,0],down:[0,-1,0]},V5=new Codec("obj",{name:"OBJ Wavefront Model",extension:"obj",support_partial_export:!0,compile(i){i||(i=0);var e=new THREE.Vector3().copy(scene.position);scene.position.set(0,0,0);let t={},n=["# Made in Blockbench 5.1.6"],a=0,o=0,r=0,s=new THREE.Vector3,l=new THREE.Color,c=new THREE.Vector3,d=new THREE.Vector2,u=[],p=Settings.get("obj_face_export_mode"),m=Settings.get("model_export_scale");n.push("mtllib "+(i.mtl_name||"materials.mtl")+` +`);var _=function(g){var v=0,b=0,x=0,w=g.geometry,E=OutlinerNode.uuids[g.name];let y=new THREE.Matrix3;if(E&&E.export!==!1&&E.faces){if(y.getNormalMatrix(g.matrixWorld),E instanceof Cube){n.push(`o ${E.name||"cube"}`),E.getGlobalVertexPositions().forEach(F=>{s.set(...F).divideScalar(m),n.push("v "+s.x+" "+s.y+" "+s.z),v++});for(let F in E.faces)if(E.faces[F].texture!==null){let O=E.faces[F],L=O.getTexture(),U=[Project.getUVWidth(L),Project.getUVHeight(L)],J=[];J.push(`vt ${O.uv[0]/U[0]} ${1-O.uv[1]/U[1]}`),J.push(`vt ${O.uv[2]/U[0]} ${1-O.uv[1]/U[1]}`),J.push(`vt ${O.uv[2]/U[0]} ${1-O.uv[3]/U[1]}`),J.push(`vt ${O.uv[0]/U[0]} ${1-O.uv[3]/U[1]}`);for(var A=O.rotation||0;A>0;)J.splice(0,0,J.pop()),A-=90;n.push(...J),b+=4}for(let F in E.faces)E.faces[F].texture!==null&&(c.fromArray(ioe[F]),c.applyMatrix3(y).normalize(),n.push("vn "+c.x+" "+c.y+" "+c.z),x+=1);let R,j=0;for(let F in E.faces)if(E.faces[F].texture!==null){let O=E.faces[F].getTexture();O&&O.uuid&&!t[O.uuid]&&(t[O.uuid]=O);let L=!O||typeof O=="string"?"none":"m_"+O.uuid;L!=R&&(R=L,n.push("usemtl "+R));let U;switch(F){case"north":U=[2,5,7,4];break;case"east":U=[1,2,4,3];break;case"south":U=[6,1,3,8];break;case"west":U=[5,6,8,7];break;case"up":U=[5,2,1,6];break;case"down":U=[8,3,4,7];break}p=="tris"?(n.push("f "+[`${U[2]+a}/${j*4+3+o}/${j+1+r}`,`${U[1]+a}/${j*4+2+o}/${j+1+r}`,`${U[0]+a}/${j*4+1+o}/${j+1+r}`].join(" ")),n.push("f "+[`${U[3]+a}/${j*4+4+o}/${j+1+r}`,`${U[2]+a}/${j*4+3+o}/${j+1+r}`,`${U[0]+a}/${j*4+1+o}/${j+1+r}`].join(" "))):n.push("f "+[`${U[3]+a}/${j*4+4+o}/${j+1+r}`,`${U[2]+a}/${j*4+3+o}/${j+1+r}`,`${U[1]+a}/${j*4+2+o}/${j+1+r}`,`${U[0]+a}/${j*4+1+o}/${j+1+r}`].join(" ")),j++}}else if(E instanceof Mesh){let O=function(ie,te,me,Q){s.set(te,me,Q),s.applyMatrix4(g.matrixWorld).divideScalar(m),n.push("v "+s.x+" "+s.y+" "+s.z),v++,E.shading=="smooth"&&(c.fromArray(R[ie]),c.applyMatrix3(y).normalize(),F.push("vn "+c.x+" "+c.y+" "+c.z),x+=1)};n.push(`o ${E.name||"mesh"}`);let R=E.calculateNormals(),j=[],F=[];for(let ie in E.vertices)O(ie,...E.vertices[ie]),j.push(ie);let L,U=0,J=[];for(let ie in E.faces)if(E.faces[ie].texture!==null&&E.faces[ie].vertices.length>=3){let te=E.faces[ie],me=te.getSortedVertices().slice(),Q=E.faces[ie].getTexture(),H=[Project.getUVWidth(Q),Project.getUVHeight(Q)];me.forEach(K=>{n.push(`vt ${te.uv[K][0]/H[0]} ${1-te.uv[K][1]/H[1]}`),b+=1}),E.shading=="flat"&&(c.fromArray(te.getNormal(!0)),c.applyMatrix3(y).normalize(),F.push("vn "+c.x+" "+c.y+" "+c.z),x+=1),Q&&Q.uuid&&!t[Q.uuid]&&(t[Q.uuid]=Q);let re=!Q||typeof Q=="string"?"none":"m_"+Q.uuid;if(re!=L&&(L=re,J.push("usemtl "+L)),p=="quads"&&me.length==3&&me.push(me[0]),p=="tris"&&me.length==4){let K=[];me.slice(0,3).forEach((xe,le)=>{let Be=[j.indexOf(xe)+1+a,b-me.length+le+1+o,E.shading=="smooth"?r+1+j.indexOf(xe):U+1+r];K.push(Be.join("/"))}),J.push("f "+K.join(" "));let pe=[];[me[0],me[2],me[3]].forEach((xe,le)=>{let Be=[j.indexOf(xe)+1+a,b-me.length+(le?1:0)+le+1+o,E.shading=="smooth"?r+1+j.indexOf(xe):U+1+r];pe.push(Be.join("/"))}),J.push("f "+pe.join(" "))}else{let K=[];me.forEach(pe=>{let xe=[j.indexOf(pe)+1+a,b-me.length+me.indexOf(pe)+1+o,E.shading=="smooth"?r+1+j.indexOf(pe):U+1+r];K.push(xe.join("/"))}),J.push("f "+K.join(" "))}U++}n.push(...F),n.push(...J)}else{let L=function(U,J){let ie=Object.keys(U.faces);var te=ie[J]??ie[0],me=U.faces[te].getTexture();return me===null?!1:!me||typeof me=="string"?"usemtl none":"usemtl m_"+me.uuid},R=w.getAttribute("position"),j=w.getAttribute("normal"),F=w.getAttribute("uv"),O=w.getIndex();if(n.push("o "+g.name),g.material&&g.material.name&&n.push("usemtl "+g.material.name),R!==void 0)for(let U=0,J=R.count;Ut.afterSave(l)),Blockbench.writeFile(n,{content:hp.mtl});for(var a in hp.images){var o=hp.images[a];if(o&&!o.error){var r=o.name;r.substr(-4)!==".png"&&(r+=".png");var s=e.split(osfs);s.splice(-1,1,r),Blockbench.writeFile(s.join(osfs),{content:o.source,savetype:"image"})}}},export(){var i=this,e=new JSZip,t=this.compile();e.file((Project.name||"model")+".obj",t),e.file("materials.mtl",hp.mtl);for(var n in hp.images){var a=hp.images[n];a&&!a.error&&a.mode==="bitmap"&&e.file(pathToName(a.name)+".png",a.source.replace("data:image/png;base64,",""),{base64:!0})}e.generateAsync({type:"blob"}).then(o=>{Blockbench.export({type:"Zip Archive",extensions:["zip"],name:"assets",content:o,savetype:"zip"},r=>i.afterDownload(r))})}});BARS.defineActions(function(){V5.export_action=new Action({id:"export_obj",icon:"icon-objects",category:"file",click:function(){V5.export()}})});function JC(i=Settings.get("model_export_scale"),e=!0){let t=[];return Animator.animations.forEach(n=>{let a=n.sampleIK(),o=[];for(var r in n.animators){let u=n.animators[r];if(["bone","armature_bone"].includes(u.type)&&u.getGroup()){for(var s in u.channels)if(s=="rotation"&&a[r]){let p=[],m=[],_=settings.animation_sample_rate.value,f=Ve.InterpolateLinear;a[r].forEach((v,b)=>{v.euler.x+=u.group.mesh.fix_rotation.x,v.euler.y+=u.group.mesh.fix_rotation.y,v.euler.z+=u.group.mesh.fix_rotation.z,new Ve.Quaternion().setFromEuler(v.euler).toArray(m,m.length),p.push(b/_)});let g=new Ve.QuaternionKeyframeTrack(u.group.mesh.uuid+".quaternion",p,m,f);g.group_uuid=u.group.uuid,g.channel="quaternion",o.push(g)}else if(u[s]&&u[s].length){let p=[],m=[],_=u[s].slice(),f;for(var l of _){if(l.interpolation==Keyframe.interpolation.catmullrom||l.interpolation==Keyframe.interpolation.bezier){f=!0;break}for(var c of l.data_points)if(isNaN(c.x)||isNaN(c.y)||isNaN(c.z)){f=!0;break}if(f)break}if(f){let x=1/Math.clamp(settings.animation_sample_rate.value,.1,500),w;for(var d=0;dMath.epsilon(y.time,d,x))){let y=new Keyframe({time:d,channel:s,data_points:[{x:E[0],y:E[1],z:E[2]}]},null,u);y.animator=u,_.push(y)}w=E}}if(_.sort((x,w)=>x.time-w.time),s==="rotation"&&!f&&e){let x=_.slice();x.forEach((w,E)=>{let y=x[E+1];if(!y)return;let A=w.getArray(w.data_points.length-1),R=y.getArray(),j=Math.max(Math.abs(A[0]-R[0]),Math.abs(A[1]-R[1]),Math.abs(A[2]-R[2])),F=Math.floor(j/180+1);for(var O=1;O{if(x.data_points.length>1&&!x.getArray(0).equals(x.getArray(1))){let w=new Keyframe({time:x.time+.004,channel:s,data_points:[x.data_points[1]]},null,u);w.animator=u,_.splice(_.indexOf(x)+1,0,w)}});let g=Ve.InterpolateLinear;_.forEach(x=>{x.interpolation==Keyframe.interpolation.catmullrom&&(g=Ve.InterpolateSmooth),x.interpolation==Keyframe.interpolation.step&&(g=Ve.InterpolateDiscrete),p.push(x.time),Timeline.time=x.time;let w=x.getFixed(0,e);e?w.toArray(m,m.length):m.push(w.x,w.y,w.z)});let v=Ve.VectorKeyframeTrack;s==="rotation"&&e?(v=Ve.QuaternionKeyframeTrack,s="quaternion"):s=="position"&&m.forEach((x,w)=>{m[w]=x/i});let b=new v(u.group.mesh.uuid+"."+s,p,m,g);b.group_uuid=u.group.uuid,b.channel=s,o.push(b)}}else u instanceof BoneAnimator&&console.log(`Skip export of track ${r.substr(0,7)}... - No connected bone`)}if(o.length){let u=new Ve.AnimationClip(n.name,n.length,o);t.push(u)}else console.log(`Skip export of animation ${n.name} - No tracks generated`)}),t}function F5(i){let e=[],t=[],n=[],a=[],o=[],r=[],s=new Ve.BufferGeometry,l=[],c=[],d=[],u=new Ve.Matrix4().copy(i.mesh.matrix).invert(),p=Reusable.vec1,m=Reusable.vec2;function _(v,b){if(v.export==!1)return;for(let w of v.children){if(!w.faces||w.export==!1)continue;let{geometry:E}=w.mesh,y=new Ve.Matrix4().copy(w.mesh.matrixWorld);y.premultiply(u);let A=n.length/3;for(let R=0;RA+R));for(let R in w.faces){let j=w.faces[R];if(j.vertices&&j.vertices.length<3||j.texture===null)continue;let F=j.getTexture();F&&F.uuid?c.push(F.getMaterial()):c.push(Canvas.getEmptyMaterial(w.color)),j.vertices&&j.vertices.length==3?d.push(3):d.push(6)}}let x=new Ve.Bone;x.name=v.name,x.uuid=v.mesh.uuid,x.position.copy(v.mesh.position),x.rotation.copy(v.mesh.rotation),v==i&&x.position.set(0,0,0),l.push(x),b&&b.add(x);for(let w of v.children)w instanceof Group&&_(w,x)}_(i),s.setAttribute("position",new Ve.BufferAttribute(new Float32Array(n),3)),s.setAttribute("normal",new Ve.BufferAttribute(new Float32Array(a),3)),s.setAttribute("uv",new Ve.BufferAttribute(new Float32Array(o),2)),s.setIndex(r),s.setAttribute("skinIndex",new Ve.Uint16BufferAttribute(e,4)),s.setAttribute("skinWeight",new Ve.Float32BufferAttribute(t,4)),c=O5(c,s,d);let f=new Ve.SkinnedMesh(s,c);f.name=i.name;let g=new Ve.Skeleton(l);return g.name=i.name,g.bones[0]&&f.add(g.bones[0]),f.bind(g),f.position.copy(i.mesh.position),f.rotation.copy(i.mesh.rotation),f}function U5(i,e){let t=[],n=[],a=[],o=[],r=[],s=[],l=[],c=[],d=[],u=[],p={},m=i.getAllBones(),_=i.children.filter(b=>b instanceof Mesh);for(let b of m){let x=new Ve.Bone;x.position.copy(b.mesh.position),x.rotation.copy(b.mesh.rotation),x.name=b.name,x.uuid=b.mesh.uuid,p[b.parent.uuid]&&p[b.parent.uuid].add(x),d.push(x),b.parent instanceof jr&&u.push(x),p[b.uuid]=x}let f=new Ve.Skeleton(d);f.name=i.name;let g;for(let b of _){if(!b.faces||b.export==!1)continue;let x=b.mesh.geometry.clone();x.applyMatrix4(b.mesh.matrix),g||(g=x);let w=a.length/3;a.push(...x.attributes.position.array),o.push(...x.attributes.normal.array),r.push(...x.attributes.uv.array),s.push(...x.index.array.map(E=>w+E));for(let E in b.faces){let y=b.faces[E];if(y.vertices&&y.vertices.length<3||y.texture===null)continue;let A=y.getTexture();A&&A.uuid?l.push(A.getMaterial()):l.push(Canvas.getEmptyMaterial(b.color)),y.vertices&&y.vertices.length==3?c.push(3):c.push(6)}for(let E in b.faces){let y=b.faces[E];y.vertices.length>=3&&y.vertices.forEach(A=>{let R=m.filter(F=>F.getVertexWeight(b,A));R.sort((F,O)=>O.getVertexWeight(b,A)-F.getVertexWeight(b,A)).slice(0,4);let j=0;for(let F=0;F<4;F++)R[F]&&(j+=R[F].getVertexWeight(b,A));for(let F=0;F<4;F++)R[F]?(t.push(m.indexOf(R[F])),n.push(R[F].getVertexWeight(b,A)/j)):(t.push(0),n.push(0))})}}g?(g.setAttribute("position",new Ve.BufferAttribute(new Float32Array(a),3)),g.setAttribute("normal",new Ve.BufferAttribute(new Float32Array(o),3)),g.setAttribute("uv",new Ve.BufferAttribute(new Float32Array(r),2)),g.setIndex(s),g.setAttribute("skinIndex",new Ve.Uint16BufferAttribute(t,4)),g.setAttribute("skinWeight",new Ve.Float32BufferAttribute(n,4)),l=O5(l,g,c)):g=new Ve.BufferGeometry;let v=new Ve.SkinnedMesh(g,l);return v.name=i.name,u.forEach(b=>v.add(b)),v.bind(f),v}function O5(i,e,t){if(i.allEqual(i[0])&&(i=i[0]),i instanceof Array){let n,a=0,o=0,r=0,s=[];e.groups.empty();for(let l of i)n!=l&&(o&&(e.addGroup(r,o-r,s.length),s.push(n)),n=l,r=o),o+=t[a],a++;e.addGroup(r,o-r,s.length),s.push(n),i=s}return i}var XC=new Codec("gltf",{name:"GLTF Model",extension:"gltf",support_partial_export:!0,export_options:{encoding:{type:"select",label:"codec.common.encoding",options:{ascii:"ASCII (glTF)",binary:"Binary (glb)"}},scale:{label:"settings.model_export_scale",type:"number",value:Settings.get("model_export_scale")},embed_textures:{type:"checkbox",label:"codec.common.embed_textures",value:!0},armature:{type:"checkbox",label:tl("codec.common.armature"),value:!1},animations:{label:"codec.common.export_animations",type:"checkbox",value:!0}},async compile(i){i=Object.assign(this.getExportOptions(),i);let e=this,t=new Ve.GLTFExporter,n=[],a=new Ve.Scene;a.name="blockbench_export",Modes.edit||Animator.showDefaultPose();let o=Texture.all.filter(l=>l.frameCount>1);Texture.all.forEach(l=>l.currentFrame=0),TextureAnimator.update(o),Outliner.root.forEach(l=>{if(l instanceof Group&&i.armature){let c=F5(l,i.scale);a.children.push(c)}else l.scene_object.no_export||a.children.push(l.mesh)});let r=[],s=[];for(let l of jr.all){let c=U5(l,i.scale);l.parent==Outliner.ROOT?(a.add(c),r.push([a,c])):(l.parent.scene_object.add(c),r.push([l.parent.scene_object,c])),l.root!=Outliner.ROOT&&(s.push([l.scene_object.parent,l.scene_object]),l.scene_object.parent.children.remove(l.scene_object))}try{BarItems.view_mode.value!=="textured"&&(BarItems.view_mode.set("textured"),BarItems.view_mode.onChange()),i.animations!==!1&&(n=JC(i.scale));let l=await new Promise((c,d)=>{t.parse(a,c,{animations:n,onlyVisible:!1,trs:!0,binary:i.encoding=="binary",truncateDrawRange:!1,forcePowerOfTwoTextures:i.embed_textures!==!1,scale_factor:1/i.scale,embedImages:i.embed_textures!=!1,exportFaceColors:!1})});for(let[c,d]of r)c.children.remove(d);for(let[c,d]of s)c.add(d);return e.dispatchEvent("compile",{model:l,options:i}),i.encoding=="binary"?l:JSON.stringify(l)}catch(l){throw l}},async export(){if(await this.promptExportOptions()===null)return;let e=await this.compile();await new Promise(t=>setTimeout(t,20)),Blockbench.export({resource_id:"gltf",type:this.name,extensions:[this.getExportOptions().encoding=="binary"?"glb":"gltf"],name:this.fileName(),startpath:this.startPath(),content:e,custom_writer:null},t=>this.afterDownload(t))}});XC.buildAnimationTracks=JC;BARS.defineActions(function(){XC.export_action=new Action({id:"export_gltf",icon:"icon-gltf",category:"file",click:function(){XC.export()}})});Object.assign(window,{buildAnimationTracks:JC,buildSkinnedMesh:U5,buildSkinnedMeshFromGroup:F5});var D1=7300;function Le(i,e){return{type:i,value:e,isTNum:!0,toString:()=>"key"+e.toString()}}function a_(i,e="i",t="a"){return{_values:[`_*${i.length}`],_type:e,[t]:i}}var L5=new Codec("fbx",{name:"FBX Model",extension:"fbx",support_partial_export:!0,compile(i){i=Object.assign(this.getExportOptions(),i);let e=this,t=(i.scale||16)/100,n=[],a=new Ve.Vector3(1,1,1);n.push(["; FBX 7.3.0 project file","; Created by the Blockbench FBX Exporter","; ----------------------------------------------------","; ","",""].join(` +`));function o(j){return` +; `+j.split(/\n/g).join(` +; `)+` +;------------------------------------------------------------------ + +`}let r={};function s(j){if(j==0)return Le("L",0);if(r[j])return r[j];let F=[];for(let L=0;L<8;L++)F.push(Math.floor(Math.random()*10));F[0]="7";let O=F.join("");return r[j]=Le("L",parseInt(O)),r[j]}let l={};function c(j,F,O){l[j]||(l[j]={});let L=l[j];if(L[F])return L[F];let U=Object.values(L);if(!U.includes(O))return L[F]=O,L[F];let J=1;for(;U.includes(O+"_"+J);)J++;return L[F]=O+"_"+J,L[F]}let d=new Date,u=d.toISOString().replace("T"," ").replace(".",":").replace("Z",""),p="C:\\Users\\Blockbench\\foobar.fbx";n.push({FBXHeaderExtension:{FBXHeaderVersion:1003,FBXVersion:D1,EncryptionType:0,CreationTimeStamp:{Version:1e3,Year:d.getFullYear(),Month:d.getMonth()+1,Day:d.getDate(),Hour:d.getHours(),Minute:d.getMinutes(),Second:d.getSeconds(),Millisecond:d.getMilliseconds()},Creator:"Blockbench "+he.version,SceneInfo:{_values:["SceneInfo::GlobalInfo","UserData"],Type:"UserData",Version:100,MetaData:{Version:100,Title:"",Subject:"",Author:"",Keywords:"",Revision:"",Comment:""},Properties70:{P01:{_key:"P",_values:["DocumentUrl","KString","Url","",p]},P02:{_key:"P",_values:["SrcDocumentUrl","KString","Url","",p]},P03:{_key:"P",_values:["Original","Compound","",""]},P04:{_key:"P",_values:["Original|ApplicationVendor","KString","","","Blockbench"]},P05:{_key:"P",_values:["Original|ApplicationName","KString","","","Blockbench FBX Exporter"]},P06:{_key:"P",_values:["Original|ApplicationVersion","KString","","",he.version]},P07:{_key:"P",_values:["Original|DateTime_GMT","DateTime","","","01/01/1970 00:00:00.000"]},P08:{_key:"P",_values:["Original|FileName","KString","","","/foobar.fbx"]},P09:{_key:"P",_values:["LastSaved","Compound","",""]},P10:{_key:"P",_values:["LastSaved|ApplicationVendor","KString","","","Blockbench"]},P11:{_key:"P",_values:["LastSaved|ApplicationName","KString","","","Blockbench FBX Exporter"]},P12:{_key:"P",_values:["LastSaved|ApplicationVersion","KString","","",he.version]},P13:{_key:"P",_values:["LastSaved|DateTime_GMT","DateTime","","","01/01/1970 00:00:00.000"]},P14:{_key:"P",_values:["Original|ApplicationNativeFile","KString","","",""]}}}},FileId:"iVFoobar",CreationTime:u,Creator:Settings.get("credit")}),n.push({GlobalSettings:{Version:1e3,Properties70:{P01:{_key:"P",_values:["UpAxis","int","Integer","",1]},P02:{_key:"P",_values:["UpAxisSign","int","Integer","",1]},P03:{_key:"P",_values:["FrontAxis","int","Integer","",2]},P04:{_key:"P",_values:["FrontAxisSign","int","Integer","",1]},P05:{_key:"P",_values:["CoordAxis","int","Integer","",0]},P08:{_key:"P",_values:["CoordAxisSign","int","Integer","",1]},P09:{_key:"P",_values:["OriginalUpAxis","int","Integer","",-1]},P10:{_key:"P",_values:["OriginalUpAxisSign","int","Integer","",1]},P11:{_key:"P",_values:["UnitScaleFactor","double","Number","",Le("D",1)]},P12:{_key:"P",_values:["OriginalUnitScaleFactor","double","Number","",Le("D",1)]},P13:{_key:"P",_values:["AmbientColor","ColorRGB","Color","",Le("D",0),Le("D",0),Le("D",0)]},P14:{_key:"P",_values:["DefaultCamera","KString","","","Producer Perspective"]},P15:{_key:"P",_values:["TimeMode","enum","","",0]},P16:{_key:"P",_values:["TimeSpanStart","KTime","Time","",Le("L",0)]},P17:{_key:"P",_values:["TimeSpanStop","KTime","Time","",Le("L",46186158e3)]},P18:{_key:"P",_values:["CustomFrameRate","double","Number","",Le("D",24)]}}}}),n.push(o("Documents Description"));let m=BigInt(Math.floor(Math.random()*2147483647)+1);n.push({Documents:{Count:1,Document:{_values:[Le("L",m)],Scene:"Scene",Properties70:{P01:{_key:"P",_values:["SourceObject","object","",""]},P02:{_key:"P",_values:["ActiveAnimStackName","KString","","",""]}},RootNode:0}}}),n.push(o("Document References")),n.push({References:{}});let _={node_attributes:0,model:0,geometry:0,material:0,texture:0,image:0,pose:0,deformer:0,animation_stack:0,animation_layer:0,animation_curve_node:0,animation_curve:0},f={},g=[],v={Current:""},b={name:"RootNode",uuid:"0"};function x(j){let F=j.origin.slice();return j.parent instanceof Group&&F.V3_subtract(j.parent.origin),F.V3_divide(t)}function w(j,F){let O=c("object",j.uuid,j.name),L=j.mesh.rotation.order=="XYZ"?5:0;f["key"+j.uuid]={_key:"Model",_values:[s(j.uuid),`Model::${O}`,F],Version:232,Properties70:{P1:{_key:"P",_values:["RotationActive","bool","","",Le("I",1)]},P2:{_key:"P",_values:["InheritType","enum","","",1]},P3:{_key:"P",_values:["ScalingMax","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P4:{_key:"P",_values:["Lcl Translation","Lcl Translation","","A",...x(j).map(J=>Le("D",J))]},P5:j.rotation?{_key:"P",_values:["RotationPivot","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]}:void 0,P6:j.rotation?{_key:"P",_values:["Lcl Rotation","Lcl Rotation","","A",...j.rotation.map(J=>Le("D",J))]}:void 0,P7:j.rotation?{_key:"P",_values:["RotationOrder","enum","","",L]}:void 0,P8:j.faces?{_key:"P",_values:["DefaultAttributeIndex","int","Integer","",0]}:void 0},Shading:!0,Culling:"CullingOff"};let U=j.parent=="root"?b:j.parent;return g.push({name:[`Model::${O}`,`Model::${c("object",U.uuid,U.name)}`],id:[s(j.uuid),s(U.uuid)]}),_.model++,f["key"+j.uuid]}Group.all.forEach(j=>{j.export&&w(j,"Null")}),[...Locator.all,...NullObject.all].forEach(j=>{j.export&&w(j,"Null")}),Mesh.all.forEach(j=>{if(!j.export)return;w(j,"Mesh");let F=c("object",j.uuid,j.name),O=[],L=[],U=[],J=[],ie=[],te=j.calculateNormals();function me(pe,xe,le){O.push(pe/t,xe/t,le/t)}for(let pe in j.vertices)me(...j.vertices[pe]),J.push(pe),j.shading=="smooth"&&L.push(...te[pe]);let Q=[];for(let pe in j.faces)if(j.faces[pe].vertices.length>=3){let xe=j.faces[pe],le=xe.getSortedVertices(),Be=j.faces[pe].getTexture()||void 0;Q.push(Be),le.forEach(X=>{U.push(xe.uv[X][0]/Project.getUVWidth(Be),1-xe.uv[X][1]/Project.getUVHeight(Be))}),j.shading=="flat"&&L.push(...xe.getNormal(!0)),le.forEach((X,ne)=>{let Me=J.indexOf(X);ne+1==le.length&&(Me=-1-Me),ie.push(Me)})}_.geometry++;let H=Texture.all.filter(pe=>Q.includes(pe)),re=s(j.uuid+"_geo"),K={_key:"Geometry",_values:[re,`Geometry::${F}`,"Mesh"],Vertices:{_values:[`_*${O.length}`],_type:"d",a:O},PolygonVertexIndex:{_values:[`_*${ie.length}`],_type:"i",a:ie},GeometryVersion:124,LayerElementNormal:{_values:[0],Version:101,Name:"",MappingInformationType:j.shading=="smooth"?"ByVertex":"ByPolygon",ReferenceInformationType:"Direct",Normals:{_values:[`_*${L.length}`],_type:"d",a:L}},LayerElementUV:{_values:[0],Version:101,Name:"",MappingInformationType:"ByPolygonVertex",ReferenceInformationType:"Direct",UV:{_values:[`_*${U.length}`],_type:"d",a:U}},LayerElementMaterial:H.length<=1?{_values:[0],Version:101,Name:"",MappingInformationType:"AllSame",ReferenceInformationType:"IndexToDirect",Materials:{_values:["_*1"],_type:"i",a:0}}:{_values:[0],Version:101,Name:"",MappingInformationType:"ByPolygon",ReferenceInformationType:"IndexToDirect",Materials:{_values:[`_*${Q.length}`],_type:"i",a:Q.map(pe=>H.indexOf(pe))}},Layer:{_values:[0],Version:100,LayerElement1:{_key:"LayerElement",Type:"LayerElementNormal",TypedIndex:0},LayerElement2:{_key:"LayerElement",Type:"LayerElementMaterial",TypedIndex:0},LayerElement3:{_key:"LayerElement",Type:"LayerElementUV",TypedIndex:0}}};f[re.toString()]=K,g.push({name:[`Geometry::${F}`,`Model::${F}`],id:[re,s(j.uuid)]}),H.forEach(pe=>{g.push({name:[`Material::${c("material",pe.uuid,pe.name)}`,`Model::${F}`],id:[s(pe.uuid+"_m"),s(j.uuid)]})})}),jr.all.forEach(j=>{let F=Mesh.all.find(H=>H.getArmature()==j),O=c("armature",j.uuid,j.name);_.pose++;let L=s(j.uuid+"_attribute");f[L.toString()]={_key:"NodeAttribute",_values:[L,`NodeAttribute::${O}`,"Null"],TypeFlags:"Null"},_.node_attributes++;let U=s(j.uuid);f[U.toString()]={_key:"Model",_values:[U,`Model::${O}`,"Null"],Version:232,Properties70:{P1:{_key:"P",_values:["InheritType","enum","","",1]},P2:{_key:"P",_values:["DefaultAttributeIndex","int","Integer","",0]},P4:{_key:"P",_values:["Lcl Translation","Lcl Translation","","A",...[0,0,0].map(H=>Le("D",H))]},P5:{_key:"P",_values:["Lcl Rotation","Lcl Rotation","","A",...[0,0,0].map(H=>Le("D",H))]},P6:{_key:"P",_values:["Lcl Scaling","Lcl Scaling","","A",...[1,1,1].map(H=>Le("D",H))]}},Culling:"CullingOff"};let J=j.parent=="root"?b:j.parent;g.push({name:[`Model::${O}`,`Model::${c("object",J.uuid,J.name)}`],id:[s(j.uuid),s(J.uuid)]}),_.model++,g.push({name:[`NodeAttribute::${O}`,`Model::${O}`],id:[L,U]});let ie;if(F){let H=s(F.uuid+"_bind_pose");ie={_key:"Pose",_values:[H,`Pose::${c("object",F.uuid,F.name)}`,"BindPose"],Type:"BindPose",Version:100,NbPoseNodes:0};let re=new Ve.Matrix4;re.scale(a),ie.PoseNode_object={_key:"PoseNode",Node:s(F.uuid),Matrix:a_(re.elements,"d")},ie.NbPoseNodes++;let K=new Ve.Matrix4;re.scale(a),ie.PoseNode_object={_key:"PoseNode",Node:s(j.uuid),Matrix:a_(K.elements,"d")},ie.NbPoseNodes++,f[H.toString()]=ie,_.pose++}let te=[],me=[];function Q(H){if(!(H instanceof xn))return;te.push(H);let re=c("bone",H.uuid,H.name),K=s(H.uuid+"_attribute");f[K.toString()]={_key:"NodeAttribute",_values:[K,`NodeAttribute::${re}`,"LimbNode"],Properties70:{P2:{_key:"P",_values:["Size","double","Number","",Le("D",H.length/t)]}},TypeFlags:"Skeleton"},_.node_attributes++;let pe=s(H.uuid);f[pe.toString()]={_key:"Model",_values:[pe,`Model::${re}`,"LimbNode"],Version:232,Properties70:{P1:{_key:"P",_values:["InheritType","enum","","",1]},P2:{_key:"P",_values:["DefaultAttributeIndex","int","Integer","",0]},P4:{_key:"P",_values:["Lcl Translation","Lcl Translation","","A",...x(H).map(le=>Le("D",le))]},P5:{_key:"P",_values:["Lcl Rotation","Lcl Rotation","","A",...H.rotation.map(le=>Le("D",le))]}},Culling:"CullingOff"};let xe=H.parent=="root"?b:H.parent;if(g.push({name:[`Model::${re}`,`Model::${c("object",xe.uuid,xe.name)}`],id:[s(H.uuid),s(xe.uuid)]}),_.model++,g.push({name:[`NodeAttribute::${re}`,`Model::${re}`],id:[K,pe]}),H.children.length==0){let le=s(H.uuid+"_end_attribute");f[le.toString()]={_key:"NodeAttribute",_values:[le,`NodeAttribute::${re}_end`,"LimbNode"],Properties70:{P2:{_key:"P",_values:["Size","double","Number","",Le("D",H.length*10)]}},TypeFlags:"Skeleton"},_.node_attributes++;let Be=s(H.uuid+"_end");f[Be.toString()]={_key:"Model",_values:[Be,`Model::${re}_end`,"LimbNode"],Version:232,Properties70:{P1:{_key:"P",_values:["InheritType","enum","","",1]},P2:{_key:"P",_values:["DefaultAttributeIndex","int","Integer","",0]},P4:{_key:"P",_values:["Lcl Translation","Lcl Translation","","A",0,H.length/t,0]}},Culling:"CullingOff"},g.push({name:[`Model::${re}_end`,`Model::${re}`],id:[Be,s(H.uuid)]}),_.model++,g.push({name:[`NodeAttribute::${re}_end`,`Model::${re}_end`],id:[le,Be]})}if(F){let le=new Ve.Matrix4().copy(H.scene_object.inverse_bind_matrix).invert();le.scale(a),ie["PoseNode"+pe]={_key:"PoseNode",Node:pe,Matrix:a_(le.elements,"d")},ie.NbPoseNodes++,me.push(le)}for(let le of H.children)Q(le)}for(let H of j.children)Q(H);if(F){let H=s(j.uuid+"_deformer");f[H.toString()]={_key:"Deformer",_values:[H,`Deformer::${O}`,"Skin"],Version:101,Link_DeformAcuracy:50},_.deformer++,g.push({name:[`Deformer::${O}`,`Geometry::${c("object",F.uuid,F.name)}`],id:[H,s(F.uuid+"_geo")]});let re=new Ve.Matrix4().copy(F.mesh.matrixWorld),K=Object.keys(F.vertices);for(let pe of te){let xe=s(pe.uuid+"_deformer"),le=c("bone",pe.uuid,pe.name),Be=[],X=[];for(let Me of K)pe.getVertexWeight(F,Me)>.001&&(Be.push(K.indexOf(Me)),X.push(Math.clamp(pe.getVertexWeight(F,Me),0,1)));let ne=me[te.indexOf(pe)];f[xe.toString()]={_key:"Deformer",_values:[xe,`SubDeformer::${le}`,"Cluster"],Version:100,UserData:["",""],Indexes:a_(Be,"i"),Weights:a_(X,"d"),Transform:a_(re.elements,"d"),TransformLink:a_(ne.elements,"d")},_.deformer++,g.push({name:[`SubDeformer::${le}`,`Deformer::${O}`],id:[xe,H]}),g.push({name:[`Model::${c("bone",pe.uuid,pe.name)}`,`SubDeformer::${le}`],id:[s(pe.uuid),xe]})}}});let E={north:[0,0,-1],east:[1,0,0],south:[0,0,1],west:[-1,0,0],up:[0,1,0],down:[0,-1,0]};if(Cube.all.forEach(j=>{if(!j.export)return;w(j,"Mesh");let F=c("object",j.uuid,j.name),O=[],L=[],U=[],J=[];function ie(xe,le,Be){O.push((xe-j.origin[0])/t,(le-j.origin[1])/t,(Be-j.origin[2])/t)}var te=j.from.slice(),me=j.to.slice();td(te,me,j),ie(me[0],me[1],me[2]),ie(me[0],me[1],te[2]),ie(me[0],te[1],me[2]),ie(me[0],te[1],te[2]),ie(te[0],me[1],te[2]),ie(te[0],me[1],me[2]),ie(te[0],te[1],te[2]),ie(te[0],te[1],me[2]);let Q=[];for(let xe in j.faces){let le=j.faces[xe];if(le.texture===null)continue;let Be=le.getTexture()||void 0;Q.push(Be),L.push(...E[xe]);let X=[[le.uv[0]/Project.getUVWidth(Be),1-le.uv[3]/Project.getUVHeight(Be)],[le.uv[2]/Project.getUVWidth(Be),1-le.uv[3]/Project.getUVHeight(Be)],[le.uv[2]/Project.getUVWidth(Be),1-le.uv[1]/Project.getUVHeight(Be)],[le.uv[0]/Project.getUVWidth(Be),1-le.uv[1]/Project.getUVHeight(Be)]];for(var H=le.rotation||0;H>0;)X.splice(0,0,X.pop()),H-=90;X.forEach(Me=>{U.push(...Me)});let ne;switch(xe){case"north":ne=[3,6,4,-2];break;case"east":ne=[2,3,1,-1];break;case"south":ne=[7,2,0,-6];break;case"west":ne=[6,7,5,-5];break;case"up":ne=[5,0,1,-5];break;case"down":ne=[6,3,2,-8];break}J.push(...ne)}_.geometry++;let re=Texture.all.filter(xe=>Q.includes(xe)),K=s(j.uuid+"_geo"),pe={_key:"Geometry",_values:[K,`Geometry::${F}`,"Mesh"],Vertices:{_values:[`_*${O.length}`],_type:"d",a:O},PolygonVertexIndex:{_values:[`_*${J.length}`],_type:"i",a:J},GeometryVersion:124,LayerElementNormal:{_values:[0],Version:101,Name:"",MappingInformationType:"ByPolygon",ReferenceInformationType:"Direct",Normals:{_values:[`_*${L.length}`],_type:"d",a:L}},LayerElementUV:{_values:[0],Version:101,Name:"",MappingInformationType:"ByPolygonVertex",ReferenceInformationType:"Direct",UV:{_values:[`_*${U.length}`],_type:"d",a:U}},LayerElementMaterial:re.length<=1?{_values:[0],Version:101,Name:"",MappingInformationType:"AllSame",ReferenceInformationType:"IndexToDirect",Materials:{_values:["_*1"],_type:"i",a:0}}:{_values:[0],Version:101,Name:"",MappingInformationType:"ByPolygon",ReferenceInformationType:"IndexToDirect",Materials:{_values:[`_*${Q.length}`],_type:"i",a:Q.map(xe=>re.indexOf(xe))}},Layer:{_values:[0],Version:100,LayerElement1:{_key:"LayerElement",Type:"LayerElementNormal",TypedIndex:0},LayerElement2:{_key:"LayerElement",Type:"LayerElementMaterial",TypedIndex:0},LayerElement3:{_key:"LayerElement",Type:"LayerElementUV",TypedIndex:0}}};f["key"+K]=pe,g.push({name:[`Geometry::${F}`,`Model::${F}`],id:[K,s(j.uuid)]}),re.forEach(xe=>{g.push({name:[`Material::${c("texture",xe.uuid,xe.name)}`,`Model::${F}`],id:[s(xe.uuid+"_m"),s(j.uuid)]})})}),Texture.all.forEach(j=>{_.material++,_.texture++,_.image++;let F=null,O=j.path,L=j.name;j.path==""&&(O="",L=""),(i.embed_textures||j.path=="")&&(F=j.getBase64());let U=c("texture",j.uuid,j.name),J={_key:"Material",_values:[s(j.uuid+"_m"),`Material::${U}`,""],Version:102,ShadingModel:"lambert",MultiLayer:0,Properties70:{P2:{_key:"P",_values:["Emissive","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P3:{_key:"P",_values:["Ambient","Vector3D","Vector","",Le("D",.2),Le("D",.2),Le("D",.2)]},P4:{_key:"P",_values:["Diffuse","Vector3D","Vector","",Le("D",.8),Le("D",.8),Le("D",.8)]},P5:{_key:"P",_values:["Opacity","double","Number","",Le("D",1)]}}},ie={_key:"Texture",_values:[s(j.uuid+"_t"),`Texture::${U}`,""],Type:"TextureVideoClip",Version:202,TextureName:`Texture::${U}`,Media:`Video::${U}`,FileName:O,RelativeFilename:L,ModelUVTranslation:[Le("D",0),Le("D",0)],ModelUVScaling:[Le("D",1),Le("D",1)],Texture_Alpha_Source:"None",Cropping:[0,0,0,0]},te={_key:"Video",_values:[s(j.uuid+"_i"),`Video::${U}`,"Clip"],Type:"Clip",Properties70:{P:["Path","KString","XRefUrl","",j.path||j.name]},UseMipMap:0,Filename:O,RelativeFilename:L,Content:F};f["key"+j.uuid+"_m"]=J,f["key"+j.uuid+"_t"]=ie,f["key"+j.uuid+"_i"]=te,g.push({name:[`Texture::${U}`,`Material::${U}`],id:[s(j.uuid+"_t"),s(j.uuid+"_m")],property:"DiffuseColor"}),g.push({name:[`Video::${U}`,`Texture::${U}`],id:[s(j.uuid+"_i"),s(j.uuid+"_t")]})}),i.include_animations){let j=Codecs.gltf.buildAnimationTracks(t,!1),F=46186158e3;j.forEach(O=>{_.animation_stack++,_.animation_layer++;let L=s(O.uuid+"_s"),U=s(O.uuid+"_l"),J=c("animation",O.uuid,O.name),ie=Math.round(O.duration*F),te={_key:"AnimationStack",_values:[L,`AnimStack::${J}`,""],Properties70:{p1:{_key:"P",_values:["LocalStop","KTime","Time","",Le("L",ie)]},p2:{_key:"P",_values:["ReferenceStop","KTime","Time","",Le("L",ie)]}}},me={_key:"AnimationLayer",_values:[U,`AnimLayer::${J}`,""],_force_compound:!0};f["key"+O.uuid+"_s"]=te,f["key"+O.uuid+"_l"]=me,g.push({name:[`AnimLayer::${J}`,`AnimStack::${J}`],id:[U,L]}),O.tracks.forEach(Q=>{_.animation_curve_node++;let H=s(O.uuid+"."+Q.name),re=`AnimCurveNode::${J}.${Q.channel[0].toUpperCase()}`,K={_key:"AnimationCurveNode",_values:[H,re,""],Properties70:{p1:{_key:"P",_values:["d|X","Number","","A",Le("D",1)]},p2:{_key:"P",_values:["d|Y","Number","","A",Le("D",1)]},p3:{_key:"P",_values:["d|Z","Number","","A",Le("D",1)]}}},pe=Q.times.map(xe=>Math.round(xe*F));f["key"+O.uuid+"."+Q.name]=K,g.push({name:[re,`Model::${c("object",Q.group_uuid,Q.name)}`],id:[H,s(Q.group_uuid)],property:Q.channel=="position"?"Lcl Translation":Q.channel=="rotation"?"Lcl Rotation":"Lcl Scaling"}),g.push({name:[re,`AnimLayer::${J}`],id:[H,U]}),["X","Y","Z"].forEach((xe,le)=>{_.animation_curve++;let Be=s(O.uuid+"."+Q.name+"."+xe),X=`AnimCurve::${J}.${Q.channel[0].toUpperCase()}${xe}`,ne=Q.values.filter((Ue,et)=>et%3==le);Q.channel=="rotation"&&ne.forEach((Ue,et)=>ne[et]=Math.radToDeg(Ue));let Me={_key:"AnimationCurve",_values:[Be,X,""],Default:0,KeyVer:4008,KeyTime:{_values:[`_*${pe.length}`],_type:"d",a:pe},KeyValueFloat:{_values:[`_*${ne.length}`],_type:"f",a:ne},KeyAttrFlags:{_values:["_*1"],_type:"i",a:[24836]},KeyAttrDataFloat:{_values:["_*4"],_type:"f",a:[0,0,255790911,0]},KeyAttrRefCount:{_values:["_*1"],_type:"i",a:[pe.length]}};f["key"+O.uuid+"."+Q.name+xe]=Me,g.push({name:[X,re],id:[Be,H],property:`d|${xe}`})})}),v[O.uuid]={_key:"Take",_values:[J],FileName:`${J}.tak`,LocalTime:[0,ie],ReferenceTime:[0,ie]}})}n.push(o("Object definitions"));let y=1;for(let j in _)y+=_[j];n.push({Definitions:{Version:100,Count:y,global_settings:{_key:"ObjectType",_values:["GlobalSettings"],Count:1},node_attribute:_.node_attributes?{_key:"ObjectType",_values:["NodeAttribute"],Count:_.node_attributes,PropertyTemplate:{_values:["FbxNull"],Properties70:{P1:{_key:"P",_values:["Color","ColorRGB","Color","",Le("D",.8),Le("D",.8),Le("D",.8)]},P2:{_key:"P",_values:["Size","double","Number","",Le("D",100)]},P3:{_key:"P",_values:["Look","enum","","",1]}}}}:void 0,model:_.model?{_key:"ObjectType",_values:["Model"],Count:_.model,PropertyTemplate:{_values:["FbxNode"],Properties70:{P01:{_key:"P",_values:["QuaternionInterpolate","enum","","",0]},P02:{_key:"P",_values:["RotationOffset","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P03:{_key:"P",_values:["RotationPivot","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P04:{_key:"P",_values:["ScalingOffset","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P05:{_key:"P",_values:["ScalingPivot","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P06:{_key:"P",_values:["TranslationActive","bool","","",Le("I",0)]},P07:{_key:"P",_values:["TranslationMin","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P08:{_key:"P",_values:["TranslationMax","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P09:{_key:"P",_values:["TranslationMinX","bool","","",Le("I",0)]},P10:{_key:"P",_values:["TranslationMinY","bool","","",Le("I",0)]},P11:{_key:"P",_values:["TranslationMinZ","bool","","",Le("I",0)]},P12:{_key:"P",_values:["TranslationMaxX","bool","","",Le("I",0)]},P13:{_key:"P",_values:["TranslationMaxY","bool","","",Le("I",0)]},P14:{_key:"P",_values:["TranslationMaxZ","bool","","",Le("I",0)]},P15:{_key:"P",_values:["RotationOrder","enum","","",5]},P16:{_key:"P",_values:["RotationSpaceForLimitOnly","bool","","",Le("I",0)]},P17:{_key:"P",_values:["RotationStiffnessX","double","Number","",Le("D",0)]},P18:{_key:"P",_values:["RotationStiffnessY","double","Number","",Le("D",0)]},P19:{_key:"P",_values:["RotationStiffnessZ","double","Number","",Le("D",0)]},P20:{_key:"P",_values:["AxisLen","double","Number","",Le("D",10)]},P21:{_key:"P",_values:["PreRotation","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P22:{_key:"P",_values:["PostRotation","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P23:{_key:"P",_values:["RotationActive","bool","","",Le("I",0)]},P24:{_key:"P",_values:["RotationMin","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P25:{_key:"P",_values:["RotationMax","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P26:{_key:"P",_values:["RotationMinX","bool","","",Le("I",0)]},P27:{_key:"P",_values:["RotationMinY","bool","","",Le("I",0)]},P28:{_key:"P",_values:["RotationMinZ","bool","","",Le("I",0)]},P29:{_key:"P",_values:["RotationMaxX","bool","","",Le("I",0)]},P30:{_key:"P",_values:["RotationMaxY","bool","","",Le("I",0)]},P31:{_key:"P",_values:["RotationMaxZ","bool","","",Le("I",0)]},P32:{_key:"P",_values:["InheritType","enum","","",0]},P33:{_key:"P",_values:["ScalingActive","bool","","",Le("I",0)]},P34:{_key:"P",_values:["ScalingMin","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P35:{_key:"P",_values:["ScalingMax","Vector3D","Vector","",Le("D",1),Le("D",1),Le("D",1)]},P36:{_key:"P",_values:["ScalingMinX","bool","","",Le("I",0)]},P37:{_key:"P",_values:["ScalingMinY","bool","","",Le("I",0)]},P38:{_key:"P",_values:["ScalingMinZ","bool","","",Le("I",0)]},P39:{_key:"P",_values:["ScalingMaxX","bool","","",Le("I",0)]},P40:{_key:"P",_values:["ScalingMaxY","bool","","",Le("I",0)]},P41:{_key:"P",_values:["ScalingMaxZ","bool","","",Le("I",0)]},P42:{_key:"P",_values:["GeometricTranslation","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P43:{_key:"P",_values:["GeometricRotation","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P44:{_key:"P",_values:["GeometricScaling","Vector3D","Vector","",Le("D",1),Le("D",1),Le("D",1)]},P45:{_key:"P",_values:["MinDampRangeX","double","Number","",Le("D",0)]},P46:{_key:"P",_values:["MinDampRangeY","double","Number","",Le("D",0)]},P47:{_key:"P",_values:["MinDampRangeZ","double","Number","",Le("D",0)]},P48:{_key:"P",_values:["MaxDampRangeX","double","Number","",Le("D",0)]},P49:{_key:"P",_values:["MaxDampRangeY","double","Number","",Le("D",0)]},P50:{_key:"P",_values:["MaxDampRangeZ","double","Number","",Le("D",0)]},P51:{_key:"P",_values:["MinDampStrengthX","double","Number","",Le("D",0)]},P52:{_key:"P",_values:["MinDampStrengthY","double","Number","",Le("D",0)]},P53:{_key:"P",_values:["MinDampStrengthZ","double","Number","",Le("D",0)]},P54:{_key:"P",_values:["MaxDampStrengthX","double","Number","",Le("D",0)]},P55:{_key:"P",_values:["MaxDampStrengthY","double","Number","",Le("D",0)]},P56:{_key:"P",_values:["MaxDampStrengthZ","double","Number","",Le("D",0)]},P57:{_key:"P",_values:["PreferedAngleX","double","Number","",Le("D",0)]},P58:{_key:"P",_values:["PreferedAngleY","double","Number","",Le("D",0)]},P59:{_key:"P",_values:["PreferedAngleZ","double","Number","",Le("D",0)]},P60:{_key:"P",_values:["LookAtProperty","object","",""]},P61:{_key:"P",_values:["UpVectorProperty","object","",""]},P62:{_key:"P",_values:["Show","bool","","",Le("I",1)]},P63:{_key:"P",_values:["NegativePercentShapeSupport","bool","","",Le("I",1)]},P64:{_key:"P",_values:["DefaultAttributeIndex","int","Integer","",-1]},P65:{_key:"P",_values:["Freeze","bool","","",Le("I",0)]},P66:{_key:"P",_values:["LODBox","bool","","",Le("I",0)]},P67:{_key:"P",_values:["Lcl Translation","Lcl Translation","","A",Le("D",0),Le("D",0),Le("D",0)]},P68:{_key:"P",_values:["Lcl Rotation","Lcl Rotation","","A",Le("D",0),Le("D",0),Le("D",0)]},P69:{_key:"P",_values:["Lcl Scaling","Lcl Scaling","","A",Le("D",1),Le("D",1),Le("D",1)]},P70:{_key:"P",_values:["Visibility","Visibility","","A",Le("D",1)]},P71:{_key:"P",_values:["Visibility Inheritance","Visibility Inheritance","","",1]}}}}:void 0,geometry:_.geometry?{_key:"ObjectType",_values:["Geometry"],Count:_.geometry,PropertyTemplate:{_values:["FbxMesh"],Properties70:{P1:{_key:"P",_values:["Color","ColorRGB","Color","",Le("D",.8),Le("D",.8),Le("D",.8)]},P2:{_key:"P",_values:["BBoxMin","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P3:{_key:"P",_values:["BBoxMax","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P4:{_key:"P",_values:["Primary Visibility","bool","","",Le("I",1)]},P5:{_key:"P",_values:["Casts Shadows","bool","","",Le("I",1)]},P6:{_key:"P",_values:["Receive Shadows","bool","","",Le("I",1)]}}}}:void 0,material:_.material?{_key:"ObjectType",_values:["Material"],Count:_.material,PropertyTemplate:{_values:["FbxSurfaceLambert"],Properties70:{P01:{_key:"P",_values:["ShadingModel","KString","","","Lambert"]},P02:{_key:"P",_values:["MultiLayer","bool","","",Le("I",0)]},P03:{_key:"P",_values:["EmissiveColor","Color","","A",Le("D",0),Le("D",0),Le("D",0)]},P04:{_key:"P",_values:["EmissiveFactor","Number","","A",Le("D",1)]},P05:{_key:"P",_values:["AmbientColor","Color","","A",Le("D",.2),Le("D",.2),Le("D",.2)]},P06:{_key:"P",_values:["AmbientFactor","Number","","A",Le("D",1)]},P07:{_key:"P",_values:["DiffuseColor","Color","","A",Le("D",.8),Le("D",.8),Le("D",.8)]},P08:{_key:"P",_values:["DiffuseFactor","Number","","A",Le("D",1)]},P09:{_key:"P",_values:["Bump","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P10:{_key:"P",_values:["NormalMap","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P11:{_key:"P",_values:["BumpFactor","double","Number","",Le("D",1)]},P12:{_key:"P",_values:["TransparentColor","Color","","A",Le("D",0),Le("D",0),Le("D",0)]},P13:{_key:"P",_values:["TransparencyFactor","Number","","A",Le("D",0)]},P14:{_key:"P",_values:["DisplacementColor","ColorRGB","Color","",Le("D",0),Le("D",0),Le("D",0)]},P15:{_key:"P",_values:["DisplacementFactor","double","Number","",Le("D",1)]},P16:{_key:"P",_values:["VectorDisplacementColor","ColorRGB","Color","",Le("D",0),Le("D",0),Le("D",0)]},P17:{_key:"P",_values:["VectorDisplacementFactor","double","Number","",Le("D",1)]}}}}:void 0,texture:_.texture?{_key:"ObjectType",_values:["Texture"],Count:_.texture,PropertyTemplate:{_values:["FbxFileTexture"],Properties70:{P01:{_key:"P",_values:["TextureTypeUse","enum","","",0]},P02:{_key:"P",_values:["Texture alpha","Number","","A",Le("D",1)]},P03:{_key:"P",_values:["CurrentMappingType","enum","","",0]},P04:{_key:"P",_values:["WrapModeU","enum","","",0]},P05:{_key:"P",_values:["WrapModeV","enum","","",0]},P06:{_key:"P",_values:["UVSwap","bool","","",Le("I",0)]},P07:{_key:"P",_values:["PremultiplyAlpha","bool","","",Le("I",1)]},P08:{_key:"P",_values:["Translation","Vector","","A",Le("D",0),Le("D",0),Le("D",0)]},P09:{_key:"P",_values:["Rotation","Vector","","A",Le("D",0),Le("D",0),Le("D",0)]},P10:{_key:"P",_values:["Scaling","Vector","","A",Le("D",1),Le("D",1),Le("D",1)]},P11:{_key:"P",_values:["TextureRotationPivot","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P12:{_key:"P",_values:["TextureScalingPivot","Vector3D","Vector","",Le("D",0),Le("D",0),Le("D",0)]},P13:{_key:"P",_values:["CurrentTextureBlendMode","enum","","",1]},P14:{_key:"P",_values:["UVSet","KString","","","default"]},P15:{_key:"P",_values:["UseMaterial","bool","","",Le("I",0)]},P16:{_key:"P",_values:["UseMipMap","bool","","",Le("I",0)]}}}}:void 0,image:_.image?{_key:"ObjectType",_values:["Video"],Count:_.image,PropertyTemplate:{_values:["FbxVideo"],Properties70:{P01:{_key:"P",_values:["ImageSequence","bool","","",Le("I",0)]},P02:{_key:"P",_values:["ImageSequenceOffset","int","Integer","",0]},P03:{_key:"P",_values:["FrameRate","double","Number","",Le("D",0)]},P04:{_key:"P",_values:["LastFrame","int","Integer","",0]},P05:{_key:"P",_values:["Width","int","Integer","",0]},P06:{_key:"P",_values:["Height","int","Integer","",0]},P07:{_key:"P",_values:["Path","KString","XRefUrl","",""]},P08:{_key:"P",_values:["StartFrame","int","Integer","",0]},P09:{_key:"P",_values:["StopFrame","int","Integer","",0]},P10:{_key:"P",_values:["PlaySpeed","double","Number","",Le("D",0)]},P11:{_key:"P",_values:["Offset","KTime","Time","",Le("L",0)]},P12:{_key:"P",_values:["InterlaceMode","enum","","",0]},P13:{_key:"P",_values:["FreeRunning","bool","","",Le("I",0)]},P14:{_key:"P",_values:["Loop","bool","","",Le("I",0)]},P15:{_key:"P",_values:["AccessMode","enum","","",0]}}}}:void 0,pose:_.pose?{_key:"ObjectType",_values:["Pose"],Count:_.pose}:void 0,deformer:_.deformer?{_key:"ObjectType",_values:["Deformer"],Count:_.deformer}:void 0,animation_stack:_.animation_stack?{_key:"ObjectType",_values:["AnimationStack"],Count:_.animation_stack,PropertyTemplate:{_values:["FbxAnimStack"],Properties70:{P01:{_key:"P",_values:["Description","KString","","",""]},P02:{_key:"P",_values:["LocalStart","KTime","Time","",Le("L",0)]},P03:{_key:"P",_values:["LocalStop","KTime","Time","",Le("L",0)]},P04:{_key:"P",_values:["ReferenceStart","KTime","Time","",Le("L",0)]},P05:{_key:"P",_values:["ReferenceStop","KTime","Time","",Le("L",0)]}}}}:void 0,animation_layer:_.animation_layer?{_key:"ObjectType",_values:["AnimationLayer"],Count:_.animation_layer,PropertyTemplate:{_values:["FbxAnimLayer"],Properties70:{P01:{_key:"P",_values:["Weight","Number","","A",Le("D",100)]},P02:{_key:"P",_values:["Mute","bool","","",Le("I",0)]},P03:{_key:"P",_values:["Solo","bool","","",Le("I",0)]},P04:{_key:"P",_values:["Lock","bool","","",Le("I",0)]},P05:{_key:"P",_values:["Color","ColorRGB","Color","",Le("D",.8),Le("D",.8),Le("D",.8)]},P06:{_key:"P",_values:["BlendMode","enum","","",0]},P07:{_key:"P",_values:["RotationAccumulationMode","enum","","",0]},P08:{_key:"P",_values:["ScaleAccumulationMode","enum","","",0]},P09:{_key:"P",_values:["BlendModeBypass","ULongLong","","",0]}}}}:void 0,animation_curve_node:_.animation_curve_node?{_key:"ObjectType",_values:["AnimationCurveNode"],Count:_.animation_curve_node,PropertyTemplate:{_values:["FbxAnimCurveNode"],Properties70:{P01:{_key:"P",_values:["d","Compound","",""]}}}}:void 0,animation_curve:_.animation_curve?{_key:"ObjectType",_values:["AnimationCurve"],Count:_.animation_curve}:void 0}}),n.push(o("Object properties")),n.push({Objects:f}),n.push(o("Object connections"));let A={};g.forEach((j,F)=>{A[`connection_${F}_comment`]={_comment:j.name.join(", ")},A[`connection_${F}`]={_key:"C",_values:[j.property?"OP":"OO",...j.id]},j.property&&A[`connection_${F}`]._values.push(j.property)}),n.push({Connections:A}),n.push(o("Takes section")),n.push({Takes:v}),e.dispatchEvent("compile",{model:n,options:i});let R;if(i.encoding=="binary"){let j={};n.forEach(F=>{if(typeof F=="object")for(let O in F)j[O]=F[O]}),R=noe(j)}else R=n.map(j=>typeof j=="object"?aoe(j):j).join("");return R},write(i,e){var t=this;he.writeFile(e,{content:i},n=>t.afterSave(n)),Texture.all.forEach(n=>{if(!n.error){var a=n.name;a.substr(-4).toLowerCase()!==".png"&&(a+=".png");var o=e.split(osfs);o.splice(-1,1,a),he.writeFile(o.join(osfs),{content:n.source,savetype:"image"})}})},export_options:{encoding:{type:"select",label:"codec.common.encoding",options:{ascii:"ASCII",binary:"Binary (Experimental)"}},scale:{label:"settings.model_export_scale",type:"number",value:Settings.get("model_export_scale")},embed_textures:{type:"checkbox",label:"codec.common.embed_textures",value:!1},include_animations:{label:"codec.common.export_animations",type:"checkbox",value:!0},armature_note:{type:"info",condition:()=>jr.all.length>0,text:"\u26A0\uFE0F Armature export to FBX is currently experimental, glTF is recommended instead."}},async export(){if(!(Object.keys(this.export_options).length&&await this.promptExportOptions()===null)){var i=this,e=new mw.default,t=this.compile();e.file((Project.name||"model")+".fbx",t),Texture.all.forEach(n=>{if(!n.error){var a=n.name;a.substr(-4).toLowerCase()!==".png"&&(a+=".png"),e.file(a,n.source.replace("data:image/png;base64,",""),{base64:!0})}}),e.generateAsync({type:"blob"}).then(n=>{bn.exportFile({type:"Zip Archive",extensions:["zip"],name:"assets",content:n,savetype:"zip"},a=>i.afterDownload(a))})}}});BARS.defineActions(function(){L5.export_action=new Action("export_fbx",{icon:"icon-fbx",category:"file",condition:()=>!!Project,click:function(){L5.export()}})});var ZC=class{constructor(e,t){W(this,"array");W(this,"buffer");W(this,"view");W(this,"cursor");W(this,"little_endian");W(this,"textEncoder");this.array=new Uint8Array(e),this.buffer=this.array.buffer,this.view=new DataView(this.buffer),this.cursor=0,this.little_endian=!!t,this.textEncoder=new TextEncoder}expand(e){if(this.cursor+e>this.buffer.byteLength){var t=this.array;this.array=new Uint8Array(this.cursor+Math.max(e,176)),this.buffer=this.array.buffer,this.array.set(t),this.view=new DataView(this.buffer)}}WriteUInt8(e){this.expand(1),this.view.setUint8(this.cursor,e),this.cursor+=1}WriteUInt16(e){this.expand(2),this.view.setUint16(this.cursor,e,this.little_endian),this.cursor+=2}WriteInt16(e){this.expand(2),this.view.setInt16(this.cursor,e,this.little_endian),this.cursor+=2}WriteInt32(e){this.expand(4),this.view.setInt32(this.cursor,e,this.little_endian),this.cursor+=4}WriteInt64(e){this.expand(8),this.view.setBigInt64(this.cursor,BigInt(e),this.little_endian),this.cursor+=8}WriteUInt32(e){this.expand(4),this.view.setUint32(this.cursor,e,this.little_endian),this.cursor+=4}WriteFloat32(e){this.expand(4),this.view.setFloat32(this.cursor,e,this.little_endian),this.cursor+=4}WriteFloat64(e){this.expand(8),this.view.setFloat64(this.cursor,e,this.little_endian),this.cursor+=8}WriteBoolean(e){this.WriteUInt8(e?1:0)}Write7BitEncodedInt(e){for(;e>=128;)this.WriteUInt8(e|128),e=e>>7;this.WriteUInt8(e)}WriteRawString(e){var t=this.EncodeString(e);this.WriteBytes(t)}WriteString(e,t){var n=this.EncodeString(e);t||this.Write7BitEncodedInt(n.byteLength),this.WriteBytes(n)}WriteU32String(e){var t=this.EncodeString(e);this.WriteUInt32(t.byteLength),this.WriteBytes(t)}WriteU32Base64(e){let t=Rb(e),n=Uint8Array.from(t,a=>a.charCodeAt(0));this.WriteUInt32(n.length),this.WriteBytes(n)}WritePoint(e){this.expand(8),this.view.setInt32(this.cursor,e.x,this.little_endian),this.cursor+=4,this.view.setInt32(this.cursor,e.y,this.little_endian),this.cursor+=4}WriteVector2(e){this.expand(8),this.view.setFloat32(this.cursor,e.x,this.little_endian),this.cursor+=4,this.view.setFloat32(this.cursor,e.y,this.little_endian),this.cursor+=4}WriteVector3(e){this.expand(12),this.view.setFloat32(this.cursor,e.x,this.little_endian),this.cursor+=4,this.view.setFloat32(this.cursor,e.y,this.little_endian),this.cursor+=4,this.view.setFloat32(this.cursor,e.z,this.little_endian),this.cursor+=4}WriteIntVector3(e){this.expand(12),this.view.setInt32(this.cursor,e.x,this.little_endian),this.cursor+=4,this.view.setInt32(this.cursor,e.y,this.little_endian),this.cursor+=4,this.view.setInt32(this.cursor,e.z,this.little_endian),this.cursor+=4}WriteQuaternion(e){this.expand(16),this.view.setFloat32(this.cursor,e.w,this.little_endian),this.cursor+=4,this.view.setFloat32(this.cursor,e.x,this.little_endian),this.cursor+=4,this.view.setFloat32(this.cursor,e.y,this.little_endian),this.cursor+=4,this.view.setFloat32(this.cursor,e.z,this.little_endian),this.cursor+=4}WriteBytes(e){this.expand(e.byteLength),this.array.set(e,this.cursor),this.cursor+=e.byteLength}EncodeString(e){return this.textEncoder.encode(e)}};function noe(i){let e;D1<7500?e=new Uint8Array(Array(13).fill(0)):e=new Uint8Array(Array(25).fill(0));let t=["AnimationStack","AnimationLayer"];var n=new ZC(20,!0);n.WriteRawString("Kaydara FBX Binary "),n.WriteUInt8(0),n.WriteUInt8(26),n.WriteUInt8(0),n.WriteUInt32(D1);function a(d,u){let p;typeof u=="object"&&typeof u.map=="function"?p=u:typeof u!="object"?p=[u]:u._values?p=u._values:p=[];let m=u.hasOwnProperty("_values")&&u.hasOwnProperty("a")&&u._type!=null,_=n.cursor;n.WriteUInt32(0),n.WriteUInt32(p.length);let f=n.cursor;n.WriteUInt32(0),n.WriteString(d);let g=n.cursor;if(m){let v=u._type||"i",b=u.a;b instanceof Array||(b=[b]),n.WriteRawString(v),n.WriteUInt32(b.length),n.WriteUInt32(0);let x=0;switch(v){case"f":case"i":x=4;break;case"d":case"l":x=8;break;case"b":x=1;break}n.WriteUInt32(b.length*x);for(let w of b)switch(v){case"f":n.WriteFloat32(w);break;case"d":n.WriteFloat64(w);break;case"l":n.WriteInt64(w);break;case"i":n.WriteInt32(w);break;case"b":n.WriteBoolean(w);break}}else p.forEach((v,b)=>{let x=typeof v;if(typeof v=="object"&&v.isTNum&&(x=v.type,v=v.value),x=="number"&&(x=v%1?"D":"I"),x=="boolean")n.WriteRawString("C"),n.WriteBoolean(v);else if(x=="string"&&v.startsWith("iV"))n.WriteRawString("R"),n.WriteU32Base64(v);else if(x=="string"){if(v.includes("::")){let y=v.split("::");v=y[1]+"\0"+y[0]}n.WriteRawString("S"),v.startsWith("_")&&(v=v.substring(1)),n.WriteU32String(v)}else x=="Y"?(n.WriteRawString("Y"),n.WriteInt16(v)):x=="I"?(n.WriteRawString("I"),n.WriteInt32(v)):x=="F"?(n.WriteRawString("F"),n.WriteFloat32(v)):x=="D"?(n.WriteRawString("D"),n.WriteFloat64(v)):x=="L"&&(n.WriteRawString("L"),n.WriteInt64(v))});if(n.view.setUint32(f,n.cursor-g,n.little_endian),typeof u=="object"&&!(u instanceof Array)&&!m){let v=!1;for(let b in u){if(typeof b=="string"&&b.startsWith("_")||u[b]===void 0)continue;let x=u[b];x===null||x._comment||(x._key&&(b=x._key),v=!0,a(b,x))}(v||Object.keys(u).length===0&&!t.includes(d))&&n.WriteBytes(e)}n.view.setUint32(_,n.cursor,n.little_endian)}for(let d in i)a(d,i[d]);n.WriteBytes(e);let o=[250,188,171,9,208,200,212,102,177,118,251,131,28,247,38,126,0,0,0,0];n.WriteBytes(new Uint8Array(o));let r=n.cursor,s=(r+15&-16)-r;s===0&&(s=16);for(let d=0;dMath.roundTo(e,6)).join(" ")}var N5=new Codec("collada",{name:"Collada Model",extension:"dae",compile(i=0){let e=this,t=[],n=[],a=[],o=[],r=[],s=Settings.get("model_export_scale"),l={type:"COLLADA",attributes:{xmlns:"http://www.collada.org/2005/11/COLLADASchema",version:"1.4.1","xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance"},content:[{type:"asset",content:[{name:"contributor",content:[{type:"author",content:settings.username.value||"Blockbench user"},{type:"authoring_tool",content:"Blockbench"}]},{name:"created",content:new Date().toISOString()},{name:"modified",content:new Date().toISOString()},{name:"unit",attributes:{name:"meter",meter:"1.0"}},{name:"up_axis",content:"Y_UP"}]},{type:"library_effects",content:a},{type:"library_images",content:o},{type:"library_materials",content:r},{type:"library_geometries",content:t},{type:"library_visual_scenes",content:[{type:"visual_scene",attributes:{id:"Scene",name:"Scene"},content:n}]},{type:"scene",content:[{type:"instance_visual_scene",attributes:{url:"#Scene"}}]}]};Texture.all.forEach((p,m)=>{a.push({type:"effect",attributes:{id:`Material_${m}-effect`},content:{type:"profile_COMMON",content:[{type:"newparam",attributes:{sid:`Image_${m}-surface`},content:{type:"surface",attributes:{type:"2D"},content:{type:"init_from",content:`Image_${m}`}}},{type:"newparam",attributes:{sid:`Image_${m}-sampler`},content:{type:"sampler2D",content:{type:"source",content:`Image_${m}-surface`}}},{type:"technique",attributes:{sid:"common"},content:{type:"lambert",content:[{type:"emission",content:{type:"color",attributes:{sid:"emission"},content:"0 0 0 1"}},{type:"diffuse",content:{type:"texture",attributes:{texture:`Image_${m}-sampler`,texcoord:"UVMap"}}},{type:"index_of_refraction",content:{type:"float",attributes:{sid:"ior"},content:"1.45"}}]}}]}}),o.push({type:"image",attributes:{id:`Image_${m}`,name:`Image_${m}`},content:{type:"init_from",content:`${p.name.replace(/\.png$/,"")}.png`}}),r.push({type:"material",attributes:{id:`Material_${m}-material`,name:`Material_${m}`},content:{name:"instance_effect",attributes:{url:`#Material_${m}-effect`}}})});let c={north:[0,0,-1],east:[1,0,0],south:[0,0,1],west:[-1,0,0],up:[0,1,0],down:[0,-1,0]};Cube.all.forEach(p=>{if(!p.export)return;let m=[],_=[],f=[],g=[],v=[];function b(F,O,L){m.push((F-p.origin[0])/s,(O-p.origin[1])/s,(L-p.origin[2])/s)}var x=p.from.slice(),w=p.to.slice();adjustFromAndToForInflateAndStretch(x,w,p),b(w[0],w[1],w[2]),b(w[0],w[1],x[2]),b(w[0],x[1],w[2]),b(w[0],x[1],x[2]),b(x[0],w[1],x[2]),b(x[0],w[1],w[2]),b(x[0],x[1],x[2]),b(x[0],x[1],w[2]);for(let F in p.faces){let O=p.faces[F];if(O.texture===null)continue;_.push(...c[F]);let L=O.getTexture(),U=[Project.getUVWidth(L),Project.getUVHeight(L)],J=[[O.uv[0]/U[0],1-O.uv[1]/U[1]],[O.uv[2]/U[0],1-O.uv[1]/U[1]],[O.uv[2]/U[0],1-O.uv[3]/U[1]],[O.uv[0]/U[0],1-O.uv[3]/U[1]]];for(var E=O.rotation||0;E>0;)J.splice(0,0,J.pop()),E-=90;J.forEach(te=>{f.push(...te)}),g.push(4);let ie;switch(F){case"north":ie=[1,4,6,3];break;case"east":ie=[0,1,3,2];break;case"south":ie=[5,0,2,7];break;case"west":ie=[4,5,7,6];break;case"up":ie=[4,1,0,5];break;case"down":ie=[7,2,3,6];break}v.push(ie[3],_.length/3-1,g.length*4-1,ie[2],_.length/3-1,g.length*4-2,ie[1],_.length/3-1,g.length*4-3,ie[0],_.length/3-1,g.length*4-4)}let y={type:"geometry",attributes:{id:`${p.uuid}-mesh`,name:p.name},content:{type:"mesh",content:[{type:"source",attributes:{id:`${p.uuid}-mesh-positions`},content:[{type:"float_array",attributes:{id:`${p.uuid}-mesh-positions-array`,count:m.length},content:ll(m)},{type:"technique_common",content:{type:"accessor",attributes:{source:`#${p.uuid}-mesh-positions-array`,count:m.length/3,stride:3},content:[{type:"param",attributes:{name:"X",type:"float"}},{type:"param",attributes:{name:"Y",type:"float"}},{type:"param",attributes:{name:"Z",type:"float"}}]}}]},{type:"source",attributes:{id:`${p.uuid}-mesh-normals`},content:[{type:"float_array",attributes:{id:`${p.uuid}-mesh-normals-array`,count:_.length},content:ll(_)},{type:"technique_common",content:{type:"accessor",attributes:{source:`#${p.uuid}-mesh-normals-array`,count:_.length/3,stride:3},content:[{type:"param",attributes:{name:"X",type:"float"}},{type:"param",attributes:{name:"Y",type:"float"}},{type:"param",attributes:{name:"Z",type:"float"}}]}}]},{type:"source",attributes:{id:`${p.uuid}-mesh-map-0`},content:[{type:"float_array",attributes:{id:`${p.uuid}-mesh-map-0-array`,count:f.length},content:ll(f)},{type:"technique_common",content:{type:"accessor",attributes:{source:`#${p.uuid}-mesh-map-0-array`,count:f.length/2,stride:2},content:[{type:"param",attributes:{name:"S",type:"float"}},{type:"param",attributes:{name:"T",type:"float"}}]}}]},{type:"vertices",attributes:{id:`${p.uuid}-mesh-vertices`},content:[{type:"input",attributes:{semantic:"POSITION",source:`#${p.uuid}-mesh-positions`}}]}]}},A=0,R,j=[];for(let F in p.faces){let O=p.faces[F];if(O.texture!==null){let L=g[A],U=v.slice(A*12,A*12+12);R&&O.texture===R?(j.last().vcount.push(L),j.last().primitive.push(...U)):(j.push({texture:O.getTexture(),vcount:[L],primitive:U}),R=O.texture),A++}}j.forEach(F=>{y.content.content.push({type:"polylist",attributes:{material:`Material_${Texture.all.indexOf(F.texture)}-material`,count:6},content:[{type:"input",attributes:{semantic:"VERTEX",source:`#${p.uuid}-mesh-vertices`,offset:0}},{type:"input",attributes:{semantic:"NORMAL",source:`#${p.uuid}-mesh-normals`,offset:1}},{type:"input",attributes:{semantic:"TEXCOORD",source:`#${p.uuid}-mesh-map-0`,offset:2,set:0}},{type:"vcount",content:ll(F.vcount)},{type:"p",content:ll(F.primitive)}]})}),t.push(y)}),Mesh.all.forEach(p=>{if(!p.export)return;let m=[],_=[],f=[],g=[];function v(A,R,j){m.push(A/s,R/s,j/s)}for(let A in p.vertices)v(...p.vertices[A]),g.push(A);let b=0,x,w=[],E=0;for(let A in p.faces)if(p.faces[A].vertices.length>=3){let R=p.faces[A],j=R.getSortedVertices(),F=p.faces[A].getTexture(),O=[Project.getUVWidth(F),Project.getUVHeight(F)];j.forEach(U=>{f.push(R.uv[U][0]/O[0],1-R.uv[U][1]/O[1])}),_.push(...R.getNormal(!0));let L=[];j.forEach((U,J)=>{L.push(g.indexOf(U),_.length/3-1,f.length/2-j.length+J)}),x&&R.texture===x?(w.last().vcount.push(j.length),w.last().primitive.push(...L)):(w.push({texture:R.getTexture(),vcount:[j.length],primitive:L}),x=R.texture),E+=R.vertices.length,b++}let y={type:"geometry",attributes:{id:`${p.uuid}-mesh`,name:p.name},content:{type:"mesh",content:[{type:"source",attributes:{id:`${p.uuid}-mesh-positions`},content:[{type:"float_array",attributes:{id:`${p.uuid}-mesh-positions-array`,count:m.length},content:ll(m)},{type:"technique_common",content:{type:"accessor",attributes:{source:`#${p.uuid}-mesh-positions-array`,count:m.length/3,stride:3},content:[{type:"param",attributes:{name:"X",type:"float"}},{type:"param",attributes:{name:"Y",type:"float"}},{type:"param",attributes:{name:"Z",type:"float"}}]}}]},{type:"source",attributes:{id:`${p.uuid}-mesh-normals`},content:[{type:"float_array",attributes:{id:`${p.uuid}-mesh-normals-array`,count:_.length},content:ll(_)},{type:"technique_common",content:{type:"accessor",attributes:{source:`#${p.uuid}-mesh-normals-array`,count:_.length/3,stride:3},content:[{type:"param",attributes:{name:"X",type:"float"}},{type:"param",attributes:{name:"Y",type:"float"}},{type:"param",attributes:{name:"Z",type:"float"}}]}}]},{type:"source",attributes:{id:`${p.uuid}-mesh-map-0`},content:[{type:"float_array",attributes:{id:`${p.uuid}-mesh-map-0-array`,count:f.length},content:ll(f)},{type:"technique_common",content:{type:"accessor",attributes:{source:`#${p.uuid}-mesh-map-0-array`,count:f.length/2,stride:2},content:[{type:"param",attributes:{name:"S",type:"float"}},{type:"param",attributes:{name:"T",type:"float"}}]}}]},{type:"vertices",attributes:{id:`${p.uuid}-mesh-vertices`},content:[{type:"input",attributes:{semantic:"POSITION",source:`#${p.uuid}-mesh-positions`}}]}]}};w.forEach(A=>{y.content.content.push({type:"polylist",attributes:{material:`Material_${Texture.all.indexOf(A.texture)}-material`,count:6},content:[{type:"input",attributes:{semantic:"VERTEX",source:`#${p.uuid}-mesh-vertices`,offset:0}},{type:"input",attributes:{semantic:"NORMAL",source:`#${p.uuid}-mesh-normals`,offset:1}},{type:"input",attributes:{semantic:"TEXCOORD",source:`#${p.uuid}-mesh-map-0`,offset:2,set:0}},{type:"vcount",content:ll(A.vcount)},{type:"p",content:ll(A.primitive)}]})}),t.push(y)});function d(p){let m=p.origin.slice();p.parent instanceof Group&&m.V3_subtract(p.parent.origin);let _={name:"node",attributes:{id:p.uuid,name:p.name,type:"NODE"},content:[{type:"scale",attributes:{sid:"scale"},content:"1 1 1"},{type:"translate",attributes:{sid:"location"},content:m.V3_divide(s).join(" ")}]};if(p.getTypeBehavior("rotatable")){let f=[{type:"rotate",attributes:{sid:"rotationZ"},content:`0 0 1 ${p.rotation[2]}`},{type:"rotate",attributes:{sid:"rotationY"},content:`0 1 0 ${p.rotation[1]}`},{type:"rotate",attributes:{sid:"rotationX"},content:`1 0 0 ${p.rotation[0]}`}];p.mesh.rotation.order=="XYZ"&&f.reverse(),_.content.push(...f)}if(p instanceof Cube||p instanceof Mesh){let f=[];for(let g in p.faces){let v=p.faces[g].getTexture();v instanceof Texture&&f.safePush(v)}_.content.push({type:"instance_geometry",attributes:{url:`#${p.uuid}-mesh`,name:p.name},content:{name:"bind_material",content:{name:"technique_common",content:f.map(g=>{let v=Texture.all.indexOf(g);return{name:"instance_material",attributes:{symbol:`Material_${v}-material`,target:`#Material_${v}-material`},content:{name:"bind_vertex_input",attributes:{semantic:"UVMap",input_semantic:"TEXCOORD",input_set:"0"}}}})}}})}return p instanceof Group&&p.children.forEach(f=>{f.export!==!1&&_.content.push(d(f))}),_}Outliner.root.forEach(p=>{p.export!==!1&&n.push(d(p))});let u=Codecs.gltf.buildAnimationTracks(s,!1);if(u.length){let p={type:"library_animations",content:[]},m={type:"library_animation_clips",content:[]},_={},f=0;u.forEach(g=>{g.duration<.01||g.tracks.forEach(v=>{_[v.group_uuid]||(_[v.group_uuid]={}),_[v.group_uuid][v.channel]||(_[v.group_uuid][v.channel]={animations_added:[],times:[]})})}),u.forEach((g,v)=>{if(g.duration<.01)return;g.tracks.forEach(x=>{let w=_[x.group_uuid][x.channel];w.times.push(...x.times.map(y=>y+f)),w.animations_added.push(v);let E=x.times[x.times.length-1]-g.duration<=.1;E&&w.times.push(g.duration+f),x.channel=="rotation"?(w.values||(w.values={}),["X","Y","Z"].forEach((y,A)=>{w.values[y]||(w.values[y]=[]);let R=x.values.filter((j,F)=>F%3==A).map(j=>Math.radToDeg(j));w.values[y].push(...R),E&&w.values[y].push(...w.values[y].slice(-1))})):(w.values||(w.values=[]),w.values.push(...x.values),E&&w.values.push(...w.values.slice(-3)))});for(let x in _){let w=Group.all.find(E=>E.uuid==x);for(let E in _[x]){let y=_[x][E];if(!y.animations_added.includes(v))if(y.times.push(f,f+g.duration),E=="rotation")y.values||(y.values={}),["X","Y","Z"].forEach((A,R)=>{y.values[A]||(y.values[A]=[]),y.values[A].push(0,0)});else if(E=="scale")y.values||(y.values=[]),y.values.push(1,1,1,1,1,1);else{y.values||(y.values=[]);let A=w.origin.slice();w.parent instanceof Group&&A.V3_subtract(w.parent.origin),A.V3_divide(s),y.values.push(...A,...A)}}}let b={type:"animation_clip",attributes:{id:g.name,name:g.name,start:f,end:f+g.duration}};f+=g.duration+.01,m.content.push(b)});for(let g in _){let v={type:"animation",attributes:{id:`animation-${g}`,name:g},content:[]};for(let b in _[g]){let x=_[g][b],w=OutlinerNode.uuids[g],E=b;E=="position"&&(E="location"),E=="rotation"&&(E="rotation_euler");let y=`${w.name}_${E}`,A={type:"animation",attributes:{id:`${y}`,name:y},content:[{type:"source",attributes:{id:y+"-input"},content:[{type:"float_array",attributes:{id:y+"-input-array",count:x.times.length},content:ll(x.times)},{type:"technique_common",content:{type:"accessor",attributes:{source:"#"+y+"-input-array",count:x.times.length,stride:1},content:{type:"param",attributes:{name:"TIME",type:"float"}}}}]}]};b=="rotation"?["X","Y","Z"].forEach((R,j)=>{let F=x.values[R];A.content.push({type:"source",attributes:{id:y+"_"+R+"-output"},content:[{type:"float_array",attributes:{id:y+"_"+R+"-output-array",count:F.length},content:ll(F)},{type:"technique_common",content:{type:"accessor",attributes:{source:"#"+y+"_"+R+"-output-array",count:F.length,stride:1},content:[{type:"param",attributes:{name:"ANGLE",type:"float"}}]}}]},{type:"sampler",attributes:{id:`${y+"_"+R}-sampler`},content:[{type:"input",attributes:{semantic:"INPUT",source:"#"+y+"-input"}},{type:"input",attributes:{semantic:"OUTPUT",source:"#"+y+"_"+R+"-output"}}]},{type:"channel",attributes:{source:`#${y+"_"+R}-sampler`,target:`${w.uuid}/rotation${R}.ANGLE`}})}):A.content.push({type:"source",attributes:{id:y+"-output"},content:[{type:"float_array",attributes:{id:y+"-output-array",count:x.values.length},content:ll(x.values)},{type:"technique_common",content:{type:"accessor",attributes:{source:"#"+y+"-output-array",count:x.values.length,stride:3},content:[{type:"param",attributes:{name:"X",type:"float"}},{type:"param",attributes:{name:"Y",type:"float"}},{type:"param",attributes:{name:"Z",type:"float"}}]}}]},{type:"sampler",attributes:{id:`${y}-sampler`},content:[{type:"input",attributes:{semantic:"INPUT",source:"#"+y+"-input"}},{type:"input",attributes:{semantic:"OUTPUT",source:"#"+y+"-output"}}]},{type:"channel",attributes:{source:`#${y}-sampler`,target:`${w.uuid}/${E}`}}),v.content.push(A)}p.content.push(v)}l.content.push(p),l.content.push(m)}return e.dispatchEvent("compile",{model:l,options:i}),i.raw?l:ooe(l)},write(i,e){var t=this;i=this.compile(),Blockbench.writeFile(e,{content:i},n=>t.afterSave(n)),Texture.all.forEach(n=>{if(!n.error){var a=n.name;a.substr(-4).toLowerCase()!==".png"&&(a+=".png");var o=e.split(osfs);o.splice(-1,1,a),Blockbench.writeFile(o.join(osfs),{content:n.source,savetype:"image"})}})},export(){var i=this,e=new JSZip,t=this.compile();e.file((Project.name||"model")+".dae",t),Texture.all.forEach(n=>{if(!n.error){var a=n.name;a.substr(-4).toLowerCase()!==".png"&&(a+=".png"),e.file(a,n.source.replace("data:image/png;base64,",""),{base64:!0})}}),e.generateAsync({type:"blob"}).then(n=>{Blockbench.export({type:"Zip Archive",extensions:["zip"],name:"assets",content:n,savetype:"zip"},a=>i.afterDownload(a))})}});BARS.defineActions(function(){N5.export_action=new Action({id:"export_collada",icon:"icon-collada",category:"file",click:function(){N5.export()}})});function ooe(i){let e=0,t=` +`;function n(){let o="";for(let r=0;r"+o.content+` +`:typeof o.content=="object"?(e++,t+=`> +`,(o.content instanceof Array?o.content:[o.content]).forEach(c=>{typeof c=="object"&&a(c)}),e--,t+=n()+` +`):t+=`/> +`}return a(i),t}var V1=class{parse(e,t={}){let n=t.binary!==void 0?t.binary:!1,a=[],o=0;e.traverse(function(v){if(v.isMesh){let b=v.geometry;if(b.isBufferGeometry!==!0)throw new Error("THREE.STLExporter: Geometry is not of type THREE.BufferGeometry.");let x=b.index,w=b.getAttribute("position");o+=x!==null?x.count/3:w.count/3,a.push({object3d:v,geometry:b})}});let r,s=80;if(n===!0){let v=o*2+o*3*4*4+80+4,b=new ArrayBuffer(v);r=new DataView(b),r.setUint32(s,o,!0),s+=4}else r="",r+=`solid exported +`;let l=new we,c=new we,d=new we,u=new we,p=new we,m=new we;for(let v=0,b=a.length;v{a.children.push(r.mesh)});let o=n.parse(a,{binary:i.encoding=="binary"});return e.dispatchEvent("compile",{result:o,options:i}),o}});BARS.defineActions(function(){H5.export_action=new Action({id:"export_stl",icon:"database",category:"file",click:function(){H5.export()}})});function Ro(i){var e=trimFloatNumber(i)+"";return e.includes(".")||(e+=".0"),e+"F"}function xy(i){return Math.floor(i)}var wo={"1.12":{name:"Forge 1.7 - 1.13",remember:!0,integer_size:!0,file:`// Made with Blockbench %(bb_version) + // Exported for Minecraft version 1.7 - 1.12 + // Paste this class into your mod and generate all required imports + + + public class %(identifier) extends ModelBase { + %(fields) + + public %(identifier)() { + textureWidth = %(texture_width); + textureHeight = %(texture_height); + + %(content) + } + + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + %(renderers) + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + }`,field:"private final ModelRenderer %(bone);",bone:`%(bone) = new ModelRenderer(this); + %(bone).setRotationPoint(%(x), %(y), %(z)); + ?(has_parent)%(parent).addChild(%(bone)); + ?(has_rotation)setRotationAngle(%(bone), %(rx), %(ry), %(rz)); + %(cubes)`,renderer:"%(bone).render(f5);",cube:"%(bone).cubeList.add(new ModelBox(%(bone), %(uv_x), %(uv_y), %(x), %(y), %(z), %(dx), %(dy), %(dz), %(inflate), %(mirror)));"},"1.14":{name:"Forge 1.14 (MCP)",remember:!0,integer_size:!0,file:`// Made with Blockbench %(bb_version) + // Exported for Minecraft version 1.14 with MCP mappings + // Paste this class into your mod and generate all required imports + + + public class %(identifier) extends EntityModel { + %(fields) + + public %(identifier)() { + textureWidth = %(texture_width); + textureHeight = %(texture_height); + + %(content) + } + + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + %(renderers) + } + + public void setRotationAngle(RendererModel modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + }`,field:"private final RendererModel %(bone);",bone:`%(bone) = new RendererModel(this); + %(bone).setRotationPoint(%(x), %(y), %(z)); + ?(has_parent)%(parent).addChild(%(bone)); + ?(has_rotation)setRotationAngle(%(bone), %(rx), %(ry), %(rz)); + %(cubes)`,renderer:"%(bone).render(f5);",cube:"%(bone).cubeList.add(new ModelBox(%(bone), %(uv_x), %(uv_y), %(x), %(y), %(z), %(dx), %(dy), %(dz), %(inflate), %(mirror)));"},"1.14_mojmaps":{name:"Forge 1.14 (Mojmaps)",remember:!1,integer_size:!0,file:`// Made with Blockbench %(bb_version) + // Exported for Minecraft version 1.14 with Mojang mappings + // Paste this class into your mod and generate all required imports + + + public class %(identifier) extends EntityModel { + %(fields) + + public %(identifier)() { + texWidth = %(texture_width); + texHeight = %(texture_height); + + %(content) + } + + @Override + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + %(renderers) + } + + public void setRotationAngle(RendererModel modelRenderer, float x, float y, float z) { + modelRenderer.xRot = x; + modelRenderer.yRot = y; + modelRenderer.zRot = z; + } + }`,field:"private final RendererModel %(bone);",bone:`%(bone) = new RendererModel(this); + %(bone).setPos(%(x), %(y), %(z)); + ?(has_parent)%(parent).addChild(%(bone)); + ?(has_rotation)setRotationAngle(%(bone), %(rx), %(ry), %(rz)); + %(cubes)`,renderer:"%(bone).render(f5);",cube:"%(bone).cubes.add(new ModelBox(%(bone), %(uv_x), %(uv_y), %(x), %(y), %(z), %(dx), %(dy), %(dz), %(inflate), %(mirror)));"},"1.15":{name:"Forge 1.15 - 1.16 (MCP)",remember:!0,integer_size:!1,file:`// Made with Blockbench %(bb_version) + // Exported for Minecraft version 1.15 - 1.16 with MCP mappings + // Paste this class into your mod and generate all required imports + + + public class %(identifier) extends EntityModel { + %(fields) + + public %(identifier)() { + textureWidth = %(texture_width); + textureHeight = %(texture_height); + + %(content) + } + + @Override + public void setRotationAngles(Entity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch){ + //previously the render function, render code was moved to a method below + } + + @Override + public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha){ + %(renderers) + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + }`,field:"private final ModelRenderer %(bone);",bone:`%(bone) = new ModelRenderer(this); + %(bone).setRotationPoint(%(x), %(y), %(z)); + ?(has_parent)%(parent).addChild(%(bone)); + ?(has_rotation)setRotationAngle(%(bone), %(rx), %(ry), %(rz)); + %(cubes)`,renderer:"%(bone).render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha);",cube:"%(bone).setTextureOffset(%(uv_x), %(uv_y)).addBox(%(x), %(y), %(z), %(dx), %(dy), %(dz), %(inflate), %(mirror));"},"1.15_mojmaps":{name:"Forge 1.15 - 1.16 (Mojmaps)",remember:!1,integer_size:!1,file:`// Made with Blockbench %(bb_version) + // Exported for Minecraft version 1.15 - 1.16 with Mojang mappings + // Paste this class into your mod and generate all required imports + + + public class %(identifier) extends EntityModel { + %(fields) + + public %(identifier)() { + texWidth = %(texture_width); + texHeight = %(texture_height); + + %(content) + } + + @Override + public void setupAnim(Entity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch){ + //previously the render function, render code was moved to a method below + } + + @Override + public void renderToBuffer(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha){ + %(renderers) + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.xRot = x; + modelRenderer.yRot = y; + modelRenderer.zRot = z; + } + }`,field:"private final ModelRenderer %(bone);",bone:`%(bone) = new ModelRenderer(this); + %(bone).setPos(%(x), %(y), %(z)); + ?(has_parent)%(parent).addChild(%(bone)); + ?(has_rotation)setRotationAngle(%(bone), %(rx), %(ry), %(rz)); + %(cubes)`,renderer:"%(bone).render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha);",cube:"%(bone).texOffs(%(uv_x), %(uv_y)).addBox(%(x), %(y), %(z), %(dx), %(dy), %(dz), %(inflate), %(mirror));"},"1.17":{name:"Forge 1.17+ (Mojmaps)",remember:!1,use_layer_definition:!0,integer_size:!1,file:`// Made with Blockbench %(bb_version) + // Exported for Minecraft version 1.17 or later with Mojang mappings + // Paste this class into your mod and generate all required imports + + + public class %(identifier) extends EntityModel { + // This layer location should be baked with EntityRendererProvider.Context in the entity renderer and passed into this model's constructor + public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(new ResourceLocation("modid", "%(identifier_rl)"), "main"); + %(fields) + + public %(identifier)(ModelPart root) { + %(model_parts) + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + %(content) + + return LayerDefinition.create(meshdefinition, %(texture_width), %(texture_height)); + } + + @Override + public void setupAnim(%(entity) entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + + } + + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + %(renderers) + } + }`,field:"private final ModelPart %(bone);",model_part:`?(has_no_parent)this.%(bone) = root.getChild("%(bone)"); + ?(has_parent)this.%(bone) = this.%(parent).getChild("%(bone)");`,bone:`?(has_no_parent)PartDefinition %(bone) = partdefinition.addOrReplaceChild("%(bone)", CubeListBuilder.create() + ?(has_parent)PartDefinition %(bone) = %(parent).addOrReplaceChild("%(bone)", CubeListBuilder.create() + %(remove_n)%(cubes) + ?(has_rotation)%(remove_n), PartPose.offsetAndRotation(%(x), %(y), %(z), %(rx), %(ry), %(rz))); + ?(has_no_rotation)%(remove_n), PartPose.offset(%(x), %(y), %(z)));`,renderer:"%(bone).render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha);",cube:".texOffs(%(uv_x), %(uv_y)){?(has_mirror).mirror()}.addBox(%(x), %(y), %(z), %(dx), %(dy), %(dz), new CubeDeformation(%(inflate))){?(has_mirror).mirror(false)}",animation_template:"mojang"},"1.17_yarn":{name:"Fabric 1.17+ (Yarn)",remember:!1,integer_size:!1,file:`// Made with Blockbench %(bb_version) + // Exported for Minecraft version 1.17+ for Yarn + // Paste this class into your mod and generate all required imports + public class %(identifier) extends EntityModel<%(entity)> { + %(fields) + public %(identifier)(ModelPart root) { + %(model_parts) + } + public static TexturedModelData getTexturedModelData() { + ModelData modelData = new ModelData(); + ModelPartData modelPartData = modelData.getRoot(); + %(content) + return TexturedModelData.of(modelData, %(texture_width), %(texture_height)); + } + @Override + public void setAngles(%(entity) entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + } + @Override + public void render(MatrixStack matrices, VertexConsumer vertexConsumer, int light, int overlay, float red, float green, float blue, float alpha) { + %(renderers) + } + }`,field:"private final ModelPart %(bone);",model_part:`?(has_no_parent)this.%(bone) = root.getChild("%(bone)"); + ?(has_parent)this.%(bone) = this.%(parent).getChild("%(bone)");`,bone:`?(has_no_parent)ModelPartData %(bone) = modelPartData.addChild("%(bone)", ModelPartBuilder.create() + ?(has_parent)ModelPartData %(bone) = %(parent).addChild("%(bone)", ModelPartBuilder.create() + %(remove_n)%(cubes) + ?(has_rotation)%(remove_n), ModelTransform.of(%(x), %(y), %(z), %(rx), %(ry), %(rz))); + ?(has_no_rotation)%(remove_n), ModelTransform.pivot(%(x), %(y), %(z)));`,renderer:"%(bone).render(matrices, vertexConsumer, light, overlay, red, green, blue, alpha);",cube:".uv(%(uv_x), %(uv_y)){?(has_mirror).mirrored()}.cuboid(%(x), %(y), %(z), %(dx), %(dy), %(dz), new Dilation(%(inflate))){?(has_mirror).mirrored(false)}",animation_template:"fabric"},get(i,e=Project.modded_entity_version){let t=wo[e][i];return typeof t=="string"&&(t=t.replace(/\t\t\t/g,"")),t},keepLine(i){return i.replace(/\?\(\w+\)/,"")},getVariableRegex(i){return new RegExp(`%\\(${i}\\)`,"g")}},Zd={mojang:{name:"Mojmaps",file:`// Save this class in your mod and generate all required imports + + /** + * Made with Blockbench %(bb_version) + * Exported for Minecraft version 1.19 or later with Mojang mappings + * @author %(author) + */ + public class %(identifier)Animation { + %(animations) + }`,animation:"public static final AnimationDefinition %(name) = AnimationDefinition.Builder.withLength(%(length))%(looping)%(channels).build();",looping:".looping()",channel:'.addAnimation("%(name)", new AnimationChannel(%(channel_type), %(keyframes)))',keyframe_rotation:"new Keyframe(%(time), KeyframeAnimations.degreeVec(%(x), %(y), %(z)), %(interpolation))",keyframe_position:"new Keyframe(%(time), KeyframeAnimations.posVec(%(x), %(y), %(z)), %(interpolation))",keyframe_scale:"new Keyframe(%(time), KeyframeAnimations.scaleVec(%(x), %(y), %(z)), %(interpolation))",channel_types:{rotation:"AnimationChannel.Targets.ROTATION",position:"AnimationChannel.Targets.POSITION",scale:"AnimationChannel.Targets.SCALE"},interpolations:{linear:"AnimationChannel.Interpolations.LINEAR",catmullrom:"AnimationChannel.Interpolations.CATMULLROM"}},fabric:{name:"Yarn",file:`// Save this class in your mod and generate all required imports + /** + * Made with Blockbench %(bb_version) + * Exported for Minecraft version 1.19 or later with Yarn mappings + * @author %(author) + */ + public class %(identifier)Animation { + %(animations) + }`,animation:"public static final Animation %(name) = Animation.Builder.create(%(length))%(looping)%(channels).build();",looping:".looping()",channel:'.addBoneAnimation("%(name)", new Transformation(%(channel_type), %(keyframes)))',keyframe_rotation:"new Keyframe(%(time), AnimationHelper.createRotationalVector(%(x), %(y), %(z)), %(interpolation))",keyframe_position:"new Keyframe(%(time), AnimationHelper.createTranslationalVector(%(x), %(y), %(z)), %(interpolation))",keyframe_scale:"new Keyframe(%(time), AnimationHelper.createScalingVector(%(x), %(y), %(z)), %(interpolation))",channel_types:{rotation:"Transformation.Targets.ROTATE",position:"Transformation.Targets.TRANSLATE",scale:"Transformation.Targets.SCALE"},interpolations:{linear:"Transformation.Interpolations.LINEAR",catmullrom:"Transformation.Interpolations.CUBIC"}},get(i,e=Project.modded_entity_version){let t=wo.get("animation_template",e),n=Zd[t||"mojang"][i];return typeof n=="string"&&(n=n.replace(/\t\t\t/g,"")),n}};function QC(){return Project.geometry_name&&Project.geometry_name.replace(/[\s-]+/g,"_")||Project.name||"CustomModel"}function G5(){Blockbench.showMessageBox({translateKey:"cannot_re_import",buttons:["dialog.save","dialog.cancel"]},i=>{i==0&&BarItems.save_project.click()})}var kf=new Codec("modded_entity",{name:"Java Class",extension:"java",remember:!0,support_partial_export:!0,load_filter:{type:"text",extensions:["java"]},compile(i){let e=wo.getVariableRegex,t=QC(),n=getAllGroups(),a=[];if(Cube.all.forEach(s=>{s.export!=!1&&s.parent=="root"&&a.push(s)}),a.length){let s=new Group({name:"bb_main"});s.is_catch_bone=!0,s.createUniqueName(),n.push(s),s.children.replace(a)}n.slice().forEach(s=>{if(s.export==!1)return;let l=[],c=n.indexOf(s);s.children.forEachReverse(d=>{if(!(!(d instanceof Cube)||!d.export)&&!d.rotation.allEqual(0)){let u=l.find(p=>{if(!p.rotation.equals(d.rotation))return!1;if(p.rotation.filter(_=>_).length>1)return p.origin.equals(d.origin);for(var m=0;m<3;m++)if(p.rotation[m]==0&&p.origin[m]!=d.origin[m])return!1;return!0});u||(u=new Group({rotation:d.rotation,origin:d.origin,name:`${d.name}_r1`}),u.parent=s,u.is_rotation_subgroup=!0,u.createUniqueName(n),l.push(u),c++,n.splice(c,0,u)),u.children.push(d)}})});let o=wo.get("file");o=o.replace(e("bb_version"),Blockbench.version),o=o.replace(e("entity"),Project.modded_entity_entity_class||"Entity"),o=o.replace(e("identifier"),t),o=o.replace(e("identifier_rl"),t.toLowerCase().replace(" ","_")),o=o.replace(e("texture_width"),Project.texture_width),o=o.replace(e("texture_height"),Project.texture_height),o=o.replace(e("fields"),()=>{let s=wo.get("use_layer_definition"),l=[];for(var c of n){if(!(c instanceof Group)&&!c.is_catch_bone||!c.export||c.is_rotation_subgroup&&wo.get("model_part"))continue;let d=wo.get("field").replace(e("bone"),c.name);l.push(d)}return l.join(` + `)}),o=o.replace(e("content"),()=>{let s=[];for(var l of n){if(!(l instanceof Group)&&!l.is_catch_bone||!l.export)continue;let d=wo.get("bone").replace(e("bone"),l.name).replace(/\n\?\(has_rotation\).+/,l.rotation.allEqual(0)?"":wo.keepLine).replace(/\n\?\(has_no_rotation\).+/,l.rotation.allEqual(0)?wo.keepLine:"");d=d.replace(e("rx"),Ro(Math.degToRad(-l.rotation[0]))).replace(e("ry"),Ro(Math.degToRad(-l.rotation[1]))).replace(e("rz"),Ro(Math.degToRad(l.rotation[2])));var c=l.origin.slice();l.parent instanceof Group&&c.V3_subtract(l.parent.origin),c[0]*=-1,Project.modded_entity_flip_y&&(c[1]*=-1,l.parent instanceof Group||(c[1]+=24)),d=d.replace(e("x"),Ro(c[0])).replace(e("y"),Ro(c[1])).replace(e("z"),Ro(c[2])).replace(/(?:\n|^)\?\(has_parent\).+/,l.parent instanceof Group?wo.keepLine:"").replace(/(?:\n|^)\?\(has_no_parent\).+/,l.parent instanceof Group?"":wo.keepLine).replace(/(?:\n|^)%\(remove_n\)/g,"").trim().replace(e("parent"),l.parent.name).replace(e("cubes"),()=>{let u=[];for(var p of l.children){if(!(p instanceof Cube)||!p.export||!p.rotation.allEqual(0)&&!l.is_rotation_subgroup)continue;let m=wo.get("cube").replace(e("bone"),l.name).replace(e("uv_x"),xy(p.uv_offset[0])).replace(e("uv_y"),xy(p.uv_offset[1])).replace(e("inflate"),Ro(p.inflate)).replace(/{\?\(has_mirror\)(.+?)}/g,p.mirror_uv==!0?"$1":"").replace(e("mirror"),p.mirror_uv);Project.modded_entity_flip_y?m=m.replace(e("x"),Ro(l.origin[0]-p.to[0])).replace(e("y"),Ro(-p.from[1]-p.size(1)+l.origin[1])).replace(e("z"),Ro(p.from[2]-l.origin[2])):m=m.replace(e("x"),Ro(l.origin[0]-p.to[0])).replace(e("y"),Ro(p.from[1]-l.origin[1])).replace(e("z"),Ro(p.from[2]-l.origin[2])),wo.get("integer_size")?m=m.replace(e("dx"),xy(p.size(0,!0))).replace(e("dy"),xy(p.size(1,!0))).replace(e("dz"),xy(p.size(2,!0))):m=m.replace(e("dx"),Ro(p.size(0,!1))).replace(e("dy"),Ro(p.size(1,!1))).replace(e("dz"),Ro(p.size(2,!1))),u.push(m)}return u.join(` +`)}).replace(/\n/g,` + `),s.push(d)}return s.join(` + + `)}),o=o.replace(e("model_parts"),()=>{let s=wo.get("model_part");if(s==null)return"";let l=[];for(let c of n){if(!(c instanceof Group)&&!c.is_catch_bone||!c.export||c.is_rotation_subgroup)continue;let d=s.replace(e("bone"),c.name).replace(/\t+/,"").replace(/(?:\n|^)\?\(has_parent\).+/,c.parent instanceof Group?wo.keepLine:"").replace(/(?:\n|^)\?\(has_no_parent\).+/,c.parent instanceof Group?"":wo.keepLine).trim().replace(e("parent"),c.parent.name);l.push(d)}return l.join(` + `)}),o=o.replace(e("renderers"),()=>{let s=[];for(var l of n){if(!(l instanceof Group)&&!l.is_catch_bone||!l.export||!wo.get("render_subgroups")&&l.parent instanceof Group)continue;let c=wo.get("renderer").replace(e("bone"),l.name);s.push(c)}return s.join(` + `)});let r={model:o,options:i};return this.dispatchEvent("compile",r),r.model},parse(i,e,t){this.dispatchEvent("parse",{model:i});var n=[];i.split(` +`).forEach(d=>{d=d.replace(/\/\*[^(\*\/)]*\*\/|\/\/.*/g,"").trim().replace(/;$/,""),d&&n.push(d)});function a(d,u){d=d.replace(/\(/g,"\\(").replace(/\)/g,"\\)").replace(/\./g,"\\.");var p=d.split("$"),m=[],_=0,f=0;for(var g of p){if(f==0){var v=new RegExp("^"+g).exec(u);if(v==null)return;_=v[0].length}else{var b=g.substr(0,1);g=g.substr(1);var x="";switch(b){case"v":x="^[a-zA-Z_][a-zA-Z0-9_]+";break;case"i":x="^-?\\d+";break;case"f":x="^-?\\d+\\.?\\d*[Ff]";break;case"d":x="^-?\\d+\\.?\\d*";break;case"b":x="^true|false";break}var v=new RegExp(x+g).exec(u.substr(_));if(v==null)return;var w=new RegExp(x).exec(u.substr(_))[0];switch(b){case"v":m.push(w);break;case"i":m.push(parseInt(w));break;case"f":m.push(parseFloat(w.replace(/F$/,"")));break;case"d":m.push(parseFloat(w.replace(/F$/,"")));break;case"b":m.push(w=="true");break}_+=v[0].length}f++}return l=m,!0}var o=0,r={},s,l,c;n.forEach(d=>{if(o==0)/^public class/.test(d)&&(o=1,s=d.split(/[\s<>()\.]+/g)[2]);else if(o==1)if(d=d.replace(/public |static |final |private |void /g,"").trim(),d.substr(0,13)=="ModelRenderer"||d.substr(0,13)=="RendererModel"){let g=d.split(" ")[1];r[g]=new Group({name:g,origin:[0,24,0]}).init()}else d.substr(0,s.length)==s&&(o=2);else if(o==2){if(d=d.replace(/^this\./,""),l=void 0,d=="}")o--;else if(a("textureWidth = $i",d)||a("texWidth = $i",d))Project.texture_width=l[0];else if(a("textureHeight = $i",d)||a("texHeight = $i",d))Project.texture_height=l[0];else if(a("super($v, $i, $i)",d))Project.texture_width=l[1],Project.texture_height=l[2];else if(a("ModelRenderer $v = new ModelRenderer(this, $i, $i)",d)||a("RendererModel $v = new RendererModel(this, $i, $i)",d)||a("$v = new ModelRenderer(this, $i, $i)",d)||a("$v = new RendererModel(this, $i, $i)",d))r[l[0]]||(r[l[0]]=new Group({name:l[0],origin:[0,24,0]}).init()),c=[l[1],l[2]];else if(a("$v = new ModelRenderer(this)",d))r[l[0]]||(r[l[0]]=new Group({name:l[0],origin:[0,0,0]}).init());else if(a("$v.setRotationPoint($f, $f, $f)",d)||a("$v.setPos($f, $f, $f)",d)){var u=r[l[0]];u&&(u.extend({origin:[-l[1],24-l[2],l[3]]}),u.children.forEach(g=>{g instanceof Cube&&(g.from[0]+=u.origin[0],g.to[0]+=u.origin[0],g.from[1]+=u.origin[1]-24,g.to[1]+=u.origin[1]-24,g.from[2]+=u.origin[2],g.to[2]+=u.origin[2])}))}else if(a("$v.addChild($v)",d.replace(/\(this\./g,"("))){var p=r[l[1]],m=r[l[0]];p.addTo(m),p.origin.V3_add(m.origin),p.origin[1]-=24,p.children.forEach(g=>{g instanceof Cube&&(g.from[0]+=m.origin[0],g.to[0]+=m.origin[0],g.from[1]+=m.origin[1]-24,g.to[1]+=m.origin[1]-24,g.from[2]+=m.origin[2],g.to[2]+=m.origin[2])})}else if(a("$v.cubeList.add(new ModelBox($v, $i, $i, $f, $f, $f, $i, $i, $i, $f, $b))",d)||a("$v.cubes.add(new ModelBox($v, $i, $i, $f, $f, $f, $i, $i, $i, $f, $b))",d)){var _=r[l[0]],f=new Cube({name:l[0],uv_offset:[l[2],l[3]],from:[_.origin[0]-l[4]-l[7],_.origin[1]-l[5]-l[8],_.origin[2]+l[6]],inflate:l[10],mirror_uv:l[11]});f.extend({to:[f.from[0]+Math.floor(l[7]),f.from[1]+Math.floor(l[8]),f.from[2]+Math.floor(l[9])]}),f.addTo(r[l[0]]).init()}else if(a("$v.addBox($f, $f, $f, $i, $i, $i)",d)||a("$v.addBox($f, $f, $f, $i, $i, $i, $v)",d)||a("$v.addBox($f, $f, $f, $i, $i, $i, $f)",d)||a("$v.addBox($f, $f, $f, $f, $f, $f, $f, $f, $f)",d)){var _=r[l[0]],f=new Cube({name:l[0],uv_offset:c,from:[_.origin[0]-l[1]-l[4],_.origin[1]-l[2]-l[5],_.origin[2]+l[3]],inflate:typeof l[7]=="number"?l[7]:0,mirror_uv:_.mirror_uv});f.extend({to:[f.from[0]+Math.floor(l[4]),f.from[1]+Math.floor(l[5]),f.from[2]+Math.floor(l[6])]}),f.addTo(r[l[0]]).init()}else if(a("$v.setTextureOffset($i, $i).addBox($f, $f, $f, $f, $f, $f, $f, $b)",d)||a("$v.texOffs($i, $i).addBox($f, $f, $f, $f, $f, $f, $f, $b)",d)){var _=r[l[0]],f=new Cube({name:l[0],uv_offset:[l[1],l[2]],from:[_.origin[0]-l[3]-l[6],_.origin[1]-l[4]-l[7],_.origin[2]+l[5]],inflate:l[9],mirror_uv:l[10]});f.extend({to:[f.from[0]+Math.floor(l[6]),f.from[1]+Math.floor(l[7]),f.from[2]+Math.floor(l[8])]}),f.addTo(r[l[0]]).init()}else if(a("setRotationAngle($v, $f, $f, $f)",d)){var _=r[l[0]];_&&_.extend({rotation:[-Math.radToDeg(l[1]),-Math.radToDeg(l[2]),Math.radToDeg(l[3])]})}else if(a("setRotation($v, $f, $f, $f)",d)){var _=r[l[0]];_&&_.extend({rotation:[-Math.radToDeg(l[1]),-Math.radToDeg(l[2]),Math.radToDeg(l[3])]})}else if(a("setRotateAngle($v, $f, $f, $f)",d)){var _=r[l[0]];_&&_.extend({rotation:[-Math.radToDeg(l[1]),-Math.radToDeg(l[2]),Math.radToDeg(l[3])]})}else if(a("$v.rotateAngleX = $f",d)||a("$v.xRot = $f",d)){var _=r[l[0]];_&&(_.rotation[0]=-Math.radToDeg(l[1]))}else if(a("$v.rotateAngleY = $f",d)||a("$v.yRot = $f",d)){var _=r[l[0]];_&&(_.rotation[1]=-Math.radToDeg(l[1]))}else if(a("$v.rotateAngleZ = $f",d)||a("$v.zRot = $f",d)){var _=r[l[0]];_&&(_.rotation[2]=Math.radToDeg(l[1]))}else if(a("$v.mirror = $b",d)){var _=r[l[0]];_.mirror_uv=l[1],_.children.forEach(v=>{v.mirror_uv=l[1]})}}}),Project.geometry_name=s,this.dispatchEvent("parsed",{model:i}),Canvas.updateAllBones(),Validator.validate()},afterDownload(i){this.remember?Project.saved=!0:open_interface||G5(),Blockbench.showQuickMessage(tl("message.save_file",[i?pathToName(i,!0):this.fileName()]))},afterSave(i){var e=pathToName(i,!0);(Format.codec==this||this.id=="project")&&(Project.export_path=i,Project.export_codec=this.id,Project.name=pathToName(i,!1)),this.remember?(Project.saved=!0,addRecentProject({name:e,path:i,icon:this.id=="project"?"icon-blockbench_file":Format.icon}),updateRecentProjectThumbnail()):open_interface||G5(),Blockbench.showQuickMessage(tl("message.save_file",[e]))},fileName(){return QC()}});kf.templates=wo;kf.animation_templates=Zd;Object.defineProperty(kf,"remember",{get(){return!!Codecs.modded_entity.templates[Project.modded_entity_version].remember}});var roe=new AnimationCodec("modded_entity",{multiple_per_file:!0,compileFile(i=Animation.all){let e=wo.getVariableRegex,t=QC(),n=Zd.get("interpolations"),a=Zd.get("file");a=a.replace(e("bb_version"),Blockbench.version),a=a.replace(e("author"),Settings.get("username")||"Author"),a=a.replace(e("identifier"),t);let o=[];return i.forEach(r=>{let s=Zd.get("animation");s=s.replace(e("name"),r.name),s=s.replace(e("length"),Ro(r.length)),s=s.replace(e("looping"),r.loop=="loop"?Zd.get("looping"):"");let l=[],c=Zd.get("channel_types");for(let d in r.animators){let u=r.animators[d];if(u instanceof BoneAnimator)for(let p in c){let f=function(v,b,x,w,E){p=="position"&&(b*=-1),p=="rotation"&&(b*=-1,x*=-1);let y=Zd.get("keyframe_"+p);y=y.replace(e("time"),Ro(v)),y=y.replace(e("x"),Ro(b)),y=y.replace(e("y"),Ro(x)),y=y.replace(e("z"),Ro(w)),y=y.replace(e("interpolation"),n[E]||n.linear),_.push(y)};if(!(u[p]&&u[p].length))continue;let m=u[p].slice().sort((v,b)=>v.time-b.time),_=[];m.forEach((v,b)=>{if(f(v.time,v.calc("x"),v.calc("y"),v.calc("z"),v.interpolation),v.data_points[1])f(v.time+.001,v.calc("x",1),v.calc("y",1),v.calc("z",1),v.interpolation);else if(v.interpolation=="step"&&m[b+1]){let x=m[b+1];f(x.time-.001,v.calc("x"),v.calc("y"),v.calc("z"),"linear")}});let g=Zd.get("channel");g=g.replace(e("name"),u.name),g=g.replace(e("channel_type"),c[p]),g=g.replace(e("keyframes"),` + `+_.join(`, + `)+` + `),l.push(g)}}s=s.replace(e("channels"),` + `+l.join(` + `)+` + `),o.push(s)}),a=a.replace(e("animations"),o.join(` + + `)),a}}),F1=new ModelFormat({id:"modded_entity",icon:"icon-format_java",category:"minecraft",target:"Minecraft: Java Edition",format_page:{content:[{type:"h3",text:tl("mode.start.format.informations")},{text:`* ${tl("format.modded_entity.info.integer_size")} + * ${tl("format.modded_entity.info.format")}`.replace(/\t+/g,"")}]},codec:kf,animation_codec:roe,node_name_regex:"\\w",box_uv:!0,box_uv_float_size:!0,single_texture:!0,bone_rig:!0,centered_grid:!0,rotate_cubes:!0,integer_size:!0,animation_mode:!0,pbr:!0});Object.defineProperty(F1,"integer_size",{get:i=>wo.get("integer_size")||settings.modded_entity_integer_size.value});kf.format=F1;BARS.defineActions(function(){new Action({id:"export_class_entity",icon:"free_breakfast",category:"file",condition:()=>Format==F1,click:function(){kf.export()}}),new Action("export_modded_animations",{icon:"free_breakfast",category:"file",condition:()=>Format==F1,click(){let i={},e=[],t=Animation.all.slice();Format.animation_files&&t.sort((a,o)=>a.path.hashCode()-o.path.hashCode()),t.forEach(a=>{let o=a.name;e.push(o),i[o.hashCode()]={label:o,type:"checkbox",value:!0}});let n=new Dialog({id:"animation_export",title:"dialog.animation_export.title",form:i,onConfirm(a){n.hide(),e=e.filter(s=>a[s.hashCode()]);let o=e.map(s=>Animation.all.find(l=>l.name==s)),r=AnimationCodec.codecs.modded_entity.compileFile(o);Blockbench.export({resource_id:"modded_animation",type:"Modded Entity Animation",extensions:["java"],name:Project.geometry_name||"model",content:r})}});i.select_all_none={type:"buttons",buttons:["generic.select_all","generic.select_none"],click(a){let o={};e.forEach(r=>o[r.hashCode()]=a==0),n.setFormValues(o)}},n.show()}})});var U1=new Codec("optifine_entity",{name:"OptiFine JEM",extension:"jem",remember:!0,support_partial_export:!0,load_filter:{type:"json",extensions:["jem"],condition(i){return i&&i.models!=null}},compile(i){i===void 0&&(i={});var e={};(Project.credit||settings.credit.value)&&(e.credit=Project.credit||settings.credit.value);function t(r){let s=r.name;return r.folder&&(s=r.folder+"/"+s),r.namespace&&r.namespace!="minecraft"&&(s=r.namespace+":"+s),s}function n(r){return Group.all.find(s=>s.export&&s.texture==r.uuid)}e.textureSize=[Project.texture_width,Project.texture_height];let a=Texture.getDefault();if(a&&(a.use_as_default||settings.optifine_save_default_texture.value&&!n(a))){let r=Texture.getDefault();e.texture=t(Texture.getDefault()),e.textureSize=[r.uv_width,r.uv_height]}else a=null;Project.shadow_size!=1&&(e.shadowSize=Project.shadow_size),e.models=[];function o(r){if(!settings.export_empty_groups.value&&!r.children.find(c=>c.export))return;var s={part:r.name,id:r.name,invertAxis:"xy",mirrorTexture:void 0,translate:r.origin.slice()};s.translate.V3_multiply(-1),r.rotation.allEqual(0)||(s.rotate=r.rotation.slice()),r.mirror_uv&&(s.mirrorTexture="u"),r.cem_attach&&(s.attach=!0),r.cem_model&&(s.model=r.cem_model),r.cem_scale&&(s.scale=r.cem_scale);function l(c,d,u,p){if(d.children.length===0)return;let m,_=d.children.filter(v=>v.export&&v.type==="cube"),f=!!_.find(v=>v.mirror_uv!==_[0].mirror_uv),g=p;if(d.texture){let v=Texture.all.find(b=>b.uuid==d.texture);v&&(g=v)}g&&g!=p&&(c.texture=t(g),(!p||g.uv_width!=p.uv_width||g.uv_height!=p.uv_height)&&(c.textureSize=[g.uv_width,g.uv_height])),d.children.forEach(v=>{if(v.export){if(v.type==="cube"){if(v.box_uv)var b=new oneLiner;else var b={};var x=v.size();if(b.coordinates=[v.from[0],v.from[1],v.from[2],x[0],x[1],x[2]],c&&c.part===void 0&&(b.coordinates[0]-=c.translate[0],b.coordinates[1]-=c.translate[1],b.coordinates[2]-=c.translate[2]),v.box_uv)b.textureOffset=v.uv_offset;else for(let E in v.faces)if(v.faces[E].texture!==null){let y=v.faces[E].uv;b[`uv${capitalizeFirstLetter(E)}`]=y}v.inflate&&typeof v.inflate=="number"&&(b.sizeAdd=v.inflate),v.mirror_uv!==d.mirror_uv&&f?(m||(m={invertAxis:"xy",mirrorTexture:"u",boxes:[]},c.submodels||(c.submodels=[]),c.submodels.splice(0,0,m)),m.boxes.push(b)):(c.boxes||(c.boxes=[]),v.mirror_uv!==d.mirror_uv&&(c.mirrorTexture=v.mirror_uv?"u":void 0),c.boxes.push(b))}else if(v.type==="group"){var w={id:v.name,invertAxis:"xy",mirrorTexture:void 0,translate:v.origin.slice()};v.mirror_uv&&(w.mirrorTexture="u"),v.rotation.allEqual(0)||(w.rotate=v.rotation.slice()),l(w,v,u+1,g),u>=1&&(w.translate[0]-=d.origin[0],w.translate[1]-=d.origin[1],w.translate[2]-=d.origin[2]),c.submodels||(c.submodels=[]),c.submodels.push(w)}}})}l(s,r,0,a),r.cem_animations&&r.cem_animations.length&&(s.animations=r.cem_animations),e.models.push(s)}if(i.build_part)o({name:Project.name,origin:[0,0,0],rotation:[0,0,0],children:Outliner.root.filter(r=>r.export)});else for(let r of Outliner.root)r instanceof Group&&r.export&&o(r);return this.dispatchEvent("compile",{entitymodel:e,options:i}),i.raw?e:autoStringify(e)},parse(i,e){this.dispatchEvent("parse",{model:i});let t={};function n(r,s){if(typeof r!="string")return;if(t[r])return t[r];let l=r.replace(/[\\/]/g,osfs),c="";if(l.includes(":")&&([c,l]=l.split(":")),l.match(/^textures/)&&e.includes("optifine")?l=e.replace(/[\\/]optifine[\\/].+$/i,osfs+l):e.includes(osfs)&&(l=e.replace(/[\\/][^\\/]+$/,osfs+l)),l.match(/\.\w{3,4}$/)||(l=l+".png"),c){let u=l.split(/[\\/]/),p=u.indexOf("assets");p>0&&u[p+1]&&(u[p+1]=c),l=u.join(osfs)}let d=new Texture().fromPath(l).add(!1);return c&&!d.namespace&&(d.namespace=c),t[r]=d,s instanceof Array&&d.extend({uv_width:s[0],uv_height:s[1]}),d}typeof i.credit=="string"&&(Project.credit=i.credit),i.textureSize&&(Project.texture_width=parseInt(i.textureSize[0])||16,Project.texture_height=parseInt(i.textureSize[1])||16);let a=n(i.texture,i.textureSize);a&&(a.use_as_default=!0),typeof i.shadowSize=="number"&&(Project.shadow_size=i.shadowSize);let o={uv:[0,0,0,0],texture:null};i.models&&i.models.forEach(function(r){if(typeof r!="object")return;let s=0,l=n(r.texture,r.textureSize),c=0;i._is_jpm||(c=new Group({name:r.part,origin:r.translate,rotation:r.rotate,mirror_uv:r.mirrorTexture&&r.mirrorTexture.includes("u"),cem_animations:r.animations,cem_attach:r.attach,cem_model:r.model,cem_scale:r.scale,texture:l?l.uuid:void 0}),c.origin.V3_multiply(-1),c.init().addTo());function d(u,p,m,_){u.boxes&&u.boxes.length&&u.boxes.forEach(f=>{var g=new Cube({name:f.name||p.name,autouv:0,uv_offset:f.textureOffset,box_uv:!!f.textureOffset,inflate:f.sizeAdd,mirror_uv:p.mirror_uv});if(f.coordinates&&g.extend({from:[f.coordinates[0],f.coordinates[1],f.coordinates[2]],to:[f.coordinates[0]+f.coordinates[3],f.coordinates[1]+f.coordinates[4],f.coordinates[2]+f.coordinates[5]]}),!f.textureOffset&&(f.uvNorth||f.uvEast||f.uvSouth||f.uvWest||f.uvUp||f.uvDown)&&g.extend({box_uv:!1,faces:{north:f.uvNorth?{uv:f.uvNorth}:o,east:f.uvEast?{uv:f.uvEast}:o,south:f.uvSouth?{uv:f.uvSouth}:o,west:f.uvWest?{uv:f.uvWest}:o,up:f.uvUp?{uv:f.uvUp}:o,down:f.uvDown?{uv:f.uvDown}:o}}),p&&(p.parent!=="root"||i._is_jpm))for(var v=0;v<3;v++)g.from[v]+=p.origin[v],g.to[v]+=p.origin[v];g.addTo(p).init()}),u.submodels&&u.submodels.length&&u.submodels.forEach(f=>{m>=1&&f.translate&&(f.translate[0]+=p.origin[0],f.translate[1]+=p.origin[1],f.translate[2]+=p.origin[2]);let g=n(f.texture,f.textureSize),v=new Group({name:f.id||f.comment||`${r.part??"part"}_sub_${s}`,origin:f.translate||(m>=1?u.translate:void 0),rotation:f.rotate,mirror_uv:f.mirrorTexture&&f.mirrorTexture.includes("u"),texture:(g||_)?.uuid});s++,v.addTo(p).init(),d(f,v,m+1,g||_)})}d(r,c,0,l||a)}),Project.box_uv=Cube.all.filter(r=>r.box_uv).length>Cube.all.length/2,this.dispatchEvent("parsed",{model:i}),Canvas.updateAllBones(),Validator.validate()}}),eP=new ModelFormat({id:"optifine_entity",extension:"jem",icon:"icon-format_optifine",category:"minecraft",target:"Minecraft: Java Edition with OptiFine",format_page:{content:[{type:"h3",text:tl("mode.start.format.informations")},{text:`* ${tl("format.optifine_entity.info.optifine_required")} + * ${tl("format.optifine_entity.info.pivots")}`.replace(/\t+/g,"")},{type:"h3",text:tl("mode.start.format.resources")},{text:"* [OptiFine Modeling and Animation Tutorial](https://youtu.be/arj2eim42KI)"}]},model_identifier:!1,box_uv:!0,optional_box_uv:!0,per_group_texture:!0,single_texture_default:!0,per_texture_uv_size:!0,integer_size:!0,bone_rig:!0,centered_grid:!0,texture_folder:!0,pbr:!0,codec:U1});Object.defineProperty(eP,"integer_size",{get:i=>Project.box_uv});U1.format=eP;BARS.defineActions(function(){U1.export_action=new Action("export_optifine_full",{icon:"icon-optifine_file",category:"file",condition:()=>Format==eP,click:function(){U1.export()}})});var ky=new Codec("optifine_part",{name:"OptiFine Part",extension:"jpm",remember:!0,support_partial_export:!0,load_filter:{type:"json",extensions:["jpm"]},compile(i){let e=i??0;i=i?Object.assign({},i):{},i.raw=!0,i.build_part=!0;let t=Codecs.optifine_entity.compile(i),n=t.models[0];return n.credit=t.credit,n.textureSize||(n.textureSize=t.textureSize),n.id==""&&delete n.id,delete n.part,this.dispatchEvent("compile",{model:n,original_options:e}),e.raw?n:autoStringify(n)},parse(i,e){this.dispatchEvent("parse",{model:i}),typeof i.credit=="string"&&(Project.credit=i.credit),i.textureSize&&(Project.texture_width=parseInt(i.textureSize[0])||16,Project.texture_height=parseInt(i.textureSize[1])||16);let t={_is_jpm:!0,invertAxis:"xy",models:[i]};Codecs.optifine_entity.parse(t,e),this.dispatchEvent("parsed",{model:i})}}),tP=new ModelFormat({name:"OptiFine Part",id:"optifine_part",extension:"jpm",icon:"icon-format_optifine",category:"minecraft",show_on_start_screen:!1,model_identifier:!1,box_uv:!0,optional_box_uv:!0,per_group_texture:!0,single_texture_default:!0,per_texture_uv_size:!0,integer_size:!0,bone_rig:!0,centered_grid:!0,texture_folder:!0,pbr:!0,codec:ky});Object.defineProperty(tP,"integer_size",{get:i=>Project.box_uv});ky.format=tP;BARS.defineActions(function(){ky.export_action=new Action("export_optifine_part",{name:"Export OptiFine Part",description:"Export a single part for an OptiFine model",icon:"icon-optifine_file",category:"file",condition:()=>Format==tP,click:function(){ky.export()}}),new Action("import_optifine_part",{icon:"icon-optifine_file",category:"file",condition:()=>Format.id=="optifine_entity"||Format.id=="optifine_part",click:function(){Blockbench.import({resource_id:"model",extensions:["jpm"],type:"JPM Entity Part Model",multiple:!0},function(i){i.forEach(e=>{var t=autoParseJSON(e.content,{file_path:e.path});ky.parse(t,e.path)})})}})});var bt={},soe={none:{Waist:[0,0,0],Head:[0,0,0],Body:[0,0,0],RightArm:[0,0,0],LeftArm:[0,0,0],RightLeg:[0,0,0],LeftLeg:[0,0,0]},natural:{Waist:[0,0,0],Head:[6,-5,0],Body:[0,0,0],RightArm:[10,0,0],LeftArm:[-12,0,0],RightLeg:[-11,0,2],LeftLeg:[10,0,-2]},walking:{Waist:[0,0,0],Head:[-2,0,0],Body:[0,0,0],RightArm:[-35,0,0],LeftArm:[35,0,0],RightLeg:[42,0,2],LeftLeg:[-42,0,-2]},crouching:{Waist:{rotation:[-28,0,0],offset:[0,-1,1]},Head:{rotation:[23,0,0],offset:[0,-3,1]},Body:{rotation:[0,0,0],offset:[0,-1,1]},RightArm:{rotation:[12,0,0],offset:[0,-1,1]},LeftArm:{rotation:[-20,0,0],offset:[0,-1,1]},RightLeg:[-14,0,0],LeftLeg:[14,0,0]},sitting:{Waist:[0,0,0],Head:[5.5,0,0],Body:[0,0,0],RightArm:[36,0,0],LeftArm:[36,0,0],RightLeg:[72,-18,0],LeftLeg:[72,18,0]},jumping:{Waist:[0,0,0],Head:[20,0,0],Body:[0,0,0],RightArm:{rotation:[-175,0,-20],offset:[0,2,0]},LeftArm:{rotation:[-170,0,15],offset:[0,2,0]},RightLeg:{rotation:[-5,0,15],offset:[0,-1,0]},LeftLeg:{rotation:[2.5,0,-10],offset:[0,6,-3.75]}},aiming:{Waist:[0,0,0],Head:[8,-35,0],Body:[-2,0,0],RightArm:{rotation:[97,-17,-2],offset:[-1,1,-1]},LeftArm:[104,-44,-10],RightLeg:{rotation:[2.5,0,0],offset:[0,1,-2]},LeftLeg:[-28,0,0]}},wy=new Codec("skin_model",{name:"Skin Model",remember:!1,compile(i){i===void 0&&(i=0);let e={name:Project.geometry_name.replace(/\./,"_"),texturewidth:Project.texture_width,textureheight:Project.texture_height,external_textures:Texture.all.filter(a=>a.pbr_channel=="color").map(a=>a.path.replace(/\\/g,"/").split("textures/")[1]),eyes:[[5,5],[9,5]],bones:void 0},t=[];return uC().forEach(function(a){if(a.type!=="group")return;let o={name:a.name};o.name=a.name,a.parent.type==="group"&&(o.parent=a.parent.name),o.pivot=a.origin.slice(),o.pivot[0]*=-1,a.rotation.allEqual(0)||(o.rotation=[-a.rotation[0],-a.rotation[1],a.rotation[2]]),a.reset&&(o.reset=!0),a.mirror_uv&&(o.mirror=!0);let r=[];for(let s of a.children)if(s.export&&s instanceof Cube){let l=Codecs.bedrock.compileCube(s,a);r.push(l)}r.length&&(o.cubes=r),t.push(o)}),t.length&&(e.bones=t),this.dispatchEvent("compile",{model:e,options:i}),e},parse(i,e,t,n=!0,a){this.dispatchEvent("parse",{model:i}),Project.texture_width=i.texturewidth||64,Project.texture_height=i.textureheight||64,i.texture_resolution_factor&&(e*=i.texture_resolution_factor),Interface.Panels.skin_pose.inside_vue.pose=Project.skin_pose=n?"natural":"none";let o={},r={};if(i.bones){let l=[];i.bones.forEach(function(c){l.push(c.name)}),i.bones.forEach(function(c,d){let u=new Group({name:c.name,origin:c.pivot,rotation:n&&c.pose?c.pose:c.rotation}).init();u.isOpen=!0,o[c.name]=u,c.pivot&&(u.origin[0]*=-1),u.rotation[0]*=-1,u.rotation[1]*=-1,u.mirror_uv=c.mirror===!0,u.reset=c.reset===!0,u.skin_original_origin=u.origin.slice(),c.cubes&&c.cubes.forEach(function(m){let _=Codecs.bedrock.parseCube(m,u);r[Cube.all.indexOf(_)]=m}),c.children&&c.children.forEach(function(m){m.addTo(u)});let p="root";c.parent&&(o[c.parent]?p=o[c.parent]:i.bones.forEach(function(m){m.name===c.parent&&(m.children&&m.children.length?m.children.push(u):m.children=[u])})),u.addTo(p)})}Cube.all.find(l=>l.box_uv)||(Project.box_uv=!1);let s;typeof t=="object"?s=new Texture().fromFile(t).add(!1):t!=!1&&e&&(s=loe(Project.texture_width*e,Project.texture_height*e,r,i.name,i.eyes,a));for(let l in r)r[l].visibility===!1&&(Cube.all[l].visibility=!1);s&&(s.load_callback=function(){Modes.options.paint.select()}),i.camera_angle&&main_preview.loadAnglePreset(Xa.find(l=>l.id==i.camera_angle)),Canvas.updateAllBones(),Canvas.updateVisibility(),rc(),updateSelection()}});wy.export=null;wy.rebuild=function(i,e){let[t,n]=i.split("."),a=bt[t],o=a.model||(n=="java"?a.model_java:a.model_bedrock)||a.variants[n].model,r=JSON.parse(o);wy.parse(r,void 0,!0,e&&e!=="none"),e&&e!=="none"&&e!=="natural"&&setTimeout(()=>{W5(e)},1)};var O1=new ModelFormat("skin",{icon:"icon-player",category:"minecraft",target:["Minecraft: Java Edition","Minecraft: Bedrock Edition"],format_page:{content:[{type:"h3",text:tl("mode.start.format.informations")},{text:`* ${tl("format.skin.info.skin")} + * ${tl("format.skin.info.model")}`.replace(/\t+/g,"")},{type:"h3",text:tl("mode.start.format.resources")},{text:"* [Skin Design Tutorial](https://youtu.be/xC81Q3HGraE)"}]},can_convert_to:!1,model_identifier:!1,bone_rig:!0,box_uv:!0,centered_grid:!0,single_texture:!0,integer_size:!0,rotate_cubes:!1,edit_mode:!1,pose_mode:!0,codec:wy});O1.new=function(){return nP.show(),!0};function W5(i){let e=soe[i];K5(e),zn.skin_pose.inside_vue.pose=i,Project.skin_pose=i}function K5(i){zn.skin_pose.inside_vue.pose="",Group.all.forEach(e=>{if(!e.skin_original_origin)return;let t=i[e.name]||i[e.name.replace(/\s/g,"")]||{rotation:[0,0,0],offset:[0,0,0]};t instanceof Array&&(t={rotation:t,offset:[0,0,0]});let n=e.skin_original_origin.slice().V3_subtract(e.origin);n.V3_add(t.offset),e.extend({rotation:t.rotation}),e.origin.V3_add(n);let a=e.children.filter(o=>o instanceof Cube);for(let o of a)o.origin.V3_add(n),o.from.V3_add(n),o.to.V3_add(n)}),Canvas.updateView({groups:Group.all,group_aspects:{transform:!0},elements:Outliner.elements,element_aspects:{transform:!0},selection:!0})}function q5(){let i={};for(let e of Group.all){if(!e.skin_original_origin)continue;let t=e.origin.slice().V3_subtract(e.skin_original_origin),n=e.rotation.slice();t.allEqual(0)==!1?i[e.name]={offset:t,rotation:n}:n.allEqual(0)==!1&&(i[e.name]=n)}return i}function loe(i=64,e=64,t,n="name",a,o){let r=new Texture({internal:!0,name:n+".png"}),s=document.createElement("canvas"),l=s.getContext("2d");if(s.width=i,s.height=e,Project.box_uv?Cube.all.forEach((d,u)=>{let p=t[u];(o||!p.layer)&&Sa.paintCubeBoxTemplate(d,r,s,null,p.layer)}):t[0]&&!t[0].layer&&(l.fillStyle=Sa.face_data.up.c1,l.fillRect(0,0,i,e),l.fillStyle=Sa.face_data.up.c2,l.fillRect(1,1,i-2,e-2)),a){let d=s.width/Project.texture_width;l.fillStyle="#cdefff",a.forEach(u=>{l.fillRect(u[0]*d,u[1]*d,(u[2]||2)*d,(u[3]||2)*d)})}let c=s.toDataURL();return r.fromDataURL(c).add(!1),r}var $5={},iP="",nP=new Dialog({title:tl("dialog.skin.title"),id:"skin",form:{model:{label:"dialog.skin.model",type:"select",options:$5},game_edition:{label:"dialog.skin.variant",type:"inline_select",default:"java_edition",options:{java_edition:"Java Edition",bedrock_edition:"Bedrock Edition"},condition(i){return!!bt[i.model].model_bedrock}},variant:{label:"dialog.skin.variant",type:"select",options(){return iP&&bt[iP].variants||{}},condition(i){return!!bt[i.model].variants}},resolution:{label:"dialog.create_texture.resolution",type:"select",value:1,options:{1:"generic.default",16:"16x",32:"32x",64:"64x",128:"128x"}},resolution_warning:{type:"info",text:"dialog.skin.high_res_texture",condition:i=>i.resolution>16&&(i.model=="steve"||i.model=="alex")},texture_source:{label:"dialog.skin.texture_source",type:"select",options:{template:"dialog.skin.texture_source.template",load_texture:navigator.onLine?"dialog.skin.texture_source.load_texture":void 0,upload_texture:"dialog.skin.texture_file"}},texture_file:{label:"dialog.skin.texture_file",condition:i=>i.texture_source=="upload_texture",type:"file",extensions:["png"],readtype:"image",filetype:"PNG",return_as:"file"},pose:{type:"checkbox",label:"dialog.skin.pose",value:!0,condition:i=>!!bt[i.model].pose},layer_template:{type:"checkbox",label:"dialog.skin.layer_template",value:!1}},onFormChange(i){iP=i.model;let e=bt[i.model].variants;if(e){for(let t in e)if(!i.variant||!e[i.variant]){i.variant=t,nP.setFormValues({variant:t},!1);break}}},onConfirm:function(i){if(i.model=="flat_texture")i.texture?Codecs.image.load(i.texture):Formats.image.new();else if(newProject(O1)){let e=bt[i.model],t;e.model_bedrock?t=i.game_edition=="java_edition"?e.model_java:e.model_bedrock:e.variants?t=e.variants[i.variant].model:t=e.model;let n=JSON.parse(t),a=i.resolution;a==1&&(a=n.default_resolution??16);let o;i.texture_source=="upload_texture"?o=i.texture_file:i.texture_source=="load_texture"&&(n.external_textures?navigator.onLine?o=!1:he.showQuickMessage("Failed to load skin texture from Minecraft. Check your internet connection.",3e3):he.showQuickMessage("This skin model does not support loading textures from Minecraft at the moment",3e3)),wy.parse(n,a/16,o,i.pose,i.layer_template),Project.skin_model=i.model,e.model_bedrock?Project.skin_model+="."+(i.game_edition=="java_edition"?"java":"bedrock"):e.variants&&(Project.skin_model+="."+i.variant),i.texture_source=="load_texture"&&navigator.onLine&&my.promptUser("skin").then(async function(r){if(r==!0&&n.external_textures)for(let s of n.external_textures){let l=new Bb,c=`https://raw.githubusercontent.com/Mojang/bedrock-samples/preview/resource_pack/textures/${s}?raw=true`,d;s.endsWith(".tga")?d=fetch(c).then(u=>u.arrayBuffer()).then(u=>l.loadFromTGA(new Uint8Array(u))):d=l.loadFromURL(c),d.then(()=>{let u=l.canvas.toDataURL();new Texture({internal:!0,name:pathToName(s,!0)}).fromDataURL(u).add(!1)})}})}},onCancel(){he.Format=0,Settings.updateSettingsInProfiles()}});O1.setup_dialog=nP;Ba.init("skin_poses","array");BARS.defineActions(function(){new Mode("pose",{icon:"emoji_people",default_tool:"rotate_tool",category:"navigate",condition:()=>Format&&Format.pose_mode}),new Action("toggle_skin_layer",{icon:"layers_clear",category:"edit",condition:{formats:["skin"]},click:function(){let e=[];if(Cube.all.forEach(n=>{n.name.toLowerCase().includes("layer")&&e.push(n)}),!e.length)return;Undo.initEdit({elements:e});let t=!e[0].visibility;e.forEach(n=>{n.visibility=t}),Undo.finishEdit("Toggle skin layer"),Canvas.updateVisibility()}}),new Action("convert_minecraft_skin_variant",{icon:"compare_arrows",category:"edit",condition:{formats:["skin"],method:()=>!!Group.all.find(e=>e.name=="Right Arm")},click(){let e=Cube.all.find(t=>t.name.match(/arm/i)).size(0)==3;new Dialog("convert_minecraft_skin_variant",{title:"action.convert_minecraft_skin_variant",form:{model:{label:"dialog.skin.model",type:"select",value:e?"steve":"alex",options:{steve:bt.steve.display_name,alex:bt.alex.display_name}},adjust_texture:{label:"dialog.convert_skin.adjust_texture",type:"checkbox",value:!0}},onConfirm(t){let n=Group.all.find(r=>r.name=="Right Arm")?.children?.filter(r=>r instanceof Cube)??[],a=Group.all.find(r=>r.name=="Left Arm")?.children?.filter(r=>r instanceof Cube)??[],o=n.concat(a);Undo.initEdit({elements:o});for(let r of n)r.to[0]=t.model=="alex"?7:8;for(let r of a)r.from[0]=t.model=="alex"?-7:-8;if(Canvas.updateView({elements:n.concat(a),element_aspects:{geometry:!0,uv:!0},selection:!0}),Undo.finishEdit("Convert Minecraft skin model"),t.adjust_texture){let r=Texture.all.filter(c=>c.selected||c.multi_selected);if(r.length||(r=[Texture.getDefault()]),!r[0])return;let s=[[40,16],[40,32],[32,48],[48,48]],l;t.model=="alex"?l=[{area:[6,0,10,16],offset:[-1,0]},{area:[9,0,2,4],offset:[-1,0]},{area:[13,4,2,12],offset:[-1,0]}]:l=[{area:[5,0,10,16],offset:[1,0]},{area:[9,0,2,4],offset:[1,0]},{area:[13,4,2,12],offset:[1,0]}],Undo.initEdit({textures:r,bitmap:!0});for(let c of r)c.layers_enabled&&(c.layers_enabled=!1,c.selected_layer=null,c.layers.empty()),c.edit(()=>{let d=c.ctx;for(let u of s){for(let p of l){let m=d.getImageData(u[0]+p.area[0],u[1]+p.area[1],p.area[2],p.area[3]);d.putImageData(m,u[0]+p.area[0]+p.offset[0],u[1]+p.area[1]+p.offset[1])}t.model=="alex"&&(d.clearRect(u[0]+10,u[1]+0,2,4),d.clearRect(u[0]+14,u[1]+4,2,12))}},{no_undo:!0});UVEditor.vue.layer=null,updateSelection(),Undo.finishEdit("Convert Minecraft skin texture")}}}).show()}}),new Action("export_minecraft_skin",{icon:"icon-player",category:"file",condition:()=>Format==O1&&!!Texture.all[0],click:function(){Texture.all[0].save(!0)}});let i=new Toggle("explode_skin_model",{icon:()=>"open_in_full",category:"edit",condition:{formats:["skin"]},default:!1,onChange(e){Undo.initEdit({elements:Cube.all,exploded_view:!e}),Cube.all.forEach(t=>{let n=[t.from[0]+(t.to[0]-t.from[0])/2,t.from[1],t.from[2]+(t.to[2]-t.from[2])/2],a=t.name.toLowerCase().includes("leg")?1:.5;n.V3_multiply(e?a:-a/(1+a)),t.from.V3_add(n),t.to.V3_add(n)}),Project.exploded_view=e,Undo.finishEdit(e?"Explode skin model":"Revert exploding skin model",{elements:Cube.all,exploded_view:e}),Canvas.updateView({elements:Cube.all,element_aspects:{geometry:!0}}),this.setIcon(this.icon)}});he.on("select_project",()=>{i.value=!!Project.exploded_view,i.updateEnabledState()}),new Action("custom_skin_poses",{icon:"format_list_bulleted",category:"view",condition:{formats:["skin"],modes:["pose"]},click(e){new Menu(this.children()).open(e.target)},children(){let e=[],t=Ba.get("skin_poses");return t.forEach((n,a)=>{let o={name:n.name,icon:"accessibility",id:a.toString(),click(){K5(n.data)},children:[{icon:"update",name:"action.custom_skin_poses.update",description:"action.custom_skin_poses.update.desc",click(){n.data=q5(),Ba.save("skin_poses")}},{icon:"delete",name:"generic.delete",click(){t.remove(n),Ba.save("skin_poses")}}]};e.push(o)}),e.push("_","add_custom_skin_pose"),e}}),new Action("add_custom_skin_pose",{icon:"add",category:"view",condition:{formats:["skin"],modes:["pose"]},click(e){he.textPrompt("generic.name","new pose",t=>{let n={name:t,data:q5()};Ba.get("skin_poses").push(n),Ba.save("skin_poses")})}})});Interface.definePanels(function(){new Ml("skin_pose",{icon:"icon-player",condition:{modes:["pose"]},default_position:{slot:"right_bar",float_position:[0,0],float_size:[300,80],height:80,sidebar_index:1},toolbars:[new Toolbar("skin_pose",{children:["custom_skin_poses","add_custom_skin_pose"]})],component:{data(){return{pose:"default"}},methods:{setPose(i){W5(i)}},template:` +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    + `}})});bt.steve={display_name:"Player - Wide",pose:!0,model:`{ + "name": "steve", + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [9, 11], + [13, 11] + ], + "bones": [ + { + "name": "Waist", + "color": 0, + "pivot": [0, 12, 0], + "pose": [0, 0, 0] + }, + { + "name": "Head", + "parent": "Waist", + "color": 1, + "pivot": [0, 24, 0], + "pose": [-6, 5, 0], + "cubes": [ + {"name": "Head", "origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [0, 0]}, + {"name": "Hat Layer", "visibility": false, "origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [32, 0], "inflate": 0.5, "layer": true} + ] + }, + { + "name": "Body", + "parent": "Waist", + "color": 3, + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Body", "origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]}, + {"name": "Body Layer", "visibility": false, "origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 32], "inflate": 0.25, "layer": true} + ] + }, + { + "name": "Right Arm", + "parent": "Waist", + "color": 5, + "pivot": [-5, 22, 0], + "pose": [-10, 0, 0], + "cubes": [ + {"name": "Right Arm", "origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 16]}, + {"name": "Right Arm Layer", "visibility": false, "origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 32], "inflate": 0.25, "layer": true} + ] + }, + { + "name": "Left Arm", + "parent": "Waist", + "color": 0, + "pivot": [5, 22, 0], + "pose": [12, 0, 0], + "cubes": [ + {"name": "Left Arm", "origin": [4, 12, -2], "size": [4, 12, 4], "uv": [32, 48]}, + {"name": "Left Arm Layer", "visibility": false, "origin": [4, 12, -2], "size": [4, 12, 4], "uv": [48, 48], "inflate": 0.25, "layer": true} + ] + }, + { + "name": "Right Leg", + "color": 6, + "pivot": [-1.9, 12, 0], + "pose": [11, 0, 2], + "cubes": [ + {"name": "Right Leg", "origin": [-3.9, 0, -2], "size": [4, 12, 4], "uv": [0, 16]}, + {"name": "Right Leg Layer", "visibility": false, "origin": [-3.9, 0, -2], "size": [4, 12, 4], "uv": [0, 32], "inflate": 0.25, "layer": true} + ] + }, + { + "name": "Left Leg", + "color": 7, + "pivot": [1.9, 12, 0], + "pose": [-10, 0, -2], + "cubes": [ + {"name": "Left Leg", "origin": [-0.1, 0, -2], "size": [4, 12, 4], "uv": [16, 48]}, + {"name": "Left Leg Layer", "visibility": false, "origin": [-0.1, 0, -2], "size": [4, 12, 4], "uv": [0, 48], "inflate": 0.25, "layer": true} + ] + } + ] + }`};bt.alex={display_name:"Player - Slim",pose:!0,model_java:`{ + "name": "alex", + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [9, 11], + [13, 11] + ], + "bones": [ + { + "name": "Waist", + "color": 0, + "pivot": [0, 12, 0], + "pose": [0, 0, 0] + }, + { + "name": "Head", + "parent": "Waist", + "color": 1, + "pivot": [0, 24, 0], + "pose": [-6, 5, 0], + "cubes": [ + {"name": "Head", "origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [0, 0]}, + {"name": "Hat Layer", "visibility": false, "origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [32, 0], "inflate": 0.5, "layer": true} + ] + }, + { + "name": "Body", + "parent": "Waist", + "color": 3, + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Body", "origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]}, + {"name": "Body Layer", "visibility": false, "origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 32], "inflate": 0.25, "layer": true} + ] + }, + { + "name": "Right Arm", + "parent": "Waist", + "color": 5, + "pivot": [-5, 22, 0], + "pose": [-10, 0, 0], + "cubes": [ + {"name": "Right Arm", "origin": [-7, 12, -2], "size": [3, 12, 4], "uv": [40, 16]}, + {"name": "Right Arm Layer", "visibility": false, "origin": [-7, 12, -2], "size": [3, 12, 4], "uv": [40, 32], "inflate": 0.25, "layer": true} + ] + }, + { + "name": "Left Arm", + "parent": "Waist", + "color": 0, + "pivot": [5, 22, 0], + "pose": [12, 0, 0], + "cubes": [ + {"name": "Left Arm", "origin": [4, 12, -2], "size": [3, 12, 4], "uv": [32, 48]}, + {"name": "Left Arm Layer", "visibility": false, "origin": [4, 12, -2], "size": [3, 12, 4], "uv": [48, 48], "inflate": 0.25, "layer": true} + ] + }, + { + "name": "Right Leg", + "color": 6, + "pivot": [-1.9, 12, 0], + "pose": [11, 0, 2], + "cubes": [ + {"name": "Right Leg", "origin": [-3.9, 0, -2], "size": [4, 12, 4], "uv": [0, 16]}, + {"name": "Right Leg Layer", "visibility": false, "origin": [-3.9, 0, -2], "size": [4, 12, 4], "uv": [0, 32], "inflate": 0.25, "layer": true} + ] + }, + { + "name": "Left Leg", + "color": 7, + "pivot": [1.9, 12, 0], + "pose": [-10, 0, -2], + "cubes": [ + {"name": "Left Leg", "origin": [-0.1, 0, -2], "size": [4, 12, 4], "uv": [16, 48]}, + {"name": "Left Leg Layer", "visibility": false, "origin": [-0.1, 0, -2], "size": [4, 12, 4], "uv": [0, 48], "inflate": 0.25, "layer": true} + ] + } + ] + }`,model_bedrock:`{ + "name": "alex", + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [9, 11], + [13, 11] + ], + "bones": [ + { + "name": "Waist", + "color": 0, + "pivot": [0, 12, 0], + "pose": [0, 0, 0] + }, + { + "name": "Head", + "parent": "Waist", + "color": 1, + "pivot": [0, 24, 0], + "pose": [-6, 5, 0], + "cubes": [ + {"name": "Head", "origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [0, 0]}, + {"name": "Hat Layer", "visibility": false, "origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [32, 0], "inflate": 0.5, "layer": true} + ] + }, + { + "name": "Body", + "parent": "Waist", + "color": 3, + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Body", "origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]}, + {"name": "Body Layer", "visibility": false, "origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 32], "inflate": 0.25, "layer": true} + ] + }, + { + "name": "Right Arm", + "parent": "Waist", + "color": 5, + "pivot": [-5, 21.5, 0], + "pose": [-10, 0, 0], + "cubes": [ + {"name": "Right Arm", "origin": [-7, 11.5, -2], "size": [3, 12, 4], "uv": [40, 16]}, + {"name": "Right Arm Layer", "visibility": false, "origin": [-7, 11.5, -2], "size": [3, 12, 4], "uv": [40, 32], "inflate": 0.25, "layer": true} + ] + }, + { + "name": "Left Arm", + "parent": "Waist", + "color": 0, + "pivot": [5, 21.5, 0], + "pose": [12, 0, 0], + "cubes": [ + {"name": "Left Arm", "origin": [4, 11.5, -2], "size": [3, 12, 4], "uv": [32, 48]}, + {"name": "Left Arm Layer", "visibility": false, "origin": [4, 11.5, -2], "size": [3, 12, 4], "uv": [48, 48], "inflate": 0.25, "layer": true} + ] + }, + { + "name": "Right Leg", + "color": 6, + "pivot": [-1.9, 12, 0], + "pose": [11, 0, 2], + "cubes": [ + {"name": "Right Leg", "origin": [-3.9, 0, -2], "size": [4, 12, 4], "uv": [0, 16]}, + {"name": "Right Leg Layer", "visibility": false, "origin": [-3.9, 0, -2], "size": [4, 12, 4], "uv": [0, 32], "inflate": 0.25, "layer": true} + ] + }, + { + "name": "Left Leg", + "color": 7, + "pivot": [1.9, 12, 0], + "pose": [-10, 0, -2], + "cubes": [ + {"name": "Left Leg", "origin": [-0.1, 0, -2], "size": [4, 12, 4], "uv": [16, 48]}, + {"name": "Left Leg Layer", "visibility": false, "origin": [-0.1, 0, -2], "size": [4, 12, 4], "uv": [0, 48], "inflate": 0.25, "layer": true} + ] + } + ] + }`};bt.flat_texture={display_name:"Texture",model:`{ + "name": "flat_texture", + "camera_angle": "top", + "texturewidth": 16, + "textureheight": 16, + "bones": [ + { + "name": "block", + "pivot": [0, 0, 0], + "cubes": [ + { + "origin": [-8, 0, -8], + "size": [16, 1, 16], + "layer": true, + "uv": { + "up": {"uv": [16, 16], "uv_size": [-16, -16]} + } + } + ] + } + ] + }`};bt.block={display_name:"Block",model:`{ + "name": "block", + "texturewidth": 16, + "textureheight": 16, + "bones": [ + { + "name": "block", + "pivot": [0, 0, 0], + "cubes": [ + { + "origin": [-8, 0, -8], + "size": [16, 16, 16], + "uv": { + "north": {"uv": [0, 0], "uv_size": [16, 16]}, + "east": {"uv": [0, 0], "uv_size": [16, 16]}, + "south": {"uv": [0, 0], "uv_size": [16, 16]}, + "west": {"uv": [0, 0], "uv_size": [16, 16]}, + "up": {"uv": [16, 16], "uv_size": [-16, -16]}, + "down": {"uv": [16, 16], "uv_size": [-16, -16]} + } + } + ] + } + ] + }`};bt.allay={display_name:"Allay",model:`{ + "name": "allay", + "external_textures": ["entity/allay/allay.png"], + "texturewidth": 32, + "textureheight": 32, + "eyes": [ + [6, 7, 1, 2], + [8, 7, 1, 2] + ], + "bones": [ + { + "name": "root", + "pivot": [0, 0, 0] + }, + { + "name": "head", + "parent": "root", + "pivot": [0, 4, 0], + "cubes": [ + {"origin": [-2.5, 4.01, -2.5], "size": [5, 5, 5], "uv": [0, 0]} + ] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 4, 0], + "cubes": [ + {"origin": [-1.5, 0, -1], "size": [3, 4, 2], "uv": [0, 10]}, + {"origin": [-1.5, -1, -1], "size": [3, 5, 2], "inflate": -0.2, "uv": [0, 16]} + ] + }, + { + "name": "rightItem", + "parent": "body", + "pivot": [0, -1, -2], + "rotation": [-80, 0, 0] + }, + { + "name": "right_arm", + "parent": "body", + "pivot": [-1.75, 3.5, 0], + "cubes": [ + {"origin": [-2.5, 0, -1], "size": [1, 4, 2], "uv": [23, 0]} + ] + }, + { + "name": "left_arm", + "parent": "body", + "pivot": [1.75, 3.5, 0], + "cubes": [ + {"origin": [1.5, 0, -1], "size": [1, 4, 2], "uv": [23, 6]} + ] + }, + { + "name": "left_wing", + "parent": "body", + "pivot": [0.5, 3, 1], + "cubes": [ + {"origin": [0.5, -2, 1], "size": [0, 5, 8], "uv": [16, 14], "mirror": true} + ] + }, + { + "name": "right_wing", + "parent": "body", + "pivot": [-0.5, 3, 1], + "cubes": [ + {"origin": [-0.5, -2, 1], "size": [0, 5, 8], "uv": [16, 14]} + ] + } + ] + }`};bt.armadillo={display_name:"Armadillo",model:`{ + "name": "armadillo", + "external_textures": ["entity/armadillo.png"], + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [44, 19, 1, 1], + [48, 19, 1, 1] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 3, 4], + "cubes": [ + {"origin": [-4, 2, -6], "size": [8, 8, 12], "inflate": 0.3, "uv": [0, 20]}, + {"origin": [-4, 2, -6], "size": [8, 8, 12], "uv": [0, 40]} + ] + }, + { + "name": "tail", + "parent": "body", + "pivot": [0, 6, 5], + "rotation": [29, 0, 0], + "cubes": [ + {"origin": [-0.5, 0.08645, 5.09326], "size": [1, 6, 1], "uv": [44, 53]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 5, -7], + "cubes": [ + {"origin": [-1.5, 1, -8], "size": [3, 5, 2], "pivot": [0, 5, -7], "rotation": [-22.5, 0, 0], "uv": [43, 15]} + ] + }, + { + "name": "right_ear", + "parent": "head", + "pivot": [-1, 6, -7], + "cubes": [ + {"origin": [-3.5, 4, -7.6], "size": [2, 5, 0], "pivot": [-1.5, 6, -7.6], "rotation": [10.80524, -22.13991, -4.11405], "uv": [43, 10]} + ] + }, + { + "name": "left_ear", + "parent": "head", + "pivot": [1, 7, -7], + "cubes": [ + {"origin": [1.5, 4, -7.6], "size": [2, 5, 0], "pivot": [1.5, 6, -7.6], "rotation": [10.80524, 22.13991, 4.11405], "uv": [47, 10]} + ] + }, + { + "name": "right_hind_leg", + "pivot": [-2, 3, 4], + "cubes": [ + {"origin": [-3, 0, 3], "size": [2, 3, 2], "uv": [51, 31]} + ] + }, + { + "name": "left_hind_leg", + "pivot": [2, 3, 4], + "cubes": [ + {"origin": [1, 0, 3], "size": [2, 3, 2], "uv": [42, 31]} + ] + }, + { + "name": "right_front_leg", + "pivot": [-2, 3, -4], + "cubes": [ + {"origin": [-3, 0, -5], "size": [2, 3, 2], "uv": [51, 43]} + ] + }, + { + "name": "left_front_leg", + "pivot": [2, 3, -4], + "cubes": [ + {"origin": [1, 0, -5], "size": [2, 3, 2], "uv": [42, 43]} + ] + }, + { + "name": "body_rolled_up", + "pivot": [0, 0, 27], + "cubes": [ + {"origin": [-5, 0, 21], "size": [10, 10, 10], "uv": [0, 0]} + ] + } + ] + }`};bt.armadillo_baby={display_name:"Armadillo Baby",model:`{ + "name": "armadillo_baby", + "texturewidth": 64, + "textureheight": 64, + "external_textures": ["entity/armadillo/armadillo_baby.png"], + "eyes": [ + [22, 21, 1, 1], + [27, 21, 1, 1] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 4, 0.5], + "cubes": [ + {"origin": [-2.5, 2, -3], "size": [5, 4, 7], "inflate": 0.3, "uv": [0, 0]}, + {"origin": [-2.5, 2, -2.5], "size": [5, 4, 6], "uv": [0, 11]} + ] + }, + { + "name": "tail", + "parent": "body", + "pivot": [0, 4, 3.9], + "cubes": [ + {"origin": [-0.5, 2, 2.9], "size": [1, 1, 4], "pivot": [0, 2.5, 4.9], "rotation": [-60, 0, 0], "uv": [22, 11]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 4, -2.7], + "cubes": [ + {"origin": [-1, 4, -6.7], "size": [2, 2, 4], "pivot": [1, 4, -2.7], "rotation": [42.5, 0, 0], "uv": [20, 17]} + ] + }, + { + "name": "right_ear", + "parent": "head", + "pivot": [-1, 5, -4.75], + "rotation": [25, -6.5, -3], + "cubes": [ + {"origin": [-2.9, 4, -4.5], "size": [2, 3, 0], "uv": [28, 8], "mirror": true} + ] + }, + { + "name": "left_ear", + "parent": "head", + "pivot": [0.9, 5.1957, -4.75], + "rotation": [25, 6.5, 3], + "cubes": [ + {"origin": [0.9, 4, -4.5], "size": [2, 3, 0], "uv": [28, 8]} + ] + }, + { + "name": "right_hind_leg", + "pivot": [-1.5, 2, 2.5], + "cubes": [ + {"origin": [-2.5, 0, 1.5], "size": [2, 2, 2], "uv": [20, 27], "mirror": true} + ] + }, + { + "name": "left_hind_leg", + "pivot": [1.5, 2, 2.5], + "cubes": [ + {"origin": [0.5, 0, 1.5], "size": [2, 2, 2], "uv": [24, 4]} + ] + }, + { + "name": "right_front_leg", + "pivot": [1.5, 2, -1.5], + "cubes": [ + {"origin": [0.5, 0, -2.5], "size": [2, 2, 2], "uv": [20, 23]} + ] + }, + { + "name": "left_front_leg", + "pivot": [-1.5, 2, -1.5], + "cubes": [ + {"origin": [-2.5, 0, -2.5], "size": [2, 2, 2], "uv": [24, 0], "mirror": true} + ] + }, + { + "name": "body_rolled_up", + "pivot": [0, 3.3, 16.5], + "cubes": [ + {"origin": [-3, 0.3, 13.5], "size": [6, 6, 6], "inflate": 0.3, "uv": [0, 25]} + ] + } + ] + }`};bt.armor_main={display_name:"Armor (Main)",pose:!0,model:`{ + "name": "armor_main", + "external_textures": ["models/armor/iron_1.png"], + "texturewidth": 64, + "textureheight": 32, + "bones": [ + { + "name": "Head", + "color": 1, + "pivot": [0, 24, 0], + "pose": [-6, 5, 0], + "cubes": [ + {"name": "Helmet", "origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [0, 0], "inflate": 1}, + {"name": "Hat Layer", "visibility": false, "origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [32, 0], "inflate": 1.5, "layer": true} + ] + }, + { + "name": "Body", + "color": 3, + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Chestplate", "origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16], "inflate": 1.01} + ] + }, + { + "name": "Right Arm", + "color": 5, + "pivot": [-5, 22, 0], + "pose": [-10, 0, 0], + "cubes": [ + {"name": "Right Arm Armor", "origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 16], "inflate": 1} + ] + }, + { + "name": "Left Arm", + "color": 0, + "pivot": [5, 22, 0], + "pose": [12, 0, 0], + "cubes": [ + {"name": "Left Arm Armor", "origin": [4, 12, -2], "size": [4, 12, 4], "uv": [40, 16], "inflate": 1, "mirror": true} + ] + }, + { + "name": "Right Leg", + "color": 6, + "pivot": [-1.9, 12, 0], + "pose": [11, 0, 2], + "cubes": [ + {"name": "Right Boot", "origin": [-3.9, 0, -2], "size": [4, 12, 4], "uv": [0, 16], "inflate": 1.0} + ] + }, + { + "name": "Left Leg", + "color": 7, + "pivot": [1.9, 12, 0], + "pose": [-10, 0, -2], + "cubes": [ + {"name": "Left Boot", "origin": [-0.1, 0, -2], "size": [4, 12, 4], "uv": [0, 16], "inflate": 1.0, "mirror": true} + ] + } + ] + }`};bt.armor_leggings={display_name:"Armor (Leggings)",pose:!0,model:`{ + "name": "armor_leggings", + "external_textures": ["models/armor/iron_2.png"], + "texturewidth": 64, + "textureheight": 32, + "bones": [ + { + "name": "Body", + "color": 3, + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Belt", "origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16], "inflate": 0.51} + ] + }, + { + "name": "Right Leg", + "color": 6, + "pivot": [-1.9, 12, 0], + "pose": [11, 0, 2], + "cubes": [ + {"name": "Right Leg Armor", "origin": [-3.9, 0, -2], "size": [4, 12, 4], "uv": [0, 16], "inflate": 0.5} + ] + }, + { + "name": "Left Leg", + "color": 7, + "pivot": [1.9, 12, 0], + "pose": [-10, 0, -2], + "cubes": [ + {"name": "Left Leg Armor", "origin": [-0.1, 0, -2], "size": [4, 12, 4], "uv": [0, 16], "inflate": 0.5, "mirror": true} + ] + } + ] + }`};bt.armor_baby={display_name:"Armor (Baby)",pose:!0,model:`{ + "name": "humanoid_baby.armor.boots", + "texturewidth": 64, + "textureheight": 64, + "external_textures": ["models/armor/diamond_baby.png"], + "bones": [ + { + "name": "Body", + "pivot": [0, 6, -1], + "cubes": [ + {"origin": [-3, 4, -1], "size": [6, 5, 3], "inflate": 0.3, "uv": [0, 17], "name": "Body Chestplate"}, + {"origin": [-3, 4, -1], "size": [6, 5, 3], "inflate": 0.27, "uv": [0, 33], "name": "Body Legging"} + ] + }, + { + "name": "Head", + "pivot": [0, 9, 0.5], + "cubes": [ + {"origin": [-4.5, 9, -4], "size": [9, 8, 8.3], "inflate": 0.3, "uv": [0, 0]} + ] + }, + { + "name": "LeftLeg", + "pivot": [1.5, 4, 0.5], + "cubes": [ + {"origin": [0, 0.2, -1.002], "size": [3, 1, 3], "inflate": 0.5, "uv": [0, 29], "name": "LeftLeg Boot"}, + {"origin": [0, 0.2, -1.002], "size": [3, 4, 3], "inflate": 0.3, "uv": [18, 24], "name": "LeftLeg Legging"} + ] + }, + { + "name": "RightLeg", + "pivot": [-1.5, 4, 0.5], + "cubes": [ + {"origin": [-3, 0.21, -1.004], "size": [3, 1, 3], "inflate": 0.5, "uv": [0, 25], "mirror": true, "name": "RightLeg Boot"}, + {"origin": [-3, 0.2, -1], "size": [3, 4, 3], "inflate": 0.3, "uv": [18, 17], "name": "RightLeg Legging"} + ] + }, + { + "name": "RightArm", + "pivot": [-4, 9, 0.5], + "cubes": [ + {"origin": [-5, 4.3, -0.97], "size": [2, 5, 3], "inflate": 0.3, "uv": [30, 25]} + ] + }, + { + "name": "LeftArm", + "pivot": [4, 9, 0.5], + "cubes": [ + {"origin": [3, 4.3, -1.03], "size": [2, 5, 3], "inflate": 0.3, "uv": [30, 17]} + ] + } + ] + }`};bt.armor_stand={display_name:"Armor Stand",model:`{ + "name": "armor_stand", + "external_textures": ["entity/armor_stand.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "Baseplate", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "baseplate", "origin": [-6, 0, -6], "size": [12, 1, 12], "uv": [0, 32]} + ] + }, + { + "name": "Waist", + "parent": "baseplate", + "pivot": [0, 12, 0] + }, + { + "name": "Body", + "parent": "waist", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "body", "origin": [-6, 21, -1.5], "size": [12, 3, 3], "uv": [0, 26]}, + {"name": "body", "origin": [-3, 14, -1], "size": [2, 7, 2], "uv": [16, 0]}, + {"name": "body", "origin": [1, 14, -1], "size": [2, 7, 2], "uv": [48, 16]}, + {"name": "body", "origin": [-4, 12, -1], "size": [8, 2, 2], "uv": [0, 48]} + ] + }, + { + "name": "Head", + "parent": "body", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "head", "origin": [-1, 24, -1], "size": [2, 7, 2], "uv": [0, 0]} + ] + }, + { + "name": "LeftArm", + "parent": "body", + "pivot": [5, 22, 0], + "mirror": true, + "cubes": [ + {"name": "LeftArm", "origin": [5, 12, -1], "size": [2, 12, 2], "uv": [32, 16]} + ] + }, + { + "name": "LeftLeg", + "parent": "body", + "pivot": [1.9, 12, 0], + "mirror": true, + "cubes": [ + {"name": "LeftLeg", "origin": [0.9, 1, -1], "size": [2, 11, 2], "uv": [40, 16]} + ] + }, + { + "name": "RightArm", + "parent": "body", + "pivot": [-5, 22, 0], + "cubes": [ + {"name": "RightArm", "origin": [-7, 12, -1], "size": [2, 12, 2], "uv": [24, 0]} + ] + }, + { + "name": "RightLeg", + "parent": "body", + "pivot": [-1.9, 12, 0], + "cubes": [ + {"name": "RightLeg", "origin": [-2.9, 1, -1], "size": [2, 11, 2], "uv": [8, 0]} + ] + } + ] + }`};bt.axolotl={display_name:"Axolotl",model:`{ + "name": "axolotl", + "external_textures": ["entity/axolotl/axolotl_lucy.png"], + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [4, 8, 2, 1], + [12, 8, 2, 1] + ], + "bones": [ + { + "name": "root", + "pivot": [0, -4, 0] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 3, 4], + "cubes": [ + {"origin": [-4, 0, -5], "size": [8, 4, 10], "uv": [0, 11]}, + {"origin": [0, 0, -5], "size": [0, 5, 9], "uv": [2, 17]} + ] + }, + { + "name": "right_arm", + "parent": "body", + "pivot": [-4, 1, -4], + "rotation": [0, -90, 90], + "cubes": [ + {"origin": [-6, -4, -4], "size": [3, 5, 0], "uv": [2, 13]} + ] + }, + { + "name": "right_leg", + "parent": "body", + "pivot": [-4, 1, 4], + "rotation": [0, 90, 90], + "cubes": [ + {"origin": [-5, -4, 4], "size": [3, 5, 0], "uv": [2, 13]} + ] + }, + { + "name": "left_arm", + "parent": "body", + "pivot": [4, 1, -4], + "rotation": [0, 90, -90], + "cubes": [ + {"origin": [3, -4, -4], "size": [3, 5, 0], "uv": [2, 13]} + ] + }, + { + "name": "left_leg", + "parent": "body", + "pivot": [4, 1, 4], + "rotation": [0, -90, -90], + "cubes": [ + {"origin": [2, -4, 4], "size": [3, 5, 0], "uv": [2, 13]} + ] + }, + { + "name": "tail", + "parent": "body", + "pivot": [0, 2, 4], + "cubes": [ + {"origin": [0, 0, 4], "size": [0, 5, 12], "uv": [2, 19]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 2, -5], + "reset": true, + "cubes": [ + {"origin": [-4, 0, -10], "size": [8, 5, 5], "uv": [0, 1]} + ] + }, + { + "name": "left_gills", + "parent": "head", + "pivot": [4, 2, -6], + "cubes": [ + {"origin": [4, 0, -6], "size": [3, 7, 0], "uv": [11, 40]} + ] + }, + { + "name": "right_gills", + "parent": "head", + "pivot": [-4, 2, -6], + "cubes": [ + {"origin": [-7, 0, -6], "size": [3, 7, 0], "uv": [0, 40]} + ] + }, + { + "name": "top_gills", + "parent": "head", + "pivot": [0, 5, -6], + "cubes": [ + {"origin": [-4, 5, -6], "size": [8, 3, 0], "uv": [3, 37]} + ] + } + ] + }`};bt.axolotl_baby={display_name:"Axolotl Baby",model:`{ + "name": "axolotl_baby", + "texturewidth": 32, + "textureheight": 32, + "external_textures": ["entity/axolotl/axolotl_lucy_baby.png"], + "eyes": [ + [3, 13, 2, 1], + [9, 13, 2, 1] + ], + "bones": [ + { + "name": "root", + "pivot": [0, 0, 0] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 1.25, 1.75], + "cubes": [ + {"origin": [-2, 0, -1], "size": [4, 2, 6], "uv": [0, 0]}, + {"origin": [0, 0, -1], "size": [0, 3, 5], "uv": [0, 12]} + ] + }, + { + "name": "right_arm", + "parent": "body", + "pivot": [-2, 1, 0.5], + "cubes": [ + {"origin": [-5, 1, 0], "size": [3, 0, 1], "uv": [20, 16]} + ] + }, + { + "name": "right_leg", + "parent": "body", + "pivot": [-2, 1, 3.5], + "rotation": [0, 90, 90], + "cubes": [ + {"origin": [-2, 1, 3], "size": [3, 0, 1], "pivot": [-2, 1, 3.5], "rotation": [-90, 0, 90], "uv": [20, 14]} + ] + }, + { + "name": "left_arm", + "parent": "body", + "pivot": [2, 1, 0.5], + "cubes": [ + {"origin": [2, 1, 0], "size": [3, 0, 1], "uv": [20, 13]} + ] + }, + { + "name": "left_leg", + "parent": "body", + "pivot": [2, 1, 3.5], + "cubes": [ + {"origin": [2, 1, 3], "size": [3, 0, 1], "uv": [20, 14]} + ] + }, + { + "name": "tail", + "parent": "body", + "pivot": [0, 1.5, 5], + "cubes": [ + {"origin": [0, 0, 4], "size": [0, 3, 8], "uv": [10, 9]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 1, -1], + "cubes": [ + {"origin": [-3, 0, -5], "size": [6, 3, 4], "uv": [0, 8]} + ] + }, + { + "name": "left_gills", + "parent": "head", + "pivot": [3, 1.5, -3], + "cubes": [ + {"origin": [3, 0, -3], "size": [3, 5, 0], "uv": [20, 8]} + ] + }, + { + "name": "right_gills", + "parent": "head", + "pivot": [-3, 1.5, -3], + "cubes": [ + {"origin": [-6, 0, -3], "size": [3, 5, 0], "uv": [20, 3]} + ] + }, + { + "name": "top_gills", + "parent": "head", + "pivot": [0, 3, -3], + "cubes": [ + {"origin": [-3, 3, -3], "size": [6, 3, 0], "uv": [20, 0]} + ] + } + ] + }`};bt.bamboo_raft={display_name:"Bamboo Raft",model:`{ + "name": "", + "external_textures": ["entity/boat/bamboo_raft.png"], + "texturewidth": 128, + "textureheight": 64, + "bones": [ + { + "name": "raft", + "pivot": [0, 1, -2], + "rotation": [90, -90, 0], + "cubes": [ + {"origin": [-14, -11, 1], "size": [28, 20, 4], "uv": [0, 0]}, + {"origin": [-14, -9, -3], "size": [28, 16, 4], "uv": [0, 0]} + ] + }, + { + "name": "paddle_left", + "pivot": [-11.5, 12, 1], + "rotation": [-50, -75, 0], + "cubes": [ + {"origin": [-12.5, 11, -4.5], "size": [2, 2, 18], "uv": [0, 24]}, + {"origin": [-12.51, 10, 8.5], "size": [1, 6, 7], "uv": [0, 24]} + ] + }, + { + "name": "paddle_right", + "pivot": [7.5, 12, 0], + "rotation": [-50, 75, 0], + "cubes": [ + {"origin": [5.5, 11, -5.5], "size": [2, 2, 18], "uv": [40, 24]}, + {"origin": [6.51, 10, 7.5], "size": [1, 6, 7], "uv": [40, 24]} + ] + } + ] + }`};bt.banner={display_name:"Banner",model:`{ + "name": "banner_base", + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "stand", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-10, 42, 0], "size": [20, 2, 2], "uv": [0, 42]}, + {"origin": [-1, 0, 0], "size": [2, 42, 2], "uv": [44, 0]} + ] + }, + { + "name": "banner", + "parent": "stand", + "pivot": [0, 44, 0], + "rotation": [-2, 0, 0], + "cubes": [ + {"origin": [-10, 4, -1], "size": [20, 40, 1], "uv": [0, 0]} + ] + } + ] + }`};bt.bat={display_name:"Bat",pose:!0,variants:{new:{name:"New",model:`{ + "name": "bat_v2", + "external_textures": ["entity/bat_v2.png"], + "texturewidth": 32, + "textureheight": 32, + "eyes": [ + [1, 10, 2, 1], + [5, 10, 2, 1] + ], + "bones": [ + { + "name": "Head", + "pivot": [0, 7, 0], + "cubes": [ + {"origin": [-2, 7, -1], "size": [4, 3, 2], "uv": [0, 7]} + ] + }, + { + "name": "rightEar", + "parent": "Head", + "pivot": [-1.5, 9, 0], + "cubes": [ + {"origin": [-4, 8, 0], "size": [3, 5, 0], "uv": [1, 15]} + ] + }, + { + "name": "leftEar", + "parent": "Head", + "pivot": [1.1, 10, 0], + "cubes": [ + {"origin": [1, 8, 0], "size": [3, 5, 0], "uv": [8, 15]} + ] + }, + { + "name": "body", + "pivot": [0, 7, 0], + "cubes": [ + {"origin": [-1.5, 2, -1], "size": [3, 5, 2], "uv": [0, 0]} + ] + }, + { + "name": "feet", + "parent": "body", + "pivot": [0, 2, 0], + "cubes": [ + {"origin": [-1.5, 0, 0], "size": [3, 2, 0], "uv": [16, 16]} + ] + }, + { + "name": "rightWing", + "parent": "body", + "pivot": [-1.5, 7, 0], + "cubes": [ + {"origin": [-3.5, 2, 0], "size": [2, 7, 0], "uv": [12, 0]} + ] + }, + { + "name": "rightWingTip", + "parent": "rightWing", + "pivot": [-3.5, 7, 0], + "cubes": [ + {"origin": [-9.5, 1, 0], "size": [6, 8, 0], "uv": [16, 0]} + ] + }, + { + "name": "leftWing", + "parent": "body", + "pivot": [1.5, 7, 0], + "cubes": [ + {"origin": [1.5, 2, 0], "size": [2, 7, 0], "uv": [12, 7]} + ] + }, + { + "name": "leftWingTip", + "parent": "leftWing", + "pivot": [3.5, 7, 0], + "cubes": [ + {"origin": [3.5, 1, 0], "size": [6, 8, 0], "uv": [16, 8]} + ] + } + ] + }`},old:{name:"Classic",model:`{ + "name": "bat", + "external_textures": ["entity/bat.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "Head", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Head", "origin": [-3, 21, -3], "size": [6, 6, 6], "uv": [0, 0]} + ] + }, + { + "name": "rightEar", + "parent": "Head", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "rightEar", "origin": [-4, 26, -2], "size": [3, 4, 1], "uv": [24, 0]} + ] + }, + { + "name": "leftEar", + "parent": "Head", + "pivot": [0, 24, 0], + "mirror": true, + "cubes": [ + {"name": "leftEar", "origin": [1, 26, -2], "size": [3, 4, 1], "uv": [24, 0]} + ] + }, + { + "name": "body", + "pivot": [0, 24, 0], + "rotation": [30, 0, 0], + "cubes": [ + {"name": "body", "origin": [-3, 8, -3], "size": [6, 12, 6], "uv": [0, 16]}, + {"name": "body", "origin": [-5, -8, 0], "size": [10, 16, 1], "uv": [0, 34]} + ] + }, + { + "name": "rightWing", + "parent": "body", + "pivot": [0, 24, 0], + "pose": [0, -10, 0], + "cubes": [ + {"name": "rightWing", "origin": [-12, 7, 1.5], "size": [10, 16, 1], "uv": [42, 0]} + ] + }, + { + "name": "rightWingTip", + "parent": "rightWing", + "pivot": [-12, 23, 1.5], + "pose": [0, -15, 0], + "cubes": [ + {"name": "rightWingTip", "origin": [-20, 10, 1.5], "size": [8, 12, 1], "uv": [24, 16]} + ] + }, + { + "name": "leftWing", + "parent": "body", + "pivot": [0, 24, 0], + "pose": [0, 10, 0], + "mirror": true, + "cubes": [ + {"name": "leftWing", "origin": [2, 7, 1.5], "size": [10, 16, 1], "uv": [42, 0]} + ] + }, + { + "name": "leftWingTip", + "parent": "leftWing", + "pivot": [12, 23, 1.5], + "pose": [0, 15, 0], + "mirror": true, + "cubes": [ + {"name": "leftWingTip", "origin": [12, 10, 1.5], "size": [8, 12, 1], "uv": [24, 16]} + ] + } + ] + }`}}};bt.bed={display_name:"Bed",model_bedrock:`{ + "name": "bed", + "external_textures": ["entity/bed/white.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "bed", + "pivot": [0, 0, 0], + "rotation": [-90, 0, 0], + "cubes": [ + {"origin": [-8, -16, -9], "size": [16, 32, 6], "uv": [0, 0]}, + {"origin": [-8, -16, -3], "size": [3, 3, 3], "uv": [0, 44]}, + {"origin": [5, 13, -3], "size": [3, 3, 3], "uv": [12, 38]}, + {"origin": [-8, 13, -3], "size": [3, 3, 3], "uv": [0, 38]}, + {"origin": [5, -16, -3], "size": [3, 3, 3], "uv": [12, 44]} + ] + }, + { + "name": "Layer", + "parent": "bed", + "cubes": [ + {"origin": [-5, 15, -3], "size": [10, 1, 3], "uv": [38, 2], "layer": true}, + {"origin": [-5, -16, -3], "size": [10, 1, 3], "uv": [38, 38], "layer": true}, + {"origin": [7, -13, -3], "size": [1, 26, 3], "uv": [52, 6], "layer": true}, + {"origin": [-8, -13, -3], "size": [1, 26, 3], "uv": [44, 6], "layer": true} + ] + } + ] + }`,model_java:`{ + "name": "bed", + "external_textures": ["entity/bed/white.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "bed", + "pivot": [0, 0, 0], + "rotation": [-90, 0, 0], + "cubes": [ + {"origin": [-8, 0, -9], "size": [16, 16, 6], "uv": [0, 0]}, + {"origin": [-8, -16, -9], "size": [16, 16, 6], "uv": [0, 22]} + ] + }, + { + "name": "leg0", + "pivot": [-6.5, 1.5, -14.5], + "cubes": [ + {"origin": [-8, 0, -16], "size": [3, 3, 3], "uv": [50, 0]} + ] + }, + { + "name": "leg1", + "pivot": [-6.5, 1.5, 14.5], + "rotation": [0, 90, 0], + "cubes": [ + {"origin": [-8, 0, 13], "size": [3, 3, 3], "uv": [50, 6]} + ] + }, + { + "name": "leg2", + "pivot": [6.5, 1.5, -14.5], + "rotation": [0, -90, 0], + "cubes": [ + {"origin": [5, 0, -16], "size": [3, 3, 3], "uv": [50, 12]} + ] + }, + { + "name": "leg3", + "pivot": [6.5, 1.5, 14.5], + "rotation": [0, 180, 0], + "cubes": [ + {"origin": [5, 0, 13], "size": [3, 3, 3], "uv": [50, 18]} + ] + } + ] + }`};bt.bee={display_name:"Bee",model:`{ + "name": "bee", + "external_textures": ["entity/bee/bee.png"], + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [10, 13, 2, 3], + [15, 13, 2, 3] + ], + "bones": [ + { + "name": "body", + "pivot": [0.5, 5, 0], + "cubes": [ + {"name": "body", "origin": [-3, 2, -5], "size": [7, 7, 10], "uv": [0, 0]}, + {"name": "body", "origin": [-2, 7, -8], "size": [1, 2, 3], "uv": [2, 3]}, + {"name": "body", "origin": [2, 7, -8], "size": [1, 2, 3], "uv": [2, 0]} + ] + }, + { + "name": "stinger", + "parent": "body", + "pivot": [0.5, 6, 1], + "cubes": [ + {"name": "stinger", "origin": [0.5, 5, 5], "size": [0, 1, 2], "uv": [26, 7]} + ] + }, + { + "name": "rightwing_bone", + "parent": "body", + "pivot": [-1, 9, -3], + "rotation": [15, -15, 0], + "cubes": [ + {"name": "rightwing_bone", "origin": [-10, 9, -3], "size": [9, 0, 6], "uv": [0, 18]} + ] + }, + { + "name": "leftwing_bone", + "parent": "body", + "pivot": [2, 9, -3], + "rotation": [15, 15, 0], + "cubes": [ + {"name": "leftwing_bone", "origin": [2, 9, -3], "size": [9, 0, 6], "uv": [9, 24]} + ] + }, + { + "name": "leg_front", + "parent": "body", + "pivot": [2, 2, -2], + "cubes": [ + {"name": "leg_front", "origin": [-3, 0, -2], "size": [7, 2, 0], "uv": [26, 1]} + ] + }, + { + "name": "leg_mid", + "parent": "body", + "pivot": [2, 2, 0], + "cubes": [ + {"name": "leg_mid", "origin": [-3, 0, 0], "size": [7, 2, 0], "uv": [26, 3]} + ] + }, + { + "name": "leg_back", + "parent": "body", + "pivot": [2, 2, 2], + "cubes": [ + {"name": "leg_back", "origin": [-3, 0, 2], "size": [7, 2, 0], "uv": [26, 5]} + ] + } + ] + }`};bt.bee_baby={display_name:"Bee Baby",model:`{ + "name": "bee_baby", + "texturewidth": 32, + "textureheight": 32, + "external_textures": ["entity/bee/bee_baby.png"], + "eyes": [ + [4, 7, 2, 2], + [8, 7, 2, 2] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 4.33333, -1.85667], + "cubes": [ + {"origin": [-2, 1, -2], "size": [4, 4, 5], "uv": [0, 0]}, + {"origin": [1, 4, -4.02], "size": [1, 2, 2], "uv": [6, 12]}, + {"origin": [-2, 4, -4.05], "size": [1, 2, 2], "uv": [0, 12]} + ] + }, + { + "name": "stinger", + "parent": "body", + "pivot": [0, 2.5, 3], + "cubes": [ + {"origin": [0, 2, 3], "size": [0, 1, 1], "uv": [13, 2]} + ] + }, + { + "name": "rightwing_bone", + "parent": "body", + "pivot": [-1, 5, -1], + "rotation": [12.5, 20, 0], + "cubes": [ + {"origin": [-4, 5, -1], "size": [3, 0, 3], "uv": [3, 9]} + ] + }, + { + "name": "leftwing_bone", + "parent": "body", + "pivot": [1, 5, -1], + "rotation": [12.5, -20, 0], + "cubes": [ + {"origin": [1, 5, -1], "size": [3, 0, 3], "uv": [-3, 9], "mirror": true} + ] + }, + { + "name": "leg_front", + "parent": "body", + "pivot": [0, 1, 0], + "cubes": [ + {"origin": [-1.5, 0, 0], "size": [3, 1, 0], "uv": [13, 0]} + ] + }, + { + "name": "leg_mid", + "parent": "body", + "pivot": [0, 1, 1], + "cubes": [ + {"origin": [-1.5, 0, 1], "size": [3, 1, 0], "uv": [13, 1]} + ] + }, + { + "name": "leg_back", + "parent": "body", + "pivot": [0, 1, 2], + "cubes": [ + {"origin": [-1.5, 0, 2], "size": [3, 1, 0], "uv": [13, 2]} + ] + } + ] + }`};bt.bell={display_name:"Bell",model:`{ + "name": "bell", + "external_textures": ["entity/bell.png"], + "texturewidth": 32, + "textureheight": 32, + "bones": [ + { + "name": "bell", + "pivot": [0, 11, 0], + "cubes": [ + {"name": "cube", "origin": [-4, 2, -4], "size": [8, 2, 8], "uv": [0, 13]}, + {"name": "cube", "origin": [-3, 4, -3], "size": [6, 7, 6], "uv": [0, 0]} + ] + } + ] + }`};bt.blaze={display_name:"Blaze",model:`{ + "name": "blaze", + "texturewidth": 64, + "textureheight": 32, + "eyes": [ + [9, 11], + [13, 11] + ], + "bones": [ + { + "name": "upperBodyParts0", + "pivot": [8, 26, -3], + "cubes": [ + {"name": "upperBodyParts0", "origin": [8, 18, -3], "size": [2, 8, 2], "uv": [0, 16]} + ] + }, + { + "name": "upperBodyParts1", + "pivot": [-10, 26, 1], + "cubes": [ + {"name": "upperBodyParts1", "origin": [-10, 18, 1], "size": [2, 8, 2], "uv": [0, 16]} + ] + }, + { + "name": "upperBodyParts2", + "pivot": [1, 26, 8], + "cubes": [ + {"name": "upperBodyParts2", "origin": [1, 18, 8], "size": [2, 8, 2], "uv": [0, 16]} + ] + }, + { + "name": "upperBodyParts3", + "pivot": [-3, 26, -10], + "cubes": [ + {"name": "upperBodyParts3", "origin": [-3, 18, -10], "size": [2, 8, 2], "uv": [0, 16]} + ] + }, + { + "name": "upperBodyParts4", + "pivot": [5, 18, -1], + "cubes": [ + {"name": "upperBodyParts4", "origin": [5, 10, -1], "size": [2, 8, 2], "uv": [0, 16]} + ] + }, + { + "name": "upperBodyParts5", + "pivot": [-7, 18, -1], + "cubes": [ + {"name": "upperBodyParts5", "origin": [-7, 10, -1], "size": [2, 8, 2], "uv": [0, 16]} + ] + }, + { + "name": "upperBodyParts6", + "pivot": [-1, 18, 5], + "cubes": [ + {"name": "upperBodyParts6", "origin": [-1, 10, 5], "size": [2, 8, 2], "uv": [0, 16]} + ] + }, + { + "name": "upperBodyParts7", + "pivot": [-1, 18, -7], + "cubes": [ + {"name": "upperBodyParts7", "origin": [-1, 10, -7], "size": [2, 8, 2], "uv": [0, 16]} + ] + }, + { + "name": "upperBodyParts8", + "pivot": [3, 8, 2], + "cubes": [ + {"name": "upperBodyParts8", "origin": [3, 0, 2], "size": [2, 8, 2], "uv": [0, 16]} + ] + }, + { + "name": "upperBodyParts9", + "pivot": [-5, 8, -4], + "cubes": [ + {"name": "upperBodyParts9", "origin": [-5, 0, -4], "size": [2, 8, 2], "uv": [0, 16]} + ] + }, + { + "name": "upperBodyParts10", + "pivot": [-4, 8, 3], + "cubes": [ + {"name": "upperBodyParts10", "origin": [-4, 0, 3], "size": [2, 8, 2], "uv": [0, 16]} + ] + }, + { + "name": "upperBodyParts11", + "pivot": [2, 8, -5], + "cubes": [ + {"name": "upperBodyParts11", "origin": [2, 0, -5], "size": [2, 8, 2], "uv": [0, 16]} + ] + }, + { + "name": "Head", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Head", "origin": [-4, 20, -4], "size": [8, 8, 8], "uv": [0, 0]} + ] + } + ] + }`};bt.boat={display_name:"Boat",model:`{ + "name": "boat", + "external_textures": ["entity/boat/boat_oak.png"], + "texturewidth": 128, + "textureheight": 64, + "bones": [ + { + "name": "bottom", + "pivot": [0, 18, 0], + "rotation": [90, 0, 0], + "mirror": true, + "cubes": [ + {"name": "bottom", "origin": [-14, 10, 0], "size": [28, 16, 3], "uv": [0, 0]} + ] + }, + { + "name": "front", + "pivot": [15, 24, 0], + "rotation": [0, 90, 0], + "mirror": true, + "cubes": [ + {"name": "front", "origin": [7, 21, -1], "size": [16, 6, 2], "uv": [0, 27]} + ] + }, + { + "name": "back", + "pivot": [-15, 24, 0], + "rotation": [0, -90, 0], + "mirror": true, + "cubes": [ + {"name": "back", "origin": [-24, 21, -1], "size": [18, 6, 2], "uv": [0, 19]} + ] + }, + { + "name": "right", + "pivot": [0, 24, -9], + "rotation": [0, -180, 0], + "mirror": true, + "cubes": [ + {"name": "right", "origin": [-14, 21, -10], "size": [28, 6, 2], "uv": [0, 35]} + ] + }, + { + "name": "left", + "pivot": [0, 24, 9], + "mirror": true, + "cubes": [ + {"name": "left", "origin": [-14, 21, 8], "size": [28, 6, 2], "uv": [0, 43]} + ] + }, + { + "name": "paddle_left", + "pivot": [-2.5, 28, 9], + "rotation": [-30, 0, 0], + "mirror": true, + "cubes": [ + {"name": "paddle_left", "origin": [-3.5, 27, 3.5], "size": [2, 2, 18], "uv": [62, 0]}, + {"name": "paddle_left", "origin": [-2.51, 26, 17.5], "size": [1, 6, 7], "uv": [62, 0]} + ] + }, + { + "name": "paddle_right", + "pivot": [-2.5, 28, -9], + "rotation": [-30, 180, 0], + "mirror": true, + "cubes": [ + {"name": "paddle_right", "origin": [-3.5, 27, -14.5], "size": [2, 2, 18], "uv": [62, 20]}, + {"name": "paddle_right", "origin": [-3.49, 26, -0.5], "size": [1, 6, 7], "uv": [62, 20]} + ] + } + ] + }`};bt.bogged={display_name:"Bogged",model:`{ + "name": "bogged", + "external_textures": ["entity/skeleton/bogged.png"], + "texturewidth": 64, + "textureheight": 32, + "eyes": [ + [9, 12, 2, 1], + [13, 12, 2, 1] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 24, 0], + "cubes": [ + {"origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]} + ] + }, + { + "name": "waist", + "pivot": [0, 12, 0] + }, + { + "name": "head", + "pivot": [0, 24, 0], + "cubes": [ + {"origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [0, 0]} + ] + }, + { + "name": "mushrooms", + "parent": "head", + "pivot": [3, 31.5, 3], + "cubes": [ + {"origin": [-6, 31, -3], "size": [6, 4, 0], "pivot": [-3, 32.5, -3], "rotation": [0, -45, 0], "uv": [50, 22]}, + {"origin": [-6, 31, -3], "size": [6, 4, 0], "pivot": [-3, 32.5, -3], "rotation": [0, 45, 0], "uv": [50, 22]}, + {"origin": [0, 31, 3], "size": [6, 4, 0], "pivot": [3, 31.5, 3], "rotation": [0, 45, 0], "uv": [50, 16]}, + {"origin": [0, 31, 3], "size": [6, 4, 0], "pivot": [3, 31.5, 3], "rotation": [0, -45, 0], "uv": [50, 16]}, + {"origin": [-5, 25, 3], "size": [6, 5, 0], "pivot": [-2, 25, 3], "rotation": [-90, 0, 45], "uv": [50, 27]}, + {"origin": [-5, 25, 3], "size": [6, 5, 0], "pivot": [-2, 25, 3], "rotation": [-90, 0, 135], "uv": [50, 27]} + ] + }, + { + "name": "hat", + "pivot": [0, 24, 0], + "cubes": [ + {"origin": [-4, 24, -4], "size": [8, 8, 8], "inflate": 0.2, "uv": [32, 0], "layer": true} + ] + }, + { + "name": "rightArm", + "pivot": [-5, 22, 0], + "cubes": [ + {"origin": [-6, 12, -1], "size": [2, 12, 2], "uv": [40, 16]} + ] + }, + { + "name": "rightItem", + "parent": "rightArm", + "pivot": [-6, 15, 1] + }, + { + "name": "leftArm", + "pivot": [5, 22, 0], + "mirror": true, + "cubes": [ + {"origin": [4, 12, -1], "size": [2, 12, 2], "uv": [40, 16], "mirror": true} + ] + }, + { + "name": "leftItem", + "parent": "leftArm", + "pivot": [6, 15, 1] + }, + { + "name": "rightLeg", + "pivot": [-2, 12, 0], + "cubes": [ + {"origin": [-3, 0, -1], "size": [2, 12, 2], "uv": [0, 16]} + ] + }, + { + "name": "leftLeg", + "pivot": [2, 12, 0], + "mirror": true, + "cubes": [ + {"origin": [1, 0, -1], "size": [2, 12, 2], "uv": [0, 16], "mirror": true} + ] + } + ] + }`};bt.bogged_layer={display_name:"Bogged/Stray Layer",model:`{ + "name": "bogged_layer", + "external_textures": ["entity/skeleton/bogged_clothes.png"], + "texturewidth": 64, + "textureheight": 32, + "eyes": [ + [9, 12, 2, 1], + [13, 12, 2, 1] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 24, 0], + "cubes": [ + {"origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]} + ] + }, + { + "name": "leftArm", + "parent": "body", + "pivot": [5, 22, 0], + "mirror": true, + "cubes": [ + {"origin": [4, 12, -2], "size": [4, 12, 4], "uv": [40, 16], "mirror": true} + ] + }, + { + "name": "head", + "pivot": [0, 24, 0], + "cubes": [ + {"origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [0, 0]} + ] + }, + { + "name": "hat", + "pivot": [0, 24, 0], + "cubes": [ + {"origin": [-4, 24, -4], "size": [8, 8, 8], "inflate": 0.5, "uv": [32, 0], "layer": true, "visibility": false} + ] + }, + { + "name": "rightArm", + "pivot": [-5, 22, 0], + "cubes": [ + {"origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 16]} + ] + }, + { + "name": "rightLeg", + "pivot": [-1.9, 12, 0], + "cubes": [ + {"origin": [-3.9, 0, -2], "size": [4, 12, 4], "uv": [0, 16]} + ] + }, + { + "name": "leftLeg", + "pivot": [1.9, 12, 0], + "mirror": true, + "cubes": [ + {"origin": [-0.1, 0, -2], "size": [4, 12, 4], "uv": [0, 16], "mirror": true} + ] + } + ] + }`};bt.breeze={display_name:"Breeze",model:`{ + "name": "breeze", + "external_textures": ["entity/breeze/breeze.png"], + "texturewidth": 32, + "textureheight": 32, + "eyes": [ + [7, 14, 3, 1], + [14, 14, 3, 1], + [6, 29, 5, 1], + [15, 29, 5, 1] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 0, 0] + }, + { + "name": "rods", + "parent": "body", + "pivot": [0, 16, 0], + "cubes": [ + {"origin": [-1, 11, -6], "size": [2, 8, 2], "pivot": [0, 19, -3], "rotation": [22.5, 0, 0], "uv": [0, 17]}, + {"origin": [-3.59808, 11, -1.5], "size": [2, 8, 2], "pivot": [-2.59808, 19, 1.5], "rotation": [-157.5, 60, 180], "uv": [0, 17]}, + {"origin": [1.59808, 11, -1.5], "size": [2, 8, 2], "pivot": [2.59808, 19, 1.5], "rotation": [-157.5, -60, 180], "uv": [0, 17]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 20, 0], + "cubes": [ + {"origin": [-4, 20, -4], "size": [8, 8, 8], "uv": [0, 0]} + ] + }, + { + "name": "eyes", + "parent": "head", + "pivot": [0, 20, 0], + "cubes": [ + {"origin": [-5, 22, -4.2], "size": [10, 3, 4], "uv": [4, 24], "layer": true} + ] + } + ] + }`};bt.breeze_tornado={display_name:"Breeze Tornado",model:`{ + "name": "breeze_wind", + "external_textures": ["entity/breeze/breeze_wind.png"], + "texturewidth": 128, + "textureheight": 128, + "bones": [ + { + "name": "tornado_body", + "pivot": [0, 0, 0] + }, + { + "name": "tornado_bottom", + "parent": "tornado_body", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-2.5, 0, -2.5], "size": [5, 7, 5], "uv": [1, 83]} + ] + }, + { + "name": "tornado_mid", + "parent": "tornado_bottom", + "pivot": [0, 7, 0], + "cubes": [ + {"origin": [-2.5, 7, -2.5], "size": [5, 6, 5], "uv": [49, 71]}, + {"origin": [-4, 7, -4], "size": [8, 6, 8], "uv": [78, 32]}, + {"origin": [-6, 7, -6], "size": [12, 6, 12], "uv": [74, 28]} + ] + }, + { + "name": "tornado_top", + "parent": "tornado_mid", + "pivot": [0, 13, 0], + "cubes": [ + {"origin": [-2.5, 13, -2.5], "size": [5, 8, 5], "uv": [105, 57]}, + {"origin": [-6, 13, -6], "size": [12, 8, 12], "uv": [6, 6]}, + {"origin": [-9, 13, -9], "size": [18, 8, 18], "uv": [0, 0]} + ] + } + ] + }`};bt.camel={display_name:"Camel",model:`{ + "name": "camel", + "external_textures": ["entity/camel/camel.png"], + "texturewidth": 128, + "textureheight": 128, + "eyes": [ + [26, 8, 3, 1], + [34, 8, 3, 1] + ], + "bones": [ + { + "name": "root", + "pivot": [0, 0, 0] + }, + { + "name": "body", + "parent": "root", + "pivot": [0.5, 20, 9.5], + "cubes": [ + {"origin": [-7.5, 20, -14], "size": [15, 12, 27], "uv": [0, 25]} + ] + }, + { + "name": "saddle", + "parent": "body", + "pivot": [0.5, 20, 9.5], + "cubes": [ + {"name": "saddle layer", "origin": [-4.5, 32, -6], "size": [9, 5, 11], "inflate": 0.1, "layer": true, "visibility": false, "uv": [74, 64]}, + {"name": "saddle layer", "origin": [-3.5, 37, -6], "size": [7, 3, 11], "inflate": 0.1, "layer": true, "visibility": false, "uv": [92, 114]}, + {"name": "saddle layer", "origin": [-7.5, 20, -14], "size": [15, 12, 27], "inflate": 0.1, "layer": true, "visibility": false, "uv": [0, 89]} + ] + }, + { + "name": "tail", + "parent": "body", + "pivot": [0, 29, 13], + "cubes": [ + {"origin": [-1.5, 15, 13], "size": [3, 14, 0], "pivot": [0, 29, 13], "rotation": [0, 180, 0], "uv": [122, 0]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0.5, 25, -10], + "cubes": [ + {"origin": [-3.5, 22, -25], "size": [7, 8, 19], "uv": [60, 24]}, + {"origin": [-3.5, 30, -25], "size": [7, 14, 7], "uv": [21, 0]}, + {"origin": [-2.5, 39, -31], "size": [5, 5, 6], "uv": [50, 0]} + ] + }, + { + "name": "bridle", + "parent": "head", + "pivot": [0.5, 25, -10], + "cubes": [ + {"name": "bridle layer", "origin": [-3.5, 22, -25], "size": [7, 8, 19], "inflate": 0.1, "uv": [60, 87], "layer": true, "visibility": false}, + {"name": "bridle layer", "origin": [-3.5, 30, -25], "size": [7, 14, 7], "inflate": 0.1, "uv": [21, 64], "layer": true, "visibility": false}, + {"name": "bridle layer", "origin": [-2.5, 39, -31.1], "size": [5, 5, 6], "inflate": 0.1, "uv": [50, 64], "layer": true, "visibility": false}, + {"origin": [2.5, 40, -28], "size": [1, 2, 2], "uv": [74, 70]}, + {"origin": [-3.5, 40, -28], "size": [1, 2, 2], "uv": [74, 70], "mirror": true} + ] + }, + { + "name": "left_ear", + "parent": "head", + "pivot": [3, 43, -19.5], + "cubes": [ + {"origin": [3, 42.5, -20.5], "size": [3, 1, 2], "uv": [45, 0]} + ] + }, + { + "name": "right_ear", + "parent": "head", + "pivot": [-3, 43, -19.5], + "cubes": [ + {"origin": [-6, 42.5, -20.5], "size": [3, 1, 2], "uv": [67, 0]} + ] + }, + { + "name": "reins", + "parent": "head", + "pivot": [3.7, 41, -27], + "cubes": [ + {"name": "reins layer", "origin": [3.7, 34, -27], "size": [0, 7, 15], "uv": [98, 42], "layer": true, "visibility": false}, + {"name": "reins layer", "origin": [-3.7, 34, -12], "size": [7.4, 7, 0], "uv": [84, 57], "layer": true, "visibility": false}, + {"name": "reins layer", "origin": [-3.7, 34, -27], "size": [0, 7, 15], "uv": [98, 42], "layer": true, "visibility": false} + ] + }, + { + "name": "hump", + "parent": "body", + "pivot": [0.5, 32, 0], + "cubes": [ + {"origin": [-4.5, 32, -6], "size": [9, 5, 11], "uv": [74, 0]} + ] + }, + { + "name": "right_front_leg", + "parent": "root", + "pivot": [-4.9, 23, -10.5], + "cubes": [ + {"origin": [-7.4, 0, -13], "size": [5, 21, 5], "uv": [0, 26]} + ] + }, + { + "name": "left_front_leg", + "parent": "root", + "pivot": [4.9, 23, -10.5], + "cubes": [ + {"origin": [2.4, 0, -13], "size": [5, 21, 5], "uv": [0, 0]} + ] + }, + { + "name": "left_hind_leg", + "parent": "root", + "pivot": [4.9, 23, 9.5], + "cubes": [ + {"origin": [2.4, 0, 7], "size": [5, 21, 5], "uv": [58, 16]} + ] + }, + { + "name": "right_hind_leg", + "parent": "root", + "pivot": [-4.9, 23, 9.5], + "cubes": [ + {"origin": [-7.4, 0, 7], "size": [5, 21, 5], "uv": [94, 16]} + ] + } + ] + }`};bt.camel_baby={display_name:"Camel Baby",model:`{ + "name": "camel_baby", + "texturewidth": 64, + "textureheight": 64, + "external_textures": ["entity/camel/camel_baby.png"], + "eyes": [ + [3, 6, 2, 1], + [10, 6, 2, 1] + ], + "bones": [ + { + "name": "root", + "pivot": [0, 0, 0] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 17, 0], + "cubes": [ + {"origin": [-4.5, 13, -8], "size": [9, 8, 16], "uv": [0, 14]} + ] + }, + { + "name": "tail", + "parent": "body", + "pivot": [0, 18.5, 8.05], + "cubes": [ + {"origin": [-1.5, 10, 8.05], "size": [3, 9, 0], "uv": [50, 38]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 16, -7.5], + "cubes": [ + {"origin": [-2.5, 14, -15], "size": [5, 5, 7], "uv": [20, 0]}, + {"origin": [-2.5, 19, -15], "size": [5, 9, 5], "uv": [0, 0]}, + {"origin": [-2.5, 24, -18], "size": [5, 4, 3], "uv": [0, 14]} + ] + }, + { + "name": "right_ear", + "parent": "head", + "pivot": [-2.5, 27, -11.5], + "cubes": [ + {"origin": [-5.5, 26.5, -12.5], "size": [3, 1, 2], "uv": [37, 0]} + ] + }, + { + "name": "left_ear", + "parent": "head", + "pivot": [2.5, 27, -11.5], + "cubes": [ + {"origin": [2.5, 26.5, -12.5], "size": [3, 1, 2], "uv": [47, 0]} + ] + }, + { + "name": "right_front_leg", + "parent": "root", + "pivot": [-2.9, 12.5, -5.5], + "cubes": [ + {"origin": [-4.4, 0, -7], "size": [3, 13, 3], "uv": [36, 14]} + ] + }, + { + "name": "left_front_leg", + "parent": "root", + "pivot": [2.9, 12.5, -5.5], + "cubes": [ + {"origin": [1.4, 0, -7], "size": [3, 13, 3], "uv": [48, 14]} + ] + }, + { + "name": "left_hind_leg", + "parent": "root", + "pivot": [2.9, 12.5, 5.5], + "cubes": [ + {"origin": [1.4, 0, 4], "size": [3, 13, 3], "uv": [12, 38]} + ] + }, + { + "name": "right_hind_leg", + "parent": "root", + "pivot": [-3, 12.5, 5.5], + "cubes": [ + {"origin": [-4.4, 0, 4], "size": [3, 13, 3], "uv": [0, 38]} + ] + } + ] + }`};bt.cat={display_name:"Cat",model:`{ + "name": "cat", + "external_textures": ["entity/cat/calico.png"], + "texturewidth": 64, + "textureheight": 32, + "bones": [ + { + "name": "body", + "pivot": [0, 7, 1] + }, + { + "name": "belly", + "parent": "body", + "pivot": [0, 7, 1], + "rotation": [90, 0, 0], + "cubes": [ + {"name": "body", "origin": [-2, -1, -2], "size": [4, 16, 6], "uv": [20, 0]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 9, -9], + "cubes": [ + {"name": "head", "origin": [-2.5, 7, -12], "size": [5, 4, 5], "uv": [0, 0]}, + {"name": "head", "origin": [-1.5, 7.01562, -13], "size": [3, 2, 2], "uv": [0, 24]}, + {"name": "head", "origin": [-2, 11, -9], "size": [1, 1, 2], "uv": [0, 10]}, + {"name": "head", "origin": [1, 11, -9], "size": [1, 1, 2], "uv": [6, 10]} + ] + }, + { + "name": "tail1", + "parent": "body", + "pivot": [0, 9, 8], + "rotation": [45, 0, 0], + "cubes": [ + {"name": "tail1", "origin": [-0.5, 1, 8], "size": [1, 8, 1], "uv": [0, 15]} + ] + }, + { + "name": "tail2", + "parent": "tail1", + "pivot": [0, 1, 8], + "rotation": [45, 0, 0], + "cubes": [ + {"name": "tail2", "origin": [-0.5, -7, 8], "size": [1, 8, 1], "uv": [4, 15]} + ] + }, + { + "name": "backLegL", + "parent": "body", + "pivot": [1.1, 6, 7], + "cubes": [ + {"name": "backLegL", "origin": [0.1, 0, 6], "size": [2, 6, 2], "uv": [8, 13]} + ] + }, + { + "name": "backLegR", + "parent": "body", + "pivot": [-1.1, 6, 7], + "cubes": [ + {"name": "backLegR", "origin": [-2.1, 0, 6], "size": [2, 6, 2], "uv": [8, 13]} + ] + }, + { + "name": "frontLegL", + "parent": "body", + "pivot": [1.2, 10, -4], + "cubes": [ + {"name": "frontLegL", "origin": [0.2, 0.2, -5], "size": [2, 10, 2], "uv": [40, 0]} + ] + }, + { + "name": "frontLegR", + "parent": "body", + "pivot": [-1.2, 10, -4], + "cubes": [ + {"name": "frontLegR", "origin": [-2.2, 0.2, -5], "size": [2, 10, 2], "uv": [40, 0]} + ] + } + ] + }`};bt.cat_baby={display_name:"Kitten / Cat Baby",model:`{ + "name": "cat_baby", + "texturewidth": 32, + "textureheight": 32, + "external_textures": ["entity/cat/calico_baby.png"], + "eyes": [ + [5, 5, 1, 1], + [7, 5, 1, 1] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 0, 0] + }, + { + "name": "belly", + "parent": "body", + "pivot": [0, 3.5, 0.5], + "cubes": [ + {"origin": [-2, 2, -3], "size": [4, 3, 7], "uv": [0, 8]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 4, -3.125], + "cubes": [ + {"origin": [-2.5, 3, -6], "size": [5, 4, 4], "uv": [0, 0]}, + {"origin": [-2, 7, -4], "size": [1, 1, 2], "uv": [18, 0]}, + {"origin": [1, 7, -4], "size": [1, 1, 2], "uv": [24, 0]}, + {"origin": [-1.5, 3, -7], "size": [3, 2, 1], "uv": [18, 3]} + ] + }, + { + "name": "tail1", + "parent": "body", + "pivot": [0, 4.89303, 3.91511], + "rotation": [-32.5, 0, 0], + "cubes": [ + {"origin": [-0.5, 4, 4], "size": [1, 1, 5], "uv": [0, 18]} + ] + }, + { + "name": "backLegL", + "parent": "body", + "pivot": [1, 2, 2.5], + "cubes": [ + {"origin": [0.5, 0, 1.5], "size": [1, 2, 2], "uv": [18, 22]} + ] + }, + { + "name": "backLegR", + "parent": "body", + "pivot": [-1, 2, 2.5], + "cubes": [ + {"origin": [-1.5, 0, 1.5], "size": [1, 2, 2], "uv": [12, 22]} + ] + }, + { + "name": "frontLegL", + "parent": "body", + "pivot": [1, 2, -1.5], + "cubes": [ + {"origin": [0.5, 0, -2.5], "size": [1, 2, 2], "uv": [18, 18]} + ] + }, + { + "name": "frontLegR", + "parent": "body", + "pivot": [-1, 2, -1.5], + "cubes": [ + {"origin": [-1.5, 0, -2.5], "size": [1, 2, 2], "uv": [12, 18]} + ] + } + ] + }`};bt.cape_elytra={display_name:"Cape + Elytra",model:`{ + "name": "cape and elytra", + "external_textures": ["models/armor/elytra.png"], + "texturewidth": 64, + "textureheight": 32, + "bones": [ + { + "name": "cape", + "pivot": [9, 24, 3], + "rotation": [0, 180, 0], + "cubes": [ + {"origin": [4, 8, 3], "size": [10, 16, 1], "uv": [0, 0]} + ] + }, + { + "name": "elytra", + "pivot": [-18, 24, 1] + }, + { + "name": "left_wing", + "parent": "elytra", + "pivot": [-18, 4, 1], + "cubes": [ + {"origin": [-18, 4, 1], "size": [10, 20, 2], "uv": [22, 0]} + ] + }, + { + "name": "right_wing", + "parent": "elytra", + "pivot": [-18, 4, 1], + "mirror": true, + "cubes": [ + {"origin": [-28, 4, 1], "size": [10, 20, 2], "uv": [22, 0], "mirror": true} + ] + } + ] + }`};bt.chest={display_name:"Chest",model:`{ + "name": "chest", + "external_textures": ["entity/chest/normal.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "chest", + "pivot": [0, 8, 0], + "rotation": [0, 0, -180], + "cubes": [ + {"name": "cube", "origin": [-1, 5, 7], "size": [2, 4, 1], "uv": [0, 0]}, + {"name": "cube", "origin": [-7, 2, -7], "size": [14, 5, 14], "uv": [0, 0]}, + {"name": "cube", "origin": [-7, 6, -7], "size": [14, 10, 14], "uv": [0, 19]} + ] + } + ] + }`};bt.chest_left={display_name:"Chest Left",model:`{ + "name": "chest_left", + "external_textures": ["entity/chest/double_normal.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "chest", + "pivot": [0, 8, 0], + "rotation": [0, 0, -180], + "cubes": [ + {"name": "cube", "origin": [-9, 5, 7], "size": [2, 4, 1], "uv": [0, 0]}, + {"name": "cube", "origin": [-8, 2, -7], "size": [15, 5, 14], "uv": [0, 0]}, + {"name": "cube", "origin": [-8, 6, -7], "size": [15, 10, 14], "uv": [0, 19]} + ] + } + ] + }`};bt.chest_right={display_name:"Chest Right",model:`{ + "name": "chest_right", + "external_textures": ["entity/chest/double_normal.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "chest", + "pivot": [0, 8, 0], + "rotation": [0, 0, -180], + "cubes": [ + {"name": "cube", "origin": [7, 5, 7], "size": [2, 4, 1], "uv": [0, 0]}, + {"name": "cube", "origin": [-7, 2, -7], "size": [15, 5, 14], "uv": [0, 0]}, + {"name": "cube", "origin": [-7, 6, -7], "size": [15, 10, 14], "uv": [0, 19]} + ] + } + ] + }`};bt.chicken={display_name:"Chicken",variants:{regular:{name:"Regular",model:`{ + "name": "chicken", + "external_textures": ["entity/chicken/chicken.png"], + "texturewidth": 64, + "textureheight": 32, + "bones": [ + { + "name": "body", + "pivot": [0, 8, 0], + "rotation": [90, 0, 0], + "cubes": [ + {"name": "body", "origin": [-3, 4, -3], "size": [6, 8, 6], "uv": [0, 9]} + ] + }, + { + "name": "head", + "pivot": [0, 9, -4], + "cubes": [ + {"name": "head", "origin": [-2, 9, -6], "size": [4, 6, 3], "uv": [0, 0]} + ] + }, + { + "name": "comb", + "parent": "head", + "pivot": [0, 9, -4], + "cubes": [ + {"name": "comb", "origin": [-1, 9, -7], "size": [2, 2, 2], "uv": [14, 4]} + ] + }, + { + "name": "beak", + "parent": "head", + "pivot": [0, 9, -4], + "cubes": [ + {"name": "beak", "origin": [-2, 11, -8], "size": [4, 2, 2], "uv": [14, 0]} + ] + }, + { + "name": "leg0", + "pivot": [-2, 5, 1], + "cubes": [ + {"name": "leg0", "origin": [-3, 0, -2], "size": [3, 5, 3], "uv": [26, 0]} + ] + }, + { + "name": "leg1", + "pivot": [1, 5, 1], + "cubes": [ + {"name": "leg1", "origin": [0, 0, -2], "size": [3, 5, 3], "uv": [26, 0]} + ] + }, + { + "name": "wing0", + "pivot": [-3, 11, 0], + "cubes": [ + {"name": "wing0", "origin": [-4, 7, -3], "size": [1, 4, 6], "uv": [24, 13]} + ] + }, + { + "name": "wing1", + "pivot": [3, 11, 0], + "cubes": [ + {"name": "wing1", "origin": [3, 7, -3], "size": [1, 4, 6], "uv": [24, 13]} + ] + } + ] + }`},cold:{name:"Cold",model:`{ + "name": "chicken_cold", + "external_textures": ["entity/chicken/chicken_cold.png"], + "texturewidth": 64, + "textureheight": 32, + "bones": [ + { + "name": "body", + "pivot": [0, 8, 0], + "cubes": [ + {"origin": [-3, 12, 5], "size": [6, 8, 6], "pivot": [0, 8, 8], "rotation": [90, 0, 0], "uv": [0, 9]}, + {"origin": [0, 10, 7], "size": [0, 3, 5], "pivot": [0, 8, 8], "rotation": [90, 0, 0], "uv": [38, 9]} + ] + }, + { + "name": "head", + "pivot": [0, 9, -4], + "cubes": [ + {"origin": [-2, 9, -6], "size": [4, 6, 3], "uv": [0, 0]}, + {"origin": [-3, 13, -6.015], "size": [6, 3, 4], "uv": [44, 0]} + ] + }, + { + "name": "comb", + "parent": "head", + "pivot": [0, 9, -4], + "cubes": [ + {"origin": [-1, 9, -7], "size": [2, 2, 2], "uv": [14, 4]} + ] + }, + { + "name": "beak", + "parent": "head", + "pivot": [0, 9, -4], + "cubes": [ + {"origin": [-2, 11, -8], "size": [4, 2, 2], "uv": [14, 0]} + ] + }, + { + "name": "leg0", + "pivot": [-2, 5, 1], + "cubes": [ + {"origin": [-3, 0, -2], "size": [3, 5, 3], "uv": [26, 0]} + ] + }, + { + "name": "leg1", + "pivot": [1, 5, 1], + "cubes": [ + {"origin": [0, 0, -2], "size": [3, 5, 3], "uv": [26, 0]} + ] + }, + { + "name": "wing0", + "pivot": [-3, 11, 0], + "cubes": [ + {"origin": [-4, 7, -3], "size": [1, 4, 6], "uv": [24, 13]} + ] + }, + { + "name": "wing1", + "pivot": [3, 11, 0], + "cubes": [ + {"origin": [3, 7, -3], "size": [1, 4, 6], "uv": [24, 13]} + ] + } + ] + }`}}};bt.chicken_baby={display_name:"Chick / Chicken Baby",model:`{ + "name": "chicken_baby", + "texturewidth": 16, + "textureheight": 16, + "external_textures": ["entity/chicken/chicken_temperate_baby.png"], + "eyes": [ + [4, 5, 1, 1], + [7, 5, 1, 1] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 3.75, -1.25], + "cubes": [ + {"origin": [-2, 2, -2], "size": [4, 4, 4], "uv": [0, 0]}, + {"origin": [-1, 3, -3], "size": [2, 1, 1], "uv": [10, 8]} + ] + }, + { + "name": "leg0", + "pivot": [-1, 2, 0.5], + "cubes": [ + {"origin": [-1.5, 0, 0.5], "size": [1, 2, 0], "uv": [0, 2]}, + {"origin": [-1.5, 0, -0.5], "size": [1, 0, 1], "uv": [0, 0]} + ] + }, + { + "name": "leg1", + "pivot": [1, 2, 0.5], + "cubes": [ + {"origin": [0.5, 0, 0.5], "size": [1, 2, 0], "uv": [2, 2]}, + {"origin": [0.5, 0, -0.5], "size": [1, 0, 1], "uv": [0, 1]} + ] + }, + { + "name": "wing0", + "pivot": [-2, 4, 0], + "cubes": [ + {"origin": [-3, 4, -1], "size": [1, 0, 2], "uv": [4, 8]} + ] + }, + { + "name": "wing1", + "pivot": [2, 4, 0], + "cubes": [ + {"origin": [2, 4, -1], "size": [1, 0, 2], "uv": [6, 8]} + ] + } + ] + }`};bt.cod={display_name:"Cod",model:`{ + "name": "cod", + "external_textures": ["entity/fish/cod.png"], + "texturewidth": 32, + "textureheight": 32, + "bones": [ + { + "name": "body", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "body", "origin": [-1, 0, 1], "size": [2, 4, 7], "uv": [0, 0]}, + {"name": "body", "origin": [0, 4, 0], "size": [0, 1, 6], "uv": [20, -6]}, + {"name": "body", "origin": [0, -1, 3], "size": [0, 1, 2], "uv": [22, -1]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 2, 0], + "cubes": [ + {"name": "head", "origin": [-0.9992, 1.0008, -3], "size": [2, 3, 1], "uv": [0, 0]}, + {"name": "head", "origin": [-1, 0, -2], "size": [2, 4, 3], "uv": [11, 0]} + ] + }, + { + "name": "leftFin", + "parent": "body", + "pivot": [1, 1, 0], + "rotation": [0, 0, 35], + "cubes": [ + {"name": "leftFin", "origin": [1, 0, 0], "size": [2, 1, 2], "uv": [24, 4]} + ] + }, + { + "name": "rightFin", + "parent": "body", + "pivot": [-1, 1, 0], + "rotation": [0, 0, -35], + "cubes": [ + {"name": "rightFin", "origin": [-3, 0, 0], "size": [2, 1, 2], "uv": [24, 1]} + ] + }, + { + "name": "tailfin", + "parent": "body", + "pivot": [0, 0, 8], + "cubes": [ + {"name": "tailfin", "origin": [0, 0, 8], "size": [0, 4, 6], "uv": [20, 1]} + ] + }, + { + "name": "waist", + "parent": "body", + "pivot": [0, 0, 0] + } + ] + }`};bt.copper_golem={display_name:"Copper Golem",model:`{ + "name": "copper_golem", + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [11, 12], + [15, 12] + ], + "bones": [ + { + "name": "root", + "pivot": [1, 0, 0] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 5, 0], + "cubes": [ + {"origin": [-4, 5, -3], "size": [8, 6, 6], "uv": [0, 15]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 11, 0], + "cubes": [ + {"origin": [-4, 11, -5], "size": [8, 5, 10], "uv": [0, 0]}, + {"origin": [-1, 10, -6], "size": [2, 3, 2], "uv": [56, 0]}, + {"origin": [-1, 16, -1], "size": [2, 4, 2], "uv": [37, 8]}, + {"origin": [-2, 20, -2], "size": [4, 4, 4], "uv": [37, 0]} + ] + }, + { + "name": "right_arm", + "parent": "body", + "pivot": [-4, 11, 0], + "cubes": [ + {"origin": [-7, 2, -2], "size": [3, 10, 4], "uv": [36, 16]} + ] + }, + { + "name": "rightItem", + "parent": "right_arm", + "pivot": [-5, 3.6, -1] + }, + { + "name": "left_arm", + "parent": "body", + "pivot": [4, 11, 0], + "cubes": [ + {"origin": [4, 2, -2], "size": [3, 10, 4], "uv": [50, 16]} + ] + }, + { + "name": "right_leg", + "parent": "root", + "pivot": [-2, 5, 0], + "cubes": [ + {"origin": [-3.9, 0, -1.99], "size": [4, 5, 4], "uv": [0, 27]} + ] + }, + { + "name": "left_leg", + "parent": "root", + "pivot": [2, 5, 0], + "cubes": [ + {"origin": [-0.1, 0, -2], "size": [4, 5, 4], "uv": [16, 27]} + ] + } + ] + }`};bt.cow={display_name:"Cow",variants:{new:{name:"Regular",model:`{ + "name": "cow", + "external_textures": ["entity/cow/cow.png"], + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [7, 9], + [11, 9] + ], + "bones": [ + { + "name": "root", + "pivot": [0, 0, -1] + }, + { + "name": "head", + "parent": "root", + "pivot": [0, 20, -9], + "cubes": [ + {"origin": [-4, 16, -15], "size": [8, 8, 6], "uv": [0, 0]}, + {"origin": [-3, 16, -16], "size": [6, 3, 1], "uv": [1, 33]}, + {"origin": [-5, 22, -14], "size": [1, 3, 1], "uv": [22, 0]}, + {"origin": [4, 22, -14], "size": [1, 3, 1], "uv": [22, 0]} + ] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 19, 1], + "cubes": [ + {"origin": [-6, 29, 14], "size": [12, 18, 10], "pivot": [0, 18, 20], "rotation": [90, 0, 0], "uv": [18, 4]}, + {"origin": [-2, 29, 13], "size": [4, 6, 1], "pivot": [0, 18, 20], "rotation": [90, 0, 0], "uv": [52, 0]} + ] + }, + { + "name": "leg0", + "parent": "root", + "pivot": [-4, 12, 6], + "cubes": [ + {"origin": [-6, 0, 4], "size": [4, 12, 4], "uv": [0, 16]} + ] + }, + { + "name": "leg1", + "parent": "root", + "pivot": [4, 12, 6], + "mirror": true, + "cubes": [ + {"origin": [2, 0, 4], "size": [4, 12, 4], "uv": [0, 16], "mirror": true} + ] + }, + { + "name": "leg2", + "parent": "root", + "pivot": [-4, 12, -7], + "cubes": [ + {"origin": [-6, 0, -8], "size": [4, 12, 4], "uv": [0, 16]} + ] + }, + { + "name": "leg3", + "parent": "root", + "pivot": [4, 12, -7], + "mirror": true, + "cubes": [ + {"origin": [2, 0, -8], "size": [4, 12, 4], "uv": [0, 16], "mirror": true} + ] + } + ] + }`},cold:{name:"Cold",model:`{ + "name": "cow_cold", + "external_textures": ["entity/cow/cow_cold.png"], + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [7, 9], + [11, 9] + ], + "bones": [ + { + "name": "root", + "pivot": [0, 0, -1] + }, + { + "name": "head", + "parent": "root", + "pivot": [0, 20, -9], + "cubes": [ + {"origin": [-4, 16, -15], "size": [8, 8, 6], "uv": [0, 0]}, + {"origin": [-6, 21, -13], "size": [2, 6, 2], "pivot": [-4.5, 22.5, -12.5], "rotation": [90, 0, 0], "uv": [0, 32]}, + {"origin": [-3, 16, -16], "size": [6, 3, 1], "uv": [9, 33]}, + {"origin": [4, 19.5, -14.5], "size": [2, 6, 2], "pivot": [5.5, 22.5, -14], "rotation": [90, 0, 0], "uv": [0, 32], "mirror": true} + ] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 19, 1], + "cubes": [ + {"origin": [-6, 29, 14], "size": [12, 18, 10], "inflate": 0.5, "pivot": [0, 18, 20], "rotation": [90, 0, 0], "uv": [20, 32]}, + {"origin": [-6, 29, 14], "size": [12, 18, 10], "pivot": [0, 18, 20], "rotation": [90, 0, 0], "uv": [18, 4]}, + {"origin": [-2, 29, 13], "size": [4, 6, 1], "pivot": [0, 18, 20], "rotation": [90, 0, 0], "uv": [52, 0]} + ] + }, + { + "name": "leg0", + "parent": "root", + "pivot": [-4, 12, 6], + "cubes": [ + {"origin": [-6, 0, 4], "size": [4, 12, 4], "uv": [0, 16]} + ] + }, + { + "name": "leg1", + "parent": "root", + "pivot": [4, 12, 6], + "mirror": true, + "cubes": [ + {"origin": [2, 0, 4], "size": [4, 12, 4], "uv": [0, 16], "mirror": true} + ] + }, + { + "name": "leg2", + "parent": "root", + "pivot": [-4, 12, -7], + "cubes": [ + {"origin": [-6, 0, -8], "size": [4, 12, 4], "uv": [0, 16]} + ] + }, + { + "name": "leg3", + "parent": "root", + "pivot": [4, 12, -7], + "mirror": true, + "cubes": [ + {"origin": [2, 0, -8], "size": [4, 12, 4], "uv": [0, 16], "mirror": true} + ] + } + ] + }`},warm:{name:"Warm",model:`{ + "name": "cow_warm", + "external_textures": ["entity/cow/cow_warm.png"], + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [7, 9], + [11, 9] + ], + "bones": [ + { + "name": "root", + "pivot": [0, 0, -1] + }, + { + "name": "head", + "parent": "root", + "pivot": [0, 20, -9], + "cubes": [ + {"origin": [-4, 16, -15], "size": [8, 8, 6], "uv": [0, 0]}, + {"origin": [-8, 21, -14], "size": [4, 2, 2], "uv": [27, 0]}, + {"origin": [-8, 23, -14], "size": [2, 2, 2], "uv": [39, 0]}, + {"origin": [4, 21, -14], "size": [4, 2, 2], "uv": [27, 0], "mirror": true}, + {"origin": [6, 23, -14], "size": [2, 2, 2], "uv": [39, 0], "mirror": true}, + {"origin": [-3, 16, -16], "size": [6, 3, 1], "uv": [1, 33]} + ] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 19, 1], + "cubes": [ + {"origin": [-6, 29, 14], "size": [12, 18, 10], "pivot": [0, 18, 20], "rotation": [90, 0, 0], "uv": [18, 4]}, + {"origin": [-2, 29, 13], "size": [4, 6, 1], "pivot": [0, 18, 20], "rotation": [90, 0, 0], "uv": [52, 0]} + ] + }, + { + "name": "leg0", + "parent": "root", + "pivot": [-4, 12, 6], + "cubes": [ + {"origin": [-6, 0, 4], "size": [4, 12, 4], "uv": [0, 16]} + ] + }, + { + "name": "leg1", + "parent": "root", + "pivot": [4, 12, 6], + "mirror": true, + "cubes": [ + {"origin": [2, 0, 4], "size": [4, 12, 4], "uv": [0, 16], "mirror": true} + ] + }, + { + "name": "leg2", + "parent": "root", + "pivot": [-4, 12, -7], + "cubes": [ + {"origin": [-6, 0, -8], "size": [4, 12, 4], "uv": [0, 16]} + ] + }, + { + "name": "leg3", + "parent": "root", + "pivot": [4, 12, -7], + "mirror": true, + "cubes": [ + {"origin": [2, 0, -8], "size": [4, 12, 4], "uv": [0, 16], "mirror": true} + ] + } + ] + }`},old:{name:"Classic",model:`{ + "name": "cow", + "texturewidth": 64, + "textureheight": 32, + "eyes": [ + [7, 9], + [11, 9] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 19, 2], + "rotation": [90, 0, 0], + "cubes": [ + {"name": "body", "origin": [-6, 11, -5], "size": [12, 18, 10], "uv": [18, 4]}, + {"name": "body", "origin": [-2, 11, -6], "size": [4, 6, 1], "uv": [52, 0]} + ] + }, + { + "name": "head", + "pivot": [0, 20, -8], + "cubes": [ + {"name": "head", "origin": [-4, 16, -14], "size": [8, 8, 6], "uv": [0, 0]}, + {"name": "head", "origin": [-5, 22, -12], "size": [1, 3, 1], "uv": [22, 0]}, + {"name": "head", "origin": [4, 22, -12], "size": [1, 3, 1], "uv": [22, 0]} + ] + }, + { + "name": "leg0", + "pivot": [-4, 12, 7], + "cubes": [ + {"name": "leg0", "origin": [-6, 0, 5], "size": [4, 12, 4], "uv": [0, 16]} + ] + }, + { + "name": "leg1", + "pivot": [4, 12, 7], + "mirror": true, + "cubes": [ + {"name": "leg1", "origin": [2, 0, 5], "size": [4, 12, 4], "uv": [0, 16]} + ] + }, + { + "name": "leg2", + "pivot": [-4, 12, -6], + "cubes": [ + {"name": "leg2", "origin": [-6, 0, -7], "size": [4, 12, 4], "uv": [0, 16]} + ] + }, + { + "name": "leg3", + "pivot": [4, 12, -6], + "mirror": true, + "cubes": [ + {"name": "leg3", "origin": [2, 0, -7], "size": [4, 12, 4], "uv": [0, 16]} + ] + } + ] + }`}}};bt.cow_baby={display_name:"Cow Baby",model:`{ + "name": "cow_baby", + "texturewidth": 64, + "textureheight": 64, + "external_textures": ["entity/cow/cow_temperate_baby.png"], + "eyes": [ + [5, 25, 1, 1], + [10, 25, 1, 1] + ], + "bones": [ + { + "name": "root", + "pivot": [0, 0, 0] + }, + { + "name": "head", + "parent": "root", + "pivot": [0, 10.43096, -5.16667], + "cubes": [ + {"origin": [-3, 9, -10], "size": [6, 6, 5], "uv": [0, 18]}, + {"origin": [3, 14, -9], "size": [1, 2, 1], "uv": [8, 29]}, + {"origin": [-4, 14, -9], "size": [1, 2, 1], "uv": [4, 29], "mirror": true}, + {"origin": [-2, 9, -11], "size": [4, 3, 1], "uv": [12, 29]} + ] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 9, 0], + "cubes": [ + {"origin": [-4, 6, -6], "size": [8, 6, 12], "uv": [0, 0]} + ] + }, + { + "name": "leg0", + "parent": "root", + "pivot": [-2.475, 6, 3.5], + "cubes": [ + {"origin": [-3.975, 0, 2], "size": [3, 6, 3], "uv": [22, 27]} + ] + }, + { + "name": "leg1", + "parent": "root", + "pivot": [2.475, 6, 3.5], + "cubes": [ + {"origin": [0.975, 0, 2], "size": [3, 6, 3], "uv": [34, 27]} + ] + }, + { + "name": "leg2", + "parent": "root", + "pivot": [-2.475, 6, -3.5], + "cubes": [ + {"origin": [-3.975, 0, -5], "size": [3, 6, 3], "uv": [22, 18]} + ] + }, + { + "name": "leg3", + "parent": "root", + "pivot": [2.475, 6, -3.5], + "cubes": [ + {"origin": [0.975, 0, -5], "size": [3, 6, 3], "uv": [34, 18]} + ] + } + ] + }`};bt.creaking={display_name:"Creaking",model:`{ + "name": "creaking", + "external_textures": ["entity/creaking/creaking.png"], + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [6, 8, 3, 1], + [9, 10, 3, 1], + [7, 13, 3, 1] + ], + "bones": [ + { + "name": "root", + "pivot": [0, 0, 0] + }, + { + "name": "Waist", + "parent": "root", + "pivot": [-1, 19, 0] + }, + { + "name": "head", + "parent": "Waist", + "pivot": [-4, 30, 0], + "cubes": [ + {"origin": [-7, 30, -3], "size": [6, 10, 6], "uv": [0, 0]}, + {"origin": [-7, 40, -3], "size": [6, 3, 6], "uv": [28, 31]}, + {"origin": [-1, 29, 0], "size": [9, 14, 0], "uv": [12, 40]}, + {"origin": [-16, 30, 0], "size": [9, 14, 0], "uv": [34, 12]} + ] + }, + { + "name": "Body", + "parent": "Waist", + "pivot": [-1, 26, 1], + "cubes": [ + {"origin": [-1, 16, -2], "size": [6, 13, 5], "uv": [0, 16]}, + {"origin": [-7, 23, -2], "size": [6, 7, 5], "uv": [24, 0]} + ] + }, + { + "name": "RightArm", + "parent": "Waist", + "pivot": [-8, 28.5, 1.5], + "cubes": [ + {"origin": [-10, 9, 0], "size": [3, 21, 3], "uv": [22, 13]}, + {"origin": [-10, 5, 0], "size": [3, 4, 3], "uv": [46, 0]} + ] + }, + { + "name": "LeftArm", + "parent": "Waist", + "pivot": [5, 28, 0.5], + "cubes": [ + {"origin": [5, 13, -1], "size": [3, 16, 3], "uv": [30, 40]}, + {"origin": [5, 29, -1], "size": [3, 4, 3], "uv": [52, 12]}, + {"origin": [5, 9, -1], "size": [3, 4, 3], "uv": [52, 19]} + ] + }, + { + "name": "LeftLeg", + "parent": "root", + "pivot": [1.5, 16, 0.5], + "cubes": [ + {"origin": [0, 0, -1], "size": [3, 16, 3], "uv": [42, 40]}, + {"origin": [0, 0.3, -4], "size": [5, 0, 9], "uv": [45, 55]} + ] + }, + { + "name": "RightLeg", + "parent": "root", + "pivot": [-1, 17.5, 0.5], + "cubes": [ + {"origin": [-4, 0, -1], "size": [3, 19, 3], "uv": [0, 34]}, + {"origin": [-6, 0.3, -4], "size": [5, 0, 9], "uv": [45, 46]}, + {"origin": [-4, 19, -1], "size": [3, 3, 3], "uv": [12, 34]} + ] + } + ] + }`};bt.creeper={display_name:"Creeper",model:`{ + "name": "creeper", + "external_textures": ["entity/creeper/creeper.png"], + "texturewidth": 64, + "textureheight": 32, + "eyes": [ + [9, 10], + [13, 10] + ], + "bones": [ + { + "name": "Body", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "Body", "origin": [-4, 6, -2], "size": [8, 12, 4], "uv": [16, 16]} + ] + }, + { + "name": "Head", + "parent": "Body", + "pivot": [0, 18, 0], + "cubes": [ + {"name": "Head", "origin": [-4, 18, -4], "size": [8, 8, 8], "uv": [0, 0]} + ] + }, + { + "name": "leg0", + "parent": "Body", + "pivot": [-2, 6, 4], + "cubes": [ + {"name": "leg0", "origin": [-4, 0, 2], "size": [4, 6, 4], "uv": [0, 16]} + ] + }, + { + "name": "leg1", + "parent": "Body", + "pivot": [2, 6, 4], + "cubes": [ + {"name": "leg1", "origin": [0, 0, 2], "size": [4, 6, 4], "uv": [0, 16]} + ] + }, + { + "name": "leg2", + "parent": "Body", + "pivot": [-2, 6, -4], + "cubes": [ + {"name": "leg2", "origin": [-4, 0, -6], "size": [4, 6, 4], "uv": [0, 16]} + ] + }, + { + "name": "leg3", + "parent": "Body", + "pivot": [2, 6, -4], + "cubes": [ + {"name": "leg3", "origin": [0, 0, -6], "size": [4, 6, 4], "uv": [0, 16]} + ] + } + ] + }`};bt.dolphin={display_name:"Dolphin",pose:!0,model_bedrock:`{ + "name": "dolphin", + "external_textures": ["entity/dolphin.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "body", + "pivot": [0, 0, -3], + "cubes": [ + {"name": "body", "origin": [-4, 0, -3], "size": [8, 7, 13], "uv": [0, 13]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 0, -3], + "cubes": [ + {"name": "head", "origin": [-4, 0, -9], "size": [8, 7, 6], "uv": [0, 0]} + ] + }, + { + "name": "nose", + "parent": "head", + "pivot": [0, 0, -13], + "cubes": [ + {"name": "nose", "origin": [-1, 0, -13], "size": [2, 2, 4], "uv": [0, 13]} + ] + }, + { + "name": "tail", + "parent": "body", + "pivot": [0, 2.5, 11], + "pose": [-5, 0, 0], + "cubes": [ + {"name": "tail", "origin": [-2, 0, 10], "size": [4, 5, 11], "uv": [0, 33]} + ] + }, + { + "name": "tail_fin", + "parent": "tail", + "pivot": [0, 2.5, 20], + "pose": [-8, 0, 0], + "cubes": [ + {"name": "tail_fin", "origin": [-5, 2, 19], "size": [10, 1, 6], "uv": [0, 49]} + ] + }, + { + "name": "back_fin", + "parent": "body", + "pivot": [0, 7, 2], + "rotation": [-30, 0, 0], + "cubes": [ + {"name": "back_fin", "origin": [-0.5, 6.25, 1], "size": [1, 5, 4], "uv": [29, 0]} + ] + }, + { + "name": "left_fin", + "parent": "body", + "pivot": [3, 1, -1], + "rotation": [0, -25, 20], + "cubes": [ + {"name": "left_fin", "origin": [3, 1, -2.5], "size": [8, 1, 4], "uv": [40, 0]} + ] + }, + { + "name": "right_fin", + "parent": "body", + "pivot": [-3, 1, -1], + "rotation": [0, 25, -20], + "cubes": [ + {"name": "right_fin", "origin": [-11, 1, -2.5], "size": [8, 1, 4], "uv": [40, 6]} + ] + } + ] + }`,model_java:`{ + "name": "dolphin", + "external_textures": ["entity/dolphin.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "body", + "pivot": [0, 0, -3], + "cubes": [ + {"name": "body", "origin": [-4, 0, -3], "size": [8, 7, 13], "uv": [22, 0]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 0, -3], + "cubes": [ + {"name": "head", "origin": [-4, 0, -9], "size": [8, 7, 6], "uv": [0, 0]} + ] + }, + { + "name": "nose", + "parent": "head", + "pivot": [0, 0, -13], + "cubes": [ + {"name": "nose", "origin": [-1, 0, -13], "size": [2, 2, 4], "uv": [0, 13]} + ] + }, + { + "name": "tail", + "parent": "body", + "pivot": [0, 2.5, 11], + "pose": [-5, 0, 0], + "cubes": [ + {"name": "tail", "origin": [-2, 0, 10], "size": [4, 5, 11], "uv": [0, 19]} + ] + }, + { + "name": "tail_fin", + "parent": "tail", + "pivot": [0, 2.5, 20], + "pose": [-8, 0, 0], + "cubes": [ + {"name": "tail_fin", "origin": [-5, 2, 19], "size": [10, 1, 6], "uv": [19, 20]} + ] + }, + { + "name": "back_fin", + "parent": "body", + "pivot": [0, 7, 2], + "rotation": [60, 0, 0], + "cubes": [ + {"name": "back_fin", "origin": [-0.5, 3.75, 1.5], "size": [1, 4, 5], "uv": [51, 0]} + ] + }, + { + "name": "left_fin", + "parent": "body", + "pivot": [3, 2, 2], + "rotation": [55, 0, 107], + "cubes": [ + {"name": "left_fin", "origin": [3, 2, 0.5], "size": [1, 4, 7], "uv": [48, 20]} + ] + }, + { + "name": "right_fin", + "parent": "body", + "pivot": [-3, 2, 2], + "rotation": [55, 0, -107], + "cubes": [ + {"name": "left_fin", "origin": [-4, 2, 0.5], "size": [1, 4, 7], "uv": [48, 20], "mirror": true} + ] + } + ] + }`};bt.dolphin_baby={display_name:"Dolphin Baby",model:`{ + "name": "dolphin_baby", + "texturewidth": 64, + "textureheight": 64, + "external_textures": ["entity/dolphin/dolphin_baby.png"], + "eyes": [ + [1, 7, 1, 1], + [12, 7, 1, 1] + ], + "bones": [ + { + "name": "body", + "pivot": [-1, 0, -3], + "cubes": [ + {"origin": [-3, 0, -4], "size": [6, 5, 8], "uv": [20, 0]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 1.5, -4], + "cubes": [ + {"origin": [-3, 0, -8], "size": [6, 5, 4], "uv": [0, 0]} + ] + }, + { + "name": "nose", + "parent": "head", + "pivot": [0, 1, -8], + "cubes": [ + {"origin": [-1, 0, -10], "size": [2, 2, 2], "uv": [0, 9]} + ] + }, + { + "name": "tail", + "parent": "body", + "pivot": [0, 1.5, 4], + "cubes": [ + {"origin": [-2, 0, 4], "size": [4, 3, 7], "uv": [0, 13]} + ] + }, + { + "name": "tail_fin", + "parent": "tail", + "pivot": [0, 1.5, 10], + "cubes": [ + {"origin": [-4, 1, 9], "size": [8, 1, 4], "uv": [22, 13]} + ] + }, + { + "name": "back_fin", + "parent": "body", + "pivot": [0, 3.5, -2.7], + "rotation": [50, 0, 0], + "cubes": [ + {"origin": [-0.5, 1.5, -1.7], "size": [1, 3, 4], "uv": [42, 0]} + ] + }, + { + "name": "left_fin", + "parent": "body", + "pivot": [1.8, 1.65001, -2.6], + "rotation": [50, 0, 97.5], + "cubes": [ + {"origin": [1.3, 0.15001, -3.1], "size": [1, 3, 6], "uv": [34, 18]} + ] + }, + { + "name": "right_fin", + "parent": "body", + "pivot": [-1.8, 1.65001, -2.6], + "rotation": [50, 0, -97.5], + "cubes": [ + {"origin": [-2.3, 0.15001, -3.1], "size": [1, 3, 6], "uv": [48, 18], "mirror": true} + ] + } + ] + }`};bt.donkey_baby={display_name:"Donkey / Mule Baby",model:`{ + "name": "donkeymule", + "texturewidth": 64, + "textureheight": 64, + "external_textures": ["entity/horse2/donkey_baby.png"], + "eyes": [ + [3, 10, 1, 1], + [20, 10, 1, 1] + ], + "bones": [ + { + "name": "root", + "pivot": [-1, 0, -3] + }, + { + "name": "Body", + "parent": "root", + "pivot": [0, 10, 0], + "cubes": [ + {"origin": [-4, 8, -7], "size": [8, 6, 14], "uv": [0, 13]} + ] + }, + { + "name": "Tail", + "parent": "root", + "pivot": [0, 11.5, 6.5], + "cubes": [ + {"origin": [-1.5, 10.5, 6], "size": [3, 3, 8], "pivot": [0, 12.5, 6.5], "rotation": [-42.5, 0, 0], "uv": [24, 33]} + ] + }, + { + "name": "LegBL", + "parent": "root", + "pivot": [2.5, 6.5, 5.5], + "cubes": [ + {"origin": [1, 0, 4], "size": [3, 8, 3], "uv": [12, 44]} + ] + }, + { + "name": "LegBR", + "parent": "root", + "pivot": [-2.5, 6.5, 5.5], + "cubes": [ + {"origin": [-4, 0, 4], "size": [3, 8, 3], "uv": [0, 44]} + ] + }, + { + "name": "LegFL", + "parent": "root", + "pivot": [2.5, 6.5, -5.5], + "cubes": [ + {"origin": [1, 0, -7], "size": [3, 8, 3], "uv": [12, 33]} + ] + }, + { + "name": "LegFR", + "parent": "root", + "pivot": [-2.5, 6.5, -5.5], + "cubes": [ + {"origin": [-4, 0, -7], "size": [3, 8, 3], "uv": [0, 33]} + ] + }, + { + "name": "Neck", + "parent": "root", + "pivot": [0, 13, -5], + "cubes": [ + {"origin": [-2, 12, -8], "size": [4, 8, 4], "pivot": [0, 14, -5], "rotation": [22.5, 0, 0], "uv": [30, 9]} + ] + }, + { + "name": "Head", + "parent": "Neck", + "pivot": [0, 19, -7], + "cubes": [ + {"origin": [-3, 19.6, -15.4], "size": [6, 4, 9], "pivot": [0, 20, -7], "rotation": [22.5, 0, 0], "uv": [0, 0]} + ] + }, + { + "name": "left_ear", + "parent": "Head", + "pivot": [2.5, 20.5, -9], + "rotation": [27.5, 0, 27.5], + "cubes": [ + {"origin": [0.03825, 21.28679, -8.59042], "size": [2, 7, 1], "uv": [0, 0]} + ] + }, + { + "name": "right_ear", + "parent": "Head", + "pivot": [-2.5, 20.5, -9], + "rotation": [27.5, 0, -27.5], + "cubes": [ + {"origin": [-2.03825, 21.28679, -8.59042], "size": [2, 7, 1], "uv": [22, 0], "mirror": true} + ] + } + ] + }`};bt.enderdragon={display_name:"Ender Dragon",pose:!0,model:`{ + "name": "enderdragon", + "texturewidth": 256, + "textureheight": 256, + "bones": [ + { + "name": "neck", + "pivot": [0, 7, -8], + "pose": [-5, 0, 0], + "cubes": [ + {"name": "neck", "origin": [-5, 2, -18], "size": [10, 10, 10], "uv": [192, 104]}, + {"name": "neck", "origin": [-1, 12, -16], "size": [2, 4, 6], "uv": [48, 0]} + ] + }, + { + "name": "neck2", + "parent": "neck", + "pivot": [0, 7, -18], + "pose": [5, 0, 0], + "cubes": [ + {"name": "neck", "origin": [-5, 2, -28], "size": [10, 10, 10], "uv": [192, 104]}, + {"name": "neck", "origin": [-1, 12, -26], "size": [2, 4, 6], "uv": [48, 0]} + ] + }, + { + "name": "neck3", + "parent": "neck2", + "pivot": [0, 7, -28], + "pose": [5, 0, 0], + "cubes": [ + {"name": "neck", "origin": [-5, 2, -38], "size": [10, 10, 10], "uv": [192, 104]}, + {"name": "neck", "origin": [-1, 12, -36], "size": [2, 4, 6], "uv": [48, 0]} + ] + }, + { + "name": "neck4", + "parent": "neck3", + "pivot": [0, 7, -38], + "pose": [5, 0, 0], + "cubes": [ + {"name": "neck", "origin": [-5, 2, -48], "size": [10, 10, 10], "uv": [192, 104]}, + {"name": "neck", "origin": [-1, 12, -46], "size": [2, 4, 6], "uv": [48, 0]} + ] + }, + { + "name": "neck5", + "parent": "neck4", + "pivot": [0, 7, -48], + "pose": [5, 0, 0], + "cubes": [ + {"name": "neck", "origin": [-5, 2, -58], "size": [10, 10, 10], "uv": [192, 104]}, + {"name": "neck", "origin": [-1, 12, -56], "size": [2, 4, 6], "uv": [48, 0]} + ] + }, + { + "name": "head", + "parent": "neck5", + "pivot": [0, 7, -58], + "pose": [5, 0, 0], + "cubes": [ + {"name": "head", "origin": [-6, 3, -88], "size": [12, 5, 16], "uv": [176, 44]}, + {"name": "head", "origin": [-8, -1, -74], "size": [16, 16, 16], "uv": [112, 30]}, + {"name": "head", "origin": [-5, 15, -68], "size": [2, 4, 6], "uv": [0, 0], "mirror": true}, + {"name": "head", "origin": [-5, 8, -86], "size": [2, 2, 4], "uv": [112, 0], "mirror": true}, + {"name": "head", "origin": [3, 15, -68], "size": [2, 4, 6], "uv": [0, 0]}, + {"name": "head", "origin": [3, 8, -86], "size": [2, 2, 4], "uv": [112, 0]} + ] + }, + { + "name": "jaw", + "parent": "head", + "pivot": [0, 3, -71], + "pose": [15, 0, 0], + "cubes": [ + {"name": "jaw", "origin": [-6, -1, -88], "size": [12, 4, 16], "uv": [176, 65]} + ] + }, + { + "name": "body", + "pivot": [0, 20, 8], + "cubes": [ + {"name": "body", "origin": [-12, -4, -8], "size": [24, 24, 64], "uv": [0, 0]}, + {"name": "body", "origin": [-1, 20, -2], "size": [2, 6, 12], "uv": [220, 53]}, + {"name": "body", "origin": [-1, 20, 18], "size": [2, 6, 12], "uv": [220, 53]}, + {"name": "body", "origin": [-1, 20, 38], "size": [2, 6, 12], "uv": [220, 53]} + ] + }, + { + "name": "wing", + "pivot": [-12, 19, 2], + "pose": [0, 10, 10], + "cubes": [ + {"name": "wing", "origin": [-68, 15, -2], "size": [56, 8, 8], "uv": [112, 88]}, + {"name": "wing", "origin": [-68, 19, 4], "size": [56, 0, 56], "uv": [-56, 88], "inflate": 0.01} + ] + }, + { + "name": "wingtip", + "parent": "wing", + "pivot": [-68, 19, 0], + "pose": [0, 0, -20], + "cubes": [ + {"name": "wingtip", "origin": [-124, 17, 0], "size": [56, 4, 4], "uv": [112, 136]}, + {"name": "wingtip", "origin": [-124, 19, 4], "size": [56, 0, 56], "uv": [-56, 144], "inflate": 0.01} + ] + }, + { + "name": "wing1", + "pivot": [12, 19, 2], + "pose": [0, -10, -10], + "mirror": true, + "cubes": [ + {"name": "wing1", "origin": [12, 15, -2], "size": [56, 8, 8], "uv": [112, 88]}, + {"name": "wing1", "origin": [12, 19, 4], "size": [56, 0, 56], "uv": [-56, 88], "inflate": 0.01} + ] + }, + { + "name": "wingtip1", + "parent": "wing1", + "pivot": [68, 19, 0], + "pose": [0, 0, 20], + "mirror": true, + "cubes": [ + {"name": "wingtip1", "origin": [68, 17, 0], "size": [56, 4, 4], "uv": [112, 136]}, + {"name": "wingtip1", "origin": [68, 19, 4], "size": [56, 0, 56], "uv": [-56, 144], "inflate": 0.01} + ] + }, + { + "name": "rearleg", + "pivot": [-16, 8, 42], + "rotation": [60, 0, 0], + "cubes": [ + {"name": "rearleg", "origin": [-24, -20, 34], "size": [16, 32, 16], "uv": [0, 0]} + ] + }, + { + "name": "rearlegtip", + "parent": "rearleg", + "pivot": [-16, -20, 43], + "rotation": [25, 0, 0], + "cubes": [ + {"name": "rearlegtip", "origin": [-22, -52, 36], "size": [12, 32, 12], "uv": [196, 0]} + ] + }, + { + "name": "rearfoot", + "parent": "rearlegtip", + "pivot": [-16, -52, 41], + "rotation": [45, 0, 0], + "cubes": [ + {"name": "rearfoot", "origin": [-25, -58, 21], "size": [18, 6, 24], "uv": [112, 0]} + ] + }, + { + "name": "rearleg1", + "pivot": [16, 8, 42], + "rotation": [60, 0, 0], + "mirror": true, + "cubes": [ + {"name": "rearleg1", "origin": [8, -20, 34], "size": [16, 32, 16], "uv": [0, 0]} + ] + }, + { + "name": "rearlegtip1", + "parent": "rearleg1", + "pivot": [16, -20, 43], + "rotation": [25, 0, 0], + "mirror": true, + "cubes": [ + {"name": "rearlegtip", "origin": [10, -52, 36], "size": [12, 32, 12], "uv": [196, 0]} + ] + }, + { + "name": "rearfoot1", + "parent": "rearlegtip1", + "pivot": [16, -52, 41], + "rotation": [45, 0, 0], + "mirror": true, + "cubes": [ + {"name": "rearfoot", "origin": [7, -58, 21], "size": [18, 6, 24], "uv": [112, 0]} + ] + }, + { + "name": "frontleg", + "pivot": [-12, 4, 2], + "rotation": [65, 0, 0], + "cubes": [ + {"name": "frontleg", "origin": [-16, -16, -2], "size": [8, 24, 8], "uv": [112, 104]} + ] + }, + { + "name": "frontlegtip", + "parent": "frontleg", + "pivot": [-12, -16, 2], + "rotation": [-20, 0, 0], + "cubes": [ + {"name": "frontlegtip", "origin": [-15, -39, -1], "size": [6, 24, 6], "uv": [226, 138]} + ] + }, + { + "name": "frontfoot", + "parent": "frontlegtip", + "pivot": [-12, -38, 2], + "rotation": [45, 0, 0], + "cubes": [ + {"name": "frontfoot", "origin": [-16, -42, -10], "size": [8, 4, 16], "uv": [144, 104]} + ] + }, + { + "name": "frontleg1", + "pivot": [12, 4, 2], + "rotation": [65, 0, 0], + "mirror": true, + "cubes": [ + {"name": "frontleg1", "origin": [8, -16, -2], "size": [8, 24, 8], "uv": [112, 104]} + ] + }, + { + "name": "frontlegtip1", + "parent": "frontleg1", + "pivot": [12, -16, 2], + "rotation": [-20, 0, 0], + "mirror": true, + "cubes": [ + {"name": "frontlegtip", "origin": [9, -39, -1], "size": [6, 24, 6], "uv": [226, 138]} + ] + }, + { + "name": "frontfoot1", + "parent": "frontlegtip1", + "pivot": [12, -38, 2], + "rotation": [45, 0, 0], + "mirror": true, + "cubes": [ + {"name": "frontfoot", "origin": [8, -42, -10], "size": [8, 4, 16], "uv": [144, 104]} + ] + }, + { + "name": "tail", + "pivot": [0, 14, 56], + "cubes": [ + {"name": "tail", "origin": [-5, 9, 56], "size": [10, 10, 10], "uv": [192, 104]}, + {"name": "tail", "origin": [-1, 19, 58], "size": [2, 4, 6], "uv": [48, 0]} + ] + }, + { + "name": "tail2", + "parent": "tail", + "pivot": [0, 14, 66], + "pose": [1, 0, 0], + "cubes": [ + {"name": "tail", "origin": [-5, 9, 66], "size": [10, 10, 10], "uv": [192, 104]}, + {"name": "tail", "origin": [-1, 19, 68], "size": [2, 4, 6], "uv": [48, 0]} + ] + }, + { + "name": "tail3", + "parent": "tail2", + "pivot": [0, 14, 76], + "pose": [1, 0, 0], + "cubes": [ + {"name": "tail", "origin": [-5, 9, 76], "size": [10, 10, 10], "uv": [192, 104]}, + {"name": "tail", "origin": [-1, 19, 78], "size": [2, 4, 6], "uv": [48, 0]} + ] + }, + { + "name": "tail4", + "parent": "tail3", + "pivot": [0, 14, 86], + "pose": [1, 0, 0], + "cubes": [ + {"name": "tail", "origin": [-5, 9, 86], "size": [10, 10, 10], "uv": [192, 104]}, + {"name": "tail", "origin": [-1, 19, 88], "size": [2, 4, 6], "uv": [48, 0]} + ] + }, + { + "name": "tail5", + "parent": "tail4", + "pivot": [0, 14, 96], + "pose": [2, 0, 0], + "cubes": [ + {"name": "tail", "origin": [-5, 9, 96], "size": [10, 10, 10], "uv": [192, 104]}, + {"name": "tail", "origin": [-1, 19, 98], "size": [2, 4, 6], "uv": [48, 0]} + ] + }, + { + "name": "tail6", + "parent": "tail5", + "pivot": [0, 14, 106], + "pose": [3, 0, 0], + "cubes": [ + {"name": "tail", "origin": [-5, 9, 106], "size": [10, 10, 10], "uv": [192, 104]}, + {"name": "tail", "origin": [-1, 19, 108], "size": [2, 4, 6], "uv": [48, 0]} + ] + }, + { + "name": "tail7", + "parent": "tail6", + "pivot": [0, 14, 116], + "pose": [3, 0, 0], + "cubes": [ + {"name": "tail", "origin": [-5, 9, 116], "size": [10, 10, 10], "uv": [192, 104]}, + {"name": "tail", "origin": [-1, 19, 118], "size": [2, 4, 6], "uv": [48, 0]} + ] + }, + { + "name": "tail8", + "parent": "tail7", + "pivot": [0, 14, 126], + "pose": [1, 0, 0], + "cubes": [ + {"name": "tail", "origin": [-5, 9, 126], "size": [10, 10, 10], "uv": [192, 104]}, + {"name": "tail", "origin": [-1, 19, 128], "size": [2, 4, 6], "uv": [48, 0]} + ] + }, + { + "name": "tail9", + "parent": "tail8", + "pivot": [0, 14, 136], + "pose": [-1, 0, 0], + "cubes": [ + {"name": "tail", "origin": [-5, 9, 136], "size": [10, 10, 10], "uv": [192, 104]}, + {"name": "tail", "origin": [-1, 19, 138], "size": [2, 4, 6], "uv": [48, 0]} + ] + }, + { + "name": "tail10", + "parent": "tail9", + "pivot": [0, 14, 146], + "pose": [-2, 0, 0], + "cubes": [ + {"name": "tail", "origin": [-5, 9, 146], "size": [10, 10, 10], "uv": [192, 104]}, + {"name": "tail", "origin": [-1, 19, 148], "size": [2, 4, 6], "uv": [48, 0]} + ] + }, + { + "name": "tail11", + "parent": "tail10", + "pivot": [0, 14, 156], + "pose": [-3, 0, 0], + "cubes": [ + {"name": "tail", "origin": [-5, 9, 156], "size": [10, 10, 10], "uv": [192, 104]}, + {"name": "tail", "origin": [-1, 19, 158], "size": [2, 4, 6], "uv": [48, 0]} + ] + }, + { + "name": "tail12", + "parent": "tail11", + "pivot": [0, 14, 166], + "pose": [-3, 0, 0], + "cubes": [ + {"name": "tail", "origin": [-5, 9, 166], "size": [10, 10, 10], "uv": [192, 104]}, + {"name": "tail", "origin": [-1, 19, 168], "size": [2, 4, 6], "uv": [48, 0]} + ] + } + ] + }`};bt.enderman={display_name:"Enderman",model:`{ + "name": "enderman", + "texturewidth": 64, + "textureheight": 32, + "bones": [ + { + "name": "Head", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Head", "origin": [-4, 40, -4], "size": [8, 8, 8], "uv": [0, 0], "inflate": -0.5}, + {"name": "Head layer", "origin": [-4, 38, -4], "size": [8, 8, 8], "uv": [0, 16], "inflate": -0.5, "layer": true} + ] + }, + { + "name": "Body", + "pivot": [0, 38, 0], + "cubes": [ + {"name": "Body", "origin": [-4, 26, -2], "size": [8, 12, 4], "uv": [32, 16]} + ] + }, + { + "name": "RightArm", + "pivot": [-3, 36, 0], + "cubes": [ + {"name": "RightArm", "origin": [-6, 8, -1], "size": [2, 30, 2], "uv": [56, 0]} + ] + }, + { + "name": "LeftArm", + "pivot": [5, 36, 0], + "mirror": true, + "cubes": [ + {"name": "LeftArm", "origin": [4, 8, -1], "size": [2, 30, 2], "uv": [56, 0]} + ] + }, + { + "name": "RightLeg", + "pivot": [-2, 26, 0], + "cubes": [ + {"name": "RightLeg", "origin": [-3, -4, -1], "size": [2, 30, 2], "uv": [56, 0]} + ] + }, + { + "name": "LeftLeg", + "pivot": [2, 26, 0], + "mirror": true, + "cubes": [ + {"name": "LeftLeg", "origin": [1, -4, -1], "size": [2, 30, 2], "uv": [56, 0]} + ] + } + ] + }`};bt.endermite={display_name:"Endermite",model:`{ + "name": "endermite", + "external_textures": ["entity/endermite.png"], + "texturewidth": 64, + "textureheight": 32, + "bones": [ + { + "name": "section_2", + "pivot": [0, 0, 2.5], + "cubes": [ + {"name": "section_2", "origin": [-1.5, 0, 2.5], "size": [3, 3, 1], "uv": [0, 14]} + ] + }, + { + "name": "section_0", + "parent": "section_2", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "section_0", "origin": [-2, 0, -4.4], "size": [4, 3, 2], "uv": [0, 0]} + ] + }, + { + "name": "section_1", + "parent": "section_2", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "section_1", "origin": [-3, 0, -2.4], "size": [6, 4, 5], "uv": [0, 5]} + ] + }, + { + "name": "section_3", + "parent": "section_2", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "section_3", "origin": [-0.5, 0, 3.5], "size": [1, 2, 1], "uv": [0, 18]} + ] + } + ] + }`};bt.evocation_fang={display_name:"Evocation Fang",model:`{ + "name": "evocation_fang", + "external_textures": ["entity/illager/fangs.png"], + "texturewidth": 64, + "textureheight": 32, + "bones": [ + { + "name": "base", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "base", "origin": [-5, 0, -5], "size": [10, 12, 10], "uv": [0, 0]} + ] + }, + { + "name": "upper_jaw", + "parent": "base", + "pivot": [0, 11, 0], + "rotation": [0, 180, -150], + "cubes": [ + {"name": "upper_jaw", "origin": [-1.5, -4, -4], "size": [4, 14, 8], "uv": [40, 0], "inflate": 0.01} + ] + }, + { + "name": "lower_jaw", + "parent": "base", + "pivot": [0, 11, 0], + "rotation": [0, 0, 150], + "cubes": [ + {"name": "lower_jaw", "origin": [-1.5, -4, -4], "size": [4, 14, 8], "uv": [40, 0]} + ] + } + ] + }`};bt.evoker={display_name:"Evoker",model:`{ + "name": "evoker", + "external_textures": ["entity/illager/evoker.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "body", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "body", "origin": [-4, 12, -3], "size": [8, 12, 6], "uv": [16, 20]}, + {"name": "body", "origin": [-4, 6, -3], "size": [8, 18, 6], "uv": [0, 38], "inflate": 0.5} + ] + }, + { + "name": "Head", + "parent": "body", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Head", "origin": [-4, 24, -4], "size": [8, 10, 8], "uv": [0, 0]} + ] + }, + { + "name": "nose", + "parent": "Head", + "pivot": [0, 26, 0], + "cubes": [ + {"name": "nose", "origin": [-1, 23, -6], "size": [2, 4, 2], "uv": [24, 0]} + ] + }, + { + "name": "arms", + "parent": "body", + "pivot": [0, 22, 0], + "cubes": [ + {"name": "arms", "origin": [-8, 16, -2], "size": [4, 8, 4], "uv": [44, 22]}, + {"name": "arms", "origin": [4, 16, -2], "size": [4, 8, 4], "uv": [44, 22]}, + {"name": "arms", "origin": [-4, 16, -2], "size": [8, 4, 4], "uv": [40, 38]} + ] + }, + { + "name": "leg0", + "parent": "body", + "pivot": [-2, 12, 0], + "cubes": [ + {"name": "leg0", "origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} + ] + }, + { + "name": "leg1", + "parent": "body", + "pivot": [2, 12, 0], + "mirror": true, + "cubes": [ + {"name": "leg1", "origin": [0, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} + ] + }, + { + "name": "RightArm", + "parent": "body", + "pivot": [-5, 22, 0], + "cubes": [ + {"name": "RightArm", "origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 46]} + ] + }, + { + "name": "LeftArm", + "parent": "body", + "pivot": [5, 22, 0], + "mirror": true, + "cubes": [ + {"name": "LeftArm", "origin": [4, 12, -2], "size": [4, 12, 4], "uv": [40, 46]} + ] + } + ] + }`};bt.fox={display_name:"Fox",model_bedrock:`{ + "name": "fox", + "external_textures": ["entity/fox/fox.png"], + "texturewidth": 64, + "textureheight": 32, + "bones": [ + { + "name": "body", + "pivot": [0, 8, 0], + "rotation": [90, 0, 0], + "cubes": [ + {"name": "body", "origin": [-3, 0, -3], "size": [6, 11, 6], "uv": [30, 15]} + ] + }, + { + "name": "head", + "pivot": [0, 8, -3], + "cubes": [ + {"name": "head", "origin": [-4, 4, -9], "size": [8, 6, 6], "uv": [0, 0]}, + {"name": "head", "origin": [-4, 10, -8], "size": [2, 2, 1], "uv": [0, 0]}, + {"name": "head", "origin": [2, 10, -8], "size": [2, 2, 1], "uv": [22, 0]}, + {"name": "head", "origin": [-2, 4, -12], "size": [4, 2, 3], "uv": [0, 24]}, + {"name": "head_sleeping", "visibility": false, "origin": [-4, 4, -9], "size": [8, 6, 6], "uv": [0, 12]} + ] + }, + { + "name": "leg0", + "pivot": [-3, 6, 6], + "cubes": [ + {"name": "leg0", "origin": [-3.005, 0, 5], "size": [2, 6, 2], "uv": [14, 24]} + ] + }, + { + "name": "leg1", + "pivot": [1, 6, 6], + "cubes": [ + {"name": "leg1", "origin": [1.005, 0, 5], "size": [2, 6, 2], "uv": [22, 24]} + ] + }, + { + "name": "leg2", + "pivot": [-3, 6, -1], + "cubes": [ + {"name": "leg2", "origin": [-3.005, 0, -2], "size": [2, 6, 2], "uv": [14, 24]} + ] + }, + { + "name": "leg3", + "pivot": [1, 6, -1], + "cubes": [ + {"name": "leg3", "origin": [1.005, 0, -2], "size": [2, 6, 2], "uv": [22, 24]} + ] + }, + { + "name": "tail", + "pivot": [0, 8, 7], + "rotation": [90, 0, 0], + "cubes": [ + {"name": "tail", "origin": [-2, -2, 4.75], "size": [4, 9, 5], "uv": [28, 0]} + ] + } + ] + }`,model_java:`{ + "name": "fox", + "texturewidth": 48, + "textureheight": 32, + "bones": [ + { + "name": "body", + "pivot": [0, 8, 0], + "rotation": [90, 0, 0], + "cubes": [ + {"name": "body", "origin": [-3, 0, -3], "size": [6, 11, 6], "uv": [24, 15]} + ] + }, + { + "name": "head", + "pivot": [0, 8, -3], + "cubes": [ + {"name": "head", "origin": [-4, 4, -9], "size": [8, 6, 6], "uv": [1, 5]}, + {"name": "head", "origin": [-4, 10, -8], "size": [2, 2, 1], "uv": [8, 1]}, + {"name": "head", "origin": [2, 10, -8], "size": [2, 2, 1], "uv": [15, 1]}, + {"name": "head", "origin": [-2, 4, -12], "size": [4, 2, 3], "uv": [6, 18]} + ] + }, + { + "name": "leg0", + "pivot": [-3, 6, 6], + "cubes": [ + {"name": "leg0", "origin": [-3.005, 0, 5], "size": [2, 6, 2], "uv": [13, 24]} + ] + }, + { + "name": "leg1", + "pivot": [1, 6, 6], + "cubes": [ + {"name": "leg1", "origin": [1.005, 0, 5], "size": [2, 6, 2], "uv": [4, 24]} + ] + }, + { + "name": "leg2", + "pivot": [-3, 6, -1], + "cubes": [ + {"name": "leg2", "origin": [-3.005, 0, -2], "size": [2, 6, 2], "uv": [13, 24]} + ] + }, + { + "name": "leg3", + "pivot": [1, 6, -1], + "cubes": [ + {"name": "leg3", "origin": [1.005, 0, -2], "size": [2, 6, 2], "uv": [4, 24]} + ] + }, + { + "name": "tail", + "pivot": [0, 8, 7], + "rotation": [90, 0, 0], + "cubes": [ + {"name": "tail", "origin": [-2, -2, 4.75], "size": [4, 9, 5], "uv": [30, 0]} + ] + } + ] + }`};bt.fox_baby={display_name:"Fox Baby",model:`{ + "name": "fox_baby", + "texturewidth": 32, + "textureheight": 32, + "eyes": [ + [6, 7, 1, 1], + [9, 7, 1, 1] + ], + "bones": [ + { + "name": "root", + "pivot": [0, 0, 0] + }, + { + "name": "head", + "parent": "root", + "pivot": [0, 5.875, 0.125], + "cubes": [ + {"origin": [-3, 3, -5], "size": [6, 5, 5], "uv": [0, 0]}, + {"origin": [-1, 3, -7], "size": [2, 2, 2], "uv": [18, 20]}, + {"origin": [-3, 8, -4], "size": [2, 2, 1], "uv": [22, 8]}, + {"origin": [1, 8, -4], "size": [2, 2, 1], "uv": [22, 11]} + ] + }, + { + "name": "held_item", + "parent": "head", + "pivot": [-2.25, 2.3, -9] + }, + { + "name": "leg0", + "parent": "root", + "pivot": [-1.5, 2, 4], + "cubes": [ + {"origin": [-2.5, 0, 3], "size": [2, 2, 2], "uv": [22, 4]} + ] + }, + { + "name": "leg1", + "parent": "root", + "pivot": [1.5, 2, 4], + "cubes": [ + {"origin": [0.5, 0, 3], "size": [2, 2, 2], "uv": [22, 0]} + ] + }, + { + "name": "leg2", + "parent": "root", + "pivot": [-1.5, 2, 0], + "cubes": [ + {"origin": [-2.5, 0, -1], "size": [2, 2, 2], "uv": [22, 4]} + ] + }, + { + "name": "leg3", + "parent": "root", + "pivot": [1.5, 2, 0], + "cubes": [ + {"origin": [0.5, 0, -1], "size": [2, 2, 2], "uv": [22, 0]} + ] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 4, 2], + "cubes": [ + {"origin": [-2.5, 2, -1], "size": [5, 4, 6], "uv": [0, 10]} + ] + }, + { + "name": "lead", + "parent": "body", + "pivot": [0, 3, -2] + }, + { + "name": "tail", + "parent": "body", + "pivot": [0, 4.5, 5], + "cubes": [ + {"origin": [-1.5, 2.98, 4], "size": [3, 3, 6], "uv": [0, 20]} + ] + } + ] + }`};bt.frog={display_name:"Frog",model:`{ + "name": "frog", + "external_textures": ["entity/frog/temperate_frog.png"], + "texturewidth": 48, + "textureheight": 48, + "eyes": [ + [2, 4, 5, 1], + [2, 9, 5, 1] + ], + "bones": [ + { + "name": "root", + "pivot": [0, 0, 0] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 2, 4], + "cubes": [ + {"origin": [-3.5, 1, -4], "size": [7, 3, 9], "uv": [3, 1]}, + {"origin": [-3.5, 3, -4], "size": [7, 0, 9], "uv": [23, 22]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 4, 3], + "cubes": [ + {"origin": [-3.5, 5, -4], "size": [7, 0, 9], "uv": [23, 13]}, + {"origin": [-3.5, 3, -4], "size": [7, 3, 9], "uv": [0, 13]} + ] + }, + { + "name": "eyes", + "parent": "head", + "pivot": [-0.5, 4, 5] + }, + { + "name": "right_eye", + "parent": "eyes", + "pivot": [-2, 7, -1.5], + "cubes": [ + {"origin": [-3.5, 6, -3], "size": [3, 2, 3], "uv": [0, 0]} + ] + }, + { + "name": "left_eye", + "parent": "eyes", + "pivot": [2, 7, -1.5], + "cubes": [ + {"origin": [0.5, 6, -3], "size": [3, 2, 3], "uv": [0, 5]} + ] + }, + { + "name": "croaking_body", + "parent": "body", + "pivot": [0, 3, -1], + "cubes": [ + {"origin": [-3.5, 1.1, -3.9], "size": [7, 2, 3], "inflate": -0.1, "uv": [26, 5]} + ] + }, + { + "name": "tongue", + "parent": "body", + "pivot": [0, 3.1, 5], + "cubes": [ + {"origin": [-2, 3.1, -2.1], "size": [4, 0, 7], "uv": [17, 13]} + ] + }, + { + "name": "left_arm", + "parent": "body", + "pivot": [4, 3, -2.5], + "cubes": [ + {"origin": [3, 0, -3.5], "size": [2, 3, 3], "uv": [0, 32]}, + {"origin": [0, -0.01, -7.5], "size": [8, 0, 8], "uv": [18, 40], "layer": true} + ] + }, + { + "name": "right_arm", + "parent": "body", + "pivot": [-4, 3, -2.5], + "cubes": [ + {"origin": [-5, 0, -3.5], "size": [2, 3, 3], "uv": [0, 38]}, + {"origin": [-8, -0.01, -7.5], "size": [8, 0, 8], "uv": [2, 40], "layer": true} + ] + }, + { + "name": "left_leg", + "parent": "root", + "pivot": [3.5, 3, 4], + "cubes": [ + {"origin": [2.5, 0, 2], "size": [3, 3, 4], "uv": [14, 25]}, + {"origin": [1.5, -0.01, 0], "size": [8, 0, 8], "uv": [2, 32], "layer": true} + ] + }, + { + "name": "right_leg", + "parent": "root", + "pivot": [-3.5, 3, 4], + "cubes": [ + {"origin": [-5.5, 0, 2], "size": [3, 3, 4], "uv": [0, 25]}, + {"origin": [-9.5, -0.01, 0], "size": [8, 0, 8], "uv": [18, 32], "layer": true} + ] + } + ] + }`};bt.ghast={display_name:"Ghast",model:`{ + "name": "ghast", + "external_textures": ["entity/ghast/ghast.png"], + "texturewidth": 64, + "textureheight": 32, + "default_resolution": 32, + "eyes": [ + [19, 21, 3, 1], + [26, 21, 3, 1] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 8, 0], + "cubes": [ + {"name": "body", "origin": [-8, 0, -8], "size": [16, 16, 16], "uv": [0, 0]} + ] + }, + { + "name": "tentacles_0", + "parent": "body", + "pivot": [-3.8, 1, -5], + "cubes": [ + {"name": "tentacles_0", "origin": [-4.8, -8, -6], "size": [2, 9, 2], "uv": [0, 0]} + ] + }, + { + "name": "tentacles_1", + "parent": "body", + "pivot": [1.3, 1, -5], + "cubes": [ + {"name": "tentacles_1", "origin": [0.3, -10, -6], "size": [2, 11, 2], "uv": [0, 0]} + ] + }, + { + "name": "tentacles_2", + "parent": "body", + "pivot": [6.3, 1, -5], + "cubes": [ + {"name": "tentacles_2", "origin": [5.3, -7, -6], "size": [2, 8, 2], "uv": [0, 0]} + ] + }, + { + "name": "tentacles_3", + "parent": "body", + "pivot": [-6.3, 1, 0], + "cubes": [ + {"name": "tentacles_3", "origin": [-7.3, -8, -1], "size": [2, 9, 2], "uv": [0, 0]} + ] + }, + { + "name": "tentacles_4", + "parent": "body", + "pivot": [-1.3, 1, 0], + "cubes": [ + {"name": "tentacles_4", "origin": [-2.3, -12, -1], "size": [2, 13, 2], "uv": [0, 0]} + ] + }, + { + "name": "tentacles_5", + "parent": "body", + "pivot": [3.8, 1, 0], + "cubes": [ + {"name": "tentacles_5", "origin": [2.8, -10, -1], "size": [2, 11, 2], "uv": [0, 0]} + ] + }, + { + "name": "tentacles_6", + "parent": "body", + "pivot": [-3.8, 1, 5], + "cubes": [ + {"name": "tentacles_6", "origin": [-4.8, -11, 4], "size": [2, 12, 2], "uv": [0, 0]} + ] + }, + { + "name": "tentacles_7", + "parent": "body", + "pivot": [1.3, 1, 5], + "cubes": [ + {"name": "tentacles_7", "origin": [0.3, -11, 4], "size": [2, 12, 2], "uv": [0, 0]} + ] + }, + { + "name": "tentacles_8", + "parent": "body", + "pivot": [6.3, 1, 5], + "cubes": [ + {"name": "tentacles_8", "origin": [5.3, -12, 4], "size": [2, 13, 2], "uv": [0, 0]} + ] + } + ] + }`};bt.goat={display_name:"Goat",model:`{ + "name": "goat", + "external_textures": ["entity/goat/goat.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "left_back_leg", + "pivot": [1, 10, 4], + "cubes": [ + {"origin": [1, 0, 4], "size": [3, 6, 3], "uv": [36, 29]} + ] + }, + { + "name": "right_back_leg", + "pivot": [-3, 10, 4], + "cubes": [ + {"origin": [-3, 0, 4], "size": [3, 6, 3], "uv": [49, 29]} + ] + }, + { + "name": "right_front_leg", + "pivot": [-3, 10, -6], + "cubes": [ + {"origin": [-3, 0, -6], "size": [3, 10, 3], "uv": [49, 2]} + ] + }, + { + "name": "left_front_leg", + "pivot": [1, 10, -6], + "cubes": [ + {"origin": [1, 0, -6], "size": [3, 10, 3], "uv": [35, 2]} + ] + }, + { + "name": "body", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-4, 6, -7], "size": [9, 11, 16], "uv": [1, 1]}, + {"origin": [-5, 4, -8], "size": [11, 14, 11], "uv": [0, 28]} + ] + }, + { + "name": "Head", + "pivot": [1, 10, 0], + "cubes": [ + {"origin": [-2, 15, -16], "size": [5, 7, 10], "pivot": [1, 18, -8], "rotation": [55, 0, 0], "uv": [34, 46]}, + {"origin": [-1.99, 19, -10], "size": [2, 7, 2], "uv": [12, 55]}, + {"origin": [0.99, 19, -10], "size": [2, 7, 2], "uv": [12, 55]}, + {"origin": [3, 19, -10], "size": [3, 2, 1], "uv": [2, 61], "mirror": true}, + {"origin": [-5, 19, -10], "size": [3, 2, 1], "uv": [2, 61]}, + {"origin": [0.5, 6, -14], "size": [0, 7, 5], "uv": [23, 52]} + ] + }, + { + "name": "Head Main", + "parent": "Head", + "pivot": [1, 18, -8], + "rotation": [55, 0, 0], + "cubes": [ + {"origin": [-2, 15, -16], "size": [5, 7, 10], "pivot": [1, 18, -8], "uv": [34, 46]} + ] + } + ] + }`};bt.goat_baby={display_name:"Goat Baby",model:`{ + "name": "goat_baby", + "texturewidth": 64, + "textureheight": 64, + "external_textures": ["entity/goat/goat_baby.png"], + "eyes": [ + [2, 7, 1, 1], + [13, 7, 1, 1] + ], + "bones": [ + { + "name": "left_back_leg", + "pivot": [1.5, 4.5, 3], + "cubes": [ + {"origin": [0.5, 0, 2], "size": [2, 5, 2], "uv": [29, 12]} + ] + }, + { + "name": "right_back_leg", + "pivot": [-1.5, 4.5, 3], + "cubes": [ + {"origin": [-2.5, 0, 2], "size": [2, 5, 2], "uv": [21, 12]} + ] + }, + { + "name": "right_front_leg", + "pivot": [-1.5, 4.5, -2], + "cubes": [ + {"origin": [-2.5, 0, -3], "size": [2, 5, 2], "uv": [21, 5]} + ] + }, + { + "name": "left_front_leg", + "pivot": [1.5, 4.5, -2], + "cubes": [ + {"origin": [0.5, 0, -3], "size": [2, 5, 2], "uv": [29, 5]} + ] + }, + { + "name": "body", + "pivot": [0, 6.2, 0], + "cubes": [ + {"origin": [-3, 3.5, -4.5], "size": [6, 5, 9], "uv": [0, 10]}, + {"origin": [-2.5, 4.4, -4], "size": [5, 4, 8], "uv": [0, 24]} + ] + }, + { + "name": "head", + "pivot": [0, 10.5, -3], + "rotation": [25, 0, 0], + "cubes": [ + {"origin": [-2, 8.5, -9], "size": [4, 4, 6], "uv": [0, 0]}, + {"origin": [1.7, 10.5, -4.2], "size": [2, 1, 1], "pivot": [1.7, 11, -3.7], "rotation": [0, 30, 0], "uv": [0, 12]}, + {"origin": [-3.7, 10.5, -4.2], "size": [2, 1, 1], "pivot": [-1.7, 11, -3.7], "rotation": [0, -30, 0], "uv": [0, 12], "mirror": true}, + {"origin": [0.5, 12.5, -3.9], "size": [1, 2, 1], "pivot": [1.5, 12.5, -3.9], "rotation": [-25, 0, 0], "uv": [24, 0]}, + {"origin": [-1.5, 12.5, -3.9], "size": [1, 2, 1], "pivot": [-1.5, 12.5, -3.9], "rotation": [-25, 0, 0], "uv": [24, 0], "mirror": true} + ] + } + ] + }`};bt.guardian={display_name:"Guardian",model:`{ + "name": "guardian", + "external_textures": ["entity/guardian.png"], + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [19, 21, 6, 3] + ], + "bones": [ + { + "name": "head", + "pivot": [0, 0, 0], + "mirror": true, + "cubes": [ + {"name": "head", "origin": [-6, 2, -8], "size": [12, 12, 16], "uv": [0, 0], "mirror": false}, + {"name": "head", "origin": [-8, 2, -6], "size": [2, 12, 12], "uv": [0, 28], "mirror": false}, + {"name": "head", "origin": [6, 2, -6], "size": [2, 12, 12], "uv": [0, 28]}, + {"name": "head", "origin": [-6, 14, -6], "size": [12, 2, 12], "uv": [16, 40]}, + {"name": "head", "origin": [-6, 0, -6], "size": [12, 2, 12], "uv": [16, 40]} + ] + }, + { + "name": "eye", + "parent": "head", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "eye", "origin": [-1, 7, -8.25], "size": [2, 2, 1], "uv": [8, 0]} + ] + }, + { + "name": "tailpart0", + "parent": "head", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "tailpart0", "origin": [-2, 6, 8], "size": [4, 4, 8], "uv": [40, 0]} + ] + }, + { + "name": "tailpart1", + "parent": "tailpart0", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "tailpart1", "origin": [-1.5, 7, 16], "size": [3, 3, 7], "uv": [0, 54]} + ] + }, + { + "name": "tailpart2", + "parent": "tailpart1", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "tailpart2", "origin": [-1, 8, 23], "size": [2, 2, 6], "uv": [41, 32]}, + {"name": "tailpart2", "origin": [0, 4.5, 26], "size": [1, 9, 9], "uv": [25, 19]} + ] + }, + { + "name": "spikepart0", + "parent": "head", + "pivot": [0, 24, 0], + "rotation": [0, 0, 45], + "cubes": [ + {"name": "spikepart0", "origin": [10.25, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} + ] + }, + { + "name": "spikepart1", + "parent": "head", + "pivot": [0, 24, 0], + "rotation": [0, 0, -45], + "cubes": [ + {"name": "spikepart1", "origin": [-12.25, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} + ] + }, + { + "name": "spikepart2", + "parent": "head", + "pivot": [0, 24, 0], + "rotation": [45, 0, 0], + "cubes": [ + {"name": "spikepart2", "origin": [-1, 19.5, -12.25], "size": [2, 9, 2], "uv": [0, 0]} + ] + }, + { + "name": "spikepart3", + "parent": "head", + "pivot": [0, 24, 0], + "rotation": [-45, 0, 0], + "cubes": [ + {"name": "spikepart3", "origin": [-1, 19.5, 10.5], "size": [2, 9, 2], "uv": [0, 0]} + ] + }, + { + "name": "spikepart4", + "parent": "head", + "pivot": [0, 24, 0], + "rotation": [0, 0, 135], + "cubes": [ + {"name": "spikepart4", "origin": [10.25, 42.5, -1], "size": [2, 9, 2], "uv": [0, 0]} + ] + }, + { + "name": "spikepart5", + "parent": "head", + "pivot": [0, 24, 0], + "rotation": [0, 0, -135], + "cubes": [ + {"name": "spikepart5", "origin": [-12.25, 42.5, -1], "size": [2, 9, 2], "uv": [0, 0]} + ] + }, + { + "name": "spikepart6", + "parent": "head", + "pivot": [0, 24, 0], + "rotation": [135, 0, 0], + "cubes": [ + {"name": "spikepart6", "origin": [-1, 43.5, -12.25], "size": [2, 9, 2], "uv": [0, 0]} + ] + }, + { + "name": "spikepart7", + "parent": "head", + "pivot": [0, 24, 0], + "rotation": [-135, 0, 0], + "cubes": [ + {"name": "spikepart7", "origin": [-1, 42.5, 10.25], "size": [2, 9, 2], "uv": [0, 0]} + ] + }, + { + "name": "spikepart8", + "parent": "head", + "pivot": [0, 24, 0], + "rotation": [90, -45, 0], + "cubes": [ + {"name": "spikepart8", "origin": [-1, 32.5, -17], "size": [2, 9, 2], "uv": [0, 0]} + ] + }, + { + "name": "spikepart9", + "parent": "head", + "pivot": [0, 24, 0], + "rotation": [90, 45, 0], + "cubes": [ + {"name": "spikepart8", "origin": [-1, 32.5, -17], "size": [2, 9, 2], "uv": [0, 0]} + ] + }, + { + "name": "spikepart10", + "parent": "head", + "pivot": [0, 24, 0], + "rotation": [90, -135, 0], + "cubes": [ + {"name": "spikepart8", "origin": [-1, 32.5, -17], "size": [2, 9, 2], "uv": [0, 0]} + ] + }, + { + "name": "spikepart11", + "parent": "head", + "pivot": [0, 24, 0], + "rotation": [90, 135, 0], + "cubes": [ + {"name": "spikepart8", "origin": [-1, 32.5, -17], "size": [2, 9, 2], "uv": [0, 0]} + ] + } + ] + }`};bt.happy_ghast={display_name:"Happy Ghast",model:`{ + "name": "happy_ghast", + "external_textures": ["entity/happy_ghast/adult.png"], + "texturewidth": 64, + "textureheight": 64, + "default_resolution": 32, + "eyes": [ + [18, 24, 3, 1], + [27, 24, 3, 1] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-8, 0, -8], "size": [16, 16, 16], "uv": [0, 0]}, + {"origin": [-8, 0, -8], "size": [16, 16, 16], "inflate": -0.5, "uv": [0, 32]} + ] + }, + { + "name": "tentacles_0", + "parent": "body", + "pivot": [-3.8, 1, -5], + "cubes": [ + {"origin": [-4.8, -4, -6], "size": [2, 5, 2], "uv": [0, 0]} + ] + }, + { + "name": "tentacles_1", + "parent": "body", + "pivot": [1.3, 1, -5], + "cubes": [ + {"origin": [0.3, -6, -6], "size": [2, 7, 2], "uv": [0, 0]} + ] + }, + { + "name": "tentacles_2", + "parent": "body", + "pivot": [6.3, 1, -5], + "cubes": [ + {"origin": [5.3, -3, -6], "size": [2, 4, 2], "uv": [0, 0]} + ] + }, + { + "name": "tentacles_3", + "parent": "body", + "pivot": [-6.3, 1, 0], + "cubes": [ + {"origin": [-7.3, -4, -1], "size": [2, 5, 2], "uv": [0, 0]} + ] + }, + { + "name": "tentacles_4", + "parent": "body", + "pivot": [-1.3, 1, 0], + "cubes": [ + {"origin": [-2.3, -4, -1], "size": [2, 5, 2], "uv": [0, 0]} + ] + }, + { + "name": "tentacles_5", + "parent": "body", + "pivot": [3.8, 1, 0], + "cubes": [ + {"origin": [2.8, -6, -1], "size": [2, 7, 2], "uv": [0, 0]} + ] + }, + { + "name": "tentacles_6", + "parent": "body", + "pivot": [-3.8, 1, 5], + "cubes": [ + {"origin": [-4.8, -7, 4], "size": [2, 8, 2], "uv": [0, 0]} + ] + }, + { + "name": "tentacles_7", + "parent": "body", + "pivot": [1.3, 1, 5], + "cubes": [ + {"origin": [0.3, -7, 4], "size": [2, 8, 2], "uv": [0, 0]} + ] + }, + { + "name": "tentacles_8", + "parent": "body", + "pivot": [6.3, 1, 5], + "cubes": [ + {"origin": [5.3, -4, 4], "size": [2, 5, 2], "uv": [0, 0]} + ] + } + ] + }`};bt.harness={display_name:"Happy Ghast Harness",model:`{ + "name": "harness", + "external_textures": ["entity/harness/harness_white.png"], + "texturewidth": 64, + "textureheight": 64, + "default_resolution": 32, + "bones": [ + { + "name": "body", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-8, 0.5, -8], "size": [16, 16, 16], "inflate": 0.5, "uv": [0, 0]} + ] + }, + { + "name": "goggles", + "parent": "body", + "pivot": [0, 11.5, -5.5], + "cubes": [ + {"origin": [-8, 7.5, -8], "size": [16, 5, 5], "inflate": 0.65, "uv": [0, 32]} + ] + } + ] + }`};bt.hoglin={display_name:"Hoglin",model:`{ + "name": "hoglin", + "external_textures": ["entity/hoglin/hoglin.png"], + "texturewidth": 128, + "textureheight": 64, + "bones": [ + { + "name": "body", + "pivot": [0, 19, -3], + "cubes": [ + {"origin": [-8, 11, -7], "size": [16, 14, 26], "inflate": 0.02, "uv": [1, 1]}, + {"origin": [0, 22, -10], "size": [0, 10, 19], "inflate": 0.02, "uv": [90, 33]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 22, -5], + "rotation": [50, 0, 0], + "cubes": [ + {"origin": [-7, 21, -24], "size": [14, 6, 19], "uv": [61, 1]}, + {"origin": [-8, 22, -19], "size": [2, 11, 2], "uv": [1, 13]}, + {"origin": [6, 22, -19], "size": [2, 11, 2], "uv": [1, 13]} + ] + }, + { + "name": "right_ear", + "parent": "head", + "pivot": [-7, 27, -7], + "rotation": [0, 0, -50], + "cubes": [ + {"origin": [-13, 26, -10], "size": [6, 1, 4], "uv": [1, 1]} + ] + }, + { + "name": "left_ear", + "parent": "head", + "pivot": [7, 27, -7], + "rotation": [0, 0, 50], + "cubes": [ + {"origin": [7, 26, -10], "size": [6, 1, 4], "uv": [1, 6]} + ] + }, + { + "name": "leg_back_right", + "pivot": [6, 8, 17], + "cubes": [ + {"origin": [-8, 0, 13], "size": [5, 11, 5], "uv": [21, 45]} + ] + }, + { + "name": "leg_back_left", + "pivot": [-6, 8, 17], + "cubes": [ + {"origin": [3, 0, 13], "size": [5, 11, 5], "uv": [0, 45]} + ] + }, + { + "name": "leg_front_right", + "pivot": [-6, 12, -3], + "cubes": [ + {"origin": [-8, 0, -6], "size": [6, 14, 6], "uv": [66, 42]} + ] + }, + { + "name": "leg_front_left", + "pivot": [6, 12, -3], + "cubes": [ + {"origin": [2, 0, -6], "size": [6, 14, 6], "uv": [41, 42]} + ] + } + ] + }`};bt.hoglin_baby={display_name:"Hoglin Baby",model:`{ + "name": "hoglin_baby", + "texturewidth": 64, + "textureheight": 64, + "external_textures": ["entity/hoglin/hoglin_baby.png"], + "eyes": [ + [13, 4, 2, 2], + [19, 4, 2, 2] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-4, 6, -7], "size": [8, 8, 14], "inflate": 0.02, "uv": [0, 16]}, + {"origin": [0, 12, -8], "size": [0, 6, 11], "inflate": 0.02, "uv": [24, 39]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 11, -7], + "rotation": [50, 0, 0], + "cubes": [ + {"origin": [-5, 9.26046, -17.54701], "size": [10, 4, 12], "uv": [0, 0]}, + {"origin": [-7, 10.09814, -15.48793], "size": [2, 5, 2], "uv": [44, 29]}, + {"origin": [5, 10.09814, -15.48793], "size": [2, 5, 2], "uv": [52, 29]} + ] + }, + { + "name": "right_ear", + "parent": "head", + "pivot": [-5, 12, -8.5], + "rotation": [0, 0, -50], + "cubes": [ + {"origin": [-10.1, 11.5, -10.5], "size": [6, 1, 4], "uv": [32, 5]} + ] + }, + { + "name": "left_ear", + "parent": "head", + "pivot": [5, 12, -8.5], + "rotation": [0, 0, 50], + "cubes": [ + {"origin": [4.1, 11.5, -10.5], "size": [6, 1, 4], "uv": [32, 0], "mirror": true} + ] + }, + { + "name": "leg_back_right", + "parent": "body", + "pivot": [-2.5, 6, 4.5], + "cubes": [ + {"origin": [-4, 0, 3], "size": [3, 6, 3], "uv": [0, 47]} + ] + }, + { + "name": "leg_back_left", + "parent": "body", + "pivot": [2.5, 6, 4.5], + "cubes": [ + {"origin": [1, 0, 3], "size": [3, 6, 3], "uv": [12, 47]} + ] + }, + { + "name": "leg_front_right", + "parent": "body", + "pivot": [-2.5, 6, -4.5], + "cubes": [ + {"origin": [-4, 0, -6], "size": [3, 6, 3], "uv": [0, 38]} + ] + }, + { + "name": "leg_front_left", + "parent": "body", + "pivot": [2.5, 6, -4.5], + "cubes": [ + {"origin": [1, 0, -6], "size": [3, 6, 3], "uv": [12, 38]} + ] + } + ] + }`};bt.horse={display_name:"Horse",model:`{ + "name": "horse", + "external_textures": ["entity/horse2/horse_gray.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "Body", + "pivot": [0, 13, 9], + "cubes": [ + {"name": "Body", "origin": [-5, 11, -11], "size": [10, 10, 22], "uv": [0, 32]} + ] + }, + { + "name": "TailA", + "pivot": [0, 20, 11], + "rotation": [30, 0, 0], + "cubes": [ + {"name": "TailA", "origin": [-1.5, 6, 9], "size": [3, 14, 4], "uv": [42, 36]} + ] + }, + { + "name": "Leg1A", + "pivot": [3, 11, 9], + "cubes": [ + {"name": "Leg1A", "origin": [1, 0, 7], "size": [4, 11, 4], "uv": [48, 21], "mirror": true} + ] + }, + { + "name": "Leg2A", + "pivot": [-3, 11, 9], + "cubes": [ + {"name": "Leg2A", "origin": [-5, 0, 7], "size": [4, 11, 4], "uv": [48, 21]} + ] + }, + { + "name": "Leg3A", + "pivot": [3, 11, -9], + "cubes": [ + {"name": "Leg3A", "origin": [1, 0, -11], "size": [4, 11, 4], "uv": [48, 21], "mirror": true} + ] + }, + { + "name": "Leg4A", + "pivot": [-3, 11, -9], + "cubes": [ + {"name": "Leg4A", "origin": [-5, 0, -11], "size": [4, 11, 4], "uv": [48, 21]} + ] + }, + { + "name": "Head", + "pivot": [0, 28, -11], + "rotation": [30, 0, 0], + "cubes": [ + {"name": "Head", "origin": [-3, 28, -17], "size": [6, 5, 7], "uv": [0, 13]}, + {"name": "UMouth", "origin": [-2, 28, -22], "size": [4, 5, 5], "uv": [0, 25]} + ] + }, + { + "name": "Ear1", + "pivot": [0, 17, -8], + "rotation": [30, 0, 5], + "cubes": [ + {"name": "Ear1", "origin": [-0.5, 32, -5.01], "size": [2, 3, 1], "uv": [19, 16], "mirror": true} + ] + }, + { + "name": "Ear2", + "pivot": [0, 17, -8], + "rotation": [30, 0, -5], + "cubes": [ + {"name": "Ear2", "origin": [-1.5, 32, -5.01], "size": [2, 3, 1], "uv": [19, 16]} + ] + }, + { + "name": "MuleEarL", + "pivot": [0, 17, -8], + "rotation": [30, 0, 15], + "cubes": [ + {"name": "MuleEarL", "visibility": false, "origin": [-3, 32, -5.01], "size": [2, 7, 1], "uv": [0, 12], "mirror": true} + ] + }, + { + "name": "MuleEarR", + "pivot": [0, 17, -8], + "rotation": [30, 0, -15], + "cubes": [ + {"name": "MuleEarR", "visibility": false, "origin": [1, 32, -5.01], "size": [2, 7, 1], "uv": [0, 12]} + ] + }, + { + "name": "Neck", + "pivot": [0, 17, -8], + "rotation": [30, 0, 0], + "cubes": [ + {"name": "Neck", "origin": [-2, 16, -11], "size": [4, 12, 7], "uv": [0, 35]}, + {"name": "Mane", "origin": [-1, 17, -4], "size": [2, 16, 2], "uv": [56, 36]} + ] + }, + { + "name": "Bag1", + "pivot": [-5, 21, 11], + "rotation": [0, -90, 0], + "cubes": [ + {"name": "Bag1", "visibility": false, "origin": [-14, 13, 11], "size": [8, 8, 3], "uv": [26, 21]} + ] + }, + { + "name": "Bag2", + "pivot": [5, 21, 11], + "rotation": [0, 90, 0], + "cubes": [ + {"name": "Bag2", "visibility": false, "origin": [6, 13, 11], "size": [8, 8, 3], "uv": [26, 21], "mirror": true} + ] + }, + { + "name": "Saddle", + "pivot": [0, 22, 2], + "cubes": [ + {"name": "Saddle", "origin": [-5, 12, -3.5], "size": [10, 9, 9], "uv": [26, 0], "inflate": 0.5} + ] + }, + { + "name": "SaddleMouthL", + "pivot": [0, 17, -8], + "rotation": [30, 0, 0], + "cubes": [ + {"name": "SaddleMouthL", "origin": [2, 29, -14], "size": [1, 2, 2], "uv": [29, 5]} + ] + }, + { + "name": "SaddleMouthR", + "pivot": [0, 17, -8], + "rotation": [30, 0, 0], + "cubes": [ + {"name": "SaddleMouthR", "origin": [-3, 29, -14], "size": [1, 2, 2], "uv": [29, 5]} + ] + }, + { + "name": "SaddleMouthLine", + "pivot": [0, 17, -8], + "cubes": [ + {"name": "SaddleMouthLine", "origin": [3.1, 24, -19.5], "size": [0, 3, 16], "uv": [32, 2]} + ] + }, + { + "name": "SaddleMouthLineR", + "pivot": [0, 17, -8], + "cubes": [ + {"name": "SaddleMouthLineR", "origin": [-3.1, 24, -19.5], "size": [0, 3, 16], "uv": [32, 2]} + ] + }, + { + "name": "HeadSaddle", + "pivot": [0, 17, -8], + "rotation": [30, 0, 0], + "cubes": [ + {"name": "HeadSaddle", "origin": [-2, 28, -13], "size": [4, 5, 2], "uv": [19, 0], "inflate": 0.25}, + {"name": "HeadSaddle", "visibility": false, "origin": [-3, 28, -11], "size": [6, 5, 7], "uv": [0, 0], "inflate": 0.25} + ] + } + ] + }`};bt.horse_baby={display_name:"Horse Baby",model:`{ + "name": "horse_baby", + "texturewidth": 64, + "textureheight": 64, + "external_textures": ["entity/horse2/horse_brown_baby.png"], + "eyes": [ + [2, 10, 2, 1], + [20, 10, 2, 1] + ], + "bones": [ + { + "name": "Body", + "pivot": [0, 11.5, 0], + "cubes": [ + {"origin": [-4, 8, -7], "size": [8, 7, 14], "uv": [0, 13]} + ] + }, + { + "name": "Tail", + "parent": "Body", + "pivot": [0, 12.5, 7], + "rotation": [-42.5, 0, 0], + "cubes": [ + {"origin": [-1.5, 11, 6], "size": [3, 3, 8], "uv": [24, 34]} + ] + }, + { + "name": "LegBL", + "parent": "Body", + "pivot": [2.4, 8, 5.4], + "cubes": [ + {"origin": [0.9, 0, 3.9], "size": [3, 9, 3], "uv": [12, 46]} + ] + }, + { + "name": "LegBR", + "parent": "Body", + "pivot": [-2.4, 8, 5.4], + "cubes": [ + {"origin": [-3.9, 0, 3.9], "size": [3, 9, 3], "uv": [0, 46]} + ] + }, + { + "name": "LegFL", + "parent": "Body", + "pivot": [2.4, 8, -5.4], + "cubes": [ + {"origin": [0.9, 0, -6.9], "size": [3, 9, 3], "uv": [12, 34]} + ] + }, + { + "name": "LegFR", + "parent": "Body", + "pivot": [-2.4, 8, -5.4], + "cubes": [ + {"origin": [-3.9, 0, -6.9], "size": [3, 9, 3], "uv": [0, 34]} + ] + }, + { + "name": "Neck", + "parent": "Body", + "pivot": [0, 14, -6], + "rotation": [35, 0, 0], + "cubes": [ + {"origin": [-2, 12, -8], "size": [4, 8, 4], "uv": [30, 0]} + ] + }, + { + "name": "Head", + "parent": "Neck", + "pivot": [0, 20.05164, -6.29505], + "cubes": [ + {"origin": [-3, 20, -13], "size": [6, 4, 9], "uv": [0, 0]} + ] + }, + { + "name": "EarL", + "parent": "Head", + "pivot": [2, 24.3, -4.35], + "rotation": [0, 0, 15], + "cubes": [ + {"origin": [1, 23.8, -5.15], "size": [2, 3, 1], "uv": [0, 4]} + ] + }, + { + "name": "EarR", + "parent": "Head", + "pivot": [-2, 24.3, -4.65], + "rotation": [0, 0, -15], + "cubes": [ + {"origin": [-3, 23.8, -5.15], "size": [2, 3, 1], "uv": [0, 0]} + ] + } + ] + }`};bt.irongolem={display_name:"Iron Golem",model:`{ + "name": "irongolem", + "external_textures": ["entity/iron_golem.png"], + "texturewidth": 128, + "textureheight": 128, + "bones": [ + { + "name": "body", + "pivot": [0, 31, 0], + "cubes": [ + {"name": "body", "origin": [-9, 21, -6], "size": [18, 12, 11], "uv": [0, 40]}, + {"name": "body", "origin": [-4.5, 16, -3], "size": [9, 5, 6], "uv": [0, 70], "inflate": 0.5} + ] + }, + { + "name": "Head", + "parent": "body", + "pivot": [0, 31, -2], + "cubes": [ + {"name": "head", "origin": [-4, 33, -7.5], "size": [8, 10, 8], "uv": [0, 0]}, + {"name": "head", "origin": [-1, 32, -9.5], "size": [2, 4, 2], "uv": [24, 0]} + ] + }, + { + "name": "arm0", + "parent": "body", + "pivot": [0, 31, 0], + "cubes": [ + {"name": "arm0", "origin": [-13, 3.5, -3], "size": [4, 30, 6], "uv": [60, 21]} + ] + }, + { + "name": "arm1", + "parent": "body", + "pivot": [0, 31, 0], + "cubes": [ + {"name": "arm1", "origin": [9, 3.5, -3], "size": [4, 30, 6], "uv": [60, 58]} + ] + }, + { + "name": "leg0", + "parent": "body", + "pivot": [-4, 13, 0], + "cubes": [ + {"name": "leg0", "origin": [-7.5, 0, -3], "size": [6, 16, 5], "uv": [37, 0]} + ] + }, + { + "name": "leg1", + "parent": "body", + "pivot": [5, 13, 0], + "mirror": true, + "cubes": [ + {"name": "leg1", "origin": [1.5, 0, -3], "size": [6, 16, 5], "uv": [60, 0]} + ] + } + ] + }`};bt.llama={display_name:"Llama",model:`{ + "name": "llama", + "external_textures": ["entity/llama/llama.png"], + "texturewidth": 128, + "textureheight": 64, + "eyes": [ + [7, 21], + [11, 21] + ], + "bones": [ + { + "name": "Head", + "pivot": [0, 17, -6], + "cubes": [ + {"name": "head", "origin": [-2, 27, -16], "size": [4, 4, 9], "uv": [0, 0]}, + {"name": "head", "origin": [-4, 15, -12], "size": [8, 18, 6], "uv": [0, 14]}, + {"name": "head", "origin": [-4, 33, -10], "size": [3, 3, 2], "uv": [17, 0]}, + {"name": "head", "origin": [1, 33, -10], "size": [3, 3, 2], "uv": [17, 0]} + ] + }, + { + "name": "chest1", + "pivot": [-8.5, 21, 3], + "rotation": [0, 90, 0], + "cubes": [ + {"name": "chest1", "origin": [-11.5, 13, 3], "size": [8, 8, 3], "uv": [45, 28]} + ] + }, + { + "name": "chest2", + "pivot": [5.5, 21, 3], + "rotation": [0, 90, 0], + "cubes": [ + {"name": "chest2", "origin": [2.5, 13, 3], "size": [8, 8, 3], "uv": [45, 41]} + ] + }, + { + "name": "body", + "pivot": [0, 19, 2], + "rotation": [90, 0, 0], + "cubes": [ + {"name": "body", "origin": [-6, 11, -5], "size": [12, 18, 10], "uv": [29, 0]} + ] + }, + { + "name": "leg0", + "pivot": [-3.5, 14, 6], + "cubes": [ + {"name": "leg0", "origin": [-5.5, 0, 4], "size": [4, 14, 4], "uv": [29, 29]} + ] + }, + { + "name": "leg1", + "pivot": [3.5, 14, 6], + "cubes": [ + {"name": "leg1", "origin": [1.5, 0, 4], "size": [4, 14, 4], "uv": [29, 29]} + ] + }, + { + "name": "leg2", + "pivot": [-3.5, 14, -5], + "cubes": [ + {"name": "leg2", "origin": [-5.5, 0, -7], "size": [4, 14, 4], "uv": [29, 29]} + ] + }, + { + "name": "leg3", + "pivot": [3.5, 14, -5], + "cubes": [ + {"name": "leg3", "origin": [1.5, 0, -7], "size": [4, 14, 4], "uv": [29, 29]} + ] + } + ] + }`};bt.llama_baby={display_name:"Llama Baby",model:`{ + "name": "llama_baby", + "texturewidth": 64, + "textureheight": 64, + "external_textures": ["entity/llama/llama_creamy_baby.png"], + "eyes": [ + [5, 5, 1, 1], + [8, 5, 1, 1] + ], + "bones": [ + { + "name": "root", + "pivot": [0, 0, 0] + }, + { + "name": "head", + "parent": "root", + "pivot": [0, 13, -4], + "cubes": [ + {"origin": [-3, 11, -8], "size": [6, 11, 4], "uv": [0, 0]}, + {"origin": [-1.5, 17, -11], "size": [3, 3, 3], "uv": [0, 15]}, + {"origin": [0.5, 22, -7], "size": [2, 2, 2], "uv": [20, 4]}, + {"origin": [-2.5, 22, -7], "size": [2, 2, 2], "uv": [20, 0]} + ] + }, + { + "name": "leg0", + "parent": "root", + "pivot": [-2.5, 8.5, 4.5], + "cubes": [ + {"origin": [-3.9, 0, 3], "size": [3, 8, 3], "uv": [0, 45]} + ] + }, + { + "name": "leg1", + "parent": "root", + "pivot": [2.5, 8.5, 4.5], + "cubes": [ + {"origin": [0.9, 0, 3], "size": [3, 8, 3], "uv": [12, 45]} + ] + }, + { + "name": "leg2", + "parent": "root", + "pivot": [-2.5, 8.5, -3.5], + "cubes": [ + {"origin": [-3.9, 0, -5], "size": [3, 8, 3], "uv": [0, 34]} + ] + }, + { + "name": "leg3", + "parent": "root", + "pivot": [2.5, 8.5, -3.5], + "cubes": [ + {"origin": [0.9, 0, -5], "size": [3, 8, 3], "uv": [12, 34]} + ] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 11, 2.5], + "cubes": [ + {"origin": [-4, 8, -6], "size": [8, 6, 13], "uv": [0, 15]} + ] + } + ] + }`};bt.lavaslime={display_name:"Magma Cube",variants:{new:{name:"New",model:`{ + "name": "magma_cube_v2", + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [9, 26, 2, 1], + [13, 26, 2, 1], + [9, 35, 2, 1], + [13, 35, 2, 1] + ], + "bones": [ + { + "name": "inside", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-2, 2, -2], "size": [4, 4, 4], "uv": [24, 40]} + ] + }, + { + "name": "outside", + "pivot": [0, 24, 0], + "cubes": [ + {"origin": [-4, 7, -4], "size": [8, 1, 8], "uv": [0, 0]}, + {"origin": [-4, 6, -4], "size": [8, 1, 8], "uv": [0, 9]}, + {"origin": [-4, 5, -4], "size": [8, 1, 8], "uv": [0, 18]}, + {"origin": [-4, 4, -4], "size": [8, 1, 8], "uv": [0, 27]}, + {"origin": [-4, 3, -4], "size": [8, 1, 8], "uv": [32, 0]}, + {"origin": [-4, 2, -4], "size": [8, 1, 8], "uv": [32, 9]}, + {"origin": [-4, 1, -4], "size": [8, 1, 8], "uv": [32, 18]}, + {"origin": [-4, 0, -4], "size": [8, 1, 8], "uv": [32, 27]} + ] + } + ] + }`},old:{name:"Classic",model:`{ + "name": "lavaslime", + "texturewidth": 64, + "textureheight": 32, + "eyes": [ + [33, 18, 2, 1], + [37, 18, 2, 1], + [33, 27, 2, 1], + [37, 27, 2, 1] + ], + "bones": [ + { + "name": "insideCube", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "insideCube", "origin": [-2, 2, -2], "size": [4, 4, 4], "uv": [0, 16]} + ] + }, + { + "name": "bodyCube_0", + "parent": "insideCube", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "bodyCube_0", "origin": [-4, 7, -4], "size": [8, 1, 8], "uv": [0, 0]} + ] + }, + { + "name": "bodyCube_1", + "parent": "insideCube", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "bodyCube_1", "origin": [-4, 6, -4], "size": [8, 1, 8], "uv": [0, 1]} + ] + }, + { + "name": "bodyCube_2", + "parent": "insideCube", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "bodyCube_2", "origin": [-4, 5, -4], "size": [8, 1, 8], "uv": [24, 10]} + ] + }, + { + "name": "bodyCube_3", + "parent": "insideCube", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "bodyCube_3", "origin": [-4, 4, -4], "size": [8, 1, 8], "uv": [24, 19]} + ] + }, + { + "name": "bodyCube_4", + "parent": "insideCube", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "bodyCube_4", "origin": [-4, 3, -4], "size": [8, 1, 8], "uv": [0, 4]} + ] + }, + { + "name": "bodyCube_5", + "parent": "insideCube", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "bodyCube_5", "origin": [-4, 2, -4], "size": [8, 1, 8], "uv": [0, 5]} + ] + }, + { + "name": "bodyCube_6", + "parent": "insideCube", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "bodyCube_6", "origin": [-4, 1, -4], "size": [8, 1, 8], "uv": [0, 6]} + ] + }, + { + "name": "bodyCube_7", + "parent": "insideCube", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "bodyCube_7", "origin": [-4, 0, -4], "size": [8, 1, 8], "uv": [0, 7]} + ] + } + ] + }`}}};bt.minecart={display_name:"Minecart",model:`{ + "name": "minecart", + "external_textures": ["entity/minecart.png"], + "texturewidth": 64, + "textureheight": 32, + "bones": [ + { + "name": "bottom", + "pivot": [0, 20, 0], + "rotation": [90, 0, 0], + "mirror": true, + "cubes": [ + {"name": "bottom", "origin": [-10, 12, -20], "size": [20, 16, 2], "uv": [0, 10]} + ] + }, + { + "name": "front", + "pivot": [-9, 25, 0], + "rotation": [0, -90, 0], + "mirror": true, + "cubes": [ + {"name": "front", "origin": [-17, 2, -1], "size": [16, 8, 2], "uv": [0, 0]} + ] + }, + { + "name": "back", + "pivot": [9, 25, 0], + "rotation": [0, 90, 0], + "mirror": true, + "cubes": [ + {"name": "back", "origin": [1, 2, -1], "size": [16, 8, 2], "uv": [0, 0]} + ] + }, + { + "name": "right", + "pivot": [0, 25, -7], + "rotation": [0, -180, 0], + "mirror": true, + "cubes": [ + {"name": "right", "origin": [-8, 2, -8], "size": [16, 8, 2], "uv": [0, 0]} + ] + }, + { + "name": "left", + "pivot": [0, 25, 7], + "mirror": true, + "cubes": [ + {"name": "left", "origin": [-8, 2, 6], "size": [16, 8, 2], "uv": [0, 0]} + ] + } + ] + }`};bt.nautilus={display_name:"Nautilus",model:`{ + "name": "nautilus", + "external_textures": ["entity/nautilus/nautilus.png"], + "texturewidth": 128, + "textureheight": 128, + "eyes": [ + [7, 70, 2, 1], + [29, 70, 2, 1] + ], + "bones": [ + { + "name": "nautilus", + "pivot": [0, -5, -6] + }, + { + "name": "head", + "parent": "nautilus", + "pivot": [0, 8, -1], + "cubes": [ + {"origin": [-7, 8, -8], "size": [14, 10, 16], "uv": [0, 0]}, + {"name": "head_bottom", "origin": [-7, 0, -8], "size": [14, 8, 20], "uv": [0, 26]}, + {"name": "head_back", "origin": [-7, 0, 5], "size": [14, 8, 0], "uv": [48, 26]} + ] + }, + { + "name": "body", + "parent": "nautilus", + "pivot": [0, 3.5, 6.3], + "cubes": [ + {"origin": [-5, 0.01, 3.3], "size": [10, 8, 14], "uv": [0, 54]}, + {"name": "body_back", "origin": [-5, 0.01, 13.3], "size": [10, 8, 0], "uv": [0, 76]}, + {"name": "mouth_top", "origin": [-5, 4.01, 13.3], "size": [10, 4, 4], "inflate": -0.002, "uv": [54, 54]}, + {"name": "inner_mouth", "origin": [-3, 2.01, 13.3], "size": [6, 4, 4], "uv": [54, 70]}, + {"name": "mouth_bottom", "origin": [-5, -0.01, 13.3], "size": [10, 4, 4], "inflate": -0.002, "uv": [54, 62]} + ] + } + ] + }`};bt.nautilus_baby={display_name:"Nautilus Baby",model:`{ + "name": "nautilus_baby", + "external_textures": ["entity/nautilus/nautilus_baby.png"], + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [3, 32, 1, 1], + [15, 32, 1, 1] + ], + "bones": [ + { + "name": "nautilus_baby", + "pivot": [0, -4, 0] + }, + { + "name": "head", + "parent": "nautilus_baby", + "pivot": [-2.5, 4, -2.5], + "cubes": [ + {"origin": [-3.5, 4, -3.5], "size": [7, 4, 7], "uv": [0, 0]}, + {"name": "head_bottom", "origin": [-3.5, 0, -3.5], "size": [7, 4, 9], "uv": [0, 11]}, + {"name": "head_back", "origin": [-3.5, 0, 2.5], "size": [7, 4, 0], "uv": [23, 11]} + ] + }, + { + "name": "body", + "parent": "nautilus_baby", + "pivot": [0, 1, 2.5], + "cubes": [ + {"origin": [-2.5, 0.01, 1.5], "size": [5, 4, 7], "uv": [0, 24]}, + {"name": "body_back", "origin": [-2.5, 0.01, 6.6], "size": [5, 4, 0], "uv": [0, 35]}, + {"name": "mouth_top", "origin": [-2.5, 2.01, 6.4], "size": [5, 2, 2], "inflate": -0.002, "uv": [24, 24]}, + {"name": "inner_mouth", "origin": [-1.5, 1.01, 6.4], "size": [3, 2, 2], "uv": [24, 32]}, + {"name": "mouth_bottom", "origin": [-2.5, 0.01, 6.4], "size": [5, 2, 2], "inflate": -0.002, "uv": [24, 28]} + ] + } + ] + }`};bt.panda={display_name:"Panda",model:`{ + "name": "panda", + "external_textures": ["entity/panda/panda.png"], + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [11, 19, 2, 1], + [18, 19, 2, 1] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 14, 0], + "rotation": [90, 0, 0], + "cubes": [ + {"name": "body", "origin": [-9.5, 1, -6.5], "size": [19, 26, 13], "uv": [0, 25]} + ] + }, + { + "name": "head", + "pivot": [0, 12.5, -17], + "cubes": [ + {"name": "head", "origin": [-6.5, 7.5, -21], "size": [13, 10, 9], "uv": [0, 6]}, + {"name": "head", "origin": [-3.5, 7.5, -23], "size": [7, 5, 2], "uv": [45, 16]}, + {"name": "head", "origin": [-8.5, 16.5, -18], "size": [5, 4, 1], "uv": [52, 25]}, + {"name": "head", "origin": [3.5, 16.5, -18], "size": [5, 4, 1], "uv": [52, 25]} + ] + }, + { + "name": "leg0", + "pivot": [-5.5, 9, 9], + "cubes": [ + {"name": "leg0", "origin": [-8.5, 0, 6], "size": [6, 9, 6], "uv": [40, 0]} + ] + }, + { + "name": "leg1", + "pivot": [5.5, 9, 9], + "cubes": [ + {"name": "leg1", "origin": [2.5, 0, 6], "size": [6, 9, 6], "uv": [40, 0]} + ] + }, + { + "name": "leg2", + "pivot": [-5.5, 9, -9], + "cubes": [ + {"name": "leg2", "origin": [-8.5, 0, -12], "size": [6, 9, 6], "uv": [40, 0]} + ] + }, + { + "name": "leg3", + "pivot": [5.5, 9, -9], + "cubes": [ + {"name": "leg3", "origin": [2.5, 0, -12], "size": [6, 9, 6], "uv": [40, 0]} + ] + } + ] + }`};bt.panda_baby={display_name:"Panda Baby",model:`{ + "name": "panda_baby", + "texturewidth": 64, + "textureheight": 64, + "external_textures": ["entity/panda/panda_baby.png"], + "eyes": [ + [6, 8, 1, 1], + [10, 8, 1, 1] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 5.5, 2.5], + "cubes": [ + {"origin": [-4.5, 2, -3], "size": [9, 7, 11], "uv": [0, 11]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 5, -3], + "cubes": [ + {"origin": [-3.5, 2, -8], "size": [7, 6, 5], "uv": [0, 0]}, + {"origin": [-2, 2, -9], "size": [4, 2, 1], "uv": [24, 6]}, + {"origin": [-4.5, 6, -6.5], "size": [3, 3, 1], "uv": [24, 0]}, + {"origin": [1.5, 6, -6.5], "size": [3, 3, 1], "uv": [33, 0]} + ] + }, + { + "name": "leg0", + "parent": "body", + "pivot": [-3, 2, 6.5], + "cubes": [ + {"origin": [-4.4975, 0, 4.975], "size": [3, 2, 3], "uv": [0, 34]} + ] + }, + { + "name": "leg1", + "parent": "body", + "pivot": [3, 2, 6.5], + "cubes": [ + {"origin": [1.4975, 0, 4.975], "size": [3, 2, 3], "uv": [12, 34]} + ] + }, + { + "name": "leg2", + "parent": "body", + "pivot": [-3, 2, -1.5], + "cubes": [ + {"origin": [-4.475, 0, -2.975], "size": [3, 2, 3], "uv": [0, 29]} + ] + }, + { + "name": "leg3", + "parent": "body", + "pivot": [3, 2, -1.5], + "cubes": [ + {"origin": [1.475, 0, -2.975], "size": [3, 2, 3], "uv": [12, 29]} + ] + } + ] + }`};bt.parrot={display_name:"Parrot",model_bedrock:`{ + "name": "parrot", + "external_textures": ["entity/parrot/parrot_red_blue.png"], + "texturewidth": 32, + "textureheight": 32, + "bones": [ + { + "name": "body", + "pivot": [0, 7.5, -3], + "rotation": [25, 0, 0], + "cubes": [ + {"name": "body", "origin": [-1.5, 1.5, -4.5], "size": [3, 6, 3], "uv": [2, 8]} + ] + }, + { + "name": "wing0", + "parent": "body", + "pivot": [1.5, 7.1, -2.8], + "rotation": [10, 0, 0], + "cubes": [ + {"name": "wing0", "origin": [1, 2.1, -4.3], "size": [1, 5, 3], "uv": [19, 8]} + ] + }, + { + "name": "wing1", + "parent": "body", + "pivot": [-1.5, 7.1, -2.8], + "rotation": [10, 0, 0], + "cubes": [ + {"name": "wing1", "origin": [-2, 2.1, -4.3], "size": [1, 5, 3], "uv": [19, 8]} + ] + }, + { + "name": "head", + "pivot": [0, 8.3, -2.8], + "cubes": [ + {"name": "head", "origin": [-1, 6.8, -3.8], "size": [2, 3, 2], "uv": [2, 2]}, + {"name": "head2", "origin": [-1, 9.8, -5.8], "size": [2, 1, 4], "uv": [10, 0]}, + {"name": "beak1", "origin": [-0.5, 7.8, -4.7], "size": [1, 2, 1], "uv": [11, 7]}, + {"name": "beak2", "origin": [-0.5, 8.1, -5.7], "size": [1, 1.7, 1], "uv": [16, 7]}, + {"name": "feather", "origin": [0, 9.1, -4.9], "size": [0, 5, 4], "uv": [2, 18]} + ] + }, + { + "name": "tail", + "pivot": [0, 2.9, 1.2], + "rotation": [50, 0, 0], + "cubes": [ + {"name": "tail", "origin": [-1.5, -0.1, 0.2], "size": [3, 4, 1], "uv": [22, 1]} + ] + }, + { + "name": "leg0", + "pivot": [1.5, 1, -0.5], + "cubes": [ + {"name": "leg0", "origin": [0.5, -0.5, -1.5], "size": [1, 2, 1], "uv": [14, 18]} + ] + }, + { + "name": "leg1", + "pivot": [-0.5, 1, -0.5], + "cubes": [ + {"name": "leg1", "origin": [-1.5, -0.5, -1.5], "size": [1, 2, 1], "uv": [14, 18]} + ] + } + ] + }`,model_java:`{ + "name": "parrot", + "external_textures": ["entity/parrot/parrot_red_blue.png"], + "texturewidth": 32, + "textureheight": 32, + "bones": [ + { + "name": "body", + "pivot": [0, 7.5, -3], + "rotation": [25, 0, 0], + "cubes": [ + {"origin": [-1.5, 1.5, -4.5], "size": [3, 6, 3], "uv": [2, 8]} + ] + }, + { + "name": "wing0", + "parent": "body", + "pivot": [1.5, 7.1, -2.8], + "rotation": [10, 0, 0], + "cubes": [ + {"origin": [1, 2.1, -4.3], "size": [1, 5, 3], "uv": [19, 8]} + ] + }, + { + "name": "wing1", + "parent": "body", + "pivot": [-1.5, 7.1, -2.8], + "rotation": [10, 0, 0], + "cubes": [ + {"origin": [-2, 2.1, -4.3], "size": [1, 5, 3], "uv": [19, 8]} + ] + }, + { + "name": "head", + "pivot": [0, 8.3, -2.8], + "cubes": [ + {"origin": [-1, 6.8, -3.8], "size": [2, 3, 2], "uv": [2, 2]}, + {"origin": [-1, 9.8, -5.8], "size": [2, 1, 4], "uv": [10, 0]}, + {"origin": [-0.5, 7.8, -4.7], "size": [1, 2, 1], "uv": [11, 7]}, + {"origin": [-0.5, 8.035, -5.64], "size": [1, 2.025, 1], "uv": [16, 7]}, + {"origin": [0, 9.1, -4.9], "size": [0, 5, 4], "uv": [2, 18]} + ] + }, + { + "name": "tail", + "pivot": [0, 2.9, 1.2], + "rotation": [50, 0, 0], + "cubes": [ + {"origin": [-1.5, -0.1, 0.2], "size": [3, 4, 1], "uv": [22, 1]} + ] + }, + { + "name": "leg0", + "pivot": [1.5, 1, -0.5], + "cubes": [ + {"origin": [0.5, -0.5, -1.5], "size": [1, 2, 1], "uv": [14, 18]} + ] + }, + { + "name": "leg1", + "pivot": [-0.5, 1, -0.5], + "cubes": [ + {"origin": [-1.5, -0.5, -1.5], "size": [1, 2, 1], "uv": [14, 18]} + ] + } + ] + }`};bt.phantom={display_name:"Phantom",model:`{ + "name": "phantom", + "external_textures": ["entity/phantom.tga"], + "eyes": [ + [5, 6, 2, 1], + [10, 6, 2, 1] + ], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "body", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "body", "origin": [-3, 23, -8], "size": [5, 3, 9], "uv": [0, 8]} + ] + }, + { + "name": "wing0", + "parent": "body", + "pivot": [2, 26, -8], + "rotation": [0, 0, 5], + "cubes": [ + {"name": "wing0", "origin": [2, 24, -8], "size": [6, 2, 9], "uv": [23, 12]} + ] + }, + { + "name": "wingtip0", + "parent": "wing0", + "pivot": [8, 26, -8], + "rotation": [0, 0, 10], + "cubes": [ + {"name": "wingtip0", "origin": [8, 25, -8], "size": [13, 1, 9], "uv": [16, 24]} + ] + }, + { + "name": "wing1", + "parent": "body", + "pivot": [-3, 26, -8], + "rotation": [0, 0, -5], + "mirror": true, + "cubes": [ + {"name": "wing1", "origin": [-9, 24, -8], "size": [6, 2, 9], "uv": [23, 12]} + ] + }, + { + "name": "wingtip1", + "parent": "wing1", + "pivot": [-9, 26, -8], + "rotation": [0, 0, -10], + "mirror": true, + "cubes": [ + {"name": "wingtip1", "origin": [-22, 25, -8], "size": [13, 1, 9], "uv": [16, 24]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 23, -7], + "cubes": [ + {"name": "head", "origin": [-4, 22, -12], "size": [7, 3, 5], "uv": [0, 0]} + ] + }, + { + "name": "tail", + "parent": "body", + "pivot": [0, 26, 1], + "rotation": [-5, 0, 0], + "cubes": [ + {"name": "tail", "origin": [-2, 24, 1], "size": [3, 2, 6], "uv": [3, 20]} + ] + }, + { + "name": "tailtip", + "parent": "tail", + "pivot": [0, 25.5, 7], + "rotation": [-5, 0, 0], + "cubes": [ + {"name": "tailtip", "origin": [-1, 24.5, 7], "size": [1, 1, 6], "uv": [4, 29]} + ] + } + ] + }`};bt.pig={display_name:"Pig",variants:{new:{name:"New",model:`{ + "name": "pig", + "external_textures": ["entity/pig/pig_v3.png"], + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [8, 11, 2, 1], + [14, 11, 2, 1] + ], + "bones": [ + { + "name": "root", + "pivot": [0, 0, 0] + }, + { + "name": "head", + "parent": "root", + "pivot": [0, 12, -7], + "cubes": [ + {"origin": [-4, 8, -15], "size": [8, 8, 8], "uv": [0, 0]}, + {"origin": [-2, 9, -16], "size": [4, 3, 1], "uv": [16, 16]} + ] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 11, 9], + "cubes": [ + {"origin": [-5, 13, 4], "size": [10, 16, 8], "pivot": [0, 11, 9], "rotation": [90, 0, 0], "uv": [28, 8]}, + {"origin": [-5, 13, 4], "size": [10, 16, 8], "inflate": 0.5, "pivot": [0, 11, 9], "rotation": [90, 0, 0], "uv": [28, 32], "layer": true} + ] + }, + { + "name": "leg0", + "parent": "root", + "pivot": [-3, 6, 6], + "cubes": [ + {"origin": [-5, 0, 4], "size": [4, 6, 4], "uv": [0, 16]} + ] + }, + { + "name": "leg1", + "parent": "root", + "pivot": [3, 6, 6], + "mirror": true, + "cubes": [ + {"origin": [1, 0, 4], "size": [4, 6, 4], "uv": [0, 16], "mirror": true} + ] + }, + { + "name": "leg3", + "parent": "root", + "pivot": [3, 6, -6], + "mirror": true, + "cubes": [ + {"origin": [1, 0, -8], "size": [4, 6, 4], "uv": [0, 16], "mirror": true} + ] + }, + { + "name": "leg2", + "parent": "root", + "pivot": [-3, 6, -6], + "cubes": [ + {"origin": [-5, 0, -8], "size": [4, 6, 4], "uv": [0, 16]} + ] + } + ] + }`},old:{name:"Classic",model:`{ + "name": "pig", + "external_textures": ["entity/pig/pig.png"], + "texturewidth": 64, + "textureheight": 32, + "eyes": [ + [8, 11, 2, 1], + [14, 11, 2, 1] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 13, 2], + "rotation": [90, 0, 0], + "cubes": [ + {"name": "body", "origin": [-5, 7, -5], "size": [10, 16, 8], "uv": [28, 8]} + ] + }, + { + "name": "head", + "pivot": [0, 12, -6], + "cubes": [ + {"name": "head", "origin": [-4, 8, -14], "size": [8, 8, 8], "uv": [0, 0]}, + {"name": "head", "origin": [-2, 9, -15], "size": [4, 3, 1], "uv": [16, 16]} + ] + }, + { + "name": "leg0", + "pivot": [-3, 6, 7], + "cubes": [ + {"name": "leg0", "origin": [-5, 0, 5], "size": [4, 6, 4], "uv": [0, 16]} + ] + }, + { + "name": "leg1", + "pivot": [3, 6, 7], + "mirror": true, + "cubes": [ + {"name": "leg1", "origin": [1, 0, 5], "size": [4, 6, 4], "uv": [0, 16]} + ] + }, + { + "name": "leg2", + "pivot": [-3, 6, -5], + "cubes": [ + {"name": "leg2", "origin": [-5, 0, -7], "size": [4, 6, 4], "uv": [0, 16]} + ] + }, + { + "name": "leg3", + "pivot": [3, 6, -5], + "mirror": true, + "cubes": [ + {"name": "leg3", "origin": [1, 0, -7], "size": [4, 6, 4], "uv": [0, 16]} + ] + } + ] + }`}}};bt.pig_baby={display_name:"Pig Baby",model:`{ + "name": "pig_baby", + "external_textures": ["entity/pig/pig_temperate_baby.png"], + "texturewidth": 32, + "textureheight": 32, + "eyes": [ + [7, 23, 1, 1], + [11, 23, 1, 1] + ], + "bones": [ + { + "name": "root", + "pivot": [0, 0, 0] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 5, 0.5], + "cubes": [ + {"origin": [-3.5, 2, -4], "size": [7, 6, 9], "uv": [0, 0]} + ] + }, + { + "name": "head", + "parent": "root", + "pivot": [0, 5, -2], + "cubes": [ + {"origin": [-3.51, 4, -7], "size": [7.02, 6, 6], "uv": [0, 15]}, + {"origin": [-1.5, 5, -8], "size": [3, 2, 1], "uv": [6, 27]} + ] + }, + { + "name": "leg0", + "parent": "root", + "pivot": [-2.5, 2, 4], + "cubes": [ + {"origin": [-3.475, 0, 3], "size": [2, 2, 2], "uv": [23, 4]} + ] + }, + { + "name": "leg1", + "parent": "root", + "pivot": [2.5, 2, 4], + "cubes": [ + {"origin": [1.475, 0, 3], "size": [2, 2, 2], "uv": [0, 4]} + ] + }, + { + "name": "leg3", + "parent": "root", + "pivot": [2.5, 2, -3], + "cubes": [ + {"origin": [1.475, 0, -4], "size": [2, 2, 2], "uv": [0, 0]} + ] + }, + { + "name": "leg2", + "parent": "root", + "pivot": [-2.5, 2, -3], + "cubes": [ + {"origin": [-3.475, 0, -4], "size": [2, 2, 2], "uv": [23, 0]} + ] + } + ] + }`};bt.piglin={display_name:"Piglin",model:`{ + "name": "piglin", + "external_textures": ["entity/piglin/piglin.png"], + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [10, 11, 1, 1], + [15, 11, 1, 1] + ], + "bones": [ + { + "name": "Body", + "pivot": [0, 24, 0], + "cubes": [ + {"origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]}, + {"origin": [-4, 12, -2], "size": [8, 12, 4], "inflate": 0.25, "uv": [16, 32]} + ] + }, + { + "name": "head", + "pivot": [0, 24, 0], + "cubes": [ + {"origin": [-5, 24, -4], "size": [10, 8, 8], "inflate": -0.02, "uv": [0, 0]}, + {"origin": [-2, 24, -5], "size": [4, 4, 1], "uv": [31, 1]}, + {"origin": [2, 24, -5], "size": [1, 2, 1], "uv": [2, 4]}, + {"origin": [-3, 24, -5], "size": [1, 2, 1], "uv": [2, 0]} + ] + }, + { + "name": "leftear", + "parent": "head", + "pivot": [5, 30, 0], + "rotation": [0, 0, -30], + "cubes": [ + {"origin": [4, 25, -2], "size": [1, 5, 4], "uv": [51, 6]} + ] + }, + { + "name": "rightear", + "parent": "head", + "pivot": [-5, 30, 0], + "rotation": [0, 0, 30], + "cubes": [ + {"origin": [-5, 25, -2], "size": [1, 5, 4], "uv": [39, 6]} + ] + }, + { + "name": "RightArm", + "pivot": [-5, 22, 0], + "cubes": [ + {"origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 16]}, + {"origin": [-8, 12, -2], "size": [4, 12, 4], "inflate": 0.25, "uv": [40, 32]} + ] + }, + { + "name": "LeftArm", + "pivot": [5, 22, 0], + "cubes": [ + {"origin": [4, 12, -2], "size": [4, 12, 4], "uv": [32, 48]}, + {"origin": [4, 12, -2], "size": [4, 12, 4], "inflate": 0.25, "uv": [48, 48]} + ] + }, + { + "name": "RightLeg", + "pivot": [-1.9, 12, 0], + "cubes": [ + {"origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 16]}, + {"origin": [-4, 0, -2], "size": [4, 12, 4], "inflate": 0.25, "uv": [0, 32]} + ] + }, + { + "name": "LeftLeg", + "pivot": [1.9, 12, 0], + "cubes": [ + {"origin": [0, 0, -2], "size": [4, 12, 4], "uv": [16, 48]}, + {"origin": [0, 0, -2], "size": [4, 12, 4], "inflate": 0.25, "uv": [0, 48]} + ] + }, + { + "name": "leftItem", + "pivot": [6, 15, 1] + } + ] + }`};bt.piglin_baby={display_name:"Piglin Baby",model:`{ + "name": "piglin_baby", + "texturewidth": 64, + "textureheight": 64, + "external_textures": ["entity/piglin/piglin_baby.png"], + "eyes": [ + [9, 9, 1, 1], + [13, 9, 1, 1] + ], + "bones": [ + { + "name": "Body", + "pivot": [0, 6, 0], + "cubes": [ + {"origin": [-3, 4, -1], "size": [6, 5, 3], "uv": [0, 13]} + ] + }, + { + "name": "head", + "parent": "Body", + "pivot": [0, 9, 0.5], + "cubes": [ + {"origin": [-1.5, 9, -4], "size": [3, 3, 1], "uv": [21, 30]}, + {"origin": [-4.5, 9, -3], "size": [9, 6, 7], "uv": [0, 0]} + ] + }, + { + "name": "leftear", + "parent": "head", + "pivot": [4.2, 13, 1], + "cubes": [ + {"origin": [4.7, 8.25, -1], "size": [1, 6, 4], "pivot": [5.2, 11.25, 1], "rotation": [0, 0, -35], "uv": [0, 21]} + ] + }, + { + "name": "rightear", + "parent": "head", + "pivot": [-4.2, 13, 1], + "cubes": [ + {"origin": [-5.7, 8.25, -1], "size": [1, 6, 4], "pivot": [-5.2, 11.25, 1], "rotation": [0, 0, 35], "uv": [18, 13]} + ] + }, + { + "name": "LeftArm", + "parent": "Body", + "pivot": [4, 9, 0.5], + "cubes": [ + {"origin": [3, 4, -1], "size": [2, 5, 3], "uv": [28, 13]} + ] + }, + { + "name": "leftItem", + "parent": "LeftArm", + "pivot": [4, 6, 0.5] + }, + { + "name": "RightArm", + "parent": "Body", + "pivot": [-4, 9, 0.5], + "cubes": [ + {"origin": [-5, 4, -1], "size": [2, 5, 3], "uv": [10, 30]} + ] + }, + { + "name": "rightItem", + "parent": "RightArm", + "pivot": [-4, 6, 0.5] + }, + { + "name": "RightLeg", + "parent": "Body", + "pivot": [-1.5, 4, 0.5], + "cubes": [ + {"origin": [-3, 0, -1], "size": [3, 4, 3], "uv": [22, 23]} + ] + }, + { + "name": "LeftLeg", + "parent": "Body", + "pivot": [1.5, 4, 0.5], + "cubes": [ + {"origin": [0, 0, -1], "size": [3, 4, 3], "uv": [10, 23]} + ] + } + ] + }`};bt.pillager={display_name:"Pillager",model:`{ + "name": "pillager", + "external_textures": ["entity/pillager.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "waist", + "pivot": [0, 12, 0] + }, + { + "name": "Body", + "parent": "waist", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "Body", "origin": [-4, 12, -3], "size": [8, 12, 6], "uv": [16, 20]}, + {"name": "Body", "origin": [-4, 6, -3], "size": [8, 18, 6], "uv": [0, 38], "inflate": 0.5} + ] + }, + { + "name": "head", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "head", "origin": [-4, 24, -4], "size": [8, 10, 8], "uv": [0, 0]} + ] + }, + { + "name": "nose", + "parent": "head", + "pivot": [0, 26, 0], + "cubes": [ + {"name": "nose", "origin": [-1, 23, -6], "size": [2, 4, 2], "uv": [24, 0]} + ] + }, + { + "name": "LeftLeg", + "pivot": [2, 12, 0], + "cubes": [ + {"name": "LeftLeg", "origin": [0, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} + ] + }, + { + "name": "RightLeg", + "pivot": [-2, 12, 0], + "mirror": true, + "cubes": [ + {"name": "RightLeg", "origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} + ] + }, + { + "name": "RightArm", + "pivot": [-5, 22, 0], + "cubes": [ + {"name": "RightArm", "origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 46]} + ] + }, + { + "name": "LeftArm", + "pivot": [5, 22, 0], + "mirror": true, + "cubes": [ + {"name": "LeftArm", "origin": [4, 12, -2], "size": [4, 12, 4], "uv": [40, 46]} + ] + } + ] + }`};bt.polar_bear={display_name:"Polar Bear",model:`{ + "name": "polar_bear", + "external_textures": ["entity/polar_bear.png"], + "texturewidth": 128, + "textureheight": 64, + "bones": [ + { + "name": "body", + "pivot": [-2, 15, 12], + "rotation": [90, 0, 0], + "cubes": [ + {"name": "body", "origin": [-7, 14, 5], "size": [14, 14, 11], "uv": [0, 19]}, + {"name": "body", "origin": [-6, 28, 5], "size": [12, 12, 10], "uv": [39, 0]} + ] + }, + { + "name": "head", + "pivot": [0, 14, -16], + "mirror": true, + "cubes": [ + {"name": "head", "origin": [-3.5, 10, -19], "size": [7, 7, 7], "uv": [0, 0], "mirror": false}, + {"name": "head", "origin": [-2.5, 10, -22], "size": [5, 3, 3], "uv": [0, 44], "mirror": false}, + {"name": "head", "origin": [-4.5, 16, -17], "size": [2, 2, 1], "uv": [26, 0], "mirror": false}, + {"name": "head", "origin": [2.5, 16, -17], "size": [2, 2, 1], "uv": [26, 0]} + ] + }, + { + "name": "leg0", + "pivot": [-4.5, 10, 6], + "cubes": [ + {"name": "leg0", "origin": [-6.5, 0, 4], "size": [4, 10, 8], "uv": [50, 22]} + ] + }, + { + "name": "leg1", + "pivot": [4.5, 10, 6], + "cubes": [ + {"name": "leg1", "origin": [2.5, 0, 4], "size": [4, 10, 8], "uv": [50, 22]} + ] + }, + { + "name": "leg2", + "pivot": [-3.5, 10, -8], + "cubes": [ + {"name": "leg2", "origin": [-5.5, 0, -10], "size": [4, 10, 6], "uv": [50, 40]} + ] + }, + { + "name": "leg3", + "pivot": [3.5, 10, -8], + "cubes": [ + {"name": "leg3", "origin": [1.5, 0, -10], "size": [4, 10, 6], "uv": [50, 40]} + ] + } + ] + }`};bt.polar_bear_baby={display_name:"Polar Bear Baby",model:`{ + "name": "polar_bear_baby", + "texturewidth": 64, + "textureheight": 64, + "external_textures": ["entity/polar_bear/polar_bear_baby.png"], + "eyes": [ + [5, 6, 1, 1], + [8, 6, 1, 1] + ], + "bones": [ + { + "name": "root", + "pivot": [0, 0, 0] + }, + { + "name": "head", + "parent": "root", + "pivot": [0, 5.375, -6.75], + "cubes": [ + {"origin": [-3, 3, -10], "size": [6, 5, 4], "uv": [0, 0]}, + {"origin": [-2, 3, -12], "size": [4, 2, 2], "uv": [20, 3]}, + {"origin": [-4, 7, -8.5], "size": [2, 2, 1], "uv": [20, 0]}, + {"origin": [2, 7, -8.5], "size": [2, 2, 1], "uv": [26, 0]} + ] + }, + { + "name": "leg0", + "parent": "root", + "pivot": [-2.5, 2.5, 4.5], + "cubes": [ + {"origin": [-3.975, 0, 3], "size": [3, 3, 3], "uv": [0, 34]} + ] + }, + { + "name": "leg1", + "parent": "root", + "pivot": [2.5, 2.5, 4.5], + "cubes": [ + {"origin": [0.975, 0, 3], "size": [3, 3, 3], "uv": [12, 34]} + ] + }, + { + "name": "leg2", + "parent": "root", + "pivot": [-2.5, 2.5, -4.5], + "cubes": [ + {"origin": [-3.975, 0, -6], "size": [3, 3, 3], "uv": [0, 28]} + ] + }, + { + "name": "leg3", + "parent": "root", + "pivot": [2.5, 2.5, -4.5], + "cubes": [ + {"origin": [0.975, 0, -6], "size": [3, 3, 3], "uv": [12, 28]} + ] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 6.5, 4], + "cubes": [ + {"origin": [-4, 3, -6], "size": [8, 7, 12], "uv": [0, 9]} + ] + } + ] + }`};bt.pufferfish={display_name:"Pufferfish",model:`{ + "name": "pufferfish", + "external_textures": ["entity/fish/pufferfish.png"], + "texturewidth": 32, + "textureheight": 32, + "bones": [ + { + "name": "body_large", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "body", "origin": [-4, 0, -4], "size": [8, 8, 8], "uv": [0, 0]} + ] + }, + { + "name": "leftFin", + "parent": "body_large", + "pivot": [4, 7, 3], + "cubes": [ + {"name": "leftFin", "origin": [4, 6, -2.9904], "size": [2, 1, 2], "uv": [24, 3]} + ] + }, + { + "name": "rightFin", + "parent": "body_large", + "pivot": [-4, 7, 1], + "cubes": [ + {"name": "rightFin", "origin": [-5.9968, 6, -2.992], "size": [2, 1, 2], "uv": [24, 0]} + ] + }, + { + "name": "spines_top_front", + "parent": "body_large", + "pivot": [-4, 8, -4], + "rotation": [45, 0, 0], + "cubes": [ + {"name": "spines_top_front", "origin": [-4, 8, -4], "size": [8, 1, 1], "uv": [14, 16]} + ] + }, + { + "name": "spines_top_mid", + "parent": "body_large", + "pivot": [0, 8, 0], + "cubes": [ + {"name": "spines_top_mid", "origin": [-4, 8, 0], "size": [8, 1, 1], "uv": [14, 16]} + ] + }, + { + "name": "spines_top_back", + "parent": "body_large", + "pivot": [0, 8, 4], + "rotation": [-45, 0, 0], + "cubes": [ + {"name": "spines_top_back", "origin": [-4, 8, 4], "size": [8, 1, 1], "uv": [14, 16]} + ] + }, + { + "name": "spines_bottom_front", + "parent": "body_large", + "pivot": [0, 0, -4], + "rotation": [-45, 0, 0], + "cubes": [ + {"name": "spines_bottom_front", "origin": [-4, -1, -4], "size": [8, 1, 1], "uv": [14, 19]} + ] + }, + { + "name": "spines_bottom_mid", + "parent": "body_large", + "pivot": [0, -1, 0], + "cubes": [ + {"name": "spines_bottom_mid", "origin": [-4, -1, 0], "size": [8, 1, 1], "uv": [14, 19]} + ] + }, + { + "name": "spines_bottom_back", + "parent": "body_large", + "pivot": [0, 0, 4], + "rotation": [45, 0, 0], + "cubes": [ + {"name": "spines_bottom_back", "origin": [-4, -1, 4], "size": [8, 1, 1], "uv": [14, 19]} + ] + }, + { + "name": "spines_left_front", + "parent": "body_large", + "pivot": [4, 0, -4], + "rotation": [0, 45, 0], + "cubes": [ + {"name": "spines_left_front", "origin": [4, 0, -4], "size": [1, 8, 1], "uv": [0, 16]} + ] + }, + { + "name": "spines_left_mid", + "parent": "body_large", + "pivot": [4, 0, 0], + "cubes": [ + {"name": "spines_left_mid", "origin": [4, 0, 0], "size": [1, 8, 1], "uv": [4, 16], "mirror": true} + ] + }, + { + "name": "spines_left_back", + "parent": "body_large", + "pivot": [4, 0, 4], + "rotation": [0, -45, 0], + "cubes": [ + {"name": "spines_left_back", "origin": [4, 0, 4], "size": [1, 8, 1], "uv": [8, 16], "mirror": true} + ] + }, + { + "name": "spines_right_front", + "parent": "body_large", + "pivot": [-4, 0, -4], + "rotation": [0, -45, 0], + "cubes": [ + {"name": "spines_right_front", "origin": [-5, 0, -4], "size": [1, 8, 1], "uv": [4, 16]} + ] + }, + { + "name": "spines_right_mid", + "parent": "body_large", + "pivot": [-4, 0, 0], + "cubes": [ + {"name": "spines_right_mid", "origin": [-5, 0, 0], "size": [1, 8, 1], "uv": [8, 16]} + ] + }, + { + "name": "spines_right_back", + "parent": "body_large", + "pivot": [-4, 0, 4], + "rotation": [0, 45, 0], + "cubes": [ + {"name": "spines_right_back", "origin": [-5, 0, 4], "size": [1, 8, 1], "uv": [8, 16]} + ] + }, + { + "name": "body_mid", + "pivot": [16, 0, 0], + "cubes": [ + {"name": "body", "origin": [13.5, 1, -2.5], "size": [5, 5, 5], "uv": [12, 22]} + ] + }, + { + "name": "leftFin", + "parent": "body_mid", + "pivot": [18.5, 5, 0.5], + "cubes": [ + {"name": "leftFin", "origin": [18.5, 4, -1.5], "size": [2, 1, 2], "uv": [24, 3]} + ] + }, + { + "name": "rightFin", + "parent": "body_mid", + "pivot": [13.5, 5, 0.5], + "cubes": [ + {"name": "rightFin", "origin": [11.5, 4, -1.5], "size": [2, 1, 2], "uv": [24, 0]} + ] + }, + { + "name": "spines_top_front", + "parent": "body_mid", + "pivot": [16, 6, -2.5], + "cubes": [ + {"name": "spines_top_front", "origin": [13.5, 6, -2.5], "size": [5, 1, 0], "uv": [19, 17]} + ] + }, + { + "name": "spines_top_back", + "parent": "body_mid", + "pivot": [16, 6, 2.5], + "cubes": [ + {"name": "spines_top_back", "origin": [13.5, 6, 2.5], "size": [5, 1, 0], "uv": [11, 17]} + ] + }, + { + "name": "spines_bottom_front", + "parent": "body_mid", + "pivot": [16, 1, -2.5], + "cubes": [ + {"name": "spines_bottom_front", "origin": [13.5, 0, -2.5], "size": [5, 1, 0], "uv": [18, 20]} + ] + }, + { + "name": "spines_bottom_back", + "parent": "body_mid", + "pivot": [16, 1, 2.5], + "rotation": [45, 0, 0], + "cubes": [ + {"name": "spines_bottom_back", "origin": [13.5, 0, 2.5], "size": [5, 1, 0], "uv": [18, 20]} + ] + }, + { + "name": "spines_left_front", + "parent": "body_mid", + "pivot": [18.5, 0, -2.5], + "rotation": [0, 45, 0], + "cubes": [ + {"name": "spines_left_front", "origin": [18.5, 1, -2.5], "size": [1, 5, 0], "uv": [1, 17]} + ] + }, + { + "name": "spines_left_back", + "parent": "body_mid", + "pivot": [18.5, 0, 2.5], + "rotation": [0, -45, 0], + "cubes": [ + {"name": "spines_left_back", "origin": [18.5, 1, 2.5], "size": [1, 5, 0], "uv": [1, 17]} + ] + }, + { + "name": "spines_right_front", + "parent": "body_mid", + "pivot": [13.5, 0, -2.5], + "rotation": [0, -45, 0], + "cubes": [ + {"name": "spines_right_front", "origin": [12.5, 1, -2.5], "size": [1, 5, 0], "uv": [5, 17]} + ] + }, + { + "name": "spines_right_back", + "parent": "body_mid", + "pivot": [13.5, 0, 2.5], + "rotation": [0, 45, 0], + "cubes": [ + {"name": "spines_right_back", "origin": [12.5, 1, 2.5], "size": [1, 5, 0], "uv": [9, 17]} + ] + }, + { + "name": "body_small", + "pivot": [-16, 0, 0], + "cubes": [ + {"name": "body", "origin": [-17.5, 0, -1.5], "size": [3, 2, 3], "uv": [0, 27]}, + {"name": "body", "origin": [-15.5, 2, -1.5], "size": [1, 1, 1], "uv": [24, 6]}, + {"name": "body", "origin": [-17.5, 2, -1.5], "size": [1, 1, 1], "uv": [28, 6]} + ] + }, + { + "name": "tailfin", + "parent": "body_small", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "tailfin", "origin": [-17.5, 1, 1.5], "size": [3, 0, 3], "uv": [-3, 0]} + ] + }, + { + "name": "leftFin", + "parent": "body_small", + "pivot": [6.5, 5, 0.5], + "cubes": [ + {"name": "leftFin", "origin": [-14.5, 0, -1.5], "size": [1, 1, 2], "uv": [25, 0], "mirror": true} + ] + }, + { + "name": "rightFin", + "parent": "body_small", + "pivot": [-6.5, 5, 0.5], + "cubes": [ + {"name": "rightFin", "origin": [-18.5, 0, -1.5], "size": [1, 1, 2], "uv": [25, 0]} + ] + } + ] + }`};bt.rabbit={display_name:"Rabbit",variants:{new:{name:"New",model:`{ + "name": "rabbit_v2", + "texturewidth": 64, + "textureheight": 64, + "external_textures": ["entity/rabbit/rabbit_salt.png"], + "eyes": [ + [6, 22, 1, 2], + [8, 22, 1, 2] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 1, 4], + "rotation": [-22.5, 0, 0], + "cubes": [ + {"origin": [-4, 1, -5], "size": [8, 6, 10], "uv": [0, 0]} + ] + }, + { + "name": "tail", + "parent": "body", + "pivot": [0, 5.99162, 4.01254], + "cubes": [ + {"origin": [-2, 5, 3], "size": [4, 4, 4], "uv": [20, 16]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 6.29289, -4.12132], + "rotation": [22.5, 0, 0], + "cubes": [ + {"origin": [-2.5, 4.29289, -8.12132], "size": [5, 5, 5], "uv": [0, 16]} + ] + }, + { + "name": "left_ear", + "parent": "head", + "pivot": [1.5, 10, -5], + "cubes": [ + {"origin": [0.5, 9.29289, -5.12132], "size": [2, 5, 1], "uv": [32, 0]} + ] + }, + { + "name": "right_ear", + "parent": "head", + "pivot": [-1.5, 10, -5], + "cubes": [ + {"origin": [-2.5, 9.29289, -5.12132], "size": [2, 5, 1], "uv": [26, 0]} + ] + }, + { + "name": "frontlegs", + "parent": "body", + "pivot": [0, 2.53492, -2.31075] + }, + { + "name": "rightFrontLeg", + "parent": "frontlegs", + "pivot": [-2, 0.61104, -1.92807], + "rotation": [22.5, 0, 0], + "cubes": [ + {"origin": [-2.9, -2.38896, -2.82807], "size": [2, 4, 2], "uv": [36, 18]} + ] + }, + { + "name": "leftFrontLeg", + "parent": "frontlegs", + "pivot": [2, 0.61104, -1.82807], + "rotation": [22.5, 0, 0], + "cubes": [ + {"origin": [1, -2.38896, -2.82807], "size": [2, 4, 2], "uv": [44, 18]} + ] + }, + { + "name": "backlegs", + "pivot": [0, 1, 4] + }, + { + "name": "rightBackLeg", + "parent": "backlegs", + "pivot": [-3, 0.5, 4], + "cubes": [ + {"origin": [-4, 0, -1], "size": [2, 1, 6], "pivot": [-3, 1, 4], "rotation": [0, 22.5, 0], "uv": [20, 24]} + ] + }, + { + "name": "leftBackLeg", + "parent": "backlegs", + "pivot": [3, 0.5, 4], + "cubes": [ + {"origin": [2, 0, -1], "size": [2, 1, 6], "pivot": [3, 1, 4], "rotation": [0, -22.5, 0], "uv": [36, 24]} + ] + } + ] + }`},old:{name:"Classic",model:`{ + "name": "rabbit", + "texturewidth": 64, + "textureheight": 32, + "bones": [ + { + "name": "rearFootLeft", + "pivot": [3, 6.5, 3.7], + "mirror": true, + "cubes": [ + {"name": "rearFootLeft", "origin": [2, 0, 0], "size": [2, 1, 7], "uv": [8, 24]} + ] + }, + { + "name": "rearFootRight", + "pivot": [-3, 6.5, 3.7], + "mirror": true, + "cubes": [ + {"name": "rearFootRight", "origin": [-4, 0, 0], "size": [2, 1, 7], "uv": [26, 24]} + ] + }, + { + "name": "haunchLeft", + "pivot": [3, 6.5, 3.7], + "rotation": [-20, 0, 0], + "mirror": true, + "cubes": [ + {"name": "haunchLeft", "origin": [2, 2.5, 3.7], "size": [2, 4, 5], "uv": [16, 15]} + ] + }, + { + "name": "haunchRight", + "pivot": [-3, 6.5, 3.7], + "rotation": [-20, 0, 0], + "mirror": true, + "cubes": [ + {"name": "haunchRight", "origin": [-4, 2.5, 3.7], "size": [2, 4, 5], "uv": [30, 15]} + ] + }, + { + "name": "body", + "pivot": [0, 5, 8], + "rotation": [-20, 0, 0], + "mirror": true, + "cubes": [ + {"name": "body", "origin": [-3, 2, -2], "size": [6, 5, 10], "uv": [0, 0]} + ] + }, + { + "name": "frontLegLeft", + "pivot": [3, 7, -1], + "rotation": [-10, 0, 0], + "mirror": true, + "cubes": [ + {"name": "frontLegLeft", "origin": [2, 0, -2], "size": [2, 7, 2], "uv": [8, 15]} + ] + }, + { + "name": "frontLegRight", + "pivot": [-3, 7, -1], + "rotation": [-10, 0, 0], + "mirror": true, + "cubes": [ + {"name": "frontLegRight", "origin": [-4, 0, -2], "size": [2, 7, 2], "uv": [0, 15]} + ] + }, + { + "name": "head", + "pivot": [0, 8, -1], + "mirror": true, + "cubes": [ + {"name": "head", "origin": [-2.5, 8, -6], "size": [5, 4, 5], "uv": [32, 0]} + ] + }, + { + "name": "earRight", + "pivot": [0, 8, -1], + "rotation": [0, -15, 0], + "mirror": true, + "cubes": [ + {"name": "earRight", "origin": [-2.5, 12, -2], "size": [2, 5, 1], "uv": [58, 0]} + ] + }, + { + "name": "earLeft", + "pivot": [0, 8, -1], + "rotation": [0, 15, 0], + "mirror": true, + "cubes": [ + {"name": "earLeft", "origin": [0.5, 12, -2], "size": [2, 5, 1], "uv": [52, 0]} + ] + }, + { + "name": "tail", + "pivot": [0, 4, 7], + "rotation": [-20, 0, 0], + "mirror": true, + "cubes": [ + {"name": "tail", "origin": [-1.5, 2.5, 7], "size": [3, 3, 2], "uv": [52, 6]} + ] + }, + { + "name": "nose", + "pivot": [0, 8, -1], + "mirror": true, + "cubes": [ + {"name": "nose", "origin": [-0.5, 9.5, -6.5], "size": [1, 1, 1], "uv": [32, 9]} + ] + } + ] + }`}}};bt.rabbit_baby={display_name:"Rabbit Baby",model:`{ + "name": "rabbit_baby", + "texturewidth": 32, + "textureheight": 32, + "external_textures": ["entity/rabbit/rabbit_salt_baby.png"], + "eyes": [ + [5, 5, 1, 2], + [7, 5, 1, 2] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 1, 1.6], + "cubes": [ + {"origin": [-2, 2, -3], "size": [4, 3, 6], "pivot": [0, 3, 0], "rotation": [-30, 0, 0], "uv": [0, 8]} + ] + }, + { + "name": "tail", + "parent": "body", + "pivot": [0, 3.2, 3.6], + "cubes": [ + {"origin": [-1.5, 2.22679, 2.58231], "size": [3, 3, 3], "pivot": [-0.1, 3.2, 3.6], "rotation": [-30, 0, 0], "uv": [0, 21]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 6, -1], + "cubes": [ + {"origin": [-2.5, 5, -4], "size": [5, 4, 4], "uv": [0, 0]} + ] + }, + { + "name": "right_ear", + "parent": "head", + "pivot": [-1.5, 9.5, -1.5], + "cubes": [ + {"origin": [-2.5, 9, -2], "size": [2, 4, 1], "uv": [18, 0]} + ] + }, + { + "name": "left_ear", + "parent": "head", + "pivot": [1.5, 9.5, -1.5], + "cubes": [ + {"origin": [0.5, 9, -2], "size": [2, 4, 1], "uv": [24, 0]} + ] + }, + { + "name": "frontlegs", + "parent": "body", + "pivot": [0, 3.5, -1] + }, + { + "name": "leftFrontLeg", + "parent": "frontlegs", + "pivot": [1, 2.5, -1.5], + "rotation": [22.5, 0, 0], + "cubes": [ + {"origin": [0.5, 0, -2], "size": [1, 3, 1], "pivot": [1, 1.5, -1.5], "rotation": [-22.5, 0, 0], "uv": [18, 8]} + ] + }, + { + "name": "rightFrontLeg", + "parent": "frontlegs", + "pivot": [-1, 2.5, -1.5], + "rotation": [22.5, 0, 0], + "cubes": [ + {"origin": [-1.5, 0, -2], "size": [1, 3, 1], "pivot": [-1, 1.5, -1.5], "rotation": [-22.5, 0, 0], "uv": [14, 8]} + ] + }, + { + "name": "backlegs", + "pivot": [0, 1, 2] + }, + { + "name": "leftBackLeg", + "parent": "backlegs", + "pivot": [1.5, 0.5, 2.5], + "rotation": [0, 180, 0], + "cubes": [ + {"origin": [0.5, 0, 3], "size": [2, 1, 3], "pivot": [2.5, 0.5, 3], "rotation": [0, -45, 0], "uv": [10, 17]} + ] + }, + { + "name": "rightBackLeg", + "parent": "backlegs", + "pivot": [-1.5, 0.5, 2.5], + "rotation": [0, 180, 0], + "cubes": [ + {"origin": [-3, 0, 1.6], "size": [2, 1, 3], "pivot": [-1, 0.5, 1.6], "rotation": [0, 45, 0], "uv": [0, 17]} + ] + } + ] + }`};bt.ravager={display_name:"Ravager",model:`{ + "name": "ravager", + "external_textures": ["entity/illager/ravager.png"], + "texturewidth": 128, + "textureheight": 128, + "bones": [ + { + "name": "body", + "pivot": [0, 19, 2], + "rotation": [90, 0, 0], + "cubes": [ + {"name": "body", "origin": [-7, 10, -2], "size": [14, 16, 20], "uv": [0, 55]}, + {"name": "body", "origin": [-6, -3, -2], "size": [12, 13, 18], "uv": [0, 91]} + ] + }, + { + "name": "neck", + "pivot": [0, 20, -20], + "cubes": [ + {"name": "neck", "origin": [-5, 21, -10], "size": [10, 10, 18], "uv": [68, 73]} + ] + }, + { + "name": "head", + "parent": "neck", + "pivot": [0, 28, -10], + "cubes": [ + {"name": "head", "origin": [-8, 14, -24], "size": [16, 20, 16], "uv": [0, 0]}, + {"name": "head", "origin": [-2, 12, -28], "size": [4, 8, 4], "uv": [0, 0]} + ] + }, + { + "name": "mouth", + "parent": "head", + "pivot": [0, 15, -10], + "cubes": [ + {"name": "mouth", "origin": [-8, 13, -24], "size": [16, 3, 16], "uv": [0, 36]} + ] + }, + { + "name": "horns", + "parent": "head", + "pivot": [-5, 27, -19], + "rotation": [60, 0, 0], + "cubes": [ + {"name": "horns", "origin": [-10, 27, -20], "size": [2, 14, 4], "uv": [74, 55]}, + {"name": "horns", "origin": [8, 27, -20], "size": [2, 14, 4], "uv": [74, 55]} + ] + }, + { + "name": "leg0", + "pivot": [-12, 30, 22], + "cubes": [ + {"name": "leg0", "origin": [-12, 0, 17], "size": [8, 37, 8], "uv": [96, 0]} + ] + }, + { + "name": "leg1", + "pivot": [4, 30, 22], + "cubes": [ + {"name": "leg1", "origin": [4, 0, 17], "size": [8, 37, 8], "uv": [96, 0]} + ] + }, + { + "name": "leg2", + "pivot": [-4, 26, -4], + "cubes": [ + {"name": "leg2", "origin": [-12, 0, -8], "size": [8, 37, 8], "uv": [64, 0]} + ] + }, + { + "name": "leg3", + "pivot": [-4, 26, -4], + "cubes": [ + {"name": "leg3", "origin": [4, 0, -8], "size": [8, 37, 8], "uv": [64, 0]} + ] + } + ] + }`};bt.salmon={display_name:"Salmon",model:`{ + "name": "salmon", + "external_textures": ["entity/fish/salmon.png"], + "texturewidth": 32, + "textureheight": 32, + "bones": [ + { + "name": "body_front", + "pivot": [0, 0, -4], + "cubes": [ + {"name": "body_front", "origin": [-1.5, 3.5, -4], "size": [3, 5, 8], "uv": [0, 0]} + ] + }, + { + "name": "body_back", + "parent": "body_front", + "pivot": [0, 0, 4], + "cubes": [ + {"name": "body_back", "origin": [-1.5, 3.5, 4], "size": [3, 5, 8], "uv": [0, 13]} + ] + }, + { + "name": "dorsal_back", + "parent": "body_back", + "pivot": [0, 5, 4], + "cubes": [ + {"name": "dorsal_back", "origin": [0, 8.5, 4], "size": [0, 2, 3], "uv": [2, 3]} + ] + }, + { + "name": "tailfin", + "parent": "body_back", + "pivot": [0, 0, 12], + "cubes": [ + {"name": "tailfin", "origin": [0, 3.5, 12], "size": [0, 5, 6], "uv": [20, 10]} + ] + }, + { + "name": "dorsal_front", + "parent": "body_front", + "pivot": [0, 5, 2], + "cubes": [ + {"name": "dorsal_front", "origin": [0, 8.5, 2], "size": [0, 2, 2], "uv": [4, 2]} + ] + }, + { + "name": "head", + "parent": "body_front", + "pivot": [0, 3, -4], + "cubes": [ + {"name": "head", "origin": [-1, 4.5, -7], "size": [2, 4, 3], "uv": [22, 0]} + ] + }, + { + "name": "leftFin", + "parent": "body_front", + "pivot": [1.5, 1, -4], + "rotation": [0, 0, 35], + "cubes": [ + {"name": "leftFin", "origin": [-0.50752, 3.86703, -4], "size": [2, 0, 2], "uv": [2, 0]} + ] + }, + { + "name": "rightFin", + "parent": "body_front", + "pivot": [-1.5, 1, -4], + "rotation": [0, 0, -35], + "cubes": [ + {"name": "rightFin", "origin": [-1.49258, 3.86703, -4], "size": [2, 0, 2], "uv": [-2, 0]} + ] + } + ] + }`};bt.sheep={display_name:"Sheep",model:`{ + "name": "sheep", + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "body", + "pivot": [0, 19, 2], + "rotation": [90, 0, 0], + "cubes": [ + {"name": "body", "origin": [-4, 13, -5], "size": [8, 16, 6], "uv": [28, 8]}, + {"name": "body", "origin": [-4, 13, -5], "size": [8, 16, 6], "uv": [28, 40], "inflate": 1.75} + ] + }, + { + "name": "head", + "pivot": [0, 18, -8], + "cubes": [ + {"name": "head", "origin": [-3, 16, -14], "size": [6, 6, 8], "uv": [0, 0]}, + {"name": "head", "origin": [-3, 16, -12], "size": [6, 6, 6], "uv": [0, 32], "inflate": 0.6} + ] + }, + { + "name": "leg0", + "pivot": [-3, 12, 7], + "cubes": [ + {"name": "leg0", "origin": [-5, 0, 5], "size": [4, 12, 4], "uv": [0, 16]}, + {"name": "leg0", "origin": [-5, 6, 5], "size": [4, 6, 4], "uv": [0, 48], "inflate": 0.5} + ] + }, + { + "name": "leg1", + "pivot": [3, 12, 7], + "cubes": [ + {"name": "leg1", "origin": [1, 0, 5], "size": [4, 12, 4], "uv": [0, 16]}, + {"name": "leg1", "origin": [1, 6, 5], "size": [4, 6, 4], "uv": [0, 48], "inflate": 0.5} + ] + }, + { + "name": "leg2", + "pivot": [-3, 12, -5], + "cubes": [ + {"name": "leg2", "origin": [-5, 0, -7], "size": [4, 12, 4], "uv": [0, 16]}, + {"name": "leg2", "origin": [-5, 6, -7], "size": [4, 6, 4], "uv": [0, 48], "inflate": 0.5} + ] + }, + { + "name": "leg3", + "pivot": [3, 12, -5], + "cubes": [ + {"name": "leg3", "origin": [1, 0, -7], "size": [4, 12, 4], "uv": [0, 16]}, + {"name": "leg3", "origin": [1, 6, -7], "size": [4, 6, 4], "uv": [0, 48], "inflate": 0.5} + ] + } + ] + }`};bt.sheep_baby={display_name:"Sheep Baby",model:`{ + "name": "sheep_baby", + "texturewidth": 32, + "textureheight": 32, + "eyes": [ + [5, 7, 1, 1], + [9, 7, 1, 1] + ], + "bones": [ + { + "name": "root", + "pivot": [0, 0, 0] + }, + { + "name": "head", + "parent": "root", + "pivot": [0, 8.5, -2.5], + "cubes": [ + {"origin": [-2.5, 8, -6], "size": [5, 5, 5], "uv": [0, 0]} + ] + }, + { + "name": "leg0", + "parent": "root", + "pivot": [-2, 5, 3], + "cubes": [ + {"origin": [-2.975, 0, 2], "size": [2, 5, 2], "uv": [0, 23]} + ] + }, + { + "name": "leg1", + "parent": "root", + "pivot": [2, 5, 3], + "cubes": [ + {"origin": [0.975, 0, 2], "size": [2, 5, 2], "uv": [24, 12]} + ] + }, + { + "name": "leg2", + "parent": "root", + "pivot": [-2, 5, -2], + "cubes": [ + {"origin": [-2.975, 0, -3], "size": [2, 5, 2], "uv": [8, 23]} + ] + }, + { + "name": "leg3", + "parent": "root", + "pivot": [2, 5, -2], + "cubes": [ + {"origin": [0.975, 0, -3], "size": [2, 5, 2], "uv": [24, 5]} + ] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 8, 2.5], + "cubes": [ + {"origin": [-3, 5, -4], "size": [6, 4, 9], "uv": [0, 10]} + ] + } + ] + }`};bt.shield={display_name:"Shield",model:`{ + "name": "shield", + "external_textures": ["entity/shield.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "shield", + "pivot": [1, 15.5, 3], + "cubes": [ + {"name": "shield", "origin": [0, 25, 0], "size": [2, 6, 6], "uv": [26, 0]}, + {"name": "shield", "origin": [-5, 17, -1], "size": [12, 22, 1], "uv": [0, 0]} + ] + } + ] + }`};bt.shulker={display_name:"Shulker",model:`{ + "name": "shulker", + "external_textures": ["entity/shulker/shulker_white.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "base", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "base", "origin": [-8, 0, -8], "size": [16, 8, 16], "uv": [0, 28]} + ] + }, + { + "name": "lid", + "parent": "base", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "lid", "origin": [-8, 13, -8], "size": [16, 12, 16], "uv": [0, 0]} + ] + }, + { + "name": "head", + "parent": "base", + "pivot": [0, 12, 0], + "cubes": [ + {"name": "head", "origin": [-3, 6, -3], "size": [6, 6, 6], "uv": [0, 52]} + ] + } + ] + }`};bt.shulker_bullet={display_name:"Shulker Bullet",model:`{ + "name": "shulker_bullet", + "external_textures": ["entity/shulker/shulker_white.png"], + "texturewidth": 64, + "textureheight": 32, + "bones": [ + { + "name": "body", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "body", "origin": [-4, -4, -1], "size": [8, 8, 2], "uv": [0, 0]}, + {"name": "body", "origin": [-1, -4, -4], "size": [2, 8, 8], "uv": [0, 10]}, + {"name": "body", "origin": [-4, -1, -4], "size": [8, 2, 8], "uv": [20, 0]} + ] + } + ] + }`};bt.silverfish={display_name:"Silverfish",model:`{ + "name": "silverfish", + "external_textures": ["entity/silverfish.png"], + "texturewidth": 64, + "textureheight": 32, + "bones": [ + { + "name": "bodyPart_2", + "pivot": [0, 4, 1], + "cubes": [ + {"name": "bodyPart_2", "origin": [-3, 0, -0.5], "size": [6, 4, 3], "uv": [0, 9]} + ] + }, + { + "name": "bodyPart_0", + "parent": "bodyPart_2", + "pivot": [0, 2, -3.5], + "cubes": [ + {"name": "bodyPart_0", "origin": [-1.5, 0, -4.5], "size": [3, 2, 2], "uv": [0, 0]} + ] + }, + { + "name": "bodyPart_1", + "parent": "bodyPart_2", + "pivot": [0, 3, -1.5], + "cubes": [ + {"name": "bodyPart_1", "origin": [-2, 0, -2.5], "size": [4, 3, 2], "uv": [0, 4]} + ] + }, + { + "name": "bodyLayer_2", + "parent": "bodyPart_1", + "pivot": [0, 5, -1.5], + "cubes": [ + {"name": "bodyLayer_2", "origin": [-3, 0, -3], "size": [6, 5, 2], "uv": [20, 18], "layer": true} + ] + }, + { + "name": "bodyPart_3", + "parent": "bodyPart_2", + "pivot": [0, 3, 4], + "cubes": [ + {"name": "bodyPart_3", "origin": [-1.5, 0, 2.5], "size": [3, 3, 3], "uv": [0, 16]} + ] + }, + { + "name": "bodyPart_4", + "parent": "bodyPart_2", + "pivot": [0, 2, 7], + "cubes": [ + {"name": "bodyPart_4", "origin": [-1, 0, 5.5], "size": [2, 2, 3], "uv": [0, 22]} + ] + }, + { + "name": "bodyLayer_1", + "parent": "bodyPart_4", + "pivot": [0, 4, 7], + "cubes": [ + {"name": "bodyLayer_1", "origin": [-3, 0, 5.5], "size": [6, 4, 3], "uv": [20, 11], "layer": true} + ] + }, + { + "name": "bodyPart_5", + "parent": "bodyPart_2", + "pivot": [0, 1, 9.5], + "cubes": [ + {"name": "bodyPart_5", "origin": [-1, 0, 8.5], "size": [2, 1, 2], "uv": [11, 0]} + ] + }, + { + "name": "bodyPart_6", + "parent": "bodyPart_2", + "pivot": [0, 1, 11.5], + "cubes": [ + {"name": "bodyPart_6", "origin": [-0.5, 0, 10.5], "size": [1, 1, 2], "uv": [13, 4]} + ] + }, + { + "name": "bodyLayer_0", + "parent": "bodyPart_2", + "pivot": [0, 8, 1], + "cubes": [ + {"name": "bodyLayer_0", "origin": [-5, 0, -0.5], "size": [10, 8, 3], "uv": [20, 0], "layer": true} + ] + } + ] + }`};bt.skeleton={display_name:"Skeleton/Stray",model:`{ + "name": "skeleton", + "external_textures": ["entity/skeleton/skeleton.png"], + "texturewidth": 64, + "textureheight": 32, + "eyes": [ + [9, 12, 2, 1], + [13, 12, 2, 1] + ], + "bones": [ + { + "name": "waist", + "pivot": [0, 12, 0] + }, + { + "name": "Body", + "parent": "waist", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Body", "origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]} + ] + }, + { + "name": "Head", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Head", "origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [0, 0]}, + {"name": "Head Layer", "visibility": false, "origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [32, 0], "inflate": 0.5} + ] + }, + { + "name": "RightArm", + "pivot": [-5, 22, 0], + "cubes": [ + {"name": "RightArm", "origin": [-6, 12, -1], "size": [2, 12, 2], "uv": [40, 16]} + ] + }, + { + "name": "LeftArm", + "pivot": [5, 22, 0], + "mirror": true, + "cubes": [ + {"name": "LeftArm", "origin": [4, 12, -1], "size": [2, 12, 2], "uv": [40, 16]} + ] + }, + { + "name": "leftItem", + "parent": "LeftArm", + "pivot": [6, 15, 1] + }, + { + "name": "RightLeg", + "pivot": [-2, 12, 0], + "cubes": [ + {"name": "RightLeg", "origin": [-3, 0, -1], "size": [2, 12, 2], "uv": [0, 16]} + ] + }, + { + "name": "LeftLeg", + "pivot": [2, 12, 0], + "mirror": true, + "cubes": [ + {"name": "LeftLeg", "origin": [1, 0, -1], "size": [2, 12, 2], "uv": [0, 16]} + ] + } + ] + }`};bt.slime={display_name:"Slime",model:`{ + "name": "slime", + "external_textures": ["entity/slime/slime.png"], + "texturewidth": 64, + "textureheight": 32, + "bones": [ + { + "name": "inner", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "cube", "origin": [-3, 1, -3], "size": [6, 6, 6], "uv": [0, 16]}, + {"name": "eye0", "origin": [-3.3, 4, -3.5], "size": [2, 2, 2], "uv": [32, 0]}, + {"name": "eye1", "origin": [1.3, 4, -3.5], "size": [2, 2, 2], "uv": [32, 4]}, + {"name": "mouth", "origin": [0, 2, -3.5], "size": [1, 1, 1], "uv": [32, 8]} + ] + }, + { + "name": "outer", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "cube layer", "visibility": false, "origin": [-4, 0, -4], "size": [8, 8, 8], "uv": [0, 0], "layer": true}, + {"name": "eye0 layer", "visibility": false, "origin": [-3.3, 4, -3.5], "size": [2, 2, 2], "uv": [32, 0], "layer": true}, + {"name": "eye1 layer", "visibility": false, "origin": [1.3, 4, -3.5], "size": [2, 2, 2], "uv": [32, 4], "layer": true}, + {"name": "mouth layer", "visibility": false, "origin": [0, 2, -3.5], "size": [1, 1, 1], "uv": [32, 8], "layer": true} + ] + } + ] + }`};bt.sniffer={display_name:"Sniffer",model:`{ + "name": "sniffer", + "external_textures": ["entity/sniffer/sniffer.png"], + "texturewidth": 192, + "textureheight": 192, + "eyes": [ + [13, 31, 4, 1], + [34, 31, 4, 1] + ], + "bones": [ + { + "name": "bone", + "pivot": [0, 19, 0] + }, + { + "name": "body", + "parent": "bone", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-12.5, 9, -20], "size": [25, 24, 40], "inflate": 0.5, "uv": [62, 0]}, + {"origin": [-12.5, 4, -20], "size": [25, 29, 40], "uv": [62, 68]}, + {"origin": [-12.5, 8, -20], "size": [25, 0, 40], "uv": [87, 68]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 13.5, -19.4], + "cubes": [ + {"origin": [-6.5, 3, -30.9], "size": [13, 18, 11], "uv": [8, 15]}, + {"origin": [-6.5, 6, -30.9], "size": [13, 0, 11], "uv": [8, 4]} + ] + }, + { + "name": "left_ear", + "parent": "head", + "pivot": [6.4, 21, -23.9], + "cubes": [ + {"origin": [6.4, 2, -26.9], "size": [1, 19, 7], "uv": [2, 0]} + ] + }, + { + "name": "right_ear", + "parent": "head", + "pivot": [-6.4, 21, -23.9], + "cubes": [ + {"origin": [-7.4, 2, -26.9], "size": [1, 19, 7], "uv": [48, 0]} + ] + }, + { + "name": "nose", + "parent": "head", + "pivot": [0, 18, -30.9], + "cubes": [ + {"origin": [-6.5, 18, -39.9], "size": [13, 2, 9], "uv": [10, 45]} + ] + }, + { + "name": "lower_beak", + "parent": "head", + "pivot": [0, 11, -31.9], + "cubes": [ + {"origin": [-6.5, 6, -39.9], "size": [13, 12, 9], "uv": [10, 57]} + ] + }, + { + "name": "right_front_leg", + "parent": "bone", + "pivot": [-7.5, 9, -15], + "cubes": [ + {"origin": [-11, 0, -19], "size": [7, 10, 8], "uv": [32, 87]} + ] + }, + { + "name": "right_mid_leg", + "parent": "bone", + "pivot": [-7.5, 9, 0], + "cubes": [ + {"origin": [-11, 0, -4], "size": [7, 10, 8], "uv": [32, 105]} + ] + }, + { + "name": "right_hind_leg", + "parent": "bone", + "pivot": [-7.5, 9, 15], + "cubes": [ + {"origin": [-11, 0, 11], "size": [7, 10, 8], "uv": [32, 123]} + ] + }, + { + "name": "left_front_leg", + "parent": "bone", + "pivot": [7.5, 9, -15], + "cubes": [ + {"origin": [4, 0, -19], "size": [7, 10, 8], "uv": [0, 87]} + ] + }, + { + "name": "left_mid_leg", + "parent": "bone", + "pivot": [7.5, 9, 0], + "cubes": [ + {"origin": [4, 0, -4], "size": [7, 10, 8], "uv": [0, 105]} + ] + }, + { + "name": "left_hind_leg", + "parent": "bone", + "pivot": [7.5, 9, 15], + "cubes": [ + {"origin": [4, 0, 11], "size": [7, 10, 8], "uv": [0, 123]} + ] + } + ] + }`};bt.snowgolem={display_name:"Snowgolem",model:`{ + "name": "snowgolem", + "external_textures": ["entity/snow_golem.png"], + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [9, 11], + [13, 11] + ], + "bones": [ + { + "name": "piece2", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "piece2", "origin": [-6, 0, -6], "size": [12, 12, 12], "uv": [0, 36], "inflate": -0.5} + ] + }, + { + "name": "piece1", + "parent": "piece2", + "pivot": [0, 11, 0], + "cubes": [ + {"name": "piece1", "origin": [-5, 11, -5], "size": [10, 10, 10], "uv": [0, 16], "inflate": -0.5} + ] + }, + { + "name": "head", + "parent": "piece1", + "pivot": [0, 20, 0], + "cubes": [ + {"name": "head", "origin": [-4, 20, -4], "size": [8, 8, 8], "uv": [0, 0], "inflate": -0.5} + ] + }, + { + "name": "arm1", + "parent": "piece1", + "pivot": [0, 18, 0], + "rotation": [0, 0, 45], + "cubes": [ + {"name": "arm1", "origin": [1, 20, -1], "size": [12, 2, 2], "uv": [32, 0], "inflate": -0.5} + ] + }, + { + "name": "arm2", + "parent": "piece1", + "pivot": [0, 18, 0], + "rotation": [0, 0, 135], + "cubes": [ + {"name": "arm2", "origin": [1, 14, -1], "size": [12, 2, 2], "uv": [32, 0], "inflate": -0.5} + ] + } + ] + }`};bt.spider={display_name:"Spider",model:`{ + "name": "spider", + "texturewidth": 64, + "textureheight": 32, + "bones": [ + { + "name": "head", + "pivot": [0, 9, -3], + "cubes": [ + {"name": "head", "origin": [-4, 5, -11], "size": [8, 8, 8], "uv": [32, 4]} + ] + }, + { + "name": "body0", + "pivot": [0, 9, 0], + "cubes": [ + {"name": "body0", "origin": [-3, 6, -3], "size": [6, 6, 6], "uv": [0, 0]} + ] + }, + { + "name": "body1", + "pivot": [0, 9, 9], + "cubes": [ + {"name": "body1", "origin": [-5, 5, 3], "size": [10, 8, 12], "uv": [0, 12]} + ] + }, + { + "name": "leg0", + "pivot": [-4, 9, 2], + "rotation": [0, 45, -45], + "cubes": [ + {"name": "leg0", "origin": [-19, 8, 1], "size": [16, 2, 2], "uv": [18, 0]} + ] + }, + { + "name": "leg1", + "pivot": [4, 9, 2], + "rotation": [0, -45, 45], + "cubes": [ + {"name": "leg1", "origin": [3, 8, 1], "size": [16, 2, 2], "uv": [18, 0]} + ] + }, + { + "name": "leg2", + "pivot": [-4, 9, 1], + "rotation": [0, 15, -35], + "cubes": [ + {"name": "leg2", "origin": [-19, 8, 0], "size": [16, 2, 2], "uv": [18, 0]} + ] + }, + { + "name": "leg3", + "pivot": [4, 9, 1], + "rotation": [0, -15, 35], + "cubes": [ + {"name": "leg3", "origin": [3, 8, 0], "size": [16, 2, 2], "uv": [18, 0]} + ] + }, + { + "name": "leg4", + "pivot": [-4, 9, 0], + "rotation": [0, -15, -35], + "cubes": [ + {"name": "leg4", "origin": [-19, 8, -1], "size": [16, 2, 2], "uv": [18, 0]} + ] + }, + { + "name": "leg5", + "pivot": [4, 9, 0], + "rotation": [0, 15, 35], + "cubes": [ + {"name": "leg5", "origin": [3, 8, -1], "size": [16, 2, 2], "uv": [18, 0]} + ] + }, + { + "name": "leg6", + "pivot": [-4, 9, -1], + "rotation": [0, -45, -45], + "cubes": [ + {"name": "leg6", "origin": [-19, 8, -2], "size": [16, 2, 2], "uv": [18, 0]} + ] + }, + { + "name": "leg7", + "pivot": [4, 9, -1], + "rotation": [0, 45, 45], + "cubes": [ + {"name": "leg7", "origin": [3, 8, -2], "size": [16, 2, 2], "uv": [18, 0]} + ] + } + ] + }`};bt.spyglass={display_name:"Spyglass",model:`{ + "name": "spyglass", + "external_textures": ["entity/spyglass.png"], + "texturewidth": 16, + "textureheight": 16, + "bones": [ + { + "name": "spyglass", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-11.1, -0.1, -0.1], "size": [6.2, 2.2, 2.2], "uv": [0, 0]}, + {"origin": [-5, 0, 0], "size": [5, 2, 2], "uv": [0, 4]} + ] + } + ] + }`};bt.squid={display_name:"Squid",model:`{ + "name": "squid", + "external_textures": ["entity/squid.png"], + "texturewidth": 64, + "textureheight": 32, + "eyes": [ + [14, 18], + [20, 18] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "body", "origin": [-6, -8, -6], "size": [12, 16, 12], "uv": [0, 0]} + ] + }, + { + "name": "tentacle1", + "pivot": [5, -7, 0], + "rotation": [0, 90, 0], + "cubes": [ + {"name": "tentacle1", "origin": [4, -25, -1], "size": [2, 18, 2], "uv": [48, 0]} + ] + }, + { + "name": "tentacle2", + "pivot": [3.5, -7, 3.5], + "rotation": [0, 45, 0], + "cubes": [ + {"name": "tentacle2", "origin": [2.5, -25, 2.5], "size": [2, 18, 2], "uv": [48, 0]} + ] + }, + { + "name": "tentacle3", + "pivot": [0, -7, 5], + "cubes": [ + {"name": "tentacle3", "origin": [-1, -25, 4], "size": [2, 18, 2], "uv": [48, 0]} + ] + }, + { + "name": "tentacle4", + "pivot": [-3.5, -7, 3.5], + "rotation": [0, -45, 0], + "cubes": [ + {"name": "tentacle4", "origin": [-4.5, -25, 2.5], "size": [2, 18, 2], "uv": [48, 0]} + ] + }, + { + "name": "tentacle5", + "pivot": [-5, -7, 0], + "rotation": [0, -90, 0], + "cubes": [ + {"name": "tentacle5", "origin": [-6, -25, -1], "size": [2, 18, 2], "uv": [48, 0]} + ] + }, + { + "name": "tentacle6", + "pivot": [-3.5, -7, -3.5], + "rotation": [0, -135, 0], + "cubes": [ + {"name": "tentacle6", "origin": [-4.5, -25, -4.5], "size": [2, 18, 2], "uv": [48, 0]} + ] + }, + { + "name": "tentacle7", + "pivot": [0, -7, -5], + "rotation": [0, -180, 0], + "cubes": [ + {"name": "tentacle7", "origin": [-1, -25, -6], "size": [2, 18, 2], "uv": [48, 0]} + ] + }, + { + "name": "tentacle8", + "pivot": [3.5, -7, -3.5], + "rotation": [0, -225, 0], + "cubes": [ + {"name": "tentacle8", "origin": [2.5, -25, -4.5], "size": [2, 18, 2], "uv": [48, 0]} + ] + } + ] + }`};bt.squid_baby={display_name:"Squid Baby",model:`{ + "name": "squid_baby", + "texturewidth": 32, + "textureheight": 32, + "external_textures": ["entity/squid/squid_baby.png"], + "eyes": [ + [9, 12, 2, 2], + [13, 12, 2, 2] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-4, -4, -4], "size": [8, 10, 8], "uv": [0, 0]} + ] + }, + { + "name": "tentacle1", + "parent": "body", + "pivot": [3, -4.5, 0], + "cubes": [ + {"origin": [2, -10, -1], "size": [2, 6, 2], "uv": [0, 18]} + ] + }, + { + "name": "tentacle2", + "parent": "body", + "pivot": [2.35355, -4.5, 2.35355], + "cubes": [ + {"origin": [1.35355, -10, 1.35355], "size": [2, 6, 2], "pivot": [2.35355, -7, 2.35355], "rotation": [0, 45, 0], "uv": [0, 18]} + ] + }, + { + "name": "tentacle3", + "parent": "body", + "pivot": [0, -4.5, 3], + "cubes": [ + {"origin": [-1, -10, 2], "size": [2, 6, 2], "uv": [0, 18]} + ] + }, + { + "name": "tentacle4", + "parent": "body", + "pivot": [-2.35355, -4.5, 2.35355], + "cubes": [ + {"origin": [-3.35355, -10, 1.35355], "size": [2, 6, 2], "pivot": [-2.35355, -7, 2.35355], "rotation": [0, -45, 0], "uv": [0, 18], "mirror": true} + ] + }, + { + "name": "tentacle5", + "parent": "body", + "pivot": [-3, -4.5, 0], + "cubes": [ + {"origin": [-4, -10, -1], "size": [2, 6, 2], "uv": [0, 18]} + ] + }, + { + "name": "tentacle6", + "parent": "body", + "pivot": [-2.35355, -4.5, -2.35355], + "cubes": [ + {"origin": [-3.35355, -10, -3.35355], "size": [2, 6, 2], "pivot": [-2.35355, -7, -2.35355], "rotation": [0, 45, 0], "uv": [0, 18], "mirror": true} + ] + }, + { + "name": "tentacle7", + "parent": "body", + "pivot": [0, -4.5, -3], + "cubes": [ + {"origin": [-1, -10, -4], "size": [2, 6, 2], "uv": [0, 18]} + ] + }, + { + "name": "tentacle8", + "parent": "body", + "pivot": [2.35355, -4.5, -2.35355], + "cubes": [ + {"origin": [1.35355, -10, -3.35355], "size": [2, 6, 2], "pivot": [2.35355, -7, -2.35355], "rotation": [0, -45, 0], "uv": [0, 18]} + ] + } + ] + }`};bt.strider={display_name:"Strider",model:`{ + "name": "strider", + "external_textures": ["entity/strider/strider.png"], + "texturewidth": 64, + "textureheight": 128, + "eyes": [ + [17, 25, 2, 1], + [29, 25, 2, 1] + ], + "bones": [ + { + "name": "Body", + "pivot": [0, 17, 0], + "cubes": [ + {"name": "cube", "origin": [-8, 17, -8], "size": [16, 14, 16], "uv": [0, 0]} + ] + }, + { + "name": "right_bristles_1", + "parent": "Body", + "pivot": [-8, 30, 0], + "rotation": [0, 0, -60], + "mirror": true, + "cubes": [ + {"name": "cube", "origin": [-20, 30, -8], "size": [12, 0, 16], "uv": [4, 33]} + ] + }, + { + "name": "left_bristles_1", + "parent": "Body", + "pivot": [8, 30, 0], + "rotation": [0, 0, 60], + "cubes": [ + {"name": "cube", "origin": [8, 30, -8], "size": [12, 0, 16], "uv": [4, 33]} + ] + }, + { + "name": "right_bristles_2", + "parent": "Body", + "pivot": [-8, 26, 0], + "rotation": [0, 0, -60], + "mirror": true, + "cubes": [ + {"name": "cube", "origin": [-20, 26, -8], "size": [12, 0, 16], "uv": [4, 49]} + ] + }, + { + "name": "left_bristles_2", + "parent": "Body", + "pivot": [8, 26, 0], + "rotation": [0, 0, 60], + "cubes": [ + {"name": "cube", "origin": [8, 26, -8], "size": [12, 0, 16], "uv": [4, 49]} + ] + }, + { + "name": "right_bristles_3", + "parent": "Body", + "pivot": [-8, 21, 0], + "rotation": [0, 0, -60], + "mirror": true, + "cubes": [ + {"name": "cube", "origin": [-20, 21, -8], "size": [12, 0, 16], "uv": [4, 65]} + ] + }, + { + "name": "left_bristles_3", + "parent": "Body", + "pivot": [8, 21, 0], + "rotation": [0, 0, 60], + "cubes": [ + {"name": "cube", "origin": [8, 21, -8], "size": [12, 0, 16], "uv": [4, 65]} + ] + }, + { + "name": "RightLeg", + "pivot": [-4, 17, 0], + "cubes": [ + {"name": "cube", "origin": [-6, 0, -2], "size": [4, 17, 4], "uv": [0, 32]} + ] + }, + { + "name": "LeftLeg", + "pivot": [4, 17, 0], + "mirror": true, + "cubes": [ + {"name": "cube", "origin": [2, 0, -2], "size": [4, 17, 4], "uv": [0, 32]} + ] + } + ] + }`};bt.strider_baby={display_name:"Strider Baby",model:`{ + "name": "strider_baby", + "texturewidth": 32, + "textureheight": 32, + "external_textures": ["entity/strider/strider_baby.png"], + "eyes": [ + [9, 11, 1, 1], + [13, 11, 1, 1] + ], + "bones": [ + { + "name": "right_leg", + "pivot": [-1.5, 4, 0], + "cubes": [ + {"origin": [-2.5, 0, -1], "size": [2, 4, 2], "uv": [0, 24]} + ] + }, + { + "name": "left_leg", + "pivot": [1.5, 4, 0], + "cubes": [ + {"origin": [0.5, 0, -1], "size": [2, 4, 2], "uv": [8, 24]} + ] + }, + { + "name": "body", + "pivot": [0, 7.25, 0], + "cubes": [ + {"origin": [-3.5, 4, -4], "size": [7, 7, 8], "uv": [0, 0]} + ] + }, + { + "name": "bristles", + "parent": "body", + "pivot": [0, 11.5, 0], + "cubes": [ + {"origin": [-3.5, 11, 2], "size": [7, 3, 0], "layer": true, "uv": [0, 21]}, + {"origin": [-3.5, 11, 0], "size": [7, 3, 0], "layer": true, "uv": [0, 18]}, + {"origin": [-3.5, 11, -2], "size": [7, 3, 0], "layer": true, "uv": [0, 15]} + ] + } + ] + }`};bt.tadpole={display_name:"Tadpole",model:`{ + "name": "tadpole", + "external_textures": ["entity/tadpole/tadpole.png"], + "texturewidth": 16, + "textureheight": 16, + "eyes": [ + [2, 3, 2, 1], + [5, 3, 2, 1] + ], + "bones": [ + { + "name": "root", + "pivot": [0, 0, 0] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 0, 1], + "cubes": [ + {"origin": [-1.5, 1, -2.5], "size": [3, 2, 3], "uv": [0, 0]} + ] + }, + { + "name": "tail", + "parent": "root", + "pivot": [0, 0, 1], + "cubes": [ + {"origin": [0, 1, -0.5], "size": [0, 2, 7], "uv": [0, 0]} + ] + } + ] + }`};bt.tropicalfish_a={display_name:"Tropicalfish A",model:`{ + "name": "tropicalfish_a", + "external_textures": ["entity/fish/tropical_a.png"], + "texturewidth": 32, + "textureheight": 32, + "bones": [ + { + "name": "body", + "pivot": [-0.5, 0, 0], + "cubes": [ + {"name": "body", "origin": [-1, 0, -3], "size": [2, 3, 6], "uv": [0, 0]}, + {"name": "body", "origin": [0, 3, -2.9992], "size": [0, 4, 6], "uv": [10, -6]} + ] + }, + { + "name": "tailfin", + "parent": "body", + "pivot": [0, 0, 3], + "cubes": [ + {"name": "tailfin", "origin": [0, 0, 3], "size": [0, 3, 4], "uv": [24, -4]} + ] + }, + { + "name": "leftFin", + "parent": "body", + "pivot": [0.5, 0, 1], + "rotation": [0, -35, 0], + "cubes": [ + {"name": "leftFin", "origin": [0.336, 0, -0.10594], "size": [2, 2, 0], "uv": [2, 12]} + ] + }, + { + "name": "rightFin", + "parent": "body", + "pivot": [-0.5, 0, 1], + "rotation": [0, 35, 0], + "cubes": [ + {"name": "rightFin", "origin": [-2.336, 0, -0.10594], "size": [2, 2, 0], "uv": [2, 16]} + ] + } + ] + }`};bt.tropicalfish_b={display_name:"Tropicalfish B",model:`{ + "name": "tropicalfish_b", + "external_textures": ["entity/fish/tropical_b.png"], + "texturewidth": 32, + "textureheight": 32, + "bones": [ + { + "name": "body", + "pivot": [-0.5, 0, 0], + "cubes": [ + {"name": "body", "origin": [-1, 0, -0.0008], "size": [2, 6, 6], "uv": [0, 20]}, + {"name": "body", "origin": [0, -5, -0.0008], "size": [0, 5, 6], "uv": [20, 21]}, + {"name": "body", "origin": [0, 6, -0.0008], "size": [0, 5, 6], "uv": [20, 10]} + ] + }, + { + "name": "tailfin", + "parent": "body", + "pivot": [0, 0, 6], + "cubes": [ + {"name": "tailfin", "origin": [0, 0.0008, 6], "size": [0, 6, 5], "uv": [21, 16]} + ] + }, + { + "name": "leftFin", + "parent": "body", + "pivot": [0.5, 0, 1], + "rotation": [0, -35, 0], + "cubes": [ + {"name": "leftFin", "origin": [2.05673, 0, 2.35152], "size": [2, 2, 0], "uv": [2, 12]} + ] + }, + { + "name": "rightFin", + "parent": "body", + "pivot": [-0.5, 0, 1], + "rotation": [0, 35, 0], + "cubes": [ + {"name": "rightFin", "origin": [-4.05673, 0, 2.35152], "size": [2, 2, 0], "uv": [2, 16]} + ] + } + ] + }`};bt.turtle={display_name:"Turtle",model_bedrock:`{ + "name": "sea_turtle", + "external_textures": ["entity/sea_turtle.png"], + "texturewidth": 128, + "textureheight": 64, + "bones": [ + { + "name": "body", + "pivot": [0, 13, -10], + "rotation": [90, 0, 0], + "cubes": [ + {"name": "body", "origin": [-9.5, -10, -20], "size": [19, 20, 6], "uv": [6, 37]}, + {"name": "body", "origin": [-5.5, -8, -23], "size": [11, 18, 3], "uv": [30, 1]} + ] + }, + { + "name": "eggbelly", + "parent": "body", + "pivot": [0, 13, -10], + "cubes": [ + {"name": "eggbelly", "origin": [-4.5, -8, -24], "size": [9, 18, 1], "uv": [69, 33]} + ] + }, + { + "name": "head", + "pivot": [0, 5, -10], + "cubes": [ + {"name": "head", "origin": [-3, 1, -13], "size": [6, 5, 6], "uv": [2, 0]} + ] + }, + { + "name": "leg0", + "pivot": [-3.5, 2, 11], + "cubes": [ + {"name": "leg0", "origin": [-5.5, 1, 11], "size": [4, 1, 10], "uv": [0, 23]} + ] + }, + { + "name": "leg1", + "pivot": [3.5, 2, 11], + "cubes": [ + {"name": "leg1", "origin": [1.5, 1, 11], "size": [4, 1, 10], "uv": [0, 12]} + ] + }, + { + "name": "leg2", + "pivot": [-5, 3, -4], + "rotation": [0, 10, 0], + "cubes": [ + {"name": "leg2", "origin": [-18, 2, -6], "size": [13, 1, 5], "uv": [26, 30]} + ] + }, + { + "name": "leg3", + "pivot": [5, 3, -4], + "rotation": [0, -10, 0], + "cubes": [ + {"name": "leg3", "origin": [5, 2, -6], "size": [13, 1, 5], "uv": [26, 24]} + ] + } + ] + }`,model_java:`{ + "name": "big_sea_turtle", + "external_textures": ["entity/sea_turtle.png"], + "texturewidth": 128, + "textureheight": 64, + "bones": [ + { + "name": "body", + "pivot": [0, 13, -10], + "rotation": [90, 0, 0], + "cubes": [ + {"name": "body", "origin": [-9.5, -10, -20], "size": [19, 20, 6], "uv": [7, 37]}, + {"name": "body", "origin": [-5.5, -8, -23], "size": [11, 18, 3], "uv": [31, 1]} + ] + }, + { + "name": "eggbelly", + "parent": "body", + "pivot": [0, 13, -10], + "cubes": [ + {"name": "eggbelly", "origin": [-4.5, -8, -24], "size": [9, 18, 1], "uv": [70, 33]} + ] + }, + { + "name": "head", + "pivot": [0, 5, -10], + "cubes": [ + {"name": "head", "origin": [-3, 1, -13], "size": [6, 5, 6], "uv": [3, 0]} + ] + }, + { + "name": "leg0", + "pivot": [-3.5, 2, 11], + "cubes": [ + {"name": "leg0", "origin": [-5.5, 1, 11], "size": [4, 1, 10], "uv": [1, 23]} + ] + }, + { + "name": "leg1", + "pivot": [3.5, 2, 11], + "cubes": [ + {"name": "leg1", "origin": [1.5, 1, 11], "size": [4, 1, 10], "uv": [1, 12]} + ] + }, + { + "name": "leg2", + "pivot": [-5, 3, -4], + "rotation": [0, 10, 0], + "cubes": [ + {"name": "leg2", "origin": [-18, 2, -6], "size": [13, 1, 5], "uv": [27, 30]} + ] + }, + { + "name": "leg3", + "pivot": [5, 3, -4], + "rotation": [0, -10, 0], + "cubes": [ + {"name": "leg3", "origin": [5, 2, -6], "size": [13, 1, 5], "uv": [27, 24]} + ] + } + ] + }`};bt.turtle_baby={display_name:"Turtle Baby",model:`{ + "name": "turtle_baby", + "texturewidth": 16, + "textureheight": 16, + "external_textures": ["entity/turtle/sea_turtle_baby.png"], + "eyes": [ + [1, 10, 1, 1], + [7, 10, 1, 1] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 1, 1], + "cubes": [ + {"origin": [-2, 0, -1], "size": [4, 2, 4], "uv": [0, 0]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 1, -1], + "cubes": [ + {"origin": [-1.5, 0, -4], "size": [3, 3, 3], "uv": [0, 6]} + ] + }, + { + "name": "leg0", + "parent": "body", + "pivot": [-2, 0, 2.5], + "cubes": [ + {"origin": [-4, 0, 2], "size": [2, 0, 1], "uv": [-1, 0]} + ] + }, + { + "name": "leg1", + "parent": "body", + "pivot": [2, 0, 2.5], + "cubes": [ + {"origin": [2, 0, 2], "size": [2, 0, 1], "uv": [-1, 1]} + ] + }, + { + "name": "leg2", + "parent": "body", + "pivot": [-2, 0, -0.5], + "cubes": [ + {"origin": [-4, 0, -1], "size": [2, 0, 1], "uv": [8, 6]} + ] + }, + { + "name": "leg3", + "parent": "body", + "pivot": [2, 0, -0.5], + "cubes": [ + {"origin": [2, 0, -1], "size": [2, 0, 1], "uv": [8, 7]} + ] + } + ] + }`};bt.vex={display_name:"Vex",model:`{ + "name": "vex", + "external_textures": ["entity/vex/vex.png"], + "texturewidth": 32, + "textureheight": 32, + "eyes": [ + [5, 8, 2, 1], + [8, 8, 2, 1] + ], + "bones": [ + { + "name": "body", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-1.5, 0, -1], "size": [3, 4, 2], "uv": [0, 10]}, + {"origin": [-1.5, -2, -1], "size": [3, 5, 2], "inflate": -0.2, "uv": [0, 16]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 4, 0], + "cubes": [ + {"origin": [-2.5, 4, -2.5], "size": [5, 5, 5], "uv": [0, 0]} + ] + }, + { + "name": "rightArm", + "parent": "body", + "pivot": [-1.75, 3.75, 0], + "cubes": [ + {"origin": [-3, 0.25, -1], "size": [2, 4, 2], "inflate": -0.1, "uv": [23, 0]} + ] + }, + { + "name": "rightItem", + "parent": "rightArm", + "pivot": [-2, 1, 0] + }, + { + "name": "leftArm", + "parent": "body", + "pivot": [1.75, 3.75, 0], + "cubes": [ + {"origin": [1, 0.25, -1], "size": [2, 4, 2], "inflate": -0.1, "uv": [23, 6]} + ] + }, + { + "name": "leftWing", + "parent": "body", + "pivot": [0.5, 3, 1], + "cubes": [ + {"origin": [0.5, -2, 1], "size": [8, 5, 0], "uv": [16, 22], "mirror": true} + ] + }, + { + "name": "rightWing", + "parent": "body", + "pivot": [-0.5, 3, 1], + "cubes": [ + {"origin": [-8.5, -2, 1], "size": [8, 5, 0], "uv": [16, 22]} + ] + } + ] + }`};bt.villager={display_name:"Villager (Old)",model:`{ + "name": "villager", + "external_textures": ["entity/villager/villager.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "head", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "head", "origin": [-4, 24, -4], "size": [8, 10, 8], "uv": [0, 0]} + ] + }, + { + "name": "nose", + "parent": "head", + "pivot": [0, 26, 0], + "cubes": [ + {"name": "nose", "origin": [-1, 23, -6], "size": [2, 4, 2], "uv": [24, 0]} + ] + }, + { + "name": "body", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "body", "origin": [-4, 12, -3], "size": [8, 12, 6], "uv": [16, 20]}, + {"name": "body", "origin": [-4, 6, -3], "size": [8, 18, 6], "uv": [0, 38], "inflate": 0.5} + ] + }, + { + "name": "arms", + "pivot": [0, 22, 0], + "rotation": [-45, 0, 0], + "cubes": [ + {"name": "arms", "origin": [-4, 16, -2], "size": [8, 4, 4], "uv": [40, 38]}, + {"name": "arms", "origin": [-8, 16, -2], "size": [4, 8, 4], "uv": [44, 22]}, + {"name": "arms", "origin": [4, 16, -2], "size": [4, 8, 4], "uv": [44, 22]} + ] + }, + { + "name": "RightLeg", + "pivot": [-2, 12, 0], + "cubes": [ + {"name": "leg0", "origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} + ] + }, + { + "name": "LeftLeg", + "pivot": [2, 12, 0], + "cubes": [ + {"name": "leg1", "origin": [0, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} + ] + } + ] + }`};bt.villager_v2={display_name:"Villager (New)",model_java:`{ + "name": "villager_v2", + "external_textures": ["entity/villager2/villager.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "body", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "body", "origin": [-4, 12, -3], "size": [8, 12, 6], "uv": [16, 20]}, + {"name": "body", "origin": [-4, 4, -3], "size": [8, 20, 6], "uv": [0, 38], "inflate": 0.5} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "head", "origin": [-4, 24, -4], "size": [8, 10, 8], "uv": [0, 0]} + ] + }, + { + "name": "helmet", + "parent": "head", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "helmet", "origin": [-4, 24, -4], "size": [8, 10, 8], "uv": [32, 0], "inflate": 0.5} + ] + }, + { + "name": "brim", + "parent": "head", + "pivot": [0, 24, 0], + "rotation": [-90, 0, 0], + "cubes": [ + {"name": "brim", "origin": [-8, 16, -6], "size": [16, 16, 1], "uv": [30, 47], "inflate": 0.1} + ] + }, + { + "name": "nose", + "parent": "head", + "pivot": [0, 26, 0], + "cubes": [ + {"name": "nose", "origin": [-1, 23, -6], "size": [2, 4, 2], "uv": [24, 0]} + ] + }, + { + "name": "arms", + "parent": "body", + "pivot": [0, 22, 0], + "rotation": [-45, 0, 0], + "cubes": [ + {"name": "arms", "origin": [-4, 16, -2], "size": [8, 4, 4], "uv": [40, 38]}, + {"name": "arms", "origin": [-8, 16, -2], "size": [4, 8, 4], "uv": [44, 22]}, + {"name": "arms", "origin": [4, 16, -2], "size": [4, 8, 4], "uv": [44, 22], "mirror": true} + ] + }, + { + "name": "RightLeg", + "parent": "body", + "pivot": [-2, 12, 0], + "cubes": [ + {"name": "leg0", "origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} + ] + }, + { + "name": "LeftLeg", + "parent": "body", + "pivot": [2, 12, 0], + "cubes": [ + {"name": "leg1", "origin": [0, 0, -2], "size": [4, 12, 4], "uv": [0, 22], "mirror": true} + ] + } + ] + }`,model_bedrock:`{ + "name": "villager_v2", + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "body", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "body", "origin": [-4, 12, -3], "size": [8, 12, 6], "uv": [16, 20]}, + {"name": "body", "origin": [-4, 6, -3], "size": [8, 18, 6], "uv": [0, 38], "inflate": 0.5} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "head", "origin": [-4, 24, -4], "size": [8, 10, 8], "uv": [0, 0]} + ] + }, + { + "name": "helmet", + "parent": "head", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "helmet", "origin": [-4, 24, -4], "size": [8, 10, 8], "uv": [32, 0], "inflate": 0.5} + ] + }, + { + "name": "brim", + "parent": "head", + "pivot": [0, 24, 0], + "rotation": [-90, 0, 0], + "cubes": [ + {"name": "brim", "origin": [-8, 16, -6], "size": [16, 16, 1], "uv": [30, 47], "inflate": 0.1} + ] + }, + { + "name": "nose", + "parent": "head", + "pivot": [0, 26, 0], + "cubes": [ + {"name": "nose", "origin": [-1, 23, -6], "size": [2, 4, 2], "uv": [24, 0]} + ] + }, + { + "name": "arms", + "parent": "body", + "pivot": [0, 22, 0], + "rotation": [-45, 0, 0], + "cubes": [ + {"name": "arms", "origin": [-4, 16, -2], "size": [8, 4, 4], "uv": [40, 38]}, + {"name": "arms", "origin": [-8, 16, -2], "size": [4, 8, 4], "uv": [44, 22]}, + {"name": "arms", "origin": [4, 16, -2], "size": [4, 8, 4], "uv": [44, 22], "mirror": true} + ] + }, + { + "name": "RightLeg", + "parent": "body", + "pivot": [-2, 12, 0], + "cubes": [ + {"name": "leg0", "origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} + ] + }, + { + "name": "LeftLeg", + "parent": "body", + "pivot": [2, 12, 0], + "cubes": [ + {"name": "leg1", "origin": [0, 0, -2], "size": [4, 12, 4], "uv": [0, 22], "mirror": true} + ] + } + ] + }`};bt.villager_baby={display_name:"Villager Baby",model:`{ + "name": "villager_baby", + "texturewidth": 64, + "textureheight": 64, + "external_textures": ["entity/villager2/villager_baby.png"], + "eyes": [ + [8, 12, 2, 1], + [12, 12, 2, 1] + ], + "bones": [ + { + "name": "body", + "pivot": [1, 5.25, 0], + "cubes": [ + {"origin": [-2, 3, -1.5], "size": [4, 5, 3], "uv": [0, 15]}, + {"origin": [-2, 2, -1.5], "size": [4, 6, 3], "inflate": 0.2, "uv": [16, 21]} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [1, 8, 0], + "cubes": [ + {"origin": [-4, 8, -3.5], "size": [8, 8, 7], "uv": [0, 0]} + ] + }, + { + "name": "helmet", + "parent": "head", + "pivot": [1, 12, 0], + "cubes": [ + {"origin": [-4, 8, -3.5], "size": [8, 8, 7], "inflate": 0.3, "uv": [0, 30], "layer": true, "visibility": false} + ] + }, + { + "name": "brim", + "parent": "head", + "pivot": [1, 12.5, 0], + "cubes": [ + {"origin": [-7, 12, -6], "size": [14, 1, 12], "uv": [0, 45], "layer": true, "visibility": false} + ] + }, + { + "name": "nose", + "parent": "head", + "pivot": [1, 10, -4], + "cubes": [ + {"origin": [-1, 8, -4.5], "size": [2, 2, 1], "uv": [23, 0]} + ] + }, + { + "name": "arms", + "parent": "body", + "pivot": [1, 5.9, -1.2], + "cubes": [ + {"origin": [2, 3.59, -2.8], "size": [2, 4, 2], "pivot": [4, 5.09754, -0.95992], "rotation": [-60, 0, 0], "uv": [16, 15]}, + {"origin": [-4, 3.59, -2.8], "size": [2, 4, 2], "pivot": [-2, 5.09754, -0.95992], "rotation": [-60, 0, 0], "uv": [36, 15]} + ] + }, + { + "name": "held_item", + "parent": "arms", + "pivot": [1.5, 0, 0] + }, + { + "name": "leg0", + "parent": "body", + "pivot": [0, 2.5, 0], + "cubes": [ + {"origin": [-2, 0, -1], "size": [2, 3, 2], "uv": [8, 23]} + ] + }, + { + "name": "leg1", + "parent": "body", + "pivot": [2, 2.5, 0], + "cubes": [ + {"origin": [0, 0, -1], "size": [2, 3, 2], "uv": [0, 23]} + ] + } + ] + }`};bt.vindicator={display_name:"Vindicator",model:`{ + "name": "vindicator", + "external_textures": ["entity/vindicator.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "head", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "head", "origin": [-4, 24, -4], "size": [8, 10, 8], "uv": [0, 0]} + ] + }, + { + "name": "nose", + "parent": "head", + "pivot": [0, 26, 0], + "cubes": [ + {"name": "nose", "origin": [-1, 23, -6], "size": [2, 4, 2], "uv": [24, 0]} + ] + }, + { + "name": "body", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "body", "origin": [-4, 12, -3], "size": [8, 12, 6], "uv": [16, 20]}, + {"name": "body", "origin": [-4, 6, -3], "size": [8, 18, 6], "uv": [0, 38], "inflate": 0.5} + ] + }, + { + "name": "arms", + "pivot": [0, 22, 0], + "rotation": [-45, 0, 0], + "cubes": [ + {"name": "arms", "origin": [-8, 16, -2], "size": [4, 8, 4], "uv": [44, 22]}, + {"name": "arms", "origin": [4, 16, -2], "size": [4, 8, 4], "uv": [44, 22]}, + {"name": "arms", "origin": [-4, 16, -2], "size": [8, 4, 4], "uv": [40, 38]} + ] + }, + { + "name": "RightLeg", + "pivot": [-2, 12, 0], + "cubes": [ + {"name": "RightLeg", "origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} + ] + }, + { + "name": "LeftLeg", + "pivot": [2, 12, 0], + "mirror": true, + "cubes": [ + {"name": "LeftLeg", "origin": [0, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} + ] + }, + { + "name": "RightArm", + "pivot": [-5, 22, 0], + "cubes": [ + {"name": "RightArm", "origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 46]} + ] + }, + { + "name": "LeftArm", + "pivot": [5, 22, 0], + "mirror": true, + "cubes": [ + {"name": "LeftArm", "origin": [4, 12, -2], "size": [4, 12, 4], "uv": [40, 46]} + ] + } + ] + }`};bt.warden={display_name:"Warden",model:`{ + "name": "warden", + "external_textures": ["entity/warden/warden.png"], + "texturewidth": 128, + "textureheight": 128, + "eyes": [ + [12, 50, 12, 7] + ], + "bones": [ + { + "name": "root", + "pivot": [0, 0, 0] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 21, 0], + "cubes": [ + {"origin": [-9, 13, -4], "size": [18, 21, 11], "uv": [0, 0]} + ] + }, + { + "name": "right_ribcage", + "parent": "body", + "pivot": [-7, 23, -4], + "cubes": [ + {"origin": [-9, 13, -4.1], "size": [9, 21, 0], "uv": [90, 11]} + ] + }, + { + "name": "left_ribcage", + "parent": "body", + "pivot": [7, 23, -4], + "cubes": [ + {"origin": [0, 13, -4.1], "size": [9, 21, 0], "uv": [90, 11], "mirror": true} + ] + }, + { + "name": "head", + "parent": "body", + "pivot": [0, 34, 0], + "cubes": [ + {"origin": [-8, 34, -5], "size": [16, 16, 10], "uv": [0, 32]} + ] + }, + { + "name": "right_tendril", + "parent": "head", + "pivot": [-8, 46, 0], + "cubes": [ + {"origin": [-24, 43, 0], "size": [16, 16, 0], "uv": [52, 32]} + ] + }, + { + "name": "left_tendril", + "parent": "head", + "pivot": [8, 46, 0], + "cubes": [ + {"origin": [8, 43, 0], "size": [16, 16, 0], "uv": [58, 0]} + ] + }, + { + "name": "right_arm", + "parent": "body", + "pivot": [-13, 34, 1], + "cubes": [ + {"origin": [-17, 6, -3], "size": [8, 28, 8], "uv": [44, 50]} + ] + }, + { + "name": "left_arm", + "parent": "body", + "pivot": [13, 34, 1], + "cubes": [ + {"origin": [9, 6, -3], "size": [8, 28, 8], "uv": [0, 58]} + ] + }, + { + "name": "right_leg", + "parent": "root", + "pivot": [-5.9, 13, 0], + "cubes": [ + {"origin": [-9, 0, -3], "size": [6, 13, 6], "uv": [76, 48]} + ] + }, + { + "name": "left_leg", + "parent": "root", + "pivot": [5.9, 13, 0], + "cubes": [ + {"origin": [3, 0, -3], "size": [6, 13, 6], "uv": [76, 76]} + ] + } + ] + }`};bt.witch={display_name:"Witch",model:`{ + "name": "witch", + "external_textures": ["entity/witch.png"], + "texturewidth": 64, + "textureheight": 128, + "bones": [ + { + "name": "head", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "head", "origin": [-4, 24, -4], "size": [8, 10, 8], "uv": [0, 0]} + ] + }, + { + "name": "nose", + "parent": "head", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "nose", "origin": [-1, 23, -6], "size": [2, 4, 2], "uv": [24, 0]}, + {"name": "nose", "origin": [0, 25, -6.75], "size": [1, 1, 1], "uv": [0, 0], "inflate": -0.25} + ] + }, + { + "name": "hat", + "parent": "head", + "pivot": [-5, 32.03125, -5], + "cubes": [ + {"name": "hat", "origin": [-5, 32.05, -5], "size": [10, 2, 10], "uv": [0, 64]} + ] + }, + { + "name": "hat2", + "parent": "hat", + "pivot": [1.75, 32, 2], + "rotation": [-3, 0, 1.5], + "cubes": [ + {"name": "hat2", "origin": [-3.25, 33.5, -3], "size": [7, 4, 7], "uv": [0, 76]} + ] + }, + { + "name": "hat3", + "parent": "hat2", + "pivot": [1.75, 35, 2], + "rotation": [-6, 0, 3], + "cubes": [ + {"name": "hat3", "origin": [-1.5, 36.5, -1], "size": [4, 4, 4], "uv": [0, 87]} + ] + }, + { + "name": "hat4", + "parent": "hat3", + "pivot": [1.75, 38, 2], + "rotation": [-12, 0, 6], + "cubes": [ + {"name": "hat4", "origin": [0.25, 40, 1], "size": [1, 2, 1], "uv": [0, 95], "inflate": 0.25} + ] + }, + { + "name": "body", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "body", "origin": [-4, 12, -3], "size": [8, 12, 6], "uv": [16, 20]}, + {"name": "body", "origin": [-4, 6, -3], "size": [8, 18, 6], "uv": [0, 38], "inflate": 0.5} + ] + }, + { + "name": "arms", + "pivot": [0, 22, 0], + "rotation": [-45, 0, 0], + "cubes": [ + {"name": "arms", "origin": [-4, 16, -2], "size": [8, 4, 4], "uv": [40, 38]}, + {"name": "arms", "origin": [-8, 16, -2], "size": [4, 8, 4], "uv": [44, 22]}, + {"name": "arms", "origin": [4, 16, -2], "size": [4, 8, 4], "uv": [44, 22]} + ] + }, + { + "name": "leg0", + "pivot": [-2, 12, 0], + "cubes": [ + {"name": "leg0", "origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} + ] + }, + { + "name": "leg1", + "pivot": [2, 12, 0], + "cubes": [ + {"name": "leg1", "origin": [0, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} + ] + } + ] + }`};bt.witherBoss={display_name:"Wither",model:`{ + "name": "witherBoss", + "external_textures": ["entity/wither_boss/wither.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "upperBodyPart1", + "pivot": [0, 0, 0], + "cubes": [ + {"name": "upperBodyPart1", "origin": [-10, 17.1, -0.5], "size": [20, 3, 3], "uv": [0, 16]} + ] + }, + { + "name": "upperBodyPart2", + "parent": "upperBodyPart1", + "pivot": [-2, 17.1, -0.5], + "cubes": [ + {"name": "upperBodyPart2", "origin": [-2, 7.1, -0.5], "size": [3, 10, 3], "uv": [0, 22]}, + {"name": "upperBodyPart2", "origin": [-6, 13.6, 0], "size": [11, 2, 2], "uv": [24, 22]}, + {"name": "upperBodyPart2", "origin": [-6, 11.1, 0], "size": [11, 2, 2], "uv": [24, 22]}, + {"name": "upperBodyPart2", "origin": [-6, 8.6, 0], "size": [11, 2, 2], "uv": [24, 22]} + ] + }, + { + "name": "upperBodyPart3", + "parent": "upperBodyPart2", + "pivot": [0, 7, 0], + "rotation": [45, 0, 0], + "cubes": [ + {"name": "upperBodyPart3", "origin": [-2, 1, 0], "size": [3, 6, 3], "uv": [12, 22]} + ] + }, + { + "name": "head1", + "parent": "upperBodyPart1", + "pivot": [0, 20, 0], + "cubes": [ + {"name": "head1", "origin": [-4, 20, -4], "size": [8, 8, 8], "uv": [0, 0]} + ] + }, + { + "name": "head2", + "parent": "upperBodyPart1", + "pivot": [-9, 18, -1], + "cubes": [ + {"name": "head2", "origin": [-12, 18, -4], "size": [6, 6, 6], "uv": [32, 0]} + ] + }, + { + "name": "head3", + "parent": "upperBodyPart1", + "pivot": [9, 18, -1], + "cubes": [ + {"name": "head3", "origin": [6, 18, -4], "size": [6, 6, 6], "uv": [32, 0]} + ] + } + ] + }`};bt.wolf={display_name:"Wolf",model:`{ + "name": "wolf", + "external_textures": ["entity/wolf/wolf.png"], + "texturewidth": 64, + "textureheight": 32, + "bones": [ + { + "name": "head", + "pivot": [-1, 10.5, -7], + "cubes": [ + {"name": "head", "origin": [-4, 7.5, -9], "size": [6, 6, 4], "uv": [0, 0]}, + {"name": "head", "origin": [-4, 13.5, -7], "size": [2, 2, 1], "uv": [16, 14]}, + {"name": "head", "origin": [0, 13.5, -7], "size": [2, 2, 1], "uv": [16, 14]}, + {"name": "head", "origin": [-2.5, 7.51563, -12], "size": [3, 3, 4], "uv": [0, 10]} + ] + }, + { + "name": "body", + "pivot": [0, 10, 2], + "rotation": [90, 0, 0], + "cubes": [ + {"name": "body", "origin": [-4, 3, -1], "size": [6, 9, 6], "uv": [18, 14]} + ] + }, + { + "name": "upperBody", + "pivot": [-1, 10, 2], + "rotation": [90, 0, 0], + "cubes": [ + {"name": "upperBody", "origin": [-5, 12, -1], "size": [8, 6, 7], "uv": [21, 0]} + ] + }, + { + "name": "leg0", + "pivot": [-2.5, 8, 7], + "cubes": [ + {"name": "leg0", "origin": [-3.5, 0, 6], "size": [2, 8, 2], "uv": [0, 18]} + ] + }, + { + "name": "leg1", + "pivot": [0.5, 8, 7], + "cubes": [ + {"name": "leg1", "origin": [-0.5, 0, 6], "size": [2, 8, 2], "uv": [0, 18]} + ] + }, + { + "name": "leg2", + "pivot": [-2.5, 8, -4], + "cubes": [ + {"name": "leg2", "origin": [-3.5, 0, -5], "size": [2, 8, 2], "uv": [0, 18]} + ] + }, + { + "name": "leg3", + "pivot": [0.5, 8, -4], + "cubes": [ + {"name": "leg3", "origin": [-0.5, 0, -5], "size": [2, 8, 2], "uv": [0, 18]} + ] + }, + { + "name": "tail", + "pivot": [-1, 12, 8], + "rotation": [55, 0, 0], + "cubes": [ + {"name": "tail", "origin": [-2, 4, 7], "size": [2, 8, 2], "uv": [9, 18]} + ] + } + ] + }`};bt.wolf_baby={display_name:"Wolf Baby",model:`{ + "name": "wolf_baby", + "texturewidth": 32, + "textureheight": 32, + "external_textures": ["entity/wolf/wolf_baby.png"], + "eyes": [ + [6, 19, 1, 1], + [9, 19, 1, 1] + ], + "bones": [ + { + "name": "head", + "pivot": [0, 5.75, -4], + "cubes": [ + {"origin": [-2.99, 4, -7], "size": [6, 5, 5], "inflate": 0.025, "uv": [0, 12]}, + {"origin": [-1.5, 3.99, -9], "size": [3, 2, 2], "uv": [17, 12]} + ] + }, + { + "name": "right_ear", + "parent": "head", + "pivot": [-2, 10, -4.5], + "cubes": [ + {"origin": [-3, 9, -5], "size": [2, 2, 1], "uv": [0, 5]} + ] + }, + { + "name": "left_ear", + "parent": "head", + "pivot": [2, 10, -4.5], + "cubes": [ + {"origin": [1, 9, -5], "size": [2, 2, 1], "uv": [20, 5]} + ] + }, + { + "name": "body", + "pivot": [0, 5, 0], + "cubes": [ + {"origin": [-3, 3, -4], "size": [6, 4, 8], "uv": [0, 0]} + ] + }, + { + "name": "leg0", + "pivot": [-1.5, 3, 3], + "cubes": [ + {"origin": [-2.5, 0, 2], "size": [2, 3, 2], "uv": [0, 22]} + ] + }, + { + "name": "leg1", + "pivot": [1.5, 3, 3], + "cubes": [ + {"origin": [0.5, 0, 2], "size": [2, 3, 2], "uv": [8, 22]} + ] + }, + { + "name": "leg2", + "pivot": [-1.5, 3, -3], + "cubes": [ + {"origin": [-2.5, 0, -4], "size": [2, 3, 2], "uv": [0, 0]} + ] + }, + { + "name": "leg3", + "pivot": [1.5, 3, -3], + "cubes": [ + {"origin": [0.5, 0, -4], "size": [2, 3, 2], "uv": [20, 0]} + ] + }, + { + "name": "tail", + "pivot": [0, 5, 3], + "rotation": [75, 0, 0], + "cubes": [ + {"origin": [-1, 5.3, 2.2], "size": [2, 6, 2], "pivot": [0, 5.6, 3.2], "rotation": [180, 0, 0], "uv": [22, 16]} + ] + } + ] + }`};bt.zombie={display_name:"Zombie",pose:!0,model_java:`{ + "name": "zombie", + "texturewidth": 64, + "textureheight": 64, + "eyes": [ + [9, 12, 2, 1], + [13, 12, 2, 1] + ], + "bones": [ + { + "name": "Body", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Body", "origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]} + ] + }, + { + "name": "Head", + "pivot": [0, 24, 0], + "pose": [3, -10, 0], + "cubes": [ + {"name": "Head", "origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [0, 0]}, + {"name": "Hat Layer", "visibility": false, "origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [32, 0], "inflate": 0.5} + ] + }, + { + "name": "RightArm", + "pivot": [-5, 22, 0], + "pose": [-80, -5, 0], + "cubes": [ + {"name": "RightArm", "origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 16]} + ] + }, + { + "name": "LeftArm", + "pivot": [5, 22, 0], + "pose": [-75, 5, 0], + "mirror": true, + "cubes": [ + {"name": "LeftArm", "origin": [4, 12, -2], "size": [4, 12, 4], "uv": [40, 16]} + ] + }, + { + "name": "RightLeg", + "pivot": [-1.9, 12, 0], + "pose": [-25, 0, 5], + "cubes": [ + {"name": "RightLeg", "origin": [-3.9, 0, -2], "size": [4, 12, 4], "uv": [0, 16]} + ] + }, + { + "name": "LeftLeg", + "pivot": [1.9, 12, 0], + "pose": [20, 0, 0], + "mirror": true, + "cubes": [ + {"name": "LeftLeg", "origin": [-0.1, 0, -2], "size": [4, 12, 4], "uv": [0, 16]} + ] + } + ] + }`,model_bedrock:`{ + "name": "zombie", + "external_textures": ["entity/zombie/zombie.png"], + "texturewidth": 64, + "textureheight": 32, + "eyes": [ + [9, 12, 2, 1], + [13, 12, 2, 1] + ], + "bones": [ + { + "name": "Body", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Body", "origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]} + ] + }, + { + "name": "Head", + "pivot": [0, 24, 0], + "pose": [3, -10, 0], + "cubes": [ + {"name": "Head", "origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [0, 0]}, + {"name": "Hat Layer", "visibility": false, "origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [32, 0], "inflate": 0.5} + ] + }, + { + "name": "RightArm", + "pivot": [-5, 22, 0], + "pose": [-80, -5, 0], + "cubes": [ + {"name": "RightArm", "origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 16]} + ] + }, + { + "name": "LeftArm", + "pivot": [5, 22, 0], + "pose": [-75, 5, 0], + "mirror": true, + "cubes": [ + {"name": "LeftArm", "origin": [4, 12, -2], "size": [4, 12, 4], "uv": [40, 16]} + ] + }, + { + "name": "RightLeg", + "pivot": [-1.9, 12, 0], + "pose": [-25, 0, 5], + "cubes": [ + {"name": "RightLeg", "origin": [-3.9, 0, -2], "size": [4, 12, 4], "uv": [0, 16]} + ] + }, + { + "name": "LeftLeg", + "pivot": [1.9, 12, 0], + "pose": [20, 0, 0], + "mirror": true, + "cubes": [ + {"name": "LeftLeg", "origin": [-0.1, 0, -2], "size": [4, 12, 4], "uv": [0, 16]} + ] + } + ] + }`};bt.zombie_baby={display_name:"Zombie Baby",pose:!0,model:`{ + "name": "zombie_baby", + "texturewidth": 64, + "textureheight": 64, + "external_textures": ["entity/zombie/zombie_baby.png"], + "eyes": [ + [9, 12, 2, 1], + [13, 12, 2, 1] + ], + "bones": [ + { + "name": "Body", + "pivot": [0, 6.5, 0], + "cubes": [ + {"origin": [-2, 4, -1], "size": [4, 5, 2], "uv": [16, 16]} + ] + }, + { + "name": "Head", + "parent": "Body", + "pivot": [0, 8.75, 0], + "cubes": [ + {"origin": [-3, 9, -3], "size": [6, 6, 6], "uv": [3, 3]}, + {"origin": [-3, 8.9, -3], "size": [6, 6, 6], "inflate": 0.25, "uv": [35, 3], "layer": true, "visibility": false} + ] + }, + { + "name": "RightArm", + "parent": "Body", + "pivot": [-3, 8.5, 0], + "pose": [-80, -5, 0], + "cubes": [ + {"origin": [-4, 4, -1], "size": [2, 5, 2], "uv": [36, 16]} + ] + }, + { + "name": "LeftArm", + "parent": "Body", + "pivot": [3, 8.5, 0], + "pose": [-75, 5, 0], + "cubes": [ + {"origin": [2, 4, -1], "size": [2, 5, 2], "uv": [28, 16]} + ] + }, + { + "name": "RightLeg", + "parent": "Body", + "pivot": [-1, 4, 0], + "cubes": [ + {"origin": [-2, 0, -1], "size": [2, 4, 2], "uv": [8, 16]} + ] + }, + { + "name": "LeftLeg", + "parent": "Body", + "pivot": [1, 4, 0], + "cubes": [ + {"origin": [0, 0, -1], "size": [2, 4, 2], "uv": [0, 16]} + ] + } + ] + }`};bt.zombie_villager_1={display_name:"Zombie Villager (Old)",model:`{ + "name": "zombie_villager_1", + "external_textures": ["entity/zombie_villager/zombie_villager.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "Head", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "head", "origin": [-4, 24, -4], "size": [8, 10, 8], "uv": [0, 0], "inflate": 0.25}, + {"name": "head", "origin": [-1, 23, -6], "size": [2, 4, 2], "uv": [24, 0], "inflate": 0.25} + ] + }, + { + "name": "Body", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Body", "origin": [-4, 12, -3], "size": [8, 12, 6], "uv": [16, 20]}, + {"name": "Body", "origin": [-4, 6, -3], "size": [8, 18, 6], "uv": [0, 38], "inflate": 0.5} + ] + }, + { + "name": "waist", + "pivot": [0, 12, 0] + }, + { + "name": "RightArm", + "pivot": [-5, 22, 0], + "cubes": [ + {"name": "RightArm", "origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [44, 38]} + ] + }, + { + "name": "LeftArm", + "pivot": [5, 22, 0], + "mirror": true, + "cubes": [ + {"name": "LeftArm", "origin": [4, 12, -2], "size": [4, 12, 4], "uv": [44, 38]} + ] + }, + { + "name": "RightLeg", + "pivot": [-2, 12, 0], + "cubes": [ + {"name": "RightLeg", "origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} + ] + }, + { + "name": "LeftLeg", + "pivot": [2, 12, 0], + "mirror": true, + "cubes": [ + {"name": "LeftLeg", "origin": [0, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} + ] + } + ] + }`};bt.zombie_villager_2={display_name:"Zombie Villager (New)",model_java:`{ + "name": "zombie_villager_2", + "external_textures": ["entity/zombie_villager2/zombie-villager.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "waist", + "pivot": [0, 12, 0] + }, + { + "name": "Body", + "parent": "waist", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Body", "origin": [-4, 12, -3], "size": [8, 12, 6], "uv": [16, 20]}, + {"name": "Body", "origin": [-4, 4, -3], "size": [8, 20, 6], "uv": [0, 38], "inflate": 0.5} + ] + }, + { + "name": "Head", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Head", "origin": [-4, 24, -4], "size": [8, 10, 8], "uv": [0, 0], "inflate": 0.25}, + {"name": "Head", "origin": [-1, 23, -6], "size": [2, 4, 2], "uv": [24, 0], "inflate": 0.25} + ] + }, + { + "name": "helmet", + "parent": "Head", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Head Layer", "origin": [-4, 24, -4], "size": [8, 10, 8], "uv": [32, 0], "inflate": 0.5} + ] + }, + { + "name": "brim", + "parent": "Head", + "pivot": [0, 24, 0], + "rotation": [-90, 0, 0], + "cubes": [ + {"name": "brim", "origin": [-8, 16, -6], "size": [16, 16, 1], "uv": [30, 47], "inflate": 0.1} + ] + }, + { + "name": "RightArm", + "pivot": [-5, 22, 0], + "cubes": [ + {"name": "RightArm", "origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [44, 22]} + ] + }, + { + "name": "LeftArm", + "pivot": [5, 22, 0], + "mirror": true, + "cubes": [ + {"name": "LeftArm", "origin": [4, 12, -2], "size": [4, 12, 4], "uv": [44, 22]} + ] + }, + { + "name": "RightLeg", + "pivot": [-2, 12, 0], + "cubes": [ + {"name": "RightLeg", "origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} + ] + }, + { + "name": "LeftLeg", + "pivot": [2, 12, 0], + "mirror": true, + "cubes": [ + {"name": "LeftLeg", "origin": [0, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} + ] + } + ] + }`,model_bedrock:`{ + "name": "zombie_villager_2", + "external_textures": ["entity/zombie_villager2/zombie-villager.png"], + "texturewidth": 64, + "textureheight": 64, + "bones": [ + { + "name": "waist", + "pivot": [0, 12, 0] + }, + { + "name": "Body", + "parent": "waist", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Body", "origin": [-4, 12, -3], "size": [8, 12, 6], "uv": [16, 20]}, + {"name": "Body", "origin": [-4, 6, -3], "size": [8, 18, 6], "uv": [0, 38], "inflate": 0.5} + ] + }, + { + "name": "Head", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Head", "origin": [-4, 24, -4], "size": [8, 10, 8], "uv": [0, 0], "inflate": 0.25}, + {"name": "Head", "origin": [-1, 23, -6], "size": [2, 4, 2], "uv": [24, 0], "inflate": 0.25} + ] + }, + { + "name": "helmet", + "parent": "Head", + "pivot": [0, 24, 0], + "cubes": [ + {"name": "Head Layer", "origin": [-4, 24, -4], "size": [8, 10, 8], "uv": [32, 0], "inflate": 0.5} + ] + }, + { + "name": "brim", + "parent": "Head", + "pivot": [0, 24, 0], + "rotation": [-90, 0, 0], + "cubes": [ + {"name": "brim", "origin": [-8, 16, -6], "size": [16, 16, 1], "uv": [30, 47], "inflate": 0.1} + ] + }, + { + "name": "RightArm", + "pivot": [-5, 22, 0], + "cubes": [ + {"name": "RightArm", "origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [44, 22]} + ] + }, + { + "name": "LeftArm", + "pivot": [5, 22, 0], + "mirror": true, + "cubes": [ + {"name": "LeftArm", "origin": [4, 12, -2], "size": [4, 12, 4], "uv": [44, 22]} + ] + }, + { + "name": "RightLeg", + "pivot": [-2, 12, 0], + "cubes": [ + {"name": "RightLeg", "origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} + ] + }, + { + "name": "LeftLeg", + "pivot": [2, 12, 0], + "mirror": true, + "cubes": [ + {"name": "LeftLeg", "origin": [0, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} + ] + } + ] + }`};bt.zombie_villager_baby={display_name:"Zombie Villager Baby",model:`{ + "name": "zombie_villager_baby", + "texturewidth": 64, + "textureheight": 64, + "external_textures": ["entity/zombie_villager2/zombie-villager_baby.png"], + "eyes": [ + [8, 12, 2, 1], + [12, 12, 2, 1] + ], + "bones": [ + { + "name": "Body", + "pivot": [-0.5, 5.25, 0], + "cubes": [ + {"origin": [-2.5, 3, -1.5], "size": [4, 5, 3], "uv": [0, 15]}, + {"origin": [-2.5, 2, -1.5], "size": [4, 6, 3], "inflate": 0.2, "uv": [16, 22]} + ] + }, + { + "name": "Head", + "parent": "Body", + "pivot": [-0.5, 8, 0], + "cubes": [ + {"origin": [-4.5, 8, -3.5], "size": [8, 8, 7], "uv": [0, 0]} + ] + }, + { + "name": "helmet", + "parent": "Head", + "pivot": [-0.5, 12, 0], + "cubes": [ + {"origin": [-4.5, 8, -3.5], "size": [8, 8, 7], "inflate": 0.3, "uv": [0, 31], "layer": true, "visibility": false} + ] + }, + { + "name": "brim", + "parent": "Head", + "pivot": [-0.5, 12.5, 0], + "cubes": [ + {"origin": [-7.5, 12, -6], "size": [14, 1, 12], "uv": [0, 46], "layer": true, "visibility": false} + ] + }, + { + "name": "Nose", + "parent": "Head", + "pivot": [-0.5, 9, -4], + "cubes": [ + {"origin": [-1.5, 8, -4.5], "size": [2, 2, 1], "uv": [23, 0]} + ] + }, + { + "name": "RightArm", + "parent": "Body", + "pivot": [-3, 6.75, 0], + "cubes": [ + {"origin": [-4.5, 2.75, -1], "size": [2, 5, 2], "uv": [24, 15]} + ] + }, + { + "name": "LeftArm", + "parent": "Body", + "pivot": [2, 6.75, 0], + "cubes": [ + {"origin": [1.5, 2.75, -1], "size": [2, 5, 2], "uv": [16, 15]} + ] + }, + { + "name": "RightLeg", + "parent": "Body", + "pivot": [-1.5, 2.5, 0], + "cubes": [ + {"origin": [-2.5, 0, -1], "size": [2, 3, 2], "uv": [8, 23]} + ] + }, + { + "name": "LeftLeg", + "parent": "Body", + "pivot": [0.5, 2.5, 0], + "cubes": [ + {"origin": [-0.5, 0, -1], "size": [2, 3, 2], "uv": [0, 23]} + ] + } + ] + }`};for(let i in bt)$5[i]=bt[i].display_name;var Sy=new Codec("image",{name:tl("format.image"),extension:"png",remember:!0,load_filter:{type:"image",extensions:Texture.getAllExtensions},load(i,e,t){if(i instanceof Array||(i=[i]),typeof e=="object"&&(i=[e],e=e.path),setupProject(Formats.image),e&&!1)var n;i.forEach((o,r)=>{let s;o.uuid?s=new Texture(o,o.uuid).load():typeof o=="string"?o.startsWith("data:image/png")?s=new Texture({name:"image"}).fromDataURL(o):s=new Texture().fromPath(o):s=new Texture().fromFile(o),s.load_callback=()=>{if(delete s.load_callback,s.select(),s.activateLayers(!1),t instanceof Array&&t[0]&&t[1]?(s.uv_width=t[0],s.uv_height=t[1]):(s.uv_height=s.display_height,s.uv_width=s.width),r==i.length-1){UVEditor.vue.updateTexture();let l=Math.min(32/UVEditor.getPixelSize(),1);l<1&&UVEditor.setZoom(l),UVEditor.vue.centerView()}},s.add(!1)});let a=Texture.all.last();Project.name=pathToName(a?.name,!1)||"image"},afterSave(){},export_options:{format:{type:"select",label:"codec.common.format",options:{png:"PNG",jpeg:"JPEG",webp:"WebP",tga:"TGA",gif:"GIF"}},alpha_channel:{type:"checkbox",label:"codec.image.alpha_channel",condition:i=>i?.format=="gif",value:!0},animation_fps:{type:"number",label:"codec.image.animation_fps",condition:i=>i?.format=="gif",value:7},quality:{type:"range",label:"codec.image.quality",value:1,min:0,max:1,step:.05,editable_range_label:!0,condition:i=>i&&["jpeg","webp"].includes(i.format)}},async compile(i){i=Object.assign(this.getExportOptions(),i);let e=Texture.getDefault();if(e)if(i.format=="gif"){let n=GIFEnc.GIFEncoder(),a=i.alpha_channel??!0,o=0,r="rgb565",s=!1,l=e.width,c=e.display_height,d=1e3/i.animation_fps,{ctx:u}=e;for(let _=0;_256?(g=GIFEnc.quantize(f,256,{format:r,oneBitAlpha:!0,clearAlphaThreshold:127}),v=GIFEnc.applyPalette(f,g,r)):v=w1(f,g,{has_transparency:a,prio_color_accuracy:s}),n.writeFrame(v,l,c,{palette:g,delay:d,transparent:a}),o++,await new Promise(b=>setTimeout(b,0))}n.finish();let p=n.bytesView(),m=new Blob([p],{type:"image/gif"});var t=new FileReader;return await new Promise((_,f)=>{t.onload=()=>_(t.result),t.onerror=f,t.readAsDataURL(m)})}else{if(Texture.file_formats[i.format]?.encode)return await Texture.file_formats[i.format].encode(e);{let n="image/"+(i.format??"png");return e.canvas.toDataURL(n,i.quality)}}},async export(){if(await this.promptExportOptions()===null)return;let e=await this.compile();Blockbench.export({resource_id:"image",type:"Image",extensions:[this.getExportOptions().format],name:this.fileName(),savetype:typeof e=="string"?"image":"binary",content:e},t=>this.afterDownload(t))},write(i,e){Blockbench.writeFile(e,{content:i,savetype:"image"},t=>this.afterSave(t))}});Sy.parse=null;Codecs.project.on("parsed",()=>{Format.id=="image"&&Texture.all[0]&&!Texture.selected&&(Texture.all[0].select(),UVEditor.vue.centerView())});var L1,Y5=new ModelFormat("image",{icon:"image",category:"general",show_on_start_screen:!0,show_in_new_list:!0,can_convert_to:!1,model_identifier:!1,single_texture:!0,animated_textures:!0,per_texture_uv_size:!0,edit_mode:!1,image_editor:!0,format_page:{button_text:"format.image.new",content:[{type:"image",source:"./assets/image_editor.png",width:640},{text:tl("format.image.info.summary")}]},new(){newProject(this);let i=()=>{setTimeout(()=>{Undo.history.empty(),Undo.index=0,UVEditor.vue.centerView()},1)},e={"16x16":"16 x 16","32x32":"32 x 32","64x64":"64 x 64","128x128":"128 x 128","256x256":"256 x 256","512x512":"512 x 512","1920x1080":"1920 x 1080"},t={};for(let a in Texture.file_formats)t[a]=Texture.file_formats[a].name;let n=new Dialog({id:"add_bitmap",title:tl("action.create_texture"),buttons:["dialog.confirm"],form:{name:{label:"generic.name",value:"texture"},file_format:{label:"menu.texture.file_format",type:"select",value:"png",options:t},section2:"_",resolution:{label:"dialog.create_texture.resolution",type:"vector",dimensions:2,value:[16,16],min:1,max:2048},size_preset:{type:"buttons",label:" ",buttons:Object.values(e),click(a){let r=Object.keys(e)[a].split("x").map(s=>parseInt(s));n.setFormValues({resolution:r},!1)}},color:{label:"data.color",type:"color",colorpicker:TextureGenerator.background_color,toggle_enabled:!0,toggle_default:!1}},onConfirm:function(a){a.type="blank",TextureGenerator.addBitmap(a,i)}}).show();return setTimeout(()=>{UVEditor.vue.centerView()},40),!0},onActivation(){Interface.preview.classList.add("image_mode"),UVEditor.vue.hidden=!1,L1=L1??Panels.uv.node.firstChild,Interface.preview.append(L1),Panels.uv.update(),Panels.textures.handle.firstChild.textContent=tl("panel.textures.images")},onDeactivation(){Interface.preview.classList.remove("image_mode"),Panels.uv.node.append(L1),Panels.textures.handle.firstChild.textContent=tl("panel.textures"),setTimeout(()=>{Condition(Panels.uv.condition)&&Panels.uv.update()},0)},codec:Sy});Sy.format=Y5;BARS.defineActions(function(){Sy.export_action=new Action({id:"export_image",icon:"panorama",category:"file",condition:()=>Format==Y5&&Texture.all.length,click:function(){Sy.export()}})});var X5="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAIiklEQVR4Aeyaa4hVVRTH9z1CNDjgzJiO4jSVPSA1KqLCDxUU2Dvs+amgondEZE+K+lAQBQX1obdRENGn8oOEoT19pFampY6o4XNEx3yFIxOB3e5vN//Dutt9zzkz17wzQ8P8Zq291tr77LXOPo855yQu5+fyuYfKWYx5+Ity88z3o+DLGb7h7twChDPcdeCQg9A+XNuFCnBG5/FpfhNaRnt9pBShUAF8xiP0T+EChKtAK2G416VwAUiUIliwDXcKFWDDtj+PyDNmOyJoGBgKFYA8SNiCDf6a95I73PVRFHzEDGWSrGs8Pk3eLn102S9+9XOXBWNkoXEaJWuuAJK0hBPM8oWxQ7mdxK7nJDf75sucmHv/Takesy189Oojbo4YF0geGQNfo/ErgMlpIkpe7fYTWt2KubMdMsu24YVbfBEYC4jt2b3b29BjKC7mO1a2hEmyMSYDnOhoC5I/79q7fBGybPg0FrrABmpLYgO1GyWTvm3djokIimAnQ/I9e/a7juk3+lXASkDHhs/GhmPRBmI0viQ2+dAbRcKGmQigM0GkIFF0Emc1ADo2+dCPu/Ip19TZgeoYC3yj8gc9RsXV8F9fAM1CkyQZ2SRJlj0O6LIjFa/+2CyHt+5wMWzMsdLD7SR/vH5FydL2+UMOxhxc72DUqbc6sWfM1W7L93NKfRu+rcL23/Tc+W7pvZ1V/PDidLf1/ZmecWtecoLtnHLa6WVLOMGwvXfv3rLl7I92l2HCq2vKEMbntatWgIL7DvVK9XLcxpcd+EaBP5fO+9tNf2dbFVM/3FmgZ7GQtrY2B4rmsK21+hRTS0YLoOCm0c1Sh4y0iWtS7ePH+/OPzkGyF5HRApA4aIDfT3/Sgdp5cu3tE/2EFMfEsNEe3dzsAN2CDaytqK4V0LtoedEuaVzC8TftnHPLD8163HPNdTPdpBM700my9JtXPevEhIkTyxZ7PKKzhyDdQr+CDb776ksHPy1f5izYVq/82ZXND+MJmfuHS8XXV41yFJdzD+cZxUumgTWURFVfWdm4CGPtarC+E9on+OaKFSsc0Ni3b5+DnbOmugOvXe5BxwbEEAvoPT09DtDxW7DVgjj6WWrFZtkTOQ/s3+cEtpbWNr8KVCBsllpFYUIXXXyJLwLxU6edler4sIW0t7d7EysEfKPyh3hBwmLdunW+aN3d3c6iWCsrw2T+Jod6ex0QRdJAIXZs3+bt8uEXSl6+jo4OB/LnSWLBxtnE0YHC6Goy+fkfncB2wdNL3Q1vbq8CW4jdRkz3h0C4lymCzgPyKWk7iHxMFDuVR4JdBejYwMbQBpJFCu1p2pxAQ7CPOmkSwknSQLc0X3Qh5kz8ClAEex5aW1scyI609wbooBUQS4o+eagfS9omTUFEbAwVhGSz/DFfaPPnACUi5+ZNmxxgB+x2BaADdiWBLhYt/M6tXbPa36wgQb6YZAWFCVMQCkM813kLtqNFwp4MB2upnACBJQ6hnz4CHycipIUELNaHHuuDXX3Qi8JKgKLxNs6vAAza0+j1ElsVMZu2gy9MHJv8oWQ1hLbBthP32ALXd/8cD0UAzgOADvITG6I9KamJkIBFdqSNlW5j0W0cd3q08+DckBcT+v0Dkc0PnPrv//D9hZj0wmIHSpx/NNKYygMUdMBuBySZIqgPsejIGPhiUBBt2/6bza0wbaT8sf7Wlhze0O3G3fCxQ/Z+uczBkjc/cYAO+BQjXe17H3jQwawnnnQWbJYsn40L9VgiHALa2xz7XO6sRJffJhvTk955d5WyeOX6svvskU4Pehi7+beNJVizamXJgs2S5bNxoc6zhl2PTiv9ctv4KrDhA+mSstGOJW1t6UnQGq0++eST/B5mz6Bb30jQcwswEpLMyiG3ANyzd63+1QF61mDD0ZcWQM8DkDaRKVOmlJqamjzo1jcS9LQAPAvYsmWTg5GQWNEc0gIU7TDS4tICLP7mq9Lczz71DKUku7q6yqBHXJLY5s+fX46BT+TlkhYgL7BRfs47MHbs2JIF24wZM0ox8Im8eQ/5AuQlUK///wLUW8Hh3n9QK6DoCWY4FGdQBeCpLAyHBPPmOKgC6IUHg7/97nvppQhdhJcn2ZHyoQvZJGVnG/8lCRvSRrW0+/r6yqC2/MTCggULHKDfd8/d6aUIXYSXJ9mR8qEL2SRlH2jyA41P2JA2qmunvfdfuHhJ1Zg2Hr3KWWnY94bozVfOLlsqIZm/utGR5J0/8A0AZHYehDP3EOAZAM8CAH0g29Cjc16wQtG+9hE5T4SAx2BF+w8kLrcAAxmMWCWNXi8UgkdbwGOweseL9c8tAM8AeBYA6LFBQhtFANn5tgDUHojUA86GrACeDbw1+wP3xDPPOc4LnCPCyXOcC741wM/LFN4t8q3BHWeud3Dyzjf8ZzbEKB6pY12S/paDc+50XHX4BoBvARQnaWMHo2euAJ4NAM8K8gbXHid53ioRTz9BGx8QC9iA9wAWXpJgPxZkFmCgEyA5+vBSRRIdaMcg8fCdADbeC1IIgS1GbMyB2DILoOcDiyvPCooMylskIJakWQlAG7ugLXifH3vPz53m5OCbAGzEW3SPYiX3LzpEJLGF0CezAJpkntRyZgUASYPth11tXqxK5yVGqMvG2T9EL0GIAd3DWMm5yj47QMcWQp+jUgAlINna/30BqwBkRyp5SWwWklLS1m71PL+NzdOPagG0xPm2AOzG8anNigG1a0mu/ZZacfXYj2oBWObQ0v99QTgx7XUkyM9eB7WPpRxUAXQyKTpRu/eL9mHPF42tJ25QBeBsDH7DdX5fwPHsx8n505A7wVpz4s4M8POPir4V0PcEfFsAalfFBN8XcKvLO32hMbMSZjz1I74e6n4eoO8FkHxLAHxbAOiAb1z/NwjS1dZlTZJkWBWxQ4DE5eecAbTr4R8AAAD//4f/6uQAAAAGSURBVAMAUEle/eUQLPgAAAAASUVORK5CYII=";var doe={description:{identifier:"geometry.default_player",texture_width:64,texture_height:64,visible_bounds_width:5,visible_bounds_height:4.5,visible_bounds_offset:[0,1.75,0]},bones:[{name:"root",pivot:[0,0,0]},{name:"waist",parent:"root",pivot:[0,12,0]},{name:"body",parent:"waist",pivot:[0,24,0],cubes:[{origin:[-4,12,-2],size:[8,12,4],uv:[16,16]}]},{name:"cape",parent:"body",pivot:[0,24,2],cubes:[{origin:[-4,10,2],size:[8,14,1],uv:{north:{uv:[36,28],uv_size:[1,1]},east:{uv:[36,28],uv_size:[1,1]},south:{uv:[36,28],uv_size:[1,1]},west:{uv:[36,28],uv_size:[1,1]},up:{uv:[37,29],uv_size:[-1,-1]},down:{uv:[37,29],uv_size:[-1,-1]}}}]},{name:"head",parent:"body",pivot:[0,24,0],cubes:[{origin:[-4,24,-4],size:[8,8,8],uv:[0,0]}]},{name:"helmet",parent:"head",pivot:[0,0,0]},{name:"rightArm",parent:"body",pivot:[-5,22,0],cubes:[{origin:[-8,12,-2],size:[4,12,4],uv:[40,16]}]},{name:"rightItem",parent:"rightArm",pivot:[-6,15,1]},{name:"leftArm",parent:"body",pivot:[5,22,0],cubes:[{origin:[4,12,-2],size:[4,12,4],uv:[32,48]}]},{name:"leftItem",parent:"leftArm",pivot:[6,15,1],cubes:[]},{name:"rightLeg",parent:"root",pivot:[-1.9,12,0],cubes:[{origin:[-3.9,0,-2],size:[4,12,4],uv:[0,16]}]},{name:"leftLeg",parent:"root",pivot:[1.9,12,0],cubes:[{origin:[-.1,0,-2],size:[4,12,4],uv:[16,48]}]}]},aP=new Vm("bedrock_attachable",{scope_isolated_animations:!0,collections_as_files:!0}),N1=class{constructor(){W(this,"before");this.before=this.getCurrent()}getCurrent(){return{elements:Outliner.elements.slice(),groups:Group.all.slice(),nodes:Group.all.concat(Outliner.elements),animations:Gt.all.slice(),textures:Texture.all.slice(),collections:Collection.all.slice()}}find(){let e=this.getCurrent();for(let t in e)e[t]=e[t].filter(n=>this.before[t].indexOf(n)==-1);return e}findEmptyScope(){let e=1;for(let t of this.before.nodes)e==t.scope&&e++;return e}};BARS.defineActions(function(){let i=new zs("bedrock_player_model",{name:"Bedrock Player Model",description:"Default bedrock player model for making attachables and player animations",show_on_start_screen:!1,icon:"icon-player",target:"Minecraft: Bedrock Edition",onStart:async function(){let e=Project&&Format.id.includes("bedrock"),t={model:{label:"dialog.skin.model",type:"select",value:"steve",options:{steve:bt.steve.display_name,alex:bt.alex.display_name}}};e&&(t.import_as_attachable={label:"Import current model as attachable",value:!0,type:"checkbox"});let n=await new Promise((l,c)=>{new Dialog({title:"Bedrock Player Model",form:t,onConfirm(d){l(d)},onCancel(){c()}}).show()}),a=n.import_as_attachable?Codecs.project.compile():null,o=Project.export_path;setupProject(Formats.bedrock);let r=structuredClone(doe);if(n.model=="alex"){let l=r.bones.find(d=>d.name=="rightArm"),c=r.bones.find(d=>d.name=="leftArm");l.cubes[0].size[0]=3,l.cubes[0].origin[0]++,l.cubes[0].uv[0]++,c.cubes[0].size[0]=3,c.cubes[0].uv[0]++}yf({object:r},{switch_to_existing_tab:!1}),Project.multi_file_ruleset=aP.id;let s=new Texture({name:"player.png",scope:1}).fromDataURL(X5).add(!0,!0);if(s.saved=!0,Outliner.nodes.forEach(l=>{l.scope=1}),new Collection({name:"Player",scope:1}).add(),!Project.variable_placeholders.includes(".is_item_equipped")){let l="query.is_item_equipped = toggle('Holding Item')";n.import_as_attachable&&(l+=` +query.equipped_item_is_attachable = true`),Project.variable_placeholders=l+` +`+Project.variable_placeholders,Panels.variable_placeholders.inside_vue.text=Project.variable_placeholders}if(n.import_as_attachable){let l=new N1,c=JSON.parse(a);Codecs.project.merge(c);let d=l.find();[...d.elements,...d.groups].forEach(u=>{u.scope=2});for(let u of Texture.all)u!=s&&(u.scope=2);new Collection({name:c.name||"Attachable",scope:2,export_codec:"bedrock",export_path:o,model_identifier:c.model_identifier}).add();for(let u of Gt.all)u.setScopeFromAnimators();Canvas.updateAllBones()}}});new Action("load_on_bedrock_player",{name:"Load with Bedrock Player",condition:()=>Format.id=="bedrock"&&!Project.multi_file_ruleset,icon:"icon-player",click(){i.onStart()}}),new Action("import_bedrock_attachable",{name:"Import Bedrock Attachable",condition:()=>Format.id=="bedrock",icon:"swords",click(){bn.importFile({extensions:["json"],type:Codecs.bedrock.name,readtype:"text",multiple:!0,resource_id:"model"},e=>{for(let t of e){let n=autoParseJSON(t.content),a=new N1,o=new Collection({name:t.name,export_codec:"bedrock",export_path:t.path}).add();Codecs.bedrock.load(n,t,{import_to_current_project:!0,collection:o});let r=a.find(),s=a.findEmptyScope();r.nodes.forEach(l=>l.scope=s),r.textures.forEach(l=>l.scope=s),o.scope=s}for(let t of Gt.all)t.setScopeFromAnimators();Canvas.updateAllBones()})}}),new Action("slice_bedrock_multiblock",{name:"Slice Bedrock Multiblock",condition:()=>Format.id=="bedrock_block",icon:"dashboard_customize",click(){let e={split_cubes:{label:"Split Cubes",description:"If enabled, cubes that span across multiple blocks and align with block edges in terms of rotation will be split between blocks.",type:"checkbox",value:!0}};new Dialog("slice_bedrock_multiblock",{title:this.name,form:e,onConfirm(t){let n=Cube.all.slice();if(Undo.initEdit({elements:n,collections:[]}),t.split_cubes)for(let s=0;s<3;s++){let l=Cube.all.slice(),c=[0,1,2].filter(d=>d!=s);for(let d of l)if(d.getAllAncestors().concat([d]).allAre(p=>p.rotation[c[0]]==0&&p.rotation[c[1]]==0)){let p=s==1?0:8,m=Math.min(d.from[s],d.to[s]),_=Math.max(d.from[s],d.to[s]),f=Math.ceil((m+p)/16)*16-p,g=[];for(;f<_;)!Math.epsilon(f,m,.6)&&!Math.epsilon(f,_,.6)&&g.push(f),f+=16;for(let v of g){let b=kC(d,s,v-d.origin[s]);n.push(b),d=b}}}function a(s,l,c,d){if(s==0)return l;let u=Math.abs(s);return`${Math.sign(s)==1?c:d}${u>=2?u:""}`}let o=0,r={};for(let s of Cube.all){let l=s.getWorldCenter(),c=[Math.round(l.x/16),Math.floor(l.y/16),Math.round(l.z/16)],d=c.join("-"),u=Project.geometry_name||Project.getDisplayName(!1)||"model";if(!r[d]){o++;let p=[a(c[0],"","right","left"),a(c[1],"bottom","top","below"),a(c[2],"","front","back")].filter(m=>m).join("_");r[d]=new Collection({name:p,offset:c.V3_multiply(16,16,16),export_codec:"bedrock",model_identifier:Project.model_identifier+"."+p}).add()}r[d].children.push(s.uuid)}Canvas.updateView({elements:n,element_aspects:{transform:!0,geometry:!0,uv:!0}}),Undo.finishEdit("Slice multi block model",{collections:Object.values(r),elements:n})}}).show()}})});var uoe={rightarm:{rotation:[-95,45,115].map(Math.degToRad),position:[-13.5,-10,12]},rightitem:{position:[0,-7,0]},leftitem:{position:[0,-7,0]},body:{hide_cubes:!0},head:{hide_cubes:!0},cape:{hide_cubes:!0},rightleg:{hide_cubes:!0},leftleg:{hide_cubes:!0}},poe={rightarm:{rotation:[18,0,0].map(Math.degToRad)}};function J5(i){for(let e in i){let t=i[e],n=Group.all.find(a=>a.name.toLowerCase()==e);if(n&&(t.rotation&&n.mesh.rotation.fromArray(t.rotation),t.position&&n.mesh.position.add(Reusable.vec1.fromArray(t.position)),t.scale&&n.mesh.scale.fromArray(t.scale),t.hide_cubes))for(let a of n.mesh.children)a.type=="cube"&&(a.visible=!1)}}Blockbench.on("display_default_pose",()=>{Project.multi_file_ruleset==aP.id&&(Project.bedrock_animation_mode=="attachable_first"?J5(uoe):Animator.MolangParser.parse("query.is_item_equipped(0)")&&J5(poe))});Blockbench.on("get_face_texture",i=>{if(Project.multi_file_ruleset==aP.id&&i.element?.scope){let e=Texture.all.find(t=>t.scope==i.element.scope);if(e)return e}});Interface.page_wrapper=document.getElementById("page_wrapper");Interface.work_screen=document.getElementById("work_screen");Interface.center_screen=document.getElementById("center");Interface.right_bar=document.getElementById("right_bar");Interface.left_bar=document.getElementById("left_bar");Interface.preview=document.getElementById("preview");CustomTheme.setup();StateMemory.init("dialog_paths","object");initCanvas();c2();he.browser="electron";navigator.userAgent.toLowerCase().indexOf("firefox")>-1?he.browser="firefox":window.chrome&&window.chrome.webstore?he.browser="chrome":window.opr&&opr.addons||window.opera||navigator.userAgent.indexOf(" OPR/")>=0?he.browser="opera":/constructor/i.test(window.HTMLElement)||function(i){return i.toString()==="[object SafariRemoteNotification]"}(!window.safari||typeof safari<"u"&&safari.pushNotification)?he.browser="safari":document.documentMode?he.browser="internet_explorer":window.chrome&&window.navigator.userAgent.toLowerCase().includes("edg")?he.browser="edge":window.StyleMedia?he.browser="proprietary_edge":window.chrome&&!window.chrome.webstore&&(he.browser="chromium"),navigator.appVersion.indexOf("Win")!=-1&&(he.operating_system="Windows"),navigator.appVersion.indexOf("Mac")!=-1&&(he.operating_system="MacOS"),navigator.appVersion.indexOf("Linux")!=-1&&(he.operating_system="Linux"),["proprietary_edge","internet_explorer"].includes(he.browser)&&alert(capitalizeFirstLetter(he.browser)+" does not support Blockbench"),$(".local_only").remove();BARS.setupActions();BARS.setupToolbars();BARS.setupVue();MenuBar.setup();Tw();i5();w4();console.log(`Three.js r${THREE.REVISION}`);console.log("%cBlockbench "+he.version+(" Web ("+capitalizeFirstLetter(he.browser)+(he.isPWA?", PWA)":")")),"border: 2px solid #3e90ff; padding: 4px 8px; font-size: 1.2em;");he.startup_count=parseInt(localStorage.getItem("startups")||0)+1;localStorage.setItem("startups",he.startup_count);document.getElementById("blackout").addEventListener("click",i=>{typeof open_interface.cancel=="function"&&open_interface.cancel_on_click_outside!==!1?open_interface.cancel(i):typeof open_interface=="string"&&open_dialog&&$("dialog#"+open_dialog).find(".cancel_btn:not([disabled])").trigger("click")});{async function i(){if("serviceWorker"in navigator)try{await navigator.serviceWorker.register("./service_worker.js")}catch(e){console.log(e)}}i()}(!he.isWeb||!he.isPWA)&&$.ajaxSetup({cache:!1});if(he.startup_count==1)try{jQuery.ajax({url:"https://blckbn.ch/api/event/new_installation",type:"POST",data:{}})}catch(i){console.error(i)}if(he.startup_count==3)try{jQuery.ajax({url:"https://blckbn.ch/api/event/recurring_user",type:"POST",data:{}})}catch(i){console.error(i)}he.on("before_closing",i=>{he.hasFlag("no_localstorage_saving")||Settings.saveLocalStorages()});updateProjectResolution();setupInterface();setupDragHandlers();onVueSetup.funcs.forEach(i=>{typeof i=="function"&&i()});settings.streamer_mode.value&&d2();yo.initialize();initializeWebApp();localStorage.setItem("last_version",he.version);(function(){let i=!1;function e(){i||(Settings.saveLocalStorages(),loadInfoFromURL(),i=!0)}S4().then(e),setTimeout(e,1200)})();setStartScreen(!0);he.isMobile&&(Toolbox.selected=null,BarItems.move_tool.select());document.getElementById("page_wrapper").classList.remove("invisible");he.setup_successful=!0;he.Outliner=Outliner;he.OutlinerNode=OutlinerNode;he.OutlinerElement=OutlinerElement;he.Group=Group;he.Cube=Cube;he.Mesh=Mesh;he.Locator=Locator;he.NullObject=NullObject;he.TextureMesh=TextureMesh;he.SplineMesh=SplineMesh;he.Face=Face;he.CubeFace=CubeFace;he.MeshFace=MeshFace;he.BillboardFace=BillboardFace;he.SplineHandle=SplineHandle;he.SplineCurve=SplineCurve;he.NodePreviewController=NodePreviewController;he.Animator=Animator;he.Timeline=Timeline;he.AnimationItem=AnimationItem;he.Animation=Animation;he.AnimationController=AnimationController;he.AnimationControllerState=AnimationControllerState;he.Keyframe=Keyframe;he.KeyframeDataPoint=KeyframeDataPoint;he.BoneAnimator=BoneAnimator;he.NullObjectAnimator=NullObjectAnimator;he.EffectAnimator=EffectAnimator;he.TimelineMarker=TimelineMarker;he.Panel=Panel;he.Mode=Mode;he.Dialog=Dialog;he.ShapelessDialog=ShapelessDialog;he.ToolConfig=ToolConfig;he.InputForm=InputForm;he.Setting=Setting;he.Plugin=Plugin;he.Preview=Preview;he.Toolbar=Toolbar;he.Language=Language;he.Painter=Painter;he.Screencam=Screencam;he.Settings=Settings;he.TextureAnimator=TextureAnimator;he.Toolbox=Toolbox;he.BarItems=BarItems;he.BarItem=BarItem;he.Action=Action;he.Tool=Tool;he.Toggle=Toggle;he.Widget=Widget;he.BarSelect=BarSelect;he.BarSlider=BarSlider;he.BarText=BarText;he.NumSlider=NumSlider;he.ColorPicker=ColorPicker;he.Keybind=Keybind;he.KeybindItem=KeybindItem;he.Menu=Menu;he.BarMenu=BarMenu;he.ResizeLine=ResizeLine;he.ModelProject=ModelProject;he.ModelFormat=ModelFormat;he.Codec=Codec;he.DisplaySlot=DisplaySlot;he.Reusable=Reusable;he.Texture=Texture;he.TextureLayer=TextureLayer;he.SharedActions=SharedActions; +/** + * @license + * Copyright 2010-2022 fik.js Authors + * SPDX-License-Identifier: MIT + */ +/*! jQuery UI - v1.12.1 - 2021-01-11 +* http://jqueryui.com +* Includes: widget.js, position.js, data.js, disable-selection.js, scroll-parent.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/selectable.js, widgets/sortable.js, widgets/mouse.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js +* Copyright jQuery Foundation and other contributors; Licensed MIT */ +/*! + * jQuery UI Touch Punch 0.2.3 + * + * Copyright 2011–2014, Dave Furfero + * Dual licensed under the MIT or GPL Version 2 licenses. + * + * Depends: + * jquery.ui.widget.js + * jquery.ui.mouse.js + */ +/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */ +/*! + * is-extendable + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ +/*! + LZ-UTF8 v0.5.5 + + Copyright (c) 2018, Rotem Dan + Released under the MIT license. + + Build date: 2018-07-30 + + Please report any issue at https://github.com/rotemdan/lzutf8.js/issues +*/ +/*! Bundled license information: + +jquery/dist/jquery.js: + (*! + * jQuery JavaScript Library v3.7.1 + * https://jquery.com/ + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2023-08-28T13:37Z + *) + +vue/dist/vue.min.js: + (*! + * Vue.js v2.7.16 + * (c) 2014-2023 Evan You + * Released under the MIT License. + *) + +prismjs/prism.js: + (** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT + * @author Lea Verou + * @namespace + * @public + *) + +sortablejs/modular/sortable.esm.js: + (**! + * Sortable 1.15.6 + * @author RubaXa + * @author owenm + * @license MIT + *) + +three/build/three.module.js: + (** + * @license + * Copyright 2010-2021 Three.js Authors + * SPDX-License-Identifier: MIT + *) + +dompurify/dist/purify.es.mjs: + (*! @license DOMPurify 3.4.12 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.12/LICENSE *) +*/ +//# sourceMappingURL=bundle.js.map diff --git a/nonpacks/static/vendor/blockbench/favicon.png b/nonpacks/static/vendor/blockbench/favicon.png new file mode 100644 index 0000000..66c77b8 Binary files /dev/null and b/nonpacks/static/vendor/blockbench/favicon.png differ diff --git a/nonpacks/static/vendor/blockbench/font/Assistant-Bold.ttf b/nonpacks/static/vendor/blockbench/font/Assistant-Bold.ttf new file mode 100644 index 0000000..c7aa796 Binary files /dev/null and b/nonpacks/static/vendor/blockbench/font/Assistant-Bold.ttf differ diff --git a/nonpacks/static/vendor/blockbench/font/Assistant-ExtraBold.ttf b/nonpacks/static/vendor/blockbench/font/Assistant-ExtraBold.ttf new file mode 100644 index 0000000..a13e207 Binary files /dev/null and b/nonpacks/static/vendor/blockbench/font/Assistant-ExtraBold.ttf differ diff --git a/nonpacks/static/vendor/blockbench/font/Assistant-ExtraLight.ttf b/nonpacks/static/vendor/blockbench/font/Assistant-ExtraLight.ttf new file mode 100644 index 0000000..1693d09 Binary files /dev/null and b/nonpacks/static/vendor/blockbench/font/Assistant-ExtraLight.ttf differ diff --git a/nonpacks/static/vendor/blockbench/font/Assistant-Light.ttf b/nonpacks/static/vendor/blockbench/font/Assistant-Light.ttf new file mode 100644 index 0000000..d00dc8a Binary files /dev/null and b/nonpacks/static/vendor/blockbench/font/Assistant-Light.ttf differ diff --git a/nonpacks/static/vendor/blockbench/font/Assistant-Regular.ttf b/nonpacks/static/vendor/blockbench/font/Assistant-Regular.ttf new file mode 100644 index 0000000..87cc8d6 Binary files /dev/null and b/nonpacks/static/vendor/blockbench/font/Assistant-Regular.ttf differ diff --git a/nonpacks/static/vendor/blockbench/font/Assistant-SemiBold.ttf b/nonpacks/static/vendor/blockbench/font/Assistant-SemiBold.ttf new file mode 100644 index 0000000..6913d68 Binary files /dev/null and b/nonpacks/static/vendor/blockbench/font/Assistant-SemiBold.ttf differ diff --git a/nonpacks/static/vendor/blockbench/font/Montserrat-VariableFont_wght.ttf b/nonpacks/static/vendor/blockbench/font/Montserrat-VariableFont_wght.ttf new file mode 100644 index 0000000..451e692 Binary files /dev/null and b/nonpacks/static/vendor/blockbench/font/Montserrat-VariableFont_wght.ttf differ diff --git a/nonpacks/static/vendor/blockbench/font/fa-brands-400.woff2 b/nonpacks/static/vendor/blockbench/font/fa-brands-400.woff2 new file mode 100644 index 0000000..d84512f Binary files /dev/null and b/nonpacks/static/vendor/blockbench/font/fa-brands-400.woff2 differ diff --git a/nonpacks/static/vendor/blockbench/font/fa-regular-400.woff2 b/nonpacks/static/vendor/blockbench/font/fa-regular-400.woff2 new file mode 100644 index 0000000..452b49c Binary files /dev/null and b/nonpacks/static/vendor/blockbench/font/fa-regular-400.woff2 differ diff --git a/nonpacks/static/vendor/blockbench/font/fa-solid-900.woff2 b/nonpacks/static/vendor/blockbench/font/fa-solid-900.woff2 new file mode 100644 index 0000000..fec1fae Binary files /dev/null and b/nonpacks/static/vendor/blockbench/font/fa-solid-900.woff2 differ diff --git a/nonpacks/static/vendor/blockbench/font/icomoon.ttf b/nonpacks/static/vendor/blockbench/font/icomoon.ttf new file mode 100644 index 0000000..24c2761 Binary files /dev/null and b/nonpacks/static/vendor/blockbench/font/icomoon.ttf differ diff --git a/nonpacks/static/vendor/blockbench/font/icomoon.woff b/nonpacks/static/vendor/blockbench/font/icomoon.woff new file mode 100644 index 0000000..4e5cf1c Binary files /dev/null and b/nonpacks/static/vendor/blockbench/font/icomoon.woff differ diff --git a/nonpacks/static/vendor/blockbench/font/material-icons.woff2 b/nonpacks/static/vendor/blockbench/font/material-icons.woff2 new file mode 100644 index 0000000..c57cdcf Binary files /dev/null and b/nonpacks/static/vendor/blockbench/font/material-icons.woff2 differ diff --git a/nonpacks/static/vendor/blockbench/icon_full.png b/nonpacks/static/vendor/blockbench/icon_full.png new file mode 100644 index 0000000..376c90b Binary files /dev/null and b/nonpacks/static/vendor/blockbench/icon_full.png differ diff --git a/nonpacks/static/vendor/blockbench/index.html b/nonpacks/static/vendor/blockbench/index.html new file mode 100644 index 0000000..3b94954 --- /dev/null +++ b/nonpacks/static/vendor/blockbench/index.html @@ -0,0 +1,226 @@ + + + + Blockbench + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + +
    +
    + + + +
    + + + + + + + \ No newline at end of file diff --git a/nonpacks/static/vendor/blockbench/manifest.webmanifest b/nonpacks/static/vendor/blockbench/manifest.webmanifest new file mode 100644 index 0000000..431a2c7 --- /dev/null +++ b/nonpacks/static/vendor/blockbench/manifest.webmanifest @@ -0,0 +1,36 @@ +{ + "$schema": "https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/web-manifest.json", + "short_name": "Blockbench", + "name": "Blockbench", + "icons": [ + { + "src": "favicon.png", + "type": "image/png", + "sizes": "128x128" + }, + { + "src": "icon.png", + "type": "image/png", + "sizes": "1024x1024" + }, + { + "src": "icon_maskable.png", + "type": "image/png", + "sizes": "256x256", + "purpose": "maskable" + } + ], + "screenshots": [ + { + "src": "content/front_page_app.png", + "sizes": "1920x1040", + "type": "image/png", + "label": "Blockbench Interface" + } + ], + "start_url": "./index.html", + "background_color": "#21252b", + "theme_color": "#3e90ff", + "display": "standalone", + "display_override": ["window-controls-overlay"] +} \ No newline at end of file diff --git a/nonpacks/static/vendor/blockbench/plugins/MultiactorEditor/MultiactorEditor.js b/nonpacks/static/vendor/blockbench/plugins/MultiactorEditor/MultiactorEditor.js new file mode 100644 index 0000000..d464bb0 --- /dev/null +++ b/nonpacks/static/vendor/blockbench/plugins/MultiactorEditor/MultiactorEditor.js @@ -0,0 +1,3207 @@ +(function () { + const PLUGIN_ID = 'MultiactorEditor'; + const ACTOR_NAMES_PROPERTY = 'multiactor_actor_names'; + const ACTOR_TEXTURES_PROPERTY = 'multiactor_actor_textures'; + const BONE_TEXTURE_OVERRIDES_PROPERTY = 'multiactor_bone_texture_overrides'; + const ACTOR_ANIMDEF_METADATA_PROPERTY = 'multiactor_actor_animdef_metadata'; + + let importAction, importConjoinedAnimationAction, importSplitAnimationAction, exportSelectedAction, exportAllAction, exportConjoinedAction, createAnimationDefinitionAction, actorPreferencesAction, boneTextureOverridesAction, exportGeckoModelAction; + let actorNamesProjectProperty, actorTexturesProjectProperty, boneTextureOverridesProjectProperty, actorAnimdefMetadataProjectProperty; + let actorTexturePreviewProjectListener; + const ACTOR_TEXTURE_PREVIEW_EVENTS = ['load_project', 'select_project', 'setup_project', 'load_from_recent_project_data', 'add_texture', 'change_texture_path']; + let actorTexturePreviewTimeouts = []; + + // ---------------------------- + // Helpers + // ---------------------------- + const num = (n, fallback = 0) => { + const v = Number(n); + return Number.isFinite(v) ? v : fallback; + }; + + const v3 = (arr, fallback = 0) => + Array.isArray(arr) ? [num(arr[0], fallback), num(arr[1], fallback), num(arr[2], fallback)] : [fallback, fallback, fallback]; + + const sanitizeFilePart = (name) => { + let s = String(name || 'animation').trim(); + + // Windows-invalid filename chars + backslash without using escapes + const backslash = String.fromCharCode(92); + const bad = new Set([backslash, '/', ':', '*', '?', '"', '<', '>', '|']); + + let out = ''; + for (const ch of s) out += bad.has(ch) ? '_' : ch; + + out = out.trim(); + while (out.indexOf(' ') !== -1) out = out.split(' ').join(' '); + return out; + }; + + const clone = (obj) => JSON.parse(JSON.stringify(obj)); + + function getProjectStringMap(propertyName) { + if (!Project) return {}; + + const raw = Project[propertyName]; + if (typeof raw !== 'string' || !raw.trim()) return {}; + + try { + const parsed = JSON.parse(raw); + if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return {}; + + const map = {}; + for (const [key, value] of Object.entries(parsed)) { + const idx = parseInt(key, 10); + const text = String(value || '').trim(); + if (Number.isFinite(idx) && idx > 0 && text) map[String(idx)] = text; + } + return map; + } catch (e) { + console.warn(`Could not parse saved project map "${propertyName}":`, e); + return {}; + } + } + + function setProjectStringMap(propertyName, values) { + if (!Project) return; + + const clean = {}; + for (const [key, value] of Object.entries(values || {})) { + const idx = parseInt(key, 10); + const text = String(value || '').trim(); + if (Number.isFinite(idx) && idx > 0 && text) clean[String(idx)] = text; + } + + Project[propertyName] = JSON.stringify(clean); + Project.saved = false; + } + + function getProjectActorNames() { + return getProjectStringMap(ACTOR_NAMES_PROPERTY); + } + + function setProjectActorNames(names) { + setProjectStringMap(ACTOR_NAMES_PROPERTY, names); + } + + function getProjectActorTextures() { + return getProjectStringMap(ACTOR_TEXTURES_PROPERTY); + } + + function setProjectActorTextures(textures) { + setProjectStringMap(ACTOR_TEXTURES_PROPERTY, textures); + } + + function uniqueTrimmedStrings(values) { + const out = []; + const seen = new Set(); + for (const value of Array.isArray(values) ? values : []) { + const text = String(value || '').trim(); + if (!text || seen.has(text)) continue; + seen.add(text); + out.push(text); + } + return out; + } + + function parseCommaSeparatedStrings(value) { + return uniqueTrimmedStrings(String(value || '').split(',')); + } + + function cleanActorAnimdefMetadata(value) { + const source = value && typeof value === 'object' && !Array.isArray(value) ? value : {}; + const out = {}; + const entityTypes = uniqueTrimmedStrings(source.entity_types); + const actorTags = uniqueTrimmedStrings(source.actor_tags); + const actorTagsAny = uniqueTrimmedStrings(source.actor_tags_any); + const entityVariant = String(source.entity_variant || '').trim(); + const activity = String(source.activity || '').trim().toLowerCase(); + const injector = String(source.injector || '').trim().toUpperCase(); + const propLeft = String(source.prop_left || '').trim(); + const propRight = String(source.prop_right || '').trim(); + + if (entityTypes.length) out.entity_types = entityTypes; + if (entityVariant) out.entity_variant = entityVariant; + if (actorTags.length) out.actor_tags = actorTags; + if (actorTagsAny.length) out.actor_tags_any = actorTagsAny; + if (activity === 'active' || activity === 'passive') out.activity = activity; + if (injector === 'V' || injector === 'A' || injector === 'M') out.injector = injector; + if (source.receiver === true) out.receiver = true; + if (propLeft) out.prop_left = propLeft; + if (propRight) out.prop_right = propRight; + return out; + } + + function getProjectActorAnimdefMetadata() { + if (!Project) return {}; + + const raw = Project[ACTOR_ANIMDEF_METADATA_PROPERTY]; + if ((typeof raw !== 'string' || !raw.trim()) && (!raw || typeof raw !== 'object')) return {}; + + try { + const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw; + if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return {}; + + const map = {}; + for (const [key, value] of Object.entries(parsed)) { + const idx = parseInt(key, 10); + if (!Number.isFinite(idx) || idx <= 0) continue; + map[String(idx)] = cleanActorAnimdefMetadata(value); + } + return map; + } catch (e) { + console.warn(`Could not parse saved project map "${ACTOR_ANIMDEF_METADATA_PROPERTY}":`, e); + return {}; + } + } + + function setProjectActorAnimdefMetadata(metadata) { + if (!Project) return; + + const clean = {}; + for (const [key, value] of Object.entries(metadata || {})) { + const idx = parseInt(key, 10); + if (!Number.isFinite(idx) || idx <= 0) continue; + const entry = cleanActorAnimdefMetadata(value); + if (Object.keys(entry).length) clean[String(idx)] = entry; + } + + Project[ACTOR_ANIMDEF_METADATA_PROPERTY] = JSON.stringify(clean); + Project.saved = false; + } + + function getProjectBoneTextureOverrides() { + if (!Project) return {}; + + const raw = Project[BONE_TEXTURE_OVERRIDES_PROPERTY]; + if ((typeof raw !== 'string' || !raw.trim()) && (!raw || typeof raw !== 'object')) return {}; + + try { + const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw; + if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return {}; + + const map = {}; + for (const [key, value] of Object.entries(parsed)) { + if (!value || typeof value !== 'object' || Array.isArray(value)) continue; + + const uuid = String(value.uuid || key || '').trim(); + const name = String(value.name || '').trim(); + const texture = String(value.texture || '').trim(); + const mapKey = uuid || name; + if (mapKey && texture) map[mapKey] = { uuid, name, texture }; + } + return map; + } catch (e) { + console.warn(`Could not parse saved project map "${BONE_TEXTURE_OVERRIDES_PROPERTY}":`, e); + return {}; + } + } + + function setProjectBoneTextureOverrides(overrides) { + if (!Project) return; + + const clean = {}; + for (const value of Object.values(overrides || {})) { + if (!value || typeof value !== 'object' || Array.isArray(value)) continue; + + const uuid = String(value.uuid || '').trim(); + const name = String(value.name || '').trim(); + const texture = String(value.texture || '').trim(); + const key = uuid || name; + if (key && texture) clean[key] = { uuid, name, texture }; + } + + Project[BONE_TEXTURE_OVERRIDES_PROPERTY] = JSON.stringify(clean); + Project.saved = false; + } + + function getActorExportLabel(actorIndex) { + const names = getProjectActorNames(); + const saved = String(names[String(actorIndex)] || '').trim(); + return saved || `actor${actorIndex}`; + } + + function getActorSelectLabel(actorIndex) { + const label = getActorExportLabel(actorIndex); + const fallback = `actor${actorIndex}`; + return label === fallback ? fallback : `${fallback} (${label})`; + } + + function buildActorSelectOptions() { + const indices = getSortedUsedActorIndicesFromProject(); + const options = {}; + for (const idx of indices) options[String(idx)] = getActorSelectLabel(idx); + return options; + } + + const GENERIC_ACTOR_LABELS = new Set(['actor', 'top', 'bottom', 'anchor', 'root', 'entity', 'mob']); + const RESOURCE_ID_PATTERN = /^[a-z0-9_.-]+:[a-z0-9/._-]+$/; + + function inferEntityTypeFromActorLabel(label) { + let candidate = String(label || '').trim().toLowerCase(); + candidate = candidate.replace(/[_-]?\d+$/, ''); + if (!candidate || GENERIC_ACTOR_LABELS.has(candidate)) return ''; + if (!/^[a-z0-9_]+$/.test(candidate)) return ''; + return `minecraft:${candidate}`; + } + + function actorAnimdefMetadataWithInference(actorIndex, metadata) { + const clean = cleanActorAnimdefMetadata(metadata); + if (Array.isArray(clean.entity_types) && clean.entity_types.length) return clean; + + const inferred = inferEntityTypeFromActorLabel(getActorExportLabel(actorIndex)); + return inferred ? { ...clean, entity_types: [inferred] } : clean; + } + + function addActorAnimdefFormFields(form, prefix, actorIndex, actorLabel, metadata, defaultActivity, condition) { + const base = `${prefix}_${actorIndex}`; + const fieldCondition = condition || undefined; + form[`${base}_heading`] = { + type: 'info', + text: `actor${actorIndex}: ${actorLabel}`, + condition: fieldCondition, + }; + form[`${base}_entity_types`] = { + label: 'Entity types', + type: 'text', + value: (metadata.entity_types || []).join(', '), + placeholder: 'minecraft:wolf', + description: 'Comma-separated entity IDs.', + condition: fieldCondition, + }; + form[`${base}_entity_variant`] = { + label: 'Entity variant', + type: 'text', + value: metadata.entity_variant || '', + placeholder: 'size_0', + condition: fieldCondition, + }; + form[`${base}_actor_tags`] = { + label: 'Required actor tags', + type: 'text', + value: (metadata.actor_tags || []).join(', '), + placeholder: 'gender.male', + condition: fieldCondition, + }; + form[`${base}_actor_tags_any`] = { + label: 'Any actor tags', + type: 'text', + value: (metadata.actor_tags_any || []).join(', '), + placeholder: 'tag.one, tag.two', + condition: fieldCondition, + }; + form[`${base}_activity`] = { + label: 'Activity', + type: 'select', + options: { active: 'Active', passive: 'Passive' }, + value: metadata.activity || defaultActivity, + condition: fieldCondition, + }; + form[`${base}_injector`] = { + label: 'Injector role', + type: 'select', + options: { '': 'None', V: 'V', A: 'A', M: 'M' }, + value: metadata.injector || '', + condition: fieldCondition, + }; + form[`${base}_receiver`] = { + label: 'Explicit receiver', + type: 'checkbox', + value: metadata.receiver === true, + description: 'An actor cannot be both an injector and an explicit receiver.', + condition: fieldCondition, + }; + form[`${base}_prop_left`] = { + label: 'Default left prop', + type: 'text', + value: metadata.prop_left || '', + placeholder: 'minecraft:carrot', + condition: fieldCondition, + }; + form[`${base}_prop_right`] = { + label: 'Default right prop', + type: 'text', + value: metadata.prop_right || '', + placeholder: 'minecraft:carrot', + condition: fieldCondition, + }; + } + + function readActorAnimdefFormFields(result, prefix, actorIndex) { + const base = `${prefix}_${actorIndex}`; + return cleanActorAnimdefMetadata({ + entity_types: parseCommaSeparatedStrings(result?.[`${base}_entity_types`]), + entity_variant: result?.[`${base}_entity_variant`], + actor_tags: parseCommaSeparatedStrings(result?.[`${base}_actor_tags`]), + actor_tags_any: parseCommaSeparatedStrings(result?.[`${base}_actor_tags_any`]), + activity: result?.[`${base}_activity`], + injector: result?.[`${base}_injector`], + receiver: !!result?.[`${base}_receiver`], + prop_left: result?.[`${base}_prop_left`], + prop_right: result?.[`${base}_prop_right`], + }); + } + + function validateActorAnimdefMetadata(metadata, actorLabel) { + for (const entityType of metadata.entity_types || []) { + if (!RESOURCE_ID_PATTERN.test(entityType)) { + throw new Error(`Actor "${actorLabel}" has invalid entity type "${entityType}". Use namespace:path.`); + } + } + if (metadata.entity_variant && !/^[a-z0-9_]+$/.test(metadata.entity_variant)) { + throw new Error(`Actor "${actorLabel}" has invalid entity variant "${metadata.entity_variant}".`); + } + for (const [key, value] of [ + ['left prop', metadata.prop_left], + ['right prop', metadata.prop_right], + ]) { + if (value && !RESOURCE_ID_PATTERN.test(value)) { + throw new Error(`Actor "${actorLabel}" has invalid ${key} item ID "${value}". Use namespace:path.`); + } + } + if (metadata.injector && metadata.receiver) { + throw new Error(`Actor "${actorLabel}" cannot be both injector ${metadata.injector} and an explicit receiver.`); + } + } + + function getSortedUsedActorIndicesFromProject() { + return Array.from(getUsedActorIndicesFromProject()).sort((a, b) => a - b); + } + + const convertPos = (p) => { + const x = p?.[0] ?? 0, + y = p?.[1] ?? 0, + z = p?.[2] ?? 0; + return [-x, y, z]; + }; + + const convertRot = (r) => { + const x = r?.[0] ?? 0, + y = r?.[1] ?? 0, + z = r?.[2] ?? 0; + return [-x, -y, z]; + }; + + function readActorIndexFromName(name) { + if (typeof name !== 'string' || !name.startsWith('actor')) return null; + + let i = 5; // after 'actor' + let digits = ''; + while (i < name.length) { + const c = name[i]; + if (c < '0' || c > '9') break; + digits += c; + i++; + } + if (!digits || name[i] !== '_') return null; + + const idx = parseInt(digits, 10); + return Number.isFinite(idx) && idx > 0 ? idx : null; + } + + function getUsedActorIndicesFromProject() { + const used = new Set(); + for (const g of Group.all) { + const idx = readActorIndexFromName(g?.name || ''); + if (idx) used.add(idx); + } + return used; + } + + function getNextActorIndex() { + const used = getUsedActorIndicesFromProject(); + let i = 1; + while (used.has(i)) i++; + return i; + } + + function getMaxActorIndexFromProject() { + let max = 0; + for (const g of Group.all) { + const idx = readActorIndexFromName(g?.name || ''); + if (idx && idx > max) max = idx; + } + return max; + } + + function extractGeckoGeometryRoot(json) { + return json?.['minecraft:geometry']?.[0] || null; + } + + function applyPerFaceUVWithXFlip(cube, uvObj) { + if (!cube?.faces || !uvObj || typeof uvObj !== 'object') return; + + const uv = { ...uvObj }; + const tmp = uv.east; + uv.east = uv.west; + uv.west = tmp; + + const faces = ['north', 'south', 'east', 'west', 'up', 'down']; + for (const face of faces) { + const f = uv[face]; + if (!f) continue; + + const a = Array.isArray(f.uv) ? f.uv : null; + const s = Array.isArray(f.uv_size) ? f.uv_size : null; + if (!a || !s) continue; + + const u1 = num(a[0], 0); + const v1 = num(a[1], 0); + const w = num(s[0], 0); + const h = num(s[1], 0); + + if (cube.faces[face]) cube.faces[face].uv = [u1, v1, u1 + w, v1 + h]; + } + + cube.updateUV?.(); + } + + // ---------------------------- + // Import Actor Geometry + // ---------------------------- + function importGeometryIntoCurrentProject(geo, actorIndex) { + const bones = Array.isArray(geo?.bones) ? geo.bones : []; + if (!bones.length) { + Blockbench.showQuickMessage('No bones found in this geometry JSON.', 2500); + return; + } + + const prefix = `actor${actorIndex}_`; + + Undo.initEdit({ outliner: true, selection: true, elements: [], textures: [], animations: [] }); + + const boneByName = new Map(); + for (const b of bones) if (b?.name) boneByName.set(b.name, b); + + const groupByBoneName = new Map(); + for (const boneName of boneByName.keys()) { + const g = new Group({ name: prefix + boneName }); + g.init(); + groupByBoneName.set(boneName, g); + } + + // parenting + for (const [boneName, b] of boneByName) { + const g = groupByBoneName.get(boneName); + const parentGroup = b?.parent ? groupByBoneName.get(b.parent) : null; + g.addTo(parentGroup || 'root'); + } + + // pivots + rotations + for (const [boneName, b] of boneByName) { + const g = groupByBoneName.get(boneName); + g.origin = convertPos(v3(b.pivot, 0)); + g.rotation = convertRot(v3(b.rotation, 0)); + } + + // cubes + for (const [boneName, b] of boneByName) { + const g = groupByBoneName.get(boneName); + const cubes = Array.isArray(b?.cubes) ? b.cubes : []; + + for (let i = 0; i < cubes.length; i++) { + const c = cubes[i]; + const origin = v3(c?.origin, 0); + const size = v3(c?.size, 0); + + const p1 = convertPos(origin); + const p2 = convertPos([origin[0] + size[0], origin[1] + size[1], origin[2] + size[2]]); + + const from = [Math.min(p1[0], p2[0]), Math.min(p1[1], p2[1]), Math.min(p1[2], p2[2])]; + const to = [Math.max(p1[0], p2[0]), Math.max(p1[1], p2[1]), Math.max(p1[2], p2[2])]; + + const cube = new Cube({ + name: `${prefix}${boneName}_cube${i + 1}`, + from, + to, + inflate: num(c?.inflate, 0), + }); + + cube.init(); + cube.addTo(g); + + if (c?.pivot) cube.origin = convertPos(v3(c.pivot, 0)); + if (c?.rotation) cube.rotation = convertRot(v3(c.rotation, 0)); + + if (Array.isArray(c?.uv)) { + cube.box_uv = true; + cube.uv_offset = [num(c.uv[0], 0), num(c.uv[1], 0)]; + } else if (c?.uv && typeof c.uv === 'object') { + cube.box_uv = false; + applyPerFaceUVWithXFlip(cube, c.uv); + } + } + } + + Canvas.updateAll(); + applyAllActorTexturePreviews(false); + Undo.finishEdit(`Import Actor ${actorIndex}`); + + Blockbench.showQuickMessage(`Imported actor with prefix "${prefix}"`, 2500); + } + + function importActorGeckoJson() { + if (!Project) { + Blockbench.showQuickMessage('No project open. Create/open a project first.', 2500); + return; + } + + Filesystem.importFile( + { + type: 'GeckoLib / Bedrock Geometry JSON', + extensions: ['json', 'geo.json'], + multiple: false, + readtype: 'text', + resource_id: 'model', + title: 'Import Actor (.json / .geo.json) with actorN_ prefix', + }, + (files) => { + if (!files?.length) return; + + try { + const json = JSON.parse(files[0]?.content || ''); + const geo = extractGeckoGeometryRoot(json); + + if (!geo) { + Blockbench.showQuickMessage('Unsupported JSON structure (expected minecraft:geometry[0]).', 3000); + return; + } + + importGeometryIntoCurrentProject(geo, getNextActorIndex()); + } catch (e) { + console.error(e); + Blockbench.showQuickMessage(`Import failed: ${e?.message || e}`, 4000); + } + } + ); + } + + // ---------------------------- + // Actor Preferences + // ---------------------------- + function editActorPreferences() { + if (!Project) { + Blockbench.showQuickMessage('No project open. Create/open a project first.', 2500); + return; + } + + const actorIndices = getSortedUsedActorIndicesFromProject(); + if (!actorIndices.length) { + Blockbench.showQuickMessage('No actorN_ bones found in this project.', 2500); + return; + } + + const names = getProjectActorNames(); + const textures = getProjectActorTextures(); + const animdefMetadata = getProjectActorAnimdefMetadata(); + const boneTextureOverrides = getProjectBoneTextureOverrides(); + const textureOverrideGroups = getGroupsForTextureOverrides(); + const loadedTextureNames = (Array.isArray(Texture.all) ? Texture.all : []) + .map((t) => getTextureDisplayName(t)) + .filter((name) => name); + const textureOptions = buildTextureSelectOptions(textures, boneTextureOverrides); + let showBoneTextureOverrides = false; + let showAnimdefMetadata = false; + + const form = { + _info: { + type: 'info', + text: + 'Set export names, actor preview textures, animation-definition metadata, and folder texture overrides for this project. Folder overrides apply recursively and take priority over actor textures. Loaded textures: ' + + (loadedTextureNames.length ? loadedTextureNames.join(', ') : '(none)'), + }, + }; + + for (const idx of actorIndices) { + form[`name_${idx}`] = { + label: `actor${idx} export name`, + type: 'text', + value: names[String(idx)] || '', + placeholder: `actor${idx}`, + }; + form[`texture_${idx}`] = { + label: `actor${idx} preview texture`, + type: 'select', + options: textureOptions, + value: textures[String(idx)] || '', + }; + } + + form.show_animdef_metadata = { + label: 'Animation definition metadata', + type: 'checkbox', + style: 'toggle_switch', + value: showAnimdefMetadata, + description: 'Show persistent AFW actor constraints used by animation-definition stub exports.', + }; + form._animdef_info = { + type: 'info', + text: 'AFW actor metadata', + condition: (result) => result?.show_animdef_metadata ?? showAnimdefMetadata, + }; + actorIndices.forEach((idx, actorPosition) => { + const label = names[String(idx)] || `actor${idx}`; + const metadata = actorAnimdefMetadataWithInference(idx, animdefMetadata[String(idx)]); + addActorAnimdefFormFields( + form, + 'preferences_animdef', + idx, + label, + metadata, + actorPosition === 0 ? 'active' : 'passive', + (result) => result?.show_animdef_metadata ?? showAnimdefMetadata + ); + }); + + if (textureOverrideGroups.length) { + form.show_bone_texture_overrides = { + label: 'Folder texture overrides', + type: 'checkbox', + style: 'toggle_switch', + value: showBoneTextureOverrides, + description: 'Show recursive folder-level texture overrides. These take priority over actor textures.', + }; + form._bone_info = { + type: 'info', + text: 'Folder texture overrides', + condition: (result) => result?.show_bone_texture_overrides ?? showBoneTextureOverrides, + }; + } + + for (let i = 0; i < textureOverrideGroups.length; i++) { + const group = textureOverrideGroups[i]; + const saved = getBoneTextureOverrideForGroup(group, boneTextureOverrides); + form[`bone_texture_${i}`] = { + label: getGroupTextureOverrideLabel(group), + type: 'select', + options: textureOptions, + value: saved?.texture || '', + condition: (result) => result?.show_bone_texture_overrides ?? showBoneTextureOverrides, + }; + } + + const dialog = new Dialog({ + id: 'edit_actor_preferences', + title: 'Actor Preferences', + width: 720, + form, + buttons: ['Cancel', 'Save & Apply'], + cancelIndex: 0, + confirmIndex: 1, + onFormChange: (result) => { + showBoneTextureOverrides = !!result?.show_bone_texture_overrides; + showAnimdefMetadata = !!result?.show_animdef_metadata; + }, + onConfirm: (result) => { + try { + const outNames = {}; + const outTextures = {}; + const outAnimdefMetadata = {}; + const outBoneTextureOverrides = {}; + for (const idx of actorIndices) { + const name = String(result?.[`name_${idx}`] || '').trim(); + const texture = String(result?.[`texture_${idx}`] || '').trim(); + if (name) outNames[String(idx)] = name; + if (texture) outTextures[String(idx)] = texture; + const metadata = result?.show_animdef_metadata + ? readActorAnimdefFormFields(result, 'preferences_animdef', idx) + : cleanActorAnimdefMetadata(animdefMetadata[String(idx)]); + validateActorAnimdefMetadata(metadata, name || `actor${idx}`); + if (Object.keys(metadata).length) outAnimdefMetadata[String(idx)] = metadata; + } + for (let i = 0; i < textureOverrideGroups.length; i++) { + const group = textureOverrideGroups[i]; + const key = getGroupTextureOverrideKey(group); + const resultKey = `bone_texture_${i}`; + const saved = getBoneTextureOverrideForGroup(group, boneTextureOverrides); + const rawTexture = Object.prototype.hasOwnProperty.call(result || {}, resultKey) ? result[resultKey] : saved?.texture; + const texture = String(rawTexture || '').trim(); + if (texture) { + outBoneTextureOverrides[key] = { + uuid: String(group.uuid || '').trim(), + name: String(group.name || '').trim(), + texture, + }; + } + } + setProjectActorNames(outNames); + setProjectActorTextures(outTextures); + setProjectActorAnimdefMetadata(outAnimdefMetadata); + setProjectBoneTextureOverrides(outBoneTextureOverrides); + applyAllActorTexturePreviews(true); + return true; + } catch (e) { + Blockbench.showMessageBox({ + title: 'Actor Preferences', + message: e?.message || String(e), + buttons: ['OK'], + }); + return false; + } + }, + }); + + dialog.show(); + } + + function editBoneTextureOverrides() { + if (!Project) { + Blockbench.showQuickMessage('No project open. Create/open a project first.', 2500); + return; + } + + const groups = getGroupsForTextureOverrides(); + if (!groups.length) { + Blockbench.showQuickMessage('No folders found in this project.', 2500); + return; + } + + const boneTextureOverrides = getProjectBoneTextureOverrides(); + const loadedTextureNames = (Array.isArray(Texture.all) ? Texture.all : []) + .map((t) => getTextureDisplayName(t)) + .filter((name) => name); + const textureOptions = buildTextureSelectOptions({}, boneTextureOverrides); + + const form = { + _info: { + type: 'info', + text: + 'Assign preview/export texture overrides to individual folders. Overrides apply recursively to child folders and cubes. Loaded textures: ' + + (loadedTextureNames.length ? loadedTextureNames.join(', ') : '(none)'), + }, + }; + + for (let i = 0; i < groups.length; i++) { + const group = groups[i]; + const saved = getBoneTextureOverrideForGroup(group, boneTextureOverrides); + form[`bone_texture_${i}`] = { + label: getGroupTextureOverrideLabel(group), + type: 'select', + options: textureOptions, + value: saved?.texture || '', + }; + } + + const dialog = new Dialog({ + id: 'edit_bone_texture_overrides', + title: 'Bone Texture Overrides', + width: 720, + form, + buttons: ['Cancel', 'Save & Apply'], + cancelIndex: 0, + confirmIndex: 1, + onConfirm: (result) => { + const out = {}; + for (let i = 0; i < groups.length; i++) { + const group = groups[i]; + const key = getGroupTextureOverrideKey(group); + const texture = String(result?.[`bone_texture_${i}`] || '').trim(); + if (texture) { + out[key] = { + uuid: String(group.uuid || '').trim(), + name: String(group.name || '').trim(), + texture, + }; + } + } + + setProjectBoneTextureOverrides(out); + applyAllActorTexturePreviews(true); + return true; + }, + }); + + dialog.show(); + } + + // ---------------------------- + // Actor Textures + // ---------------------------- + function getTextureDisplayName(texture) { + return String(texture?.name || texture?.id || texture?.uuid || '').trim(); + } + + function buildTextureSelectOptions(savedTextures, savedBoneTextureOverrides) { + const options = { '': '(none)' }; + const add = (name) => { + const text = String(name || '').trim(); + if (text && !Object.prototype.hasOwnProperty.call(options, text)) options[text] = text; + }; + + const list = Array.isArray(Texture.all) ? Texture.all : []; + for (const texture of list) add(getTextureDisplayName(texture)); + for (const textureName of Object.values(savedTextures || {})) add(textureName); + for (const override of Object.values(savedBoneTextureOverrides || {})) add(override?.texture); + + return options; + } + + function findTextureByActorTextureName(name) { + const wanted = String(name || '').trim(); + if (!wanted) return null; + + const wantedLower = wanted.toLowerCase(); + const list = Array.isArray(Texture.all) ? Texture.all : []; + + return ( + list.find((t) => String(t?.name || '').trim().toLowerCase() === wantedLower) || + list.find((t) => String(t?.id || '').trim().toLowerCase() === wantedLower) || + list.find((t) => String(t?.uuid || '').trim().toLowerCase() === wantedLower) || + list.find((t) => String(t?.name || '').trim().toLowerCase().replace(/\.[^.]+$/, '') === wantedLower) || + null + ); + } + + function groupBelongsToActor(group, actorIndex) { + const prefix = `actor${actorIndex}_`; + let g = group; + while (g) { + if (typeof g?.name === 'string' && g.name.startsWith(prefix)) return true; + g = g.parent instanceof Group ? g.parent : null; + } + return false; + } + + function getGroupsForTextureOverrides() { + const groups = Array.isArray(Group.all) ? Group.all.filter((group) => group) : []; + return groups.sort((a, b) => String(a?.name || '').localeCompare(String(b?.name || ''))); + } + + function getGroupTextureOverrideKey(group) { + return String(group?.uuid || group?.name || '').trim(); + } + + function getGroupTextureOverrideLabel(group) { + return String(group?.name || '(unnamed folder)').trim(); + } + + function getBoneTextureOverrideForGroup(group, overrides) { + if (!group || !overrides) return null; + + const key = getGroupTextureOverrideKey(group); + const direct = key ? overrides[key] : null; + if (direct?.texture) return direct; + + const name = String(group.name || '').trim(); + if (!name) return null; + + return Object.values(overrides).find((override) => override?.name === name && override?.texture) || null; + } + + function cubeBelongsToActor(cube, actorIndex) { + const prefix = `actor${actorIndex}_`; + if (typeof cube?.name === 'string' && cube.name.startsWith(prefix)) return true; + return groupBelongsToActor(cube?.parent, actorIndex); + } + + function getTextureMaterial(texture) { + if (!texture) return null; + if (typeof texture.getMaterial === 'function') return texture.getMaterial(); + if (typeof texture.getOwnMaterial === 'function') return texture.getOwnMaterial(); + return texture.material || null; + } + + function forceActorTextureMaterial(cube, texture) { + const material = getTextureMaterial(texture); + if (!cube?.mesh || !material) return false; + + cube.mesh.material = material; + cube.mesh.material.needsUpdate = true; + cube.mesh.needsUpdate = true; + cube.mesh.userData = cube.mesh.userData || {}; + cube.mesh.userData.multiactor_actor_texture_uuid = texture.uuid || texture.id || texture.name; + return true; + } + + function applyTextureToCube(cube, texture) { + if (!cube || !texture) return; + + const faces = ['north', 'south', 'east', 'west', 'up', 'down']; + const textureId = texture.uuid || texture.id || texture.name; + + if (textureId && cube.faces) { + for (const face of faces) { + const cubeFace = cube.faces[face]; + if (!cubeFace) continue; + cubeFace.texture = textureId; + } + } + + // In GeckoLib/single-texture formats, Blockbench can still render every cube with the selected/default texture. + // So after updating the normal face data, force the actual Three.js mesh material for preview only. + cube.preview_controller?.updateFaces?.(cube); + cube.preview_controller?.updateUV?.(cube); + cube.preview_controller?.updateGeometry?.(cube); + forceActorTextureMaterial(cube, texture); + + // Some preview updates are deferred internally, so apply the material again on the next tick. + setTimeout(() => forceActorTextureMaterial(cube, texture), 0); + } + + function applyActorTexturePreview(actorIndex, textureName) { + const texture = findTextureByActorTextureName(textureName); + if (!texture) return { applied: 0, missing: true }; + + let applied = 0; + const cubes = Array.isArray(Cube.all) ? Cube.all : []; + for (const cube of cubes) { + if (!cubeBelongsToActor(cube, actorIndex)) continue; + applyTextureToCube(cube, texture); + applied++; + } + + return { applied, missing: false }; + } + + function getNearestBoneTextureOverride(cube, overrides) { + let group = cube?.parent instanceof Group ? cube.parent : null; + while (group) { + const override = getBoneTextureOverrideForGroup(group, overrides); + if (override?.texture) return override; + group = group.parent instanceof Group ? group.parent : null; + } + return null; + } + + function applyBoneTextureOverrides() { + const overrides = getProjectBoneTextureOverrides(); + const missing = []; + let applied = 0; + + if (!Object.keys(overrides).length) return { applied, missing }; + + const textureByName = {}; + const cubes = Array.isArray(Cube.all) ? Cube.all : []; + for (const cube of cubes) { + const override = getNearestBoneTextureOverride(cube, overrides); + const textureName = String(override?.texture || '').trim(); + if (!textureName) continue; + + if (!Object.prototype.hasOwnProperty.call(textureByName, textureName)) { + textureByName[textureName] = findTextureByActorTextureName(textureName); + } + + const texture = textureByName[textureName]; + if (!texture) { + if (!missing.includes(textureName)) missing.push(textureName); + continue; + } + + applyTextureToCube(cube, texture); + applied++; + } + + return { applied, missing }; + } + + function applyAllActorTexturePreviews(showMessage = false) { + const textures = getProjectActorTextures(); + const missing = []; + let applied = 0; + + for (const [idxText, textureName] of Object.entries(textures)) { + const idx = parseInt(idxText, 10); + if (!Number.isFinite(idx) || idx <= 0) continue; + + const result = applyActorTexturePreview(idx, textureName); + applied += result.applied || 0; + if (result.missing) missing.push(textureName); + } + + const boneResult = applyBoneTextureOverrides(); + applied += boneResult.applied || 0; + for (const textureName of boneResult.missing || []) { + if (!missing.includes(textureName)) missing.push(textureName); + } + + Canvas.updateAll?.(); + + if (showMessage) { + if (missing.length) { + const missingMessage = + 'Applied texture preferences where possible. These textures are not loaded in this project:' + + '\n\n' + + missing.map((x) => `- ${x}`).join('\n'); + + Blockbench.showMessageBox({ + title: 'Actor Preferences', + message: missingMessage, + buttons: ['OK'], + }); + } else { + Blockbench.showQuickMessage(`Applied texture preferences to ${applied} cubes`, 2500); + } + } + } + + function clearScheduledActorTexturePreviewApplies() { + for (const timeout of actorTexturePreviewTimeouts) clearTimeout(timeout); + actorTexturePreviewTimeouts = []; + } + + function hasProjectActorTexturePreviews() { + return Object.keys(getProjectActorTextures()).length > 0 || Object.keys(getProjectBoneTextureOverrides()).length > 0; + } + + function scheduleActorTexturePreviewApply() { + clearScheduledActorTexturePreviewApplies(); + if (!Project || !hasProjectActorTexturePreviews()) return; + + // Project loading can rebuild preview meshes and load textures after project events fire. + // Reapply for a short window so the saved actor texture preview wins over the selected texture. + for (const delay of [0, 50, 250, 1000, 2500, 5000, 10000]) { + const timeout = setTimeout(() => { + if (Project && hasProjectActorTexturePreviews()) applyAllActorTexturePreviews(false); + }, delay); + actorTexturePreviewTimeouts.push(timeout); + } + } + + // ---------------------------- + // Export Models + // ---------------------------- + function getTextureExportPath(textureName) { + const saved = String(textureName || '').trim(); + if (!saved) return ''; + if (saved.includes(':')) return saved.replace(/\\/g, '/'); + + const texture = findTextureByActorTextureName(saved); + if (texture) { + const path = String(texture.path || texture.relative_path || '').replace(/\\/g, '/'); + if (path) { + const assetsMatch = path.match(/(?:^|\/)assets\/([^/]+)\/(.+)$/i); + if (assetsMatch) return `${assetsMatch[1]}:${assetsMatch[2]}`; + + const texturesIndex = path.toLowerCase().lastIndexOf('/textures/'); + if (texturesIndex !== -1) { + return `minecraft:${path.slice(texturesIndex + 1)}`; + } + } + + if (typeof texture.javaTextureLink === 'function') { + const link = String(texture.javaTextureLink() || '').trim(); + if (link) { + const normalized = link.replace(/\\/g, '/'); + return /\.[a-z0-9]+$/i.test(normalized) ? normalized : `${normalized}.png`; + } + } + } + + return saved.replace(/\\/g, '/'); + } + + function getTextureExportPathFromTexture(texture) { + if (!texture) return ''; + return getTextureExportPath(texture.name || texture.id || texture.uuid); + } + + function findTextureById(textureId) { + const wanted = String(textureId || '').trim(); + if (!wanted) return null; + + const wantedLower = wanted.toLowerCase(); + const list = Array.isArray(Texture.all) ? Texture.all : []; + return ( + list.find((t) => String(t?.uuid || '').trim().toLowerCase() === wantedLower) || + list.find((t) => String(t?.id || '').trim().toLowerCase() === wantedLower) || + list.find((t) => String(t?.name || '').trim().toLowerCase() === wantedLower) || + null + ); + } + + function getCubeReadableTexture(cube) { + const forcedTextureId = cube?.mesh?.userData?.multiactor_actor_texture_uuid; + const forcedTexture = findTextureById(forcedTextureId); + if (forcedTexture) return forcedTexture; + + const faces = ['north', 'south', 'east', 'west', 'up', 'down']; + for (const face of faces) { + const textureId = cube?.faces?.[face]?.texture; + const texture = findTextureById(textureId); + if (texture) return texture; + } + + return null; + } + + function getReadableTexturePathFromCube(cube) { + return getTextureExportPathFromTexture(getCubeReadableTexture(cube)); + } + + function findGroupForTextureOverride(overrideKey, override) { + const groups = Array.isArray(Group.all) ? Group.all : []; + const uuid = String(override?.uuid || overrideKey || '').trim(); + const name = String(override?.name || '').trim(); + + return ( + groups.find((group) => String(group?.uuid || '').trim() === uuid) || + groups.find((group) => String(group?.name || '').trim() === name) || + null + ); + } + + function buildAfwBoneTextureMap() { + const overrides = getProjectBoneTextureOverrides(); + const out = {}; + const explicitBones = new Set(); + + for (const [key, override] of Object.entries(overrides)) { + const group = findGroupForTextureOverride(key, override); + const boneName = String(group?.name || override?.name || '').trim(); + const texturePath = getTextureExportPath(override?.texture); + if (boneName && texturePath) { + out[boneName] = texturePath; + explicitBones.add(boneName); + } + } + + const cubes = Array.isArray(Cube.all) ? Cube.all : []; + const textureCounts = {}; + const boneTextureCounts = {}; + + for (const cube of cubes) { + const group = cube?.parent instanceof Group ? cube.parent : null; + const boneName = String(group?.name || '').trim(); + const texturePath = getReadableTexturePathFromCube(cube); + if (!boneName || !texturePath) continue; + + textureCounts[texturePath] = (textureCounts[texturePath] || 0) + 1; + boneTextureCounts[boneName] = boneTextureCounts[boneName] || {}; + boneTextureCounts[boneName][texturePath] = (boneTextureCounts[boneName][texturePath] || 0) + 1; + } + + let baseTexture = ''; + let baseCount = 0; + for (const [texturePath, count] of Object.entries(textureCounts)) { + if (count > baseCount) { + baseTexture = texturePath; + baseCount = count; + } + } + + for (const [boneName, counts] of Object.entries(boneTextureCounts)) { + if (explicitBones.has(boneName)) continue; + + let dominantTexture = ''; + let dominantCount = 0; + for (const [texturePath, count] of Object.entries(counts)) { + if (count > dominantCount) { + dominantTexture = texturePath; + dominantCount = count; + } + } + + if (dominantTexture && dominantTexture !== baseTexture) out[boneName] = dominantTexture; + } + + return out; + } + + function addAfwBoneTextureMapToGeckoJson(json, afwBoneTextures) { + if (!Object.keys(afwBoneTextures || {}).length) return json; + + const output = {}; + output.afw_bone_textures = afwBoneTextures; + + for (const [key, value] of Object.entries(json || {})) { + if (key !== 'afw_bone_textures') output[key] = value; + } + + return output; + } + + function stringifyCompactModelJson(obj, indent = 2) { + let i = 0; + const tokenPrefix = '__COMPACT_MODEL_JSON__'; + const replacements = new Map(); + + const isNumericArray = (value) => + Array.isArray(value) && value.length > 0 && value.every((n) => typeof n === 'number' && Number.isFinite(n)); + + const isCompactCube = (value) => { + if (!value || typeof value !== 'object' || Array.isArray(value)) return false; + + const keys = Object.keys(value); + if (!keys.length) return false; + + const compactKeys = new Set(['origin', 'size', 'pivot', 'rotation', 'uv', 'inflate', 'mirror']); + for (const key of keys) { + const child = value[key]; + if (!compactKeys.has(key)) return false; + if (Array.isArray(child)) { + if (!isNumericArray(child)) return false; + } else if (typeof child !== 'number' && typeof child !== 'boolean') { + return false; + } + } + + return Array.isArray(value.origin) && Array.isArray(value.size); + }; + + const isCompactUvFace = (value) => { + if (!value || typeof value !== 'object' || Array.isArray(value)) return false; + + const keys = Object.keys(value); + if (!keys.length || keys.length > 3) return false; + if (!Array.isArray(value.uv) || !Array.isArray(value.uv_size)) return false; + + for (const key of keys) { + if (key === 'uv' || key === 'uv_size') { + if (!isNumericArray(value[key])) return false; + } else if (key !== 'texture') { + return false; + } + } + + return true; + }; + + const inline = (value) => { + if (isNumericArray(value)) return `[${value.join(', ')}]`; + + const parts = []; + for (const [key, child] of Object.entries(value)) { + const childText = isNumericArray(child) ? `[${child.join(', ')}]` : JSON.stringify(child); + parts.push(`${JSON.stringify(key)}: ${childText}`); + } + return `{${parts.join(', ')}}`; + }; + + const json = JSON.stringify( + obj, + (key, value) => { + if (isCompactCube(value) || isCompactUvFace(value) || isNumericArray(value)) { + const token = `${tokenPrefix}${i++}__`; + replacements.set(token, inline(value)); + return token; + } + return value; + }, + indent + ); + + let out = json; + for (const [token, text] of replacements) out = out.split(`"${token}"`).join(text); + return out; + } + + function getGeckoModelCodecCandidates() { + const candidates = []; + const add = (codec) => { + if (codec && typeof codec.compile === 'function' && !candidates.includes(codec)) candidates.push(codec); + }; + + add(Format?.codec); + add(Codecs?.bedrock); + add(Codecs?.bedrock_old); + + if (Codecs && typeof Codecs === 'object') { + for (const codec of Object.values(Codecs)) { + const name = String(codec?.name || codec?.id || '').toLowerCase(); + if (name.includes('gecko') || name.includes('bedrock')) add(codec); + } + } + + return candidates; + } + + function parseCompiledModelContent(content) { + if (typeof content === 'string') return JSON.parse(content); + if (content && typeof content === 'object') return clone(content); + throw new Error('Model compiler returned empty content.'); + } + + function compileGeckoModelJson() { + const candidates = getGeckoModelCodecCandidates(); + let lastError = null; + + for (const codec of candidates) { + try { + const options = typeof codec.getExportOptions === 'function' ? codec.getExportOptions() : undefined; + const json = parseCompiledModelContent(codec.compile(options)); + if (Array.isArray(json?.['minecraft:geometry'])) return json; + } catch (e) { + lastError = e; + } + } + + throw new Error(lastError?.message || 'Could not find a GeckoLib/Bedrock model compiler for this project.'); + } + + function getModelExportFileName() { + const codec = Format?.codec; + const codecName = typeof codec?.fileName === 'function' ? codec.fileName() : ''; + const name = codecName || Project?.geometry_name || Project?.name || 'model'; + return sanitizeFilePart(String(name).replace(/\.geo\.json$/i, '').replace(/\.json$/i, '')) || 'model'; + } + + function exportGeckoModel() { + if (!Project) { + Blockbench.showQuickMessage('No project open. Create/open a project first.', 2500); + return; + } + + try { + const compiled = compileGeckoModelJson(); + const afwBoneTextures = buildAfwBoneTextureMap(); + const output = addAfwBoneTextureMapToGeckoJson(compiled, afwBoneTextures); + + Blockbench.export( + { + type: 'GeckoLib Model JSON', + extensions: ['json', 'geo.json'], + name: `${getModelExportFileName()}.geo`, + content: stringifyCompactModelJson(output, 2), + savetype: 'text', + }, + () => Blockbench.showQuickMessage('Exported GeckoLib model', 2500) + ); + } catch (e) { + console.error(e); + Blockbench.showMessageBox({ + title: 'Export GeckoLib Model', + message: `Export failed: ${e?.message || e}`, + buttons: ['OK'], + }); + } + } + + // ---------------------------- + // Export Actor Animations + // ---------------------------- + function getSelectedAnimation() { + return Animation.selected || Timeline.animation || Animation.all?.[0] || null; + } + + function stripPrefixFromAnimationFileForActor(fileObj, actorIndex) { + const prefix = `actor${actorIndex}_`; + const anims = fileObj?.animations; + if (!anims) return; + + for (const animKey of Object.keys(anims)) { + const anim = anims[animKey]; + if (!anim) continue; + + if (anim.bones) { + const newBones = {}; + for (const [boneName, payload] of Object.entries(anim.bones)) { + if (boneName.startsWith(prefix)) newBones[boneName.slice(prefix.length)] = payload; + } + anim.bones = newBones; + } + + // De-prefix common string fields (locators/particles) + const fixStrings = (node) => { + if (!node || typeof node !== 'object') return; + for (const k of Object.keys(node)) { + const v = node[k]; + if (typeof v === 'string') { + if ((k === 'bone' || k === 'locator') && v.startsWith(prefix)) node[k] = v.slice(prefix.length); + } else if (v && typeof v === 'object') { + fixStrings(v); + } + } + }; + fixStrings(anim); + } + } + + function stringifyInlineVec3(obj, indent = 2) { + let i = 0; + const tokenPrefix = '__INLINE_VEC3__'; + const replacements = new Map(); + + const json = JSON.stringify( + obj, + (key, value) => { + if (Array.isArray(value) && value.length === 3 && value.every((n) => typeof n === 'number' && Number.isFinite(n))) { + const token = `${tokenPrefix}${i++}__`; + replacements.set(token, `[${value[0]},${value[1]},${value[2]}]`); + return token; + } + return value; + }, + indent + ); + + let out = json; + for (const [token, vecStr] of replacements) out = out.split(`"${token}"`).join(vecStr); + return out; + } + + function buildActorAnimationOutputsForAnimation(anim, maxActor) { + if (typeof anim?.compileBedrockAnimation !== 'function') { + throw new Error(`Animation compiler not available for "${anim?.name || 'animation'}" (missing compileBedrockAnimation).`); + } + + const animKey = anim.name || 'animation.unnamed'; + const safeAnim = sanitizeFilePart(animKey); + + const compiled = anim.compileBedrockAnimation() || {}; + const baseFile = compiled.animations ? compiled : { format_version: '1.8.0', animations: { [animKey]: compiled } }; + + const outputs = []; + for (let i = 1; i <= maxActor; i++) { + const f = clone(baseFile); + stripPrefixFromAnimationFileForActor(f, i); + const safeActor = sanitizeFilePart(getActorExportLabel(i)) || `actor${i}`; + outputs.push({ + name: `${safeAnim}_${safeActor}.animation`, + content: stringifyInlineVec3(f, 2), + }); + } + return outputs; + } + + function exportActorAnimationOutputs(outputs, doneMessage) { + let idx = 0; + const next = () => { + if (idx >= outputs.length) { + Blockbench.showQuickMessage(doneMessage || `Exported ${outputs.length} actor animation files`, 2500); + return; + } + const o = outputs[idx++]; + Blockbench.export( + { + type: 'JSON', + extensions: ['json'], + name: o.name, + content: o.content, + savetype: 'text', + }, + next + ); + }; + next(); + } + + function exportSelectedActorAnimation() { + const anim = getSelectedAnimation(); + if (!anim) { + Blockbench.showQuickMessage('No animation selected.', 2500); + return; + } + + const maxActor = getMaxActorIndexFromProject(); + if (maxActor < 1) { + Blockbench.showQuickMessage('No actorN_ bones found in this project.', 2500); + return; + } + + try { + const outputs = buildActorAnimationOutputsForAnimation(anim, maxActor); + exportActorAnimationOutputs(outputs, `Exported ${outputs.length} actor animation files`); + } catch (e) { + console.error(e); + Blockbench.showMessageBox({ + title: 'Export Selected Animations (Split Files)', + message: `Export failed: ${e?.message || e}`, + buttons: ['OK'], + }); + } + } + + function exportAllActorAnimations() { + const animations = Array.isArray(Animation.all) ? Animation.all.filter((a) => a) : []; + if (!animations.length) { + Blockbench.showQuickMessage('No animations found.', 2500); + return; + } + + const maxActor = getMaxActorIndexFromProject(); + if (maxActor < 1) { + Blockbench.showQuickMessage('No actorN_ bones found in this project.', 2500); + return; + } + + try { + const outputs = []; + for (const anim of animations) outputs.push(...buildActorAnimationOutputsForAnimation(anim, maxActor)); + exportActorAnimationOutputs(outputs, `Exported ${outputs.length} actor animation files from ${animations.length} animations`); + } catch (e) { + console.error(e); + Blockbench.showMessageBox({ + title: 'Export All Animations (Split Files)', + message: `Export failed: ${e?.message || e}`, + buttons: ['OK'], + }); + } + } + + function parseAfwStageAnimationName(animation) { + const name = String(animation?.name || '').trim(); + const match = /^([a-z0-9._-]+)\.p(\d+)$/.exec(name); + if (!match) return null; + return { + id: match[1], + stageNumber: Number(match[2]), + name, + animation, + }; + } + + function collectConjoinedAnimationGroups() { + const groupsById = new Map(); + const ignored = []; + const animations = Array.isArray(Animation.all) ? Animation.all.filter((animation) => animation) : []; + for (const animation of animations) { + const stage = parseAfwStageAnimationName(animation); + if (!stage) { + ignored.push(String(animation?.name || 'unnamed')); + continue; + } + if (!groupsById.has(stage.id)) groupsById.set(stage.id, []); + groupsById.get(stage.id).push(stage); + } + + const groups = Array.from(groupsById, ([id, stages]) => { + stages.sort((a, b) => a.stageNumber - b.stageNumber || a.name.localeCompare(b.name)); + const seenStages = new Set(); + for (const stage of stages) { + if (seenStages.has(stage.stageNumber)) { + throw new Error(`Animation "${id}" contains more than one .p${stage.stageNumber} stage.`); + } + seenStages.add(stage.stageNumber); + } + return { id, stages }; + }); + groups.sort((a, b) => a.id.localeCompare(b.id)); + return { groups, ignored }; + } + + function compileConjoinedStage(stage) { + const animation = stage?.animation; + if (typeof animation?.compileBedrockAnimation !== 'function') { + throw new Error(`Animation compiler not available for "${stage?.name || 'animation'}".`); + } + + const compiled = animation.compileBedrockAnimation() || {}; + if (!compiled.animations) { + return { formatVersion: '1.8.0', clip: clone(compiled) }; + } + + let clip = compiled.animations[stage.name]; + if (!clip) { + const entries = Object.entries(compiled.animations); + if (entries.length !== 1) { + throw new Error(`Compiled animation "${stage.name}" did not contain a matching animation key.`); + } + clip = entries[0][1]; + } + return { + formatVersion: compiled.format_version || '1.8.0', + clip: clone(clip), + }; + } + + function getActorIndicesFromAnimationClip(clip) { + const actors = new Set(); + for (const boneName of Object.keys(clip?.bones || {})) { + const actorIndex = readActorIndexFromName(boneName); + if (actorIndex) actors.add(actorIndex); + } + return actors; + } + + function validateConjoinedActorLabels(actorIndices) { + const labels = new Map(); + const used = new Set(); + for (const actorIndex of actorIndices) { + const label = String(getActorExportLabel(actorIndex) || '').trim(); + if (!/^[a-z0-9._-]+$/.test(label)) { + throw new Error(`Actor ${actorIndex} export name "${label}" must use only lowercase letters, numbers, ., _ or -.`); + } + if (used.has(label)) { + throw new Error(`Actor export name "${label}" is assigned to more than one actor.`); + } + labels.set(actorIndex, label); + used.add(label); + } + return labels; + } + + function collectParticleOwnerIndices(node, owners, fieldName = '') { + if (node == null) return; + if (typeof node === 'string') { + if (fieldName === 'locator' || fieldName === 'bone') { + const actorIndex = readActorIndexFromName(node); + if (actorIndex) owners.add(actorIndex); + } + return; + } + if (typeof node !== 'object') return; + if (Array.isArray(node)) { + for (const value of node) collectParticleOwnerIndices(value, owners, fieldName); + return; + } + for (const [key, value] of Object.entries(node)) { + collectParticleOwnerIndices(value, owners, key); + } + } + + function particleOwnerForEvent(event, stageName, cueTime) { + const owners = new Set(); + collectParticleOwnerIndices(event, owners); + if (owners.size !== 1) { + const detail = owners.size === 0 ? 'no actor-prefixed locator' : 'locators from multiple actors'; + throw new Error(`Particle cue ${stageName}@${cueTime} has ${detail}. Use one actorN_ locator per cue.`); + } + return owners.values().next().value; + } + + function filterParticleEffectsForActor(clip, actorIndex, stageName) { + if (!clip?.particle_effects || typeof clip.particle_effects !== 'object') return; + const filtered = {}; + for (const [cueTime, payload] of Object.entries(clip.particle_effects)) { + const events = Array.isArray(payload) ? payload : [payload]; + const kept = events.filter((event) => particleOwnerForEvent(event, stageName, cueTime) === actorIndex); + if (!kept.length) continue; + filtered[cueTime] = Array.isArray(payload) ? kept : kept[0]; + } + if (Object.keys(filtered).length) clip.particle_effects = filtered; + else delete clip.particle_effects; + } + + function buildConjoinedAnimationOutput(group) { + const compiledStages = group.stages.map((stage) => ({ ...stage, ...compileConjoinedStage(stage) })); + const actorSet = new Set(); + for (const stage of compiledStages) { + for (const actorIndex of getActorIndicesFromAnimationClip(stage.clip)) actorSet.add(actorIndex); + } + const actorIndices = Array.from(actorSet).sort((a, b) => a - b); + if (!actorIndices.length) { + throw new Error(`Animation "${group.id}" has no animated actorN_ bones.`); + } + + const actorLabels = validateConjoinedActorLabels(actorIndices); + const soundOwner = actorIndices[0]; + const output = { + format_version: compiledStages[0]?.formatVersion || '1.8.0', + animations: {}, + }; + + for (const stage of compiledStages) { + for (const actorIndex of actorIndices) { + const clip = clone(stage.clip); + filterParticleEffectsForActor(clip, actorIndex, stage.name); + if (actorIndex !== soundOwner) delete clip.sound_effects; + + const wrapped = { animations: { clip } }; + stripPrefixFromAnimationFileForActor(wrapped, actorIndex); + output.animations[`p${stage.stageNumber}_${actorLabels.get(actorIndex)}`] = wrapped.animations.clip; + } + } + + return { + name: `${sanitizeFilePart(group.id)}.animation`, + content: stringifyInlineVec3(output, 2), + }; + } + + function exportSelectedConjoinedAnimationGroups(groups) { + try { + const outputs = groups.map(buildConjoinedAnimationOutput); + exportActorAnimationOutputs( + outputs, + `Exported ${outputs.length} animation file${outputs.length === 1 ? '' : 's'}` + ); + } catch (e) { + console.error(e); + Blockbench.showMessageBox({ + title: 'Export Animations', + message: `Export failed: ${e?.message || e}`, + buttons: ['OK'], + }); + } + } + + function showConjoinedAnimationExportDialog() { + let detected; + try { + detected = collectConjoinedAnimationGroups(); + } catch (e) { + Blockbench.showMessageBox({ + title: 'Export Animations', + message: e?.message || String(e), + buttons: ['OK'], + }); + return; + } + if (!detected.groups.length) { + Blockbench.showMessageBox({ + title: 'Export Animations', + message: 'No animations named .p were found in this project.', + buttons: ['OK'], + }); + return; + } + + const form = { + _info: { + type: 'info', + text: 'Select the animation IDs to export. Each selected ID becomes one .animation.json file.', + }, + }; + detected.groups.forEach((group, index) => { + form[`animation_${index}`] = { + label: `${group.id} (${group.stages.length} stage${group.stages.length === 1 ? '' : 's'})`, + type: 'checkbox', + value: true, + }; + }); + if (detected.ignored.length) { + form._ignored = { + type: 'info', + text: `Ignored animations without a valid .p name: ${detected.ignored.join(', ')}`, + }; + } + + const dialog = new Dialog({ + id: 'export_conjoined_actor_animations', + title: 'Export Animations', + width: 680, + form, + buttons: ['Cancel', 'Export Selected'], + cancelIndex: 0, + confirmIndex: 1, + onConfirm: (result) => { + const selected = detected.groups.filter((group, index) => !!result?.[`animation_${index}`]); + if (!selected.length) { + Blockbench.showQuickMessage('No animation IDs selected.', 2500); + return false; + } + exportSelectedConjoinedAnimationGroups(selected); + return true; + }, + }); + dialog.show(); + } + + // ---------------------------- + // Create AFW Animation Definition Stub + // ---------------------------- + function compactNumber(value) { + return Number(Number(value).toFixed(6)); + } + + function parseLoopMode(value) { + if (value === true) return true; + if (value === false) return false; + const normalized = String(value ?? '').trim().toLowerCase(); + if (normalized === 'loop' || normalized === 'true') return true; + if (normalized === 'once' || normalized === 'hold' || normalized === 'hold_on_last_frame' || normalized === 'false') return false; + return null; + } + + function detectStageLoop(stage, clip) { + const animationLoop = parseLoopMode(stage?.animation?.loop); + if (animationLoop !== null) return animationLoop; + const compiledLoop = parseLoopMode(clip?.loop); + return compiledLoop === null ? false : compiledLoop; + } + + function detectStageCycleSeconds(stage, clip) { + for (const candidate of [clip?.animation_length, stage?.animation?.length]) { + const value = Number(candidate); + if (Number.isFinite(value) && value > 0) return compactNumber(value); + } + throw new Error(`Animation "${stage?.name || 'unknown'}" has no positive animation length.`); + } + + function analyzeAnimationDefinitionGroup(group) { + const actorSet = new Set(); + const warnings = []; + const stages = group.stages.map((stage) => { + const compiled = compileConjoinedStage(stage); + const stageActors = getActorIndicesFromAnimationClip(compiled.clip); + for (const actorIndex of stageActors) actorSet.add(actorIndex); + if (!stageActors.size) warnings.push(`${stage.name} has no animated actorN_ bones.`); + return { + stageNumber: stage.stageNumber, + name: stage.name, + loop: detectStageLoop(stage, compiled.clip), + cycleSeconds: detectStageCycleSeconds(stage, compiled.clip), + }; + }); + + const actorIndices = Array.from(actorSet).sort((a, b) => a - b); + if (!actorIndices.length) throw new Error(`Animation "${group.id}" has no animated actorN_ bones.`); + const actorLabels = validateConjoinedActorLabels(actorIndices); + + for (let i = 0; i < stages.length; i++) { + const expected = i + 1; + if (stages[i].stageNumber !== expected) { + warnings.push(`Stages are not contiguous: expected p${expected}, found p${stages[i].stageNumber}.`); + break; + } + } + return { actorIndices, actorLabels, stages, warnings }; + } + + function parseRequiredPositiveNumber(value, label) { + const parsed = Number(value); + if (!Number.isFinite(parsed) || parsed <= 0) throw new Error(`${label} must be a positive number.`); + return compactNumber(parsed); + } + + function parseOptionalNumber(value, label, validator) { + const raw = String(value ?? '').trim(); + if (!raw) return null; + const parsed = Number(raw); + if (!Number.isFinite(parsed)) throw new Error(`${label} must be a number.`); + if (validator && !validator(parsed)) throw new Error(`${label} is outside its supported range.`); + return compactNumber(parsed); + } + + function buildActorConstraint(actorLabel, metadata) { + validateActorAnimdefMetadata(metadata, actorLabel); + + const actor = { label: actorLabel }; + if (metadata.entity_types?.length) actor.entity_types = metadata.entity_types; + if (metadata.entity_variant) actor.entity_variant = metadata.entity_variant; + if (metadata.actor_tags?.length) actor.actor_tags = metadata.actor_tags; + if (metadata.actor_tags_any?.length) actor.actor_tags_any = metadata.actor_tags_any; + if (metadata.activity) actor.activity = metadata.activity; + if (metadata.injector) actor.injector = metadata.injector; + if (metadata.receiver) actor.receiver = true; + if (metadata.prop_left) actor.prop_left = metadata.prop_left; + if (metadata.prop_right) actor.prop_right = metadata.prop_right; + return actor; + } + + function readStageDefinitionFromForm(result, stage, isLastStage) { + const base = `stub_stage_${stage.stageNumber}`; + const loop = !!result?.[`${base}_loop`]; + const cycleSeconds = parseRequiredPositiveNumber(result?.[`${base}_cycle_seconds`], `Stage p${stage.stageNumber} cycle seconds`); + const speed = parseOptionalNumber(result?.[`${base}_speed`], `Stage p${stage.stageNumber} speed`, (value) => value > 0); + const midpointOffset = parseOptionalNumber( + result?.[`${base}_midpoint_offset`], + `Stage p${stage.stageNumber} midpoint offset`, + () => loop + ); + const stageSeconds = parseOptionalNumber( + result?.[`${base}_stage_seconds`], + `Stage p${stage.stageNumber} stage seconds`, + (value) => Number.isInteger(value) && (value === -1 || (value >= 1 && value <= 300)) + ); + const durationMultiplier = parseOptionalNumber( + result?.[`${base}_duration_multiplier`], + `Stage p${stage.stageNumber} duration multiplier`, + (value) => loop && value >= 0.05 && value <= 20 + ); + const escapable = Object.prototype.hasOwnProperty.call(result || {}, `${base}_escapable`) + ? !!result[`${base}_escapable`] + : !isLastStage; + const peaked = Object.prototype.hasOwnProperty.call(result || {}, `${base}_peaked`) + ? !!result[`${base}_peaked`] + : isLastStage; + + const output = { + stage: stage.stageNumber, + loop, + cycle_seconds: cycleSeconds, + allow_join: Object.prototype.hasOwnProperty.call(result || {}, `${base}_allow_join`) + ? !!result[`${base}_allow_join`] + : !isLastStage, + }; + if (midpointOffset !== null) output.cycle_midpoint_offset_seconds = midpointOffset; + if (speed !== null) output.speed = speed; + if (peaked) output.non_peak = true; + output.escapable = escapable; + if (stageSeconds !== null) output.stage_seconds = stageSeconds; + if (durationMultiplier !== null) output.stage_duration_multiplier = durationMultiplier; + return output; + } + + function exportAnimationDefinitionStub(group, definition, actorMetadata) { + const mergedMetadata = { ...getProjectActorAnimdefMetadata(), ...actorMetadata }; + setProjectActorAnimdefMetadata(mergedMetadata); + Blockbench.export( + { + type: 'AFW Animation Definition', + extensions: ['json'], + name: sanitizeFilePart(group.id), + content: JSON.stringify(definition, null, 2), + savetype: 'text', + }, + () => + Blockbench.showQuickMessage( + `Created ${group.id}.json for data//afw_animdefs/`, + 3500 + ) + ); + } + + function confirmUnresolvedActorTypes(unresolvedLabels, onContinue) { + if (!unresolvedLabels.length) { + onContinue(); + return; + } + Blockbench.showMessageBox( + { + title: 'Unresolved Entity Types', + message: + `Could not infer entity types for: ${unresolvedLabels.join(', ')}.\n\n` + + 'The stub will omit entity_types for these actors, which makes them wildcard constraints. Manually add the correct entity_types before using this animation definition.', + buttons: ['Cancel', 'Export Stub'], + }, + (button) => { + if (button === 1 || button === 'Export Stub') onContinue(); + } + ); + } + + function showAnimationDefinitionReviewDialog(group, analysis) { + const savedMetadata = getProjectActorAnimdefMetadata(); + const form = { + _info: { + type: 'info', + text: + `Creating ${group.id}.json with ${analysis.actorIndices.length} actor(s) and ${analysis.stages.length} stage(s). ` + + 'Save it under data//afw_animdefs/. Actor metadata is stored in this Blockbench project for later exports.', + }, + }; + if (analysis.warnings.length) { + form._warnings = { + type: 'info', + text: `Warnings: ${analysis.warnings.join(' ')}`, + }; + } + + form.display_name = { + label: 'Display Name', + type: 'text', + value: '', + placeholder: group.id, + description: 'Optional player-facing name. AFW uses the animation ID when this is empty.', + }; + + form._actors = { type: 'info', text: 'Actor constraints' }; + analysis.actorIndices.forEach((actorIndex, actorPosition) => { + const label = analysis.actorLabels.get(actorIndex); + const metadata = actorAnimdefMetadataWithInference(actorIndex, savedMetadata[String(actorIndex)]); + addActorAnimdefFormFields( + form, + 'stub_actor', + actorIndex, + label, + metadata, + actorPosition === 0 ? 'active' : 'passive' + ); + }); + + form._stages = { type: 'info', text: 'Stage metadata' }; + + analysis.stages.forEach((stage, index) => { + const base = `stub_stage_${stage.stageNumber}`; + const isLastStage = index === analysis.stages.length - 1; + const showAdvanced = (result) => !!result?.[`${base}_advanced`]; + const showAdvancedLoop = (result) => + showAdvanced(result) && (result?.[`${base}_loop`] ?? stage.loop); + form[`${base}_heading`] = { + type: 'info', + text: `Stage p${stage.stageNumber}: detected ${stage.loop ? 'looping' : 'non-looping'}, ${stage.cycleSeconds}s`, + }; + form[`${base}_loop`] = { + label: 'Loop', + type: 'checkbox', + value: stage.loop, + }; + form[`${base}_cycle_seconds`] = { + label: 'Cycle seconds', + type: 'number', + value: stage.cycleSeconds, + min: 0.001, + step: 0.001, + description: 'Detected from the compiled GeckoLib animation_length.', + }; + form[`${base}_allow_join`] = { + label: 'Allow joins', + type: 'checkbox', + value: !isLastStage, + }; + form[`${base}_escapable`] = { + label: 'Escapable', + type: 'checkbox', + value: !isLastStage, + }; + form[`${base}_peaked`] = { + label: 'Peaked stage', + type: 'checkbox', + value: isLastStage, + description: "Marks this as NoN's peaked stage.", + }; + form[`${base}_advanced`] = { + label: 'Advanced stage settings', + type: 'checkbox', + style: 'toggle_switch', + value: false, + description: 'Show optional playback and duration controls.', + }; + form[`${base}_speed`] = { + label: 'Playback speed', + type: 'text', + value: '', + placeholder: 'Default (1.0)', + condition: showAdvanced, + }; + form[`${base}_stage_seconds`] = { + label: 'Stage seconds', + type: 'text', + value: '', + placeholder: 'Use NoN settings', + condition: showAdvanced, + }; + form[`${base}_midpoint_offset`] = { + label: 'Cycle midpoint offset seconds', + type: 'text', + value: '', + placeholder: 'Default (0.0)', + condition: showAdvancedLoop, + }; + form[`${base}_duration_multiplier`] = { + label: 'Stage duration multiplier', + type: 'text', + value: '', + placeholder: 'Default (1.0)', + condition: showAdvancedLoop, + }; + }); + + const dialog = new Dialog({ + id: 'create_afw_animation_definition_review', + title: `Create Animation Definition: ${group.id}`, + width: 760, + form, + buttons: ['Cancel', 'Create Stub'], + cancelIndex: 0, + confirmIndex: 1, + onConfirm: (result) => { + try { + const actorMetadata = {}; + const actors = []; + const unresolvedLabels = []; + for (const actorIndex of analysis.actorIndices) { + const label = analysis.actorLabels.get(actorIndex); + const metadata = readActorAnimdefFormFields(result, 'stub_actor', actorIndex); + actorMetadata[String(actorIndex)] = metadata; + if (!metadata.entity_types?.length) unresolvedLabels.push(label); + actors.push(buildActorConstraint(label, metadata)); + } + + const stages = analysis.stages.map((stage, index) => + readStageDefinitionFromForm(result, stage, index === analysis.stages.length - 1) + ); + const displayName = String(result?.display_name || '').trim(); + const definition = {}; + if (displayName) definition.display_name = displayName; + definition.actors = actors; + definition.stages = stages; + confirmUnresolvedActorTypes(unresolvedLabels, () => + exportAnimationDefinitionStub(group, definition, actorMetadata) + ); + return true; + } catch (e) { + Blockbench.showMessageBox({ + title: 'Create Animation Definition', + message: e?.message || String(e), + buttons: ['OK'], + }); + return false; + } + }, + }); + dialog.show(); + } + + function showCreateAnimationDefinitionDialog() { + let detected; + try { + detected = collectConjoinedAnimationGroups(); + } catch (e) { + Blockbench.showMessageBox({ + title: 'Create Animation Definition', + message: e?.message || String(e), + buttons: ['OK'], + }); + return; + } + if (!detected.groups.length) { + Blockbench.showMessageBox({ + title: 'Create Animation Definition', + message: 'No animations named .p were found in this project.', + buttons: ['OK'], + }); + return; + } + + const options = {}; + for (const group of detected.groups) { + options[group.id] = `${group.id} (${group.stages.length} stage${group.stages.length === 1 ? '' : 's'})`; + } + const selectedStage = parseAfwStageAnimationName(getSelectedAnimation()); + const defaultId = selectedStage && options[selectedStage.id] ? selectedStage.id : detected.groups[0].id; + const dialog = new Dialog({ + id: 'create_afw_animation_definition', + title: 'Create Animation Definition Stub', + width: 620, + form: { + _info: { + type: 'info', + text: 'Select one animation ID. The plugin will detect its actors, stages, loop modes, and exact GeckoLib cycle lengths.', + }, + animation_id: { + label: 'Animation ID', + type: 'select', + options, + value: defaultId, + }, + }, + buttons: ['Cancel', 'Continue'], + cancelIndex: 0, + confirmIndex: 1, + onConfirm: (result) => { + try { + const selectedId = String(result?.animation_id || ''); + const group = detected.groups.find((candidate) => candidate.id === selectedId); + if (!group) throw new Error('No animation ID was selected.'); + const analysis = analyzeAnimationDefinitionGroup(group); + showAnimationDefinitionReviewDialog(group, analysis); + return true; + } catch (e) { + Blockbench.showMessageBox({ + title: 'Create Animation Definition', + message: e?.message || String(e), + buttons: ['OK'], + }); + return false; + } + }, + }); + dialog.show(); + } + + // ---------------------------- + // Import Animations + // ---------------------------- + function stripJsonSuffix(name) { + const s = String(name || ''); + return s.toLowerCase().endsWith('.json') ? s.slice(0, -5) : s; + } + + function stripAnimationSuffix(name) { + const s = String(name || ''); + return s.toLowerCase().endsWith('.animation') ? s.slice(0, -10) : s; + } + + function parseActorSuffix(base) { + const marker = '_actor'; + const at = base.lastIndexOf(marker); + if (at === -1) return null; + + let i = at + marker.length; + let digits = ''; + while (i < base.length) { + const c = base[i]; + if (c < '0' || c > '9') break; + digits += c; + i++; + } + + if (!digits) return null; + if (i !== base.length) return null; + + const idx = parseInt(digits, 10); + return Number.isFinite(idx) && idx > 0 ? idx : null; + } + + function splitWeakBaseAndLabel(base) { + const s = String(base || ''); + const last = s.lastIndexOf('_'); + if (last <= 0 || last >= s.length - 1) return { base: null, label: null }; + return { base: s.slice(0, last), label: s.slice(last + 1) }; + } + + function getFilenameParts(fileName) { + const rawBase = stripAnimationSuffix(stripJsonSuffix(fileName)); + + // Strong rule: ..._actorN + const actor = parseActorSuffix(rawBase); + if (actor) { + const marker = '_actor'; + const at = rawBase.lastIndexOf(marker); + const strictBaseName = at === -1 ? rawBase : rawBase.slice(0, at); + return { + rawBase, + strictActorIndex: actor, + strictBaseName, + weakBaseName: null, + weakLabel: null, + }; + } + + // Weak rule: split at last underscore: _