├── .babelrc ├── .gitignore ├── LICENSE ├── README.md ├── app ├── index.html ├── index.js ├── modal.html ├── models │ ├── canvas.js │ ├── convert.js │ ├── counter.js │ ├── schematics.js │ └── svgCroppy.js ├── screens │ ├── convert.js │ ├── editor.js │ ├── settings.js │ └── start.js └── style.css ├── build ├── webpack.base.conf.js ├── webpack.dev.conf.js └── webpack.prod.conf.js ├── package.json ├── prepare.js └── static ├── blocks_12.json ├── blocks_13.json ├── img ├── arrow.svg ├── brush.svg ├── bucket.png ├── bucket.svg ├── eyedrop.png ├── eyedropper.svg ├── favicon.png ├── hold.svg ├── pencil.svg ├── selection.svg └── zoom.svg └── textures ├── bedrock.png ├── blue_ice.png ├── bone_block_side.png ├── bookshelf.png ├── brain_coral_block.png ├── brick.png ├── bubble_coral_block.png ├── chorus_flower.png ├── chorus_plant.png ├── clay.png ├── coal_block.png ├── coal_ore.png ├── cobblestone.png ├── cobblestone_mossy.png ├── concrete_black.png ├── concrete_blue.png ├── concrete_brown.png ├── concrete_cyan.png ├── concrete_gray.png ├── concrete_green.png ├── concrete_light_blue.png ├── concrete_lime.png ├── concrete_magenta.png ├── concrete_orange.png ├── concrete_pink.png ├── concrete_powder_black.png ├── concrete_powder_blue.png ├── concrete_powder_brown.png ├── concrete_powder_cyan.png ├── concrete_powder_gray.png ├── concrete_powder_green.png ├── concrete_powder_light_blue.png ├── concrete_powder_lime.png ├── concrete_powder_magenta.png ├── concrete_powder_orange.png ├── concrete_powder_pink.png ├── concrete_powder_purple.png ├── concrete_powder_red.png ├── concrete_powder_silver.png ├── concrete_powder_white.png ├── concrete_powder_yellow.png ├── concrete_purple.png ├── concrete_red.png ├── concrete_silver.png ├── concrete_white.png ├── concrete_yellow.png ├── crafting_table_side.png ├── dead_brain_coral_block.png ├── dead_bubble_coral_block.png ├── dead_fire_coral_block.png ├── dead_horn_coral_block.png ├── dead_tube_coral_block.png ├── diamond_block.png ├── diamond_ore.png ├── dirt.png ├── dried_kelp_side.png ├── emerald_block.png ├── emerald_ore.png ├── end_bricks.png ├── end_stone.png ├── fire_coral_block.png ├── glass_black.png ├── glass_blue.png ├── glass_brown.png ├── glass_cyan.png ├── glass_gray.png ├── glass_green.png ├── glass_light_blue.png ├── glass_lime.png ├── glass_magenta.png ├── glass_orange.png ├── glass_pink.png ├── glass_purple.png ├── glass_red.png ├── glass_silver.png ├── glass_white.png ├── glass_yellow.png ├── glazed_terracotta_black.png ├── glazed_terracotta_blue.png ├── glazed_terracotta_brown.png ├── glazed_terracotta_cyan.png ├── glazed_terracotta_gray.png ├── glazed_terracotta_green.png ├── glazed_terracotta_light_blue.png ├── glazed_terracotta_lime.png ├── glazed_terracotta_magenta.png ├── glazed_terracotta_orange.png ├── glazed_terracotta_pink.png ├── glazed_terracotta_purple.png ├── glazed_terracotta_red.png ├── glazed_terracotta_silver.png ├── glazed_terracotta_white.png ├── glazed_terracotta_yellow.png ├── glowstone.png ├── gold_block.png ├── gold_ore.png ├── grass_side.png ├── gravel.png ├── hardened_clay.png ├── hardened_clay_stained_black.png ├── hardened_clay_stained_blue.png ├── hardened_clay_stained_brown.png ├── hardened_clay_stained_cyan.png ├── hardened_clay_stained_gray.png ├── hardened_clay_stained_green.png ├── hardened_clay_stained_light_blue.png ├── hardened_clay_stained_lime.png ├── hardened_clay_stained_magenta.png ├── hardened_clay_stained_orange.png ├── hardened_clay_stained_pink.png ├── hardened_clay_stained_purple.png ├── hardened_clay_stained_red.png ├── hardened_clay_stained_silver.png ├── hardened_clay_stained_white.png ├── hardened_clay_stained_yellow.png ├── hay_block_side.png ├── horn_coral_block.png ├── ice.png ├── iron_block.png ├── iron_ore.png ├── lapis_block.png ├── lapis_ore.png ├── leaves.png ├── log_acacia.png ├── log_acacia_top.png ├── log_big_oak.png ├── log_big_oak_top.png ├── log_birch.png ├── log_birch_top.png ├── log_jungle.png ├── log_jungle_top.png ├── log_oak.png ├── log_oak_top.png ├── log_spruce.png ├── log_spruce_top.png ├── magma.png ├── melon_side.png ├── mushroom_block_skin_brown.png ├── mushroom_block_skin_red.png ├── mycelium_side.png ├── nether_brick.png ├── nether_wart_block.png ├── netherrack.png ├── no_block.png ├── noteblock.png ├── obsidian.png ├── packed_ice.png ├── planks_acacia.png ├── planks_big_oak.png ├── planks_birch.png ├── planks_jungle.png ├── planks_oak.png ├── planks_spruce.png ├── prismarine.png ├── prismarine_bricks.png ├── prismarine_dark.png ├── purpur_block.png ├── purpur_pillar.png ├── quartz_block_chiseled.png ├── quartz_block_lines.png ├── quartz_block_side.png ├── quartz_ore.png ├── red_nether_brick.png ├── red_sand.png ├── red_sandstone_carved.png ├── red_sandstone_normal.png ├── red_sandstone_smooth.png ├── redstone_block.png ├── redstone_lamp_off.png ├── redstone_lamp_on.png ├── redstone_ore.png ├── sand.png ├── sandstone_carved.png ├── sandstone_normal.png ├── sandstone_smooth.png ├── sea_lantern.png ├── slime.png ├── snow.png ├── soul_sand.png ├── sponge.png ├── stone.png ├── stone_andesite.png ├── stone_andesite_smooth.png ├── stone_diorite.png ├── stone_diorite_smooth.png ├── stone_granite.png ├── stone_granite_smooth.png ├── stonebrick.png ├── stonebrick_carved.png ├── stonebrick_cracked.png ├── stonebrick_mossy.png ├── stripped_acacia_log.png ├── stripped_acacia_log_top.png ├── stripped_birch_log.png ├── stripped_birch_log_top.png ├── stripped_dark_oak_log.png ├── stripped_dark_oak_log_top.png ├── stripped_jungle_log.png ├── stripped_jungle_log_top.png ├── stripped_oak_log.png ├── stripped_oak_log_top.png ├── stripped_spruce_log.png ├── stripped_spruce_log_top.png ├── tnt_side.png ├── transparent.png ├── tube_coral_block.png ├── wool_colored_black.png ├── wool_colored_blue.png ├── wool_colored_brown.png ├── wool_colored_cyan.png ├── wool_colored_gray.png ├── wool_colored_green.png ├── wool_colored_light_blue.png ├── wool_colored_lime.png ├── wool_colored_magenta.png ├── wool_colored_orange.png ├── wool_colored_pink.png ├── wool_colored_purple.png ├── wool_colored_red.png ├── wool_colored_silver.png ├── wool_colored_white.png └── wool_colored_yellow.png /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["env"] 3 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | web -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Nikita Suhov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # minecraft-artifier-js 2 | JavaScript/Node.js Web Converter from image to Minecraft blocks.
3 | Can open and save 1.12 and lower .schematics of Minecraft. 4 | 5 | Public part of minecraftart.netlify.com 6 | -------------------------------------------------------------------------------- /app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Minecraft Art To Block 5 | 6 | 7 | 8 | 9 | 10 | <%=require('./modal.html')%> 11 | 12 | 20 | 21 |
22 |
23 |
Drag and drop your image/.schematic file here
24 |
25 | or 26 | 35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 | 43 | 158 | 159 | 319 | 320 | 398 | 399 | -------------------------------------------------------------------------------- /app/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | import './style.css' 4 | import 'bulma/css/bulma.css' 5 | 6 | import ConvertWorker from 'worker-loader!./models/convert.js' 7 | import MineartCanvas from './models/canvas.js' 8 | 9 | const blocks = require('../static/baked_blocks.json') 10 | blocks.forEach((item) => { 11 | item.src = require('../static/textures/' + item.texture_image) 12 | delete item.texture_image 13 | }) 14 | 15 | const store = { 16 | blocksDefault: blocks, 17 | convertWorker: new ConvertWorker(), 18 | mineartCanvas: new MineartCanvas(), 19 | canvasTemp: document.createElement('canvas'), 20 | localStorage: window.localStorage, 21 | uploadedType: null, 22 | uploadedImage: new Image(), 23 | uploadedImageName: null, 24 | minecraftVersion: 12, 25 | waitForLoaded: { 26 | arr: null, 27 | width: null, 28 | height: null 29 | }, 30 | isSaved: true, 31 | leftClick: false, 32 | findBlockById(id) { 33 | return this.blocksDefault.find((item) => { 34 | if (item.id === id) { 35 | return true 36 | } 37 | }) 38 | }, 39 | findBlockByGameId(blockId, dataId) { 40 | const dataIrrelevant = [18, 99, 100, 202, 216, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250] 41 | const dataAxis = [17, 162] 42 | return this.blocksDefault.find((item) => { 43 | if (dataAxis.indexOf(blockId) >= 0 && dataId >= 4) { 44 | let tempDataId = dataId % 4 45 | if (item.block_id === blockId && item.data_id === tempDataId && item.axis) { 46 | return true 47 | } 48 | } else if (dataIrrelevant.indexOf(blockId) >= 0) { 49 | if (item.block_id === blockId) { 50 | return true 51 | } 52 | } else if (item.block_id === blockId && item.data_id === dataId && !item.axis) { 53 | return true 54 | } 55 | }) 56 | }, 57 | showLoading() { 58 | document.querySelector('.loading-overlay').classList.add('is-active') 59 | }, 60 | hideLoading() { 61 | document.querySelector('.loading-overlay').classList.remove('is-active') 62 | }, 63 | startScreen: require('./screens/start.js').output, 64 | settingsScreen: require('./screens/settings.js').output, 65 | editorScreen: require('./screens/editor.js').output, 66 | convertScreen: require('./screens/convert.js').output, 67 | modals: { 68 | items: {}, 69 | $root: document.querySelector('.modal'), 70 | $closeBtn: document.querySelector('.modal-close'), 71 | init() { 72 | const modalList = document.querySelectorAll('div[id^="modal-"]') 73 | modalList.forEach((item) => { 74 | const id = item.id.match(/(modal\-)(.*)/)[2] 75 | this.items[id] = item 76 | }) 77 | }, 78 | openModal(name) { 79 | this.$root.classList.add('is-active') 80 | for (let key in this.items) { 81 | this.items[key].classList.add('hidden') 82 | } 83 | this.items[name].classList.remove('hidden') 84 | store.editorScreen.closeTopbarMenus() 85 | }, 86 | closeModal() { 87 | this.$root.classList.remove('is-active') 88 | for (let key in this.items) { 89 | const video = this.items[key].querySelector('iframe') 90 | if (video) { 91 | video.src = video.src 92 | } 93 | this.items[key].classList.add('hidden') 94 | } 95 | } 96 | }, 97 | errors: { 98 | items: {}, 99 | init() { 100 | const errorList = document.querySelectorAll('div[id^="error-"]') 101 | errorList.forEach((item) => { 102 | const id = item.id.match(/(error\-)(.*)/)[2] 103 | this.items[id] = item 104 | item.classList.add('hidden') 105 | }) 106 | }, 107 | triggerError(id, text, timeout) { 108 | if (this.items[id]) { 109 | if (!this.items[id].classList.contains('hidden')) { 110 | clearTimeout(this.items[id].timeout) 111 | this.items[id].timeout = null 112 | } 113 | this.items[id].querySelector('.warning-body').innerHTML = text 114 | this.items[id].classList.remove('hidden') 115 | this.items[id].timeout = setTimeout(() => { 116 | this.items[id].classList.add('hidden') 117 | this.items[id].timeout = null 118 | }, timeout) 119 | } else { 120 | console.error('No error id!') 121 | } 122 | }, 123 | closeError(id) { 124 | if (this.items[id]) { 125 | if (this.items[id].classList.contains('hidden')) { return } 126 | this.items[id].classList.add('hidden') 127 | if (this.items[id].timeout) { 128 | clearTimeout(this.items[id].timeout) 129 | this.items[id].timeout = null 130 | } 131 | } else { 132 | console.error('No error id!') 133 | } 134 | } 135 | }, 136 | setEventListeners() { 137 | this.convertWorker.onmessage = (e) => { 138 | if (document.readyState !== 'complete') { 139 | store.waitForLoaded.arr = e.data 140 | store.waitForLoaded.width = store.canvasTemp.width 141 | store.waitForLoaded.height = store.canvasTemp.height 142 | return 143 | } 144 | store.hideLoading() 145 | this.settingsScreen.changeToEditorScreen() 146 | this.mineartCanvas.init(store.editorScreen.$canvas) 147 | this.mineartCanvas.setImageSizes(store.canvasTemp.width, store.canvasTemp.height) 148 | this.mineartCanvas.open(e.data) 149 | store.editorScreen.setEyedrop(1) 150 | store.editorScreen.setBrushSize(3) 151 | store.editorScreen.resetScreen() 152 | } 153 | 154 | this.modals.$closeBtn.onclick = () => { 155 | this.modals.closeModal() 156 | } 157 | 158 | window.addEventListener("load", function(event) { 159 | if (store.waitForLoaded.arr !== null) { 160 | store.settingsScreen.changeToEditorScreen() 161 | store.mineartCanvas.init(store.editorScreen.$canvas) 162 | store.mineartCanvas.setImageSizes(store.waitForLoaded.width, store.waitForLoaded.height) 163 | store.mineartCanvas.open(store.waitForLoaded.arr) 164 | store.waitForLoaded = null 165 | store.hideLoading() 166 | } 167 | }); 168 | 169 | document.addEventListener("DOMContentLoaded", function(event) { 170 | document.body.style.display = 'block' 171 | }); 172 | 173 | document.addEventListener('keydown', (e) => { 174 | if (document.activeElement.tagName === 'INPUT' || document.querySelector('section.editor-screen').classList.contains('hidden')) { 175 | return 176 | } 177 | if (store.leftClick) { return } 178 | store.editorScreen.closeTopbarMenus() 179 | switch (e.which) { 180 | case 17: 181 | store.mineartCanvas.setTool('clicker') 182 | store.mineartCanvas.render() 183 | break 184 | case 80: 185 | document.querySelector('.editor-tools input[value="pencil"]').click() 186 | break 187 | case 66: 188 | document.querySelector('.editor-tools input[value="brush"]').click() 189 | break 190 | case 85: 191 | document.querySelector('.editor-tools input[value="bucket"]').click() 192 | break 193 | case 69: 194 | document.querySelector('.editor-tools input[value="eyedropper"]').click() 195 | break 196 | case 90: 197 | if (e.ctrlKey) { 198 | store.editorScreen.undoOnce() 199 | } else { 200 | document.querySelector('.editor-tools input[value="zoom"]').click() 201 | } 202 | break 203 | case 89: 204 | if (e.ctrlKey) { 205 | store.editorScreen.redoOnce() 206 | } 207 | break 208 | case 71: 209 | document.querySelector('.editor-tools input[value="grab"]').click() 210 | break 211 | case 79: 212 | store.editorScreen.$settingsOriginal.click() 213 | break 214 | case 37: 215 | store.mineartCanvas.moveOffset(1, 0) 216 | break 217 | case 38: 218 | store.mineartCanvas.moveOffset(0, 1) 219 | break 220 | case 39: 221 | store.mineartCanvas.moveOffset(-1, 0) 222 | break 223 | case 40: 224 | store.mineartCanvas.moveOffset(0, -1) 225 | break 226 | case 219: 227 | if (store.editorScreen.currentTool === 'pencil' || store.editorScreen.currentTool === 'brush') { 228 | store.editorScreen.$brushMinus.click() 229 | } 230 | break 231 | case 221: 232 | if (store.editorScreen.currentTool === 'pencil' || store.editorScreen.currentTool === 'brush') { 233 | store.editorScreen.$brushPlus.click() 234 | } 235 | break 236 | } 237 | }) 238 | 239 | document.addEventListener('keyup', (e) => { 240 | if (document.activeElement.tagName === 'INPUT' || document.querySelector('section.editor-screen').classList.contains('hidden')) { 241 | return 242 | } 243 | if (store.leftClick) { return } 244 | switch (e.which) { 245 | case 17: 246 | store.mineartCanvas.setTool(store.editorScreen.currentTool) 247 | break 248 | } 249 | }) 250 | 251 | document.addEventListener('mousedown', (e) => { 252 | store.leftClick = true 253 | }) 254 | 255 | document.addEventListener('mouseup', (e) => { 256 | store.leftClick = false 257 | }) 258 | } 259 | } 260 | 261 | store.mineartCanvas.setBlocks(blocks) 262 | blocks.sort((a, b) => { 263 | return a.h - b.h + a.s - b.s + b.l - a.l; 264 | }) 265 | 266 | store.startScreen.init(store) 267 | store.settingsScreen.init(store) 268 | store.editorScreen.init(store) 269 | store.convertScreen.init(store) 270 | store.errors.init() 271 | store.modals.init() 272 | store.setEventListeners() 273 | store.editorScreen.fillBlockList() 274 | -------------------------------------------------------------------------------- /app/modal.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/models/convert.js: -------------------------------------------------------------------------------- 1 | const blocks = require('../../static/baked_blocks.json') 2 | 3 | onmessage = function(e) { 4 | const blocksCopy = Object.assign({}, blocks) 5 | 6 | e.data.exclude.forEach((item) => { 7 | delete blocksCopy[item - 1] 8 | }) 9 | 10 | const imageData = e.data.imgData 11 | 12 | if (imageData.constructor.name != 'Uint8ClampedArray') { 13 | console.error('not uint8!!!') 14 | return 15 | } 16 | 17 | let output = new Uint8ClampedArray(imageData.length / 4) 18 | 19 | for (let i = 0; i < imageData.length; i += 4) { 20 | let pixelRgb = { 21 | red: imageData[i], 22 | green: imageData[i + 1], 23 | blue: imageData[i + 2], 24 | alpha: imageData[i + 3] 25 | } 26 | if (pixelRgb.alpha > 70) { 27 | let temp = false 28 | for (let key in blocksCopy) { 29 | const item = blocksCopy[key] 30 | let dev = Math.abs(pixelRgb.red - item.red) + Math.abs(pixelRgb.green - item.green) + Math.abs(pixelRgb.blue - item.blue) 31 | if (!temp || dev < temp.deviation) { 32 | temp = item 33 | temp.deviation = dev 34 | } 35 | } 36 | output[i / 4] = temp.id 37 | } else { 38 | output[i / 4] = 0 39 | } 40 | 41 | } 42 | 43 | postMessage(output) 44 | } 45 | -------------------------------------------------------------------------------- /app/models/counter.js: -------------------------------------------------------------------------------- 1 | function Counter(node) { 2 | let initFlag = false 3 | let $root 4 | let current = 1 5 | let max = 1 6 | let callback = null 7 | const template = ` 8 | 9 | 10 | 11 | ` 12 | const nodes = { 13 | doubleLeft: null, 14 | left: null, 15 | input: null, 16 | span: null, 17 | right: null, 18 | doubleRight: null 19 | } 20 | 21 | this._setSpan = () => { 22 | nodes.span.innerHTML = `out of ${max}` 23 | } 24 | 25 | this._setEventListeners = () => { 26 | nodes.doubleLeft.onclick = () => { 27 | this.setValue(1) 28 | } 29 | 30 | nodes.left.onclick = () => { 31 | this.setValue(current - 1) 32 | } 33 | 34 | nodes.input.onchange = () => { 35 | this.setValue(nodes.input.value) 36 | } 37 | 38 | nodes.right.onclick = () => { 39 | this.setValue(current + 1) 40 | } 41 | 42 | nodes.doubleRight.onclick = () => { 43 | this.setValue(max) 44 | } 45 | } 46 | 47 | this.setValue = (int) => { 48 | current = int 49 | if (int < 1) { current = 1 } 50 | if (int > max) { current = max } 51 | nodes.input.value = current 52 | if (callback) { 53 | callback(current) 54 | } 55 | } 56 | 57 | this.setMax = (int) => { 58 | max = int 59 | if (current > max) { 60 | this.setValue(int) 61 | } 62 | this._setSpan() 63 | } 64 | 65 | this.setCallback = (func) => { 66 | callback = func 67 | } 68 | 69 | this.init = (node) => { 70 | if (initFlag === true) { return } 71 | initFlag = true 72 | $root = node 73 | $root.innerHTML = template 74 | nodes.doubleLeft = $root.querySelector('i.fa-angle-double-left') 75 | nodes.left = $root.querySelector('i.fa-angle-left') 76 | nodes.input = $root.querySelector('input.input') 77 | nodes.span = $root.querySelector('span.counter-span') 78 | nodes.right = $root.querySelector('i.fa-angle-right') 79 | nodes.doubleRight = $root.querySelector('i.fa-angle-double-right') 80 | this._setEventListeners() 81 | } 82 | 83 | if (node) { 84 | this.init(node) 85 | } 86 | } 87 | 88 | export default Counter 89 | -------------------------------------------------------------------------------- /app/models/schematics.js: -------------------------------------------------------------------------------- 1 | import Zlib from 'zlibjs/bin/zlib_and_gzip.min.js' 2 | import Nbt from 'nbt' 3 | 4 | function SchematicsHelper() { 5 | this.Zlib = Zlib.Zlib 6 | 7 | this.encode = (obj) => { 8 | const writer = new Nbt.Writer() 9 | writer.compound(obj) 10 | const compound = new Uint8Array(writer.getData()) 11 | const compoundName = 'Schematic' 12 | const output = new Uint8Array(3 + compoundName.length + compound.byteLength) 13 | output[0] = 10 14 | output[2] = compoundName.length 15 | compoundName.split('').forEach((i, k) => { 16 | output[k + 3] = i.charCodeAt(0) 17 | }) 18 | output.set(compound, 3 + compoundName.length) 19 | var gzip = new this.Zlib.Gzip(output) 20 | var compressed = gzip.compress() 21 | return compressed 22 | } 23 | 24 | this.decode = (arr, callback) => { 25 | const gzip = new this.Zlib.Gunzip(arr) 26 | Nbt.parse(arr, callback) 27 | } 28 | } 29 | 30 | export default SchematicsHelper -------------------------------------------------------------------------------- /app/models/svgCroppy.js: -------------------------------------------------------------------------------- 1 | function SvgCroppy() { 2 | function setAttr(node, obj) { 3 | for (let key in obj) { 4 | node.setAttribute(key, obj[key]) 5 | } 6 | } 7 | 8 | const store = { 9 | style: { 10 | cornerWidth: 20, 11 | cornerHeight: 20 12 | }, 13 | posData: { 14 | boundingRect: null, 15 | selectRect: { 16 | width: 50, 17 | height: 50, 18 | offsetX: 0, 19 | offsetY: 0, 20 | minWidth: 10, 21 | minHeight: 10 22 | } 23 | }, 24 | nodes: { 25 | root: null, 26 | wrapper: null, 27 | svg: null 28 | }, 29 | svgNodes: { 30 | backgroundRect: null, 31 | selectRect: null, 32 | selectRectMask: null, 33 | cornerLeftTop: null, 34 | cornerRightTop: null, 35 | cornerLeftBottom: null, 36 | cornerRightBottom: null, 37 | barTop: null, 38 | barLeft: null, 39 | barRight: null, 40 | barBottom: null 41 | }, 42 | events: { 43 | transformed: new Event('croppytransformed') 44 | } 45 | } 46 | 47 | var initFlag = false 48 | 49 | this._storeSetNode = (key, node) => { 50 | if (store.nodes[key] === undefined) { 51 | throw new Error('[SvgCroppy] Unknown key in store.nodes') 52 | } 53 | store.nodes[key] = node 54 | return node 55 | } 56 | 57 | this._storeGetNode = (key) => { 58 | return store.nodes[key] 59 | } 60 | 61 | this._storeSetSvgNode = (key, node) => { 62 | if (store.svgNodes[key] === undefined) { 63 | throw new Error('[SvgCroppy] Unknown key in store.svgNodes') 64 | } 65 | store.svgNodes[key] = node 66 | return node 67 | } 68 | 69 | this._storeGetSvgNode = (key) => { 70 | return store.svgNodes[key] 71 | } 72 | 73 | this._setPosDataSelectRect = (key, value) => { 74 | switch (key) { 75 | case 'width': 76 | if (value <= store.posData.selectRect.minWidth) { 77 | store.posData.selectRect.width = store.posData.selectRect.minWidth 78 | } else if (value >= store.posData.boundingRect.width - store.posData.selectRect.offsetX) { 79 | store.posData.selectRect.width = store.posData.boundingRect.width - store.posData.selectRect.offsetX 80 | } else { 81 | store.posData.selectRect.width = value 82 | } 83 | break 84 | case 'height': 85 | if (value <= store.posData.selectRect.minHeight) { 86 | store.posData.selectRect.height = store.posData.selectRect.minHeight 87 | } else if (value >= store.posData.boundingRect.height - store.posData.selectRect.offsetY) { 88 | store.posData.selectRect.height = store.posData.boundingRect.height - store.posData.selectRect.offsetY 89 | } else { 90 | store.posData.selectRect.height = value 91 | } 92 | break 93 | case 'offsetX': 94 | if (value <= 0) { 95 | store.posData.selectRect.offsetX = 0 96 | } else if (value >= store.posData.boundingRect.width - store.posData.selectRect.width) { 97 | store.posData.selectRect.offsetX = store.posData.boundingRect.width - store.posData.selectRect.width 98 | } else { 99 | store.posData.selectRect.offsetX = value 100 | } 101 | break 102 | case 'offsetY': 103 | if (value <= 0) { 104 | store.posData.selectRect.offsetY = 0 105 | } else if (value >= store.posData.boundingRect.height - store.posData.selectRect.height) { 106 | store.posData.selectRect.offsetY = store.posData.boundingRect.height - store.posData.selectRect.height 107 | } else { 108 | store.posData.selectRect.offsetY = value 109 | } 110 | break 111 | } 112 | } 113 | 114 | this._setEventListeners = () => { 115 | const $root = this._storeGetNode('root'), 116 | $svg = this._storeGetNode('svg'), 117 | $selectRect = this._storeGetSvgNode('selectRect'), 118 | $cornerLeftTop = this._storeGetSvgNode('cornerLeftTop'), 119 | $cornerRightTop = this._storeGetSvgNode('cornerRightTop'), 120 | $cornerLeftBottom = this._storeGetSvgNode('cornerLeftBottom'), 121 | $cornerRightBottom = this._storeGetSvgNode('cornerRightBottom'), 122 | $barTop = this._storeGetSvgNode('barTop'), 123 | $barLeft = this._storeGetSvgNode('barLeft'), 124 | $barRight = this._storeGetSvgNode('barRight'), 125 | $barBottom = this._storeGetSvgNode('barBottom') 126 | 127 | 128 | const svgNodeStyleAliases = { 129 | 'croppy-svg-corner-left-top' : 'CORNER_LEFT_TOP', 130 | 'croppy-svg-corner-right-top' : 'CORNER_RIGHT_TOP', 131 | 'croppy-svg-corner-left-bottom' : 'CORNER_LEFT_BOTTOM', 132 | 'croppy-svg-corner-right-bottom' : 'CORNER_RIGHT_BOTTOM', 133 | 'croppy-svg-bar-top' : 'BAR_TOP', 134 | 'croppy-svg-bar-left' : 'BAR_LEFT', 135 | 'croppy-svg-bar-right' : 'BAR_RIGHT', 136 | 'croppy-svg-bar-bottom' : 'BAR_BOTTOM', 137 | 'croppy-svg-select' : 'SELECT_RECT' 138 | } 139 | 140 | const grabbed = { 141 | el: null, 142 | startX: null, 143 | startY: null, 144 | oldWidth: null, 145 | oldHeight: null 146 | } 147 | const svgControls = [$cornerLeftTop, $cornerRightTop, $cornerLeftBottom, $cornerRightBottom, 148 | $barTop, $barLeft, $barRight, $barBottom, 149 | $selectRect] 150 | 151 | for (let key in svgControls) { 152 | svgControls[key].addEventListener('mousedown', (e) => { 153 | const localXY = { 154 | x: e.pageX - store.posData.boundingRect.x, 155 | y: e.pageY - store.posData.boundingRect.y 156 | } 157 | 158 | grabbed.el = svgNodeStyleAliases[e.target.classList[1]] || svgNodeStyleAliases[e.target.classList[0]] 159 | if (grabbed.el === undefined) { throw new Error('[SvgCroppy] Selected node is not defined in aliases') } 160 | grabbed.startX = localXY.x 161 | grabbed.startY = localXY.y 162 | grabbed.oldWidth = store.posData.selectRect.width 163 | grabbed.oldHeight = store.posData.selectRect.height 164 | grabbed.oldOffsetX = store.posData.selectRect.offsetX 165 | grabbed.oldOffsetY = store.posData.selectRect.offsetY 166 | grabbed.oldEndX = store.posData.selectRect.offsetX + store.posData.selectRect.width 167 | grabbed.oldEndY = store.posData.selectRect.offsetY + store.posData.selectRect.height 168 | }) 169 | } 170 | 171 | document.addEventListener('mousemove', (e) => { 172 | if (e.target.constructor.name !== 'HTMLHtmlElement') { 173 | if (e.target.parentNode.getAttribute('class') !== 'croppy-svg' && !grabbed.el) { //hardcode 174 | return 175 | } 176 | } 177 | 178 | if (grabbed.el) { 179 | const startLocal = { 180 | x: e.pageX - store.posData.boundingRect.x - grabbed.startX, 181 | y: e.pageY - store.posData.boundingRect.y - grabbed.startY, 182 | } 183 | switch (grabbed.el) { 184 | case 'CORNER_LEFT_TOP': 185 | if (grabbed.oldOffsetX + startLocal.x > 0 && grabbed.oldEndX >= grabbed.oldOffsetX + startLocal.x + store.posData.selectRect.minWidth) { 186 | this._setPosDataSelectRect('offsetX', grabbed.oldOffsetX + startLocal.x) 187 | this._setPosDataSelectRect('width', grabbed.oldWidth - startLocal.x) 188 | } else if (grabbed.oldOffsetX + startLocal.x <= 0) { 189 | this._setPosDataSelectRect('offsetX', 0) 190 | this._setPosDataSelectRect('width', grabbed.oldEndX) 191 | } else { 192 | this._setPosDataSelectRect('offsetX', grabbed.oldEndX - store.posData.selectRect.minWidth) 193 | this._setPosDataSelectRect('width', store.posData.selectRect.minWidth) 194 | } 195 | if (grabbed.oldOffsetY + startLocal.y <= 0) { 196 | this._setPosDataSelectRect('offsetY', 0) 197 | this._setPosDataSelectRect('height', grabbed.oldEndY) 198 | } else if (grabbed.oldEndY >= grabbed.oldOffsetY + startLocal.y + store.posData.selectRect.minHeight) { 199 | this._setPosDataSelectRect('offsetY', grabbed.oldOffsetY + startLocal.y) 200 | this._setPosDataSelectRect('height', grabbed.oldHeight - startLocal.y) 201 | } else { 202 | this._setPosDataSelectRect('offsetY', grabbed.oldEndY - store.posData.selectRect.minHeight) 203 | this._setPosDataSelectRect('height', store.posData.selectRect.minHeight) 204 | } 205 | break 206 | case 'CORNER_RIGHT_TOP': 207 | if (grabbed.oldOffsetY + startLocal.y <= 0) { 208 | this._setPosDataSelectRect('offsetY', 0) 209 | this._setPosDataSelectRect('height', grabbed.oldEndY) 210 | } else if (grabbed.oldEndY >= grabbed.oldOffsetY + startLocal.y + store.posData.selectRect.minHeight) { 211 | this._setPosDataSelectRect('offsetY', grabbed.oldOffsetY + startLocal.y) 212 | this._setPosDataSelectRect('height', grabbed.oldHeight - startLocal.y) 213 | } else { 214 | this._setPosDataSelectRect('offsetY', grabbed.oldEndY - store.posData.selectRect.minHeight) 215 | this._setPosDataSelectRect('height', store.posData.selectRect.minHeight) 216 | } 217 | 218 | this._setPosDataSelectRect('width', grabbed.oldWidth + startLocal.x) 219 | break 220 | case 'CORNER_LEFT_BOTTOM': 221 | if (grabbed.oldOffsetX + startLocal.x > 0 && grabbed.oldEndX >= grabbed.oldOffsetX + startLocal.x + store.posData.selectRect.minWidth) { 222 | this._setPosDataSelectRect('offsetX', grabbed.oldOffsetX + startLocal.x) 223 | this._setPosDataSelectRect('width', grabbed.oldWidth - startLocal.x) 224 | } else if (grabbed.oldOffsetX + startLocal.x <= 0) { 225 | this._setPosDataSelectRect('offsetX', 0) 226 | this._setPosDataSelectRect('width', grabbed.oldEndX) 227 | } else { 228 | this._setPosDataSelectRect('offsetX', grabbed.oldEndX - store.posData.selectRect.minWidth) 229 | this._setPosDataSelectRect('width', store.posData.selectRect.minWidth) 230 | } 231 | this._setPosDataSelectRect('height', grabbed.oldHeight + startLocal.y) 232 | break 233 | case 'CORNER_RIGHT_BOTTOM': 234 | this._setPosDataSelectRect('width', grabbed.oldWidth + startLocal.x) 235 | this._setPosDataSelectRect('height', grabbed.oldHeight + startLocal.y) 236 | break 237 | case 'BAR_TOP': 238 | if (grabbed.oldOffsetY + startLocal.y <= 0) { 239 | this._setPosDataSelectRect('offsetY', 0) 240 | this._setPosDataSelectRect('height', grabbed.oldEndY) 241 | } else if (grabbed.oldEndY >= grabbed.oldOffsetY + startLocal.y + store.posData.selectRect.minHeight) { 242 | this._setPosDataSelectRect('offsetY', grabbed.oldOffsetY + startLocal.y) 243 | this._setPosDataSelectRect('height', grabbed.oldHeight - startLocal.y) 244 | } else { 245 | this._setPosDataSelectRect('offsetY', grabbed.oldEndY - store.posData.selectRect.minHeight) 246 | this._setPosDataSelectRect('height', store.posData.selectRect.minHeight) 247 | } 248 | break 249 | case 'BAR_LEFT': 250 | if (grabbed.oldOffsetX + startLocal.x > 0 && grabbed.oldEndX >= grabbed.oldOffsetX + startLocal.x + store.posData.selectRect.minWidth) { 251 | this._setPosDataSelectRect('offsetX', grabbed.oldOffsetX + startLocal.x) 252 | this._setPosDataSelectRect('width', grabbed.oldWidth - startLocal.x) 253 | } else if (grabbed.oldOffsetX + startLocal.x <= 0) { 254 | this._setPosDataSelectRect('offsetX', 0) 255 | this._setPosDataSelectRect('width', grabbed.oldEndX) 256 | } else { 257 | this._setPosDataSelectRect('offsetX', grabbed.oldEndX - store.posData.selectRect.minWidth) 258 | this._setPosDataSelectRect('width', store.posData.selectRect.minWidth) 259 | } 260 | break 261 | case 'BAR_RIGHT': 262 | this._setPosDataSelectRect('width', grabbed.oldWidth + startLocal.x) 263 | break 264 | case 'BAR_BOTTOM': 265 | this._setPosDataSelectRect('height', grabbed.oldHeight + startLocal.y) 266 | break 267 | case 'SELECT_RECT': 268 | this._setPosDataSelectRect('offsetX', grabbed.oldOffsetX + startLocal.x) 269 | this._setPosDataSelectRect('offsetY', grabbed.oldOffsetY + startLocal.y) 270 | break 271 | } 272 | this.render() 273 | $root.dispatchEvent(store.events.transformed) 274 | } 275 | 276 | }) 277 | 278 | document.addEventListener('mouseup', (e) => { 279 | grabbed.el = null 280 | grabbed.startX = null 281 | grabbed.startY = null 282 | grabbed.oldWidth = null 283 | grabbed.oldHeight = null 284 | grabbed.oldOffsetX = null 285 | grabbed.oldOffsetY = null 286 | grabbed.oldEndX = null 287 | grabbed.oldEndY = null 288 | }) 289 | } 290 | 291 | this.render = () => { 292 | const $selectRect = this._storeGetSvgNode('selectRect'), 293 | $selectRectMask = this._storeGetSvgNode('selectRectMask'), 294 | $cornerLeftTop = this._storeGetSvgNode('cornerLeftTop'), 295 | $cornerRightTop = this._storeGetSvgNode('cornerRightTop'), 296 | $cornerLeftBottom = this._storeGetSvgNode('cornerLeftBottom'), 297 | $cornerRightBottom = this._storeGetSvgNode('cornerRightBottom'), 298 | $barTop = this._storeGetSvgNode('barTop'), 299 | $barLeft = this._storeGetSvgNode('barLeft'), 300 | $barRight = this._storeGetSvgNode('barRight'), 301 | $barBottom = this._storeGetSvgNode('barBottom') 302 | 303 | 304 | setAttr($selectRectMask, { 305 | x: store.posData.selectRect.offsetX, 306 | y: store.posData.selectRect.offsetY, 307 | width: store.posData.selectRect.width, 308 | height: store.posData.selectRect.height 309 | }) 310 | 311 | setAttr($selectRect, { 312 | x: store.posData.selectRect.offsetX, 313 | y: store.posData.selectRect.offsetY, 314 | width: store.posData.selectRect.width, 315 | height: store.posData.selectRect.height 316 | }) 317 | 318 | setAttr($cornerLeftTop, { 319 | x: store.posData.selectRect.offsetX - Math.round(store.style.cornerWidth / 2), 320 | y: store.posData.selectRect.offsetY - Math.round(store.style.cornerHeight / 2) 321 | }) 322 | 323 | setAttr($cornerRightTop, { 324 | x: store.posData.selectRect.offsetX + store.posData.selectRect.width - Math.round(store.style.cornerWidth / 2), 325 | y: store.posData.selectRect.offsetY - Math.round(store.style.cornerHeight / 2) 326 | }) 327 | 328 | setAttr($cornerLeftBottom, { 329 | x: store.posData.selectRect.offsetX - Math.round(store.style.cornerWidth / 2), 330 | y: store.posData.selectRect.offsetY + store.posData.selectRect.height - Math.round(store.style.cornerHeight / 2) 331 | }) 332 | 333 | setAttr($cornerRightBottom, { 334 | x: store.posData.selectRect.offsetX + store.posData.selectRect.width - Math.round(store.style.cornerWidth / 2), 335 | y: store.posData.selectRect.offsetY + store.posData.selectRect.height - Math.round(store.style.cornerHeight / 2) 336 | }) 337 | 338 | setAttr($barTop, { 339 | x: store.posData.selectRect.offsetX - Math.round(store.style.cornerWidth / 2) + store.style.cornerWidth, 340 | y: store.posData.selectRect.offsetY - Math.round(store.style.cornerHeight / 2), 341 | width: store.posData.selectRect.width - store.style.cornerHeight >= 0 ? store.posData.selectRect.width - store.style.cornerHeight : 0, 342 | height: store.style.cornerHeight 343 | }) 344 | 345 | setAttr($barLeft, { 346 | x: store.posData.selectRect.offsetX - Math.round(store.style.cornerWidth / 2), 347 | y: store.posData.selectRect.offsetY - Math.round(store.style.cornerHeight / 2) + store.style.cornerHeight, 348 | width: store.style.cornerWidth, 349 | height: store.posData.selectRect.height - store.style.cornerHeight >= 0 ? store.posData.selectRect.height - store.style.cornerHeight : 0 350 | }) 351 | 352 | setAttr($barRight, { 353 | x: store.posData.selectRect.offsetX - Math.round(store.style.cornerWidth / 2) + store.posData.selectRect.width, 354 | y: store.posData.selectRect.offsetY - Math.round(store.style.cornerHeight / 2) + store.style.cornerHeight, 355 | width: store.style.cornerWidth, 356 | height: store.posData.selectRect.height - store.style.cornerHeight >= 0 ? store.posData.selectRect.height - store.style.cornerHeight : 0 357 | }) 358 | 359 | setAttr($barBottom, { 360 | x: store.posData.selectRect.offsetX - Math.round(store.style.cornerWidth / 2) + store.style.cornerWidth, 361 | y: store.posData.selectRect.offsetY - Math.round(store.style.cornerHeight / 2) + store.posData.selectRect.height, 362 | width: store.posData.selectRect.width - store.style.cornerHeight >= 0 ? store.posData.selectRect.width - store.style.cornerHeight : 0, 363 | height: store.style.cornerHeight 364 | }) 365 | } 366 | 367 | this.getCropInfo = () => { 368 | return { 369 | offsetX: store.posData.selectRect.offsetX, 370 | offsetY: store.posData.selectRect.offsetY, 371 | width: store.posData.selectRect.width, 372 | height: store.posData.selectRect.height, 373 | boundWidth: store.posData.boundingRect.width, 374 | boundHeight: store.posData.boundingRect.height, 375 | } 376 | } 377 | 378 | this.hide = () => { 379 | if (store.nodes.svg) { 380 | store.nodes.svg.classList.add('croppy-hidden') 381 | } 382 | } 383 | 384 | this.unhide = () => { 385 | if (store.nodes.svg) { 386 | store.nodes.svg.classList.remove('croppy-hidden') 387 | } 388 | this._storeGetNode('root').dispatchEvent(store.events.transformed) 389 | } 390 | 391 | this.setSizes = () => { 392 | const $svg = this._storeGetNode('svg') 393 | const $svgSelectRect = this._storeGetSvgNode('selectRect') 394 | const $wrapper = this._storeGetNode('wrapper') 395 | const $root = this._storeGetNode('root') 396 | 397 | $wrapper.style.height = $root.clientHeight + 'px' 398 | 399 | store.posData.selectRect.width = Math.round($root.width * 0.8) 400 | store.posData.selectRect.height = Math.round($root.height * 0.8) 401 | store.posData.selectRect.offsetX = Math.round($root.width * 0.1) 402 | store.posData.selectRect.offsetY = Math.round($root.height * 0.1) 403 | 404 | store.posData.boundingRect = $wrapper.getBoundingClientRect() 405 | 406 | this.render() 407 | } 408 | 409 | this.init = (rootSelector) => { 410 | let $root = null 411 | 412 | if (rootSelector.constructor.name === 'String') { 413 | $root = document.querySelector(rootSelector) 414 | } else { 415 | $root = rootSelector 416 | } 417 | 418 | if ($root === null) { throw new Error('[SvgCroppy] rootNode is null') } 419 | 420 | this._storeSetNode('root', $root) 421 | 422 | if (initFlag) { 423 | this.setSizes() 424 | return 425 | } 426 | initFlag = true 427 | 428 | const svgTemplate = ` 429 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | ` 513 | const $wrapper = document.createElement('div') 514 | $wrapper.className = 'croppy-wrapper' 515 | 516 | this._storeSetNode('wrapper', $wrapper) 517 | 518 | $root.parentNode.insertBefore($wrapper, $root) 519 | $wrapper.innerHTML = svgTemplate 520 | $wrapper.append($root) 521 | 522 | const $svg = this._storeSetNode('svg', $wrapper.querySelector('svg')) 523 | const $svgBackgroundRect = this._storeSetSvgNode('backgroundRect', $svg.querySelector('.croppy-svg-background')) 524 | const $svgSelectRect = this._storeSetSvgNode('selectRect', $svg.querySelector('.croppy-svg-select')) 525 | 526 | this._storeSetSvgNode('selectRectMask', $svg.querySelector('.croppy-svg-mask')) 527 | 528 | this._storeSetSvgNode('cornerLeftTop', $svg.querySelector('.croppy-svg-corner-left-top')) 529 | this._storeSetSvgNode('cornerRightTop', $svg.querySelector('.croppy-svg-corner-right-top')) 530 | this._storeSetSvgNode('cornerLeftBottom', $svg.querySelector('.croppy-svg-corner-left-bottom')) 531 | this._storeSetSvgNode('cornerRightBottom', $svg.querySelector('.croppy-svg-corner-right-bottom')) 532 | 533 | this._storeSetSvgNode('barTop', $svg.querySelector('.croppy-svg-bar-top')) 534 | this._storeSetSvgNode('barLeft', $svg.querySelector('.croppy-svg-bar-left')), 535 | this._storeSetSvgNode('barRight', $svg.querySelector('.croppy-svg-bar-right')), 536 | this._storeSetSvgNode('barBottom', $svg.querySelector('.croppy-svg-bar-bottom')), 537 | 538 | this.setSizes() 539 | this._setEventListeners() 540 | } 541 | } 542 | 543 | export default SvgCroppy 544 | -------------------------------------------------------------------------------- /app/screens/convert.js: -------------------------------------------------------------------------------- 1 | import Counter from '../models/counter.js' 2 | const _URL = window.URL || window.webkitURL 3 | 4 | const store = { 5 | parent: null, 6 | wasChanged: false, 7 | commBlockStrings: null, 8 | mcfunctionBlob: null, 9 | rawCommands: null, 10 | quantityOfBlocks: null, 11 | counterCommblock: new Counter(), 12 | counterRaw: new Counter(), 13 | counterManual: new Counter(), 14 | init(parent) { 15 | this.parent = parent 16 | const nodeList = document.querySelectorAll('*[id^="convert-"]').forEach((item) => { 17 | let key = '$' 18 | item.id.split('-').forEach((str, i) => { 19 | if (i > 1) { 20 | key += str.charAt(0).toUpperCase() + str.slice(1) 21 | } else if (i > 0) { 22 | key += str 23 | } 24 | }) 25 | this[key] = item 26 | }) 27 | this.setEventListeners() 28 | }, 29 | convert () { 30 | if (this.wasChanged) { 31 | store.parent.mineartCanvas.resetGroups() 32 | this.wasChanged = false 33 | } 34 | this.commBlockStrings = store.parent.mineartCanvas.convertAsCommandBlock(this.$selectFacing.value) 35 | this.mcfunctionBlob = new Blob([store.parent.mineartCanvas.convertAsMcfunction(this.$selectFacing.value)], {type : 'text/plain'}) 36 | this.rawCommands = store.parent.mineartCanvas.convertAsRaw(this.$selectFacing.value) 37 | this.$btnMcfunction.href = _URL.createObjectURL(this.mcfunctionBlob) 38 | this.quantityOfBlocks = store.parent.mineartCanvas.getQuantityOfBlocks() 39 | 40 | this.$stringCommands.innerHTML = `Total commands: ${this.rawCommands.length}` 41 | 42 | this.counterCommblock.init(this.$counterCommblock) 43 | this.counterCommblock.setMax(this.commBlockStrings.length) 44 | this.counterCommblock.setCallback((int) => { 45 | this.$commblockTextarea.value = this.commBlockStrings[int - 1] 46 | store.parent.mineartCanvas.setSettingsValue('drawGroupsCurrent', int - 1) 47 | store.parent.mineartCanvas.render() 48 | }) 49 | this.counterCommblock.setValue(1) 50 | 51 | this.counterRaw.init(this.$counterRaw) 52 | const commandsOnPage = 1000 53 | this.counterRaw.setMax(Math.ceil(this.rawCommands.length / commandsOnPage)) 54 | this.counterRaw.setCallback((int) => { 55 | const slice = this.rawCommands.slice((int - 1) * commandsOnPage, commandsOnPage * int) 56 | let output = '' 57 | slice.forEach((item) => { 58 | output += `${item}\n` 59 | }) 60 | this.$preRaw.style.counterIncrement = 'line ' + (int - 1) * commandsOnPage 61 | this.$preRaw.innerHTML = output 62 | }) 63 | this.counterRaw.setValue(1) 64 | 65 | const rowsOnPage = 10 66 | const $tbody = this.$tableManual.querySelector('tbody') 67 | this.counterManual.init(this.$counterManual) 68 | this.counterManual.setMax(Math.ceil(this.quantityOfBlocks.length / rowsOnPage)) 69 | this.counterManual.setCallback((int) => { 70 | $tbody.innerHTML = '' 71 | const slice = this.quantityOfBlocks.slice((int - 1) * rowsOnPage, rowsOnPage * int) 72 | slice.forEach((item) => { 73 | const $row = document.createElement('tr') 74 | const block = store.parent.findBlockById(parseInt(item.id)) 75 | let quantityStr = '' 76 | if (item.quant > 63) { 77 | quantityStr += `${Math.floor(item.quant / 64)} stacks` 78 | if (item.quant % 64 !== 0) { 79 | quantityStr += ` + ${item.quant % 64} blocks` 80 | } 81 | } else { 82 | quantityStr += `${item.quant} blocks` 83 | } 84 | $row.innerHTML = `${block.name}${quantityStr}` 85 | $tbody.appendChild($row) 86 | }) 87 | }) 88 | this.counterManual.setValue(1) 89 | this.$stringDelete.innerHTML = store.parent.mineartCanvas.getCommandToDelete(this.$selectFacing.value).join('
') 90 | this.$notifyChanged.classList.add('hidden') 91 | }, 92 | resetScreen() { 93 | this.$selectVersion.value = 12 94 | this.$selectMethod.value = 'commblock' 95 | this.$selectFacing.value = 'north' 96 | document.querySelector('section.convert-screen').classList.add('hidden') 97 | this.$outputCommblock.classList.remove('hidden') 98 | this.$outputMcfunction.classList.add('hidden') 99 | this.$outputRaw.classList.add('hidden') 100 | this.$outputManual.classList.add('hidden') 101 | }, 102 | setEventListeners() { 103 | this.$selectMethod.onchange = (e) => { 104 | this.$outputCommblock.classList.add('hidden') 105 | this.$outputMcfunction.classList.add('hidden') 106 | this.$outputRaw.classList.add('hidden') 107 | this.$outputManual.classList.add('hidden') 108 | switch (e.target.value) { 109 | case 'commblock': 110 | this.$outputCommblock.classList.remove('hidden') 111 | break 112 | case 'mcfunction': 113 | this.$outputMcfunction.classList.remove('hidden') 114 | break 115 | case 'raw': 116 | this.$outputRaw.classList.remove('hidden') 117 | break 118 | case 'manual': 119 | this.$outputManual.classList.remove('hidden') 120 | break 121 | } 122 | } 123 | 124 | this.$selectFacing.onchange = (e) => { 125 | store.parent.editorScreen.$settingsWeDirection.value = e.target.value 126 | this.convert() 127 | } 128 | 129 | this.$btnMcfunction.onclick = (e) => { 130 | if (this.$inputMcfunction.value) { 131 | this.$btnMcfunction.classList.remove('border-danger') 132 | this.$btnMcfunction.download = `${this.$inputMcfunction.value}.mcfunction` 133 | } else { 134 | this.$btnMcfunction.classList.add('border-danger') 135 | e.preventDefault() 136 | return 137 | } 138 | } 139 | 140 | this.$copyClipboard.onclick = (e) => { 141 | e.preventDefault() 142 | this.$commblockTextarea.select() 143 | document.execCommand('copy') 144 | } 145 | 146 | this.$notifyLink.onclick = (e) => { 147 | e.preventDefault() 148 | this.convert() 149 | this.$notifyChanged.classList.add('hidden') 150 | } 151 | 152 | this.$selectVersion.onchange = (e) => { 153 | store.parent.mineartCanvas.setSettingsValue('minecraftVersion', parseInt(e.target.value)) 154 | this.convert() 155 | } 156 | 157 | this.$howtoCommand.onclick = (e) => { 158 | e.preventDefault() 159 | store.parent.modals.openModal('howto-command') 160 | } 161 | } 162 | } 163 | 164 | export { store as output } -------------------------------------------------------------------------------- /app/screens/editor.js: -------------------------------------------------------------------------------- 1 | const _URL = window.URL || window.webkitURL 2 | 3 | const store = { 4 | parent: null, 5 | eyedropListener: null, 6 | mainEyedrop: null, 7 | currentHistoryPos: -1, 8 | noBlockImg: new Image(), 9 | currentTool: 'pencil', 10 | brushSize: 3, 11 | pencilSize: 3, 12 | maxHistory: 100, 13 | tempEyedrop: false, 14 | $topbarBtns: document.querySelectorAll('.topbar-btn'), 15 | init(parent) { 16 | this.parent = parent 17 | const nodeList = document.querySelectorAll('*[id^="editor-"]').forEach((item) => { 18 | let key = '$' 19 | item.id.split('-').forEach((str, i) => { 20 | if (i > 1) { 21 | key += str.charAt(0).toUpperCase() + str.slice(1) 22 | } else if (i > 0) { 23 | key += str 24 | } 25 | }) 26 | this[key] = item 27 | }) 28 | this.setEventListeners() 29 | }, 30 | setEyedropListener(node) { 31 | this.eyedropListener = node 32 | node.classList.add('active') 33 | store.parent.mineartCanvas.setTool('clicker') 34 | }, 35 | removeEyedropListener() { 36 | if (this.eyedropListener) { 37 | this.eyedropListener.classList.remove('active') 38 | this.eyedropListener = null 39 | store.parent.mineartCanvas.setTool(this.currentTool) 40 | } 41 | }, 42 | fillBlockList() { 43 | this.noBlockImg.src = require('../../static/textures/no_block.png') 44 | const wrapperNoBlock = document.createElement('div') 45 | wrapperNoBlock.onclick = () => { 46 | this.setEyedrop(0) 47 | } 48 | wrapperNoBlock.title = 'No Block' 49 | wrapperNoBlock.appendChild(this.noBlockImg) 50 | wrapperNoBlock.classList.add('info-panels-blocks-img-wrapper') 51 | store.$blockList.appendChild(wrapperNoBlock) 52 | store.parent.blocksDefault.forEach((item) => { 53 | const wrapper = document.createElement('div') 54 | const node = new Image() 55 | node.src = item.src 56 | node.classList.add('img-pixelated') 57 | node.setAttribute('data-block-id', item.id) 58 | wrapper.title = item.name 59 | wrapper.onclick = () => { 60 | if (store.eyedropListener) { 61 | store.eyedropListener.setAttribute('data-block-id', item.id) 62 | store.eyedropListener.src = item.src 63 | const $title = store.eyedropListener.parentNode.querySelector('span') 64 | if ($title) { 65 | $title.innerHTML = item.name 66 | } 67 | store.removeEyedropListener() 68 | } else { 69 | this.setEyedrop(item.id) 70 | } 71 | } 72 | wrapper.appendChild(node) 73 | wrapper.classList.add('info-panels-blocks-img-wrapper') 74 | store.$blockList.appendChild(wrapper) 75 | }) 76 | }, 77 | changeToSettingsScreen() { 78 | document.querySelector('section.editor-screen').classList.add('hidden') 79 | document.querySelector('section.convert-screen').classList.add('hidden') 80 | document.querySelector('section.settings-screen').classList.remove('hidden') 81 | store.parent.settingsScreen.resetScreen() 82 | }, 83 | removeHistory() { 84 | document.querySelectorAll('.info-panels-history-action').forEach((item) => { 85 | item.remove() 86 | }) 87 | }, 88 | setEyedrop(int) { 89 | if (int != 0) { 90 | const block = store.parent.findBlockById(int) 91 | this.$mainEyedrop.src = block.src 92 | this.$mainEyedrop.title = block.name 93 | } else { 94 | this.$mainEyedrop.src = this.noBlockImg.src 95 | this.$mainEyedrop.title = 'No Block' 96 | } 97 | this.mainEyedrop = int 98 | store.parent.mineartCanvas.setEyedrop(int) 99 | }, 100 | filterBlockList(str) { 101 | store.parent.blocksDefault.forEach((item) => { 102 | const regex = new RegExp(str, 'i') 103 | if (item.name.match(regex)) { 104 | this.$blockList.querySelector(`img[data-block-id="${item.id}"]`).classList.remove('hidden') 105 | } else { 106 | this.$blockList.querySelector(`img[data-block-id="${item.id}"]`).classList.add('hidden') 107 | } 108 | }) 109 | }, 110 | setBrushSize(int) { 111 | let temp 112 | if (int > 25) { 113 | temp = 25 114 | } else if (int < 1) { 115 | temp = 1 116 | } else { 117 | temp = int 118 | } 119 | const size = temp < 3 ? 3 : temp 120 | this.$brushShape.style.width = (size % 2 ? size : size - 1) + 'px' 121 | this.$brushShape.style.height = (size % 2 ? size : size - 1) + 'px' 122 | this.$brushString.innerHTML = `${temp} bl.` 123 | if (this.currentTool === 'pencil') { 124 | this.pencilSize = temp 125 | } else if (this.currentTool === 'brush') { 126 | this.brushSize = temp 127 | } else { 128 | this.pencilSize = temp 129 | this.brushSize = temp 130 | } 131 | store.parent.mineartCanvas.setBrushSize(temp) 132 | }, 133 | resetScreen() { 134 | this.currentTool = 'pencil' 135 | this.brushSize = 3 136 | this.pencilSize = 3 137 | this.closeTopbarMenus() 138 | this.$settingsRulers.checked = true 139 | this.$settingsGrid.checked = false 140 | this.$settingsOriginal.checked = false 141 | this.$settingsGridColor.value = '#ff4778' 142 | this.setEyedrop(1) 143 | this.removeEyedropListener() 144 | this.$replaceReplacement.src = require('../../static/textures/transparent.png') 145 | this.$replaceTarget.src = require('../../static/textures/transparent.png') 146 | this.$replaceReplacement.parentNode.querySelector('span').innerHTML = '...' 147 | this.$replaceTarget.parentNode.querySelector('span').innerHTML = '...' 148 | this.$replaceInfo.classList.add('hidden') 149 | this.$firstAction.classList.add('info-panels-history-action-current') 150 | document.querySelector('.editor-tools input[value="pencil"]').checked = true 151 | this.$brushShape.classList.remove('circle') 152 | this.$brushContainer.classList.remove('hidden') 153 | if (store.parent.localStorage.getItem('gridColor')) { 154 | this.$settingsGridColor.value = store.parent.localStorage.getItem('gridColor') 155 | store.parent.mineartCanvas.setSettingsValue('gridColor', this.$settingsGridColor.value) 156 | } 157 | }, 158 | closeTopbarMenus() { 159 | document.querySelectorAll('.topbar-menu').forEach((item) => { 160 | item.classList.add('hidden') 161 | }) 162 | this.$replaceInfo.classList.add('hidden') 163 | this.removeEyedropListener() 164 | }, 165 | undoOnce() { 166 | const temp = store.currentHistoryPos - 1 167 | const node = document.querySelector(`.info-panels-history-action[data-action-pos="${temp}"]`) 168 | if (temp < -1) { return } 169 | if (temp === -1 || node === null) { 170 | this.$firstAction.click() 171 | } else { 172 | node.click() 173 | } 174 | }, 175 | redoOnce() { 176 | const temp = store.currentHistoryPos + 1 177 | const node = document.querySelector(`.info-panels-history-action[data-action-pos="${temp}"]`) 178 | if (node) { 179 | node.click() 180 | } else if (temp === 0) { 181 | document.querySelector('.info-panels-history-action').click() 182 | } 183 | }, 184 | setEventListeners() { 185 | this.$topbarBtns.forEach((item) => { 186 | item.onclick = (e) => { 187 | const menu = item.querySelector('.topbar-menu') 188 | if (e.target === item) { 189 | if (menu.classList.contains('hidden')) { 190 | this.closeTopbarMenus() 191 | menu.classList.remove('hidden') 192 | } else { 193 | this.closeTopbarMenus() 194 | } 195 | } 196 | } 197 | }) 198 | 199 | this.$replaceTarget.onclick = (e) => { 200 | this.removeEyedropListener() 201 | this.setEyedropListener(e.target) 202 | } 203 | 204 | this.$replaceReplacement.onclick = (e) => { 205 | this.removeEyedropListener() 206 | this.setEyedropListener(e.target) 207 | } 208 | 209 | this.$replaceBtn.onclick = (e) => { 210 | const id1 = parseInt(this.$replaceTarget.dataset.blockId) 211 | const id2 = parseInt(this.$replaceReplacement.dataset.blockId) 212 | 213 | if (id1 && id2) { 214 | this.$replaceBtn.classList.remove('border-danger') 215 | } else { 216 | this.$replaceBtn.classList.add('border-danger') 217 | return 218 | } 219 | 220 | const replacedNum = store.parent.mineartCanvas.replace(id1, id2) 221 | this.$replaceInfo.classList.remove('hidden') 222 | this.$replaceInfo.innerHTML = `${replacedNum} block(s) replaced.` 223 | } 224 | 225 | this.$canvas.onmousedown = (e) => { 226 | if (e.which === 1 && this.$settingsOriginal.checked === true) { 227 | store.parent.mineartCanvas.setSettingsValue('showOriginal', false) 228 | this.$settingsOriginal.checked = false 229 | store.parent.mineartCanvas.render() 230 | } 231 | } 232 | 233 | this.$canvas.onclick = (e) => { 234 | store.parent.mineartCanvas.render() 235 | const info = store.parent.mineartCanvas.getBlockInfoByMouseXY(e.x, e.y).info 236 | if (!info) { return } 237 | if (this.eyedropListener) { 238 | this.eyedropListener.setAttribute('data-block-id', info.id) 239 | this.eyedropListener.src = info.image.src 240 | const $title = this.eyedropListener.parentNode.querySelector('span') 241 | if ($title) { 242 | $title.innerHTML = info.name 243 | } 244 | this.removeEyedropListener() 245 | } 246 | if (this.currentTool === 'eyedropper' || store.parent.mineartCanvas.getTool() === 'clicker') { 247 | this.setEyedrop(info.id) 248 | } 249 | } 250 | 251 | this.$canvas.onmousemove = (e) => { 252 | const data = store.parent.mineartCanvas.getBlockInfoByMouseXY(e.x, e.y) 253 | if (data && data.info) { 254 | this.$footbarLeft.innerHTML = ` 255 | X: ${data.x}, Y: ${data.y}, Name: ${data.info.name}, Game ID: ${data.info.game_id} Pos: ${data.blockPos} 256 | ` 257 | } else if (data) { 258 | this.$footbarLeft.innerHTML = ` 259 | X: ${data.x}, Y: ${data.y}, Name: - 260 | ` 261 | } else { 262 | this.$footbarLeft.innerHTML = '...' 263 | } 264 | } 265 | 266 | this.$canvas.addEventListener('history', (e) => { 267 | store.parent.convertScreen.wasChanged = true 268 | store.parent.convertScreen.$notifyChanged.classList.remove('hidden') 269 | this.isSaved = false 270 | this.currentHistoryPos = e.details.pos 271 | 272 | let historyCounter = 0 273 | const actions = this.$history.querySelectorAll('.info-panels-history-action') 274 | actions.forEach((item) => { 275 | item.classList.remove('info-panels-history-action-current') 276 | if (parseInt(item.dataset.actionPos) >= parseInt(this.currentHistoryPos)) { 277 | item.remove() 278 | historyCounter-- 279 | } else { 280 | historyCounter++ 281 | } 282 | }) 283 | 284 | if (historyCounter === this.maxHistory) { 285 | const lastAction = this.$history.querySelector('.info-panels-history-action') 286 | lastAction.remove() 287 | } 288 | 289 | const node = document.createElement('div') 290 | node.classList.add('info-panels-history-action') 291 | node.classList.add('info-panels-history-action-current') 292 | node.classList.add('info-panels-history-action-' + e.details.type) 293 | node.setAttribute('data-action-pos', e.details.pos) 294 | node.innerHTML = e.details.type.charAt(0).toUpperCase() + e.details.type.slice(1) 295 | node.onclick = () => { 296 | if (this.$settingsOriginal.checked === true) { 297 | store.parent.mineartCanvas.setSettingsValue('showOriginal', false) 298 | store.parent.mineartCanvas.render() 299 | this.$settingsOriginal.checked = false 300 | } 301 | this.$firstAction.classList.remove('info-panels-history-action-current') 302 | const actions = this.$history.querySelectorAll('.info-panels-history-action') 303 | actions.forEach((item) => { 304 | item.classList.remove('info-panels-history-action-current') 305 | if (parseInt(item.dataset.actionPos) > parseInt(node.dataset.actionPos)) { 306 | item.classList.add('info-panels-history-action-returned') 307 | } else { 308 | item.classList.remove('info-panels-history-action-returned') 309 | } 310 | }) 311 | node.classList.add('info-panels-history-action-current') 312 | store.parent.mineartCanvas.undoTo(parseInt(node.dataset.actionPos)) 313 | if (this.currentHistoryPos !== parseInt(node.dataset.actionPos)) { 314 | store.parent.convertScreen.$notifyChanged.classList.remove('hidden') 315 | this.isSaved = false 316 | } 317 | this.currentHistoryPos = parseInt(node.dataset.actionPos) 318 | store.parent.convertScreen.wasChanged = true 319 | } 320 | 321 | this.$firstAction.classList.remove('info-panels-history-action-current') 322 | this.$history.appendChild(node) 323 | this.$history.scrollTop = this.$history.scrollHeight 324 | }) 325 | 326 | this.$firstAction.onclick = (e) => { 327 | e.target.classList.add('info-panels-history-action-current') 328 | const actions = this.$history.querySelectorAll('.info-panels-history-action') 329 | actions.forEach((item) => { 330 | item.classList.remove('info-panels-history-action-current') 331 | item.classList.add('info-panels-history-action-returned') 332 | }) 333 | store.parent.mineartCanvas.undoTo(-1) 334 | if (this.currentHistoryPos !== -1) { 335 | store.parent.convertScreen.$notifyChanged.classList.remove('hidden') 336 | this.isSaved = false 337 | } 338 | this.currentHistoryPos = -1 339 | store.parent.convertScreen.wasChanged = true 340 | if (this.$settingsOriginal.checked === true) { 341 | store.parent.mineartCanvas.setSettingsValue('showOriginal', false) 342 | store.parent.mineartCanvas.render() 343 | this.$settingsOriginal.checked = false 344 | } 345 | } 346 | 347 | this.$btnConvert.onclick = () => { 348 | const convertScreen = document.querySelector('section.convert-screen') 349 | convertScreen.classList.remove('hidden') 350 | store.parent.convertScreen.convert() 351 | setTimeout(() => { 352 | convertScreen.scrollIntoView({behavior: 'smooth'}) 353 | }, 100) 354 | } 355 | 356 | this.$saveBtn.onclick = () => { 357 | if (this.$saveInput.value) { 358 | this.$saveBtn.classList.remove('border-danger') 359 | this.$saveBtn.download = `${this.$saveInput.value}.schematic` 360 | } else { 361 | this.$saveBtn.classList.add('border-danger') 362 | return 363 | } 364 | const link = store.parent.mineartCanvas.save(this.$settingsWeDirection.value) 365 | this.$saveBtn.href = link 366 | this.isSaved = true 367 | } 368 | 369 | this.$fileInputImage.onclick = (e) => { 370 | e.target.value = null 371 | } 372 | 373 | this.$fileInputImage.oninput = (e) => { 374 | if (e.target.files.length !== 1) { 375 | store.parent.errors.triggerError('editor-screen', 'Please, choose only one file.', 5000) 376 | return 377 | } 378 | const regexp = /(.*)\.([^.]*)/ 379 | const output = e.target.files[0].name.match(regexp) 380 | let ext, name 381 | if (output) { 382 | ext = e.target.files[0].name.match(regexp)[2] 383 | name = e.target.files[0].name.match(regexp)[1] 384 | } else { 385 | store.parent.errors.triggerError('editor-screen', 'Wrong file type. Try image file (jpg, png, bmp).', 5000) 386 | return 387 | } 388 | if (ext.match(/(jpeg|jpg|png|bmp)/i)) { 389 | store.parent.startScreen.setNameFile(name) 390 | store.parent.startScreen.uploadImage(_URL.createObjectURL(e.target.files[0])) 391 | } else { 392 | store.parent.errors.triggerError('editor-screen', 'Wrong file type. Try image file (jpg, png, bmp).', 5000) 393 | return 394 | } 395 | 396 | store.parent.startScreen.uploadImage(_URL.createObjectURL(e.target.files[0])) 397 | store.parent.startScreen.setNameFile(name) 398 | this.changeToSettingsScreen() 399 | this.removeHistory() 400 | } 401 | 402 | this.$fileInputData.onclick = (e) => { 403 | e.target.value = null 404 | } 405 | 406 | this.$fileInputData.oninput = (e) => { 407 | if (e.target.files.length !== 1) { 408 | store.parent.errors.triggerError('editor-screen', 'Please, choose only one file.', 5000) 409 | return 410 | } 411 | const regexp = /(.*)\.([^.]*)/ 412 | const output = e.target.files[0].name.match(regexp) 413 | let ext, name 414 | if (output) { 415 | ext = e.target.files[0].name.match(regexp)[2] 416 | name = e.target.files[0].name.match(regexp)[1] 417 | } else { 418 | store.parent.errors.triggerError('editor-screen', 'Wrong file type. Try .schematic file.', 5000) 419 | return 420 | } 421 | if (ext.match(/(schematic)/i)) { 422 | store.parent.startScreen.setNameFile(name) 423 | store.parent.startScreen.uploadImage(_URL.createObjectURL(e.target.files[0])) 424 | } else { 425 | store.parent.errors.triggerError('editor-screen', 'Wrong file type. Try .schematic file.', 5000) 426 | return 427 | } 428 | 429 | store.parent.startScreen.uploadSchematic(e.target.files[0]) 430 | store.parent.startScreen.setNameFile(name) 431 | this.removeHistory() 432 | } 433 | 434 | this.$inputFilter.oninput = (e) => { 435 | this.filterBlockList(e.target.value) 436 | } 437 | 438 | document.querySelectorAll('input[name="tool"]').forEach((item) => { 439 | item.addEventListener('click', (e) => { 440 | const tool = e.target.value 441 | store.parent.mineartCanvas.setTool(tool) 442 | this.currentTool = tool 443 | if (tool === 'pencil') { 444 | this.setBrushSize(this.pencilSize) 445 | this.$brushShape.classList.remove('circle') 446 | this.$brushContainer.classList.remove('hidden') 447 | } else if (tool === 'brush') { 448 | this.setBrushSize(this.brushSize) 449 | this.$brushShape.classList.add('circle') 450 | this.$brushContainer.classList.remove('hidden') 451 | } else { 452 | this.$brushContainer.classList.add('hidden') 453 | } 454 | }) 455 | }) 456 | 457 | this.$brushMinus.onclick = () => { 458 | if (this.currentTool === 'pencil') { 459 | this.setBrushSize(this.pencilSize - 2) 460 | } else if (this.currentTool === 'brush') { 461 | this.setBrushSize(this.brushSize - 2) 462 | } 463 | } 464 | 465 | this.$brushPlus.onclick = () => { 466 | if (this.currentTool === 'pencil') { 467 | this.setBrushSize(this.pencilSize + 2) 468 | } else if (this.currentTool === 'brush') { 469 | this.setBrushSize(this.brushSize + 2) 470 | } 471 | } 472 | 473 | this.$settingsGrid.onchange = (e) => { 474 | store.parent.mineartCanvas.setSettingsValue('showGrid', e.target.checked) 475 | store.parent.mineartCanvas.render() 476 | } 477 | 478 | this.$settingsRulers.onchange = (e) => { 479 | store.parent.mineartCanvas.setSettingsValue('showRulers', e.target.checked) 480 | store.parent.mineartCanvas.render() 481 | } 482 | 483 | this.$settingsOriginal.onchange = (e) => { 484 | store.parent.mineartCanvas.setSettingsValue('showOriginal', e.target.checked) 485 | store.parent.mineartCanvas.render() 486 | } 487 | 488 | this.$settingsGridColor.onchange = (e) => { 489 | store.parent.mineartCanvas.setSettingsValue('gridColor', e.target.value) 490 | store.parent.localStorage.setItem('gridColor', e.target.value) 491 | store.parent.mineartCanvas.render() 492 | } 493 | 494 | this.$helpFaq.onclick = () => { 495 | store.parent.modals.openModal('faq') 496 | } 497 | 498 | this.$helpControls.onclick = () => { 499 | store.parent.modals.openModal('controls') 500 | } 501 | } 502 | } 503 | 504 | export { store as output } -------------------------------------------------------------------------------- /app/screens/settings.js: -------------------------------------------------------------------------------- 1 | import SvgCroppy from '../models/svgCroppy.js' 2 | const _URL = window.URL || window.webkitURL 3 | 4 | const store = { 5 | svgCroppy: new SvgCroppy(), 6 | parent: null, 7 | aspectRatio: null, 8 | ctxTemp: null, 9 | ignoreRatio: false, 10 | init(parent) { 11 | this.parent = parent 12 | const nodeList = document.querySelectorAll('*[id^="settings-"]').forEach((item) => { 13 | let key = '$' 14 | item.id.split('-').forEach((str, i) => { 15 | if (i > 1) { 16 | key += str.charAt(0).toUpperCase() + str.slice(1) 17 | } else if (i > 0) { 18 | key += str 19 | } 20 | }) 21 | this[key] = item 22 | }) 23 | this.ctxTemp = store.parent.canvasTemp.getContext('2d') 24 | this.setEventListeners() 25 | if (store.parent.localStorage.getItem('minecraftVersion')) { 26 | this.$version.value = store.parent.localStorage.getItem('minecraftVersion') 27 | } 28 | }, 29 | fillTable() { 30 | const tbody = this.$tableBlocks.querySelector('tbody') 31 | store.parent.blocksDefault.forEach((item) => { 32 | let row = document.createElement('tr') 33 | row.classList.add('visible') 34 | row.innerHTML = ` 35 | 36 | 37 | ${item.name} 38 | ` 39 | row.querySelector('input').oninput = (e) => { 40 | this.setTableCounter() 41 | } 42 | row.onclick = (e) => { 43 | store.parent.errors.closeError('settings-screen') 44 | if (e.target.localName === 'input') { return } 45 | row.querySelector('input').click() 46 | } 47 | tbody.appendChild(row) 48 | }) 49 | this.setTableCounter() 50 | }, 51 | filterTable(name) { 52 | const regex = new RegExp(name, 'i') 53 | store.parent.blocksDefault.forEach((item) => { 54 | let row = this.$tableBlocks.querySelector(`input[data-block-id='${item.id}']`).parentNode.parentNode 55 | if (item.name.search(regex) < 0) { 56 | row.classList.add('hidden') 57 | } else { 58 | row.classList.remove('hidden') 59 | } 60 | }) 61 | }, 62 | setImageSizesString(w, h, crop) { 63 | this.$imgSizes.innerHTML = `Image size${crop ? ' (cropped)' : ''}: ${w}x${h}` 64 | }, 65 | setEqualsString() { 66 | const w = parseInt(this.$inputWidth.value) 67 | const h = parseInt(this.$inputHeight.value) 68 | if (w * h > 0) { 69 | const int = w * h 70 | let output = '' 71 | const arr = int.toString().split('') 72 | arr.forEach((item, i) => { 73 | output += item 74 | if ((arr.length - i - 1) % 3 === 0 && arr.length - i !== 1) { 75 | output += ',' 76 | } 77 | }) 78 | this.$equalsBlocks.innerHTML = `${output} blocks` 79 | } else { 80 | this.$equalsBlocks.innerHTML = '??? blocks' 81 | } 82 | }, 83 | setTableCounter() { 84 | const max = this.$tableBlocks.querySelectorAll('tr.visible').length 85 | const int = this.$tableBlocks.querySelectorAll('tr.visible td input:checked').length 86 | 87 | if (int === 0) { 88 | this.$tableCheckbox.checked = false 89 | } else if (int === max) { 90 | this.$tableCheckbox.indeterminate = false 91 | this.$tableCheckbox.checked = true 92 | } else { 93 | this.$tableCheckbox.indeterminate = true 94 | this.$tableCheckbox.checked = true 95 | } 96 | 97 | this.$tableCounter.innerHTML = `${int}/${max} selected` 98 | }, 99 | selectBoxGroup(group) { 100 | this.$groupSurvival.classList.remove('box-selected') 101 | this.$groupAll.classList.remove('box-selected') 102 | this.$groupCustom.classList.remove('box-selected') 103 | document.querySelector('.table-blocks-container').classList.add('hidden') 104 | document.getElementById('settings-checkboxes-include').classList.remove('hidden') 105 | switch (group) { 106 | case 'survival': 107 | this.$groupSurvival.classList.add('box-selected') 108 | this.$groupSurvival.querySelector('input[type=radio]').checked = true 109 | break 110 | case 'all': 111 | this.$groupAll.classList.add('box-selected') 112 | this.$groupAll.querySelector('input[type=radio]').checked = true 113 | break 114 | case 'custom': 115 | this.$groupCustom.classList.add('box-selected') 116 | this.$groupCustom.querySelector('input[type=radio]').checked = true 117 | document.querySelector('.table-blocks-container').classList.remove('hidden') 118 | document.getElementById('settings-checkboxes-include').classList.add('hidden') 119 | break 120 | } 121 | }, 122 | drawToCanvas() { 123 | this.ctxTemp.imageSmoothingEnabled = false 124 | const inputWidth = parseInt(this.$inputWidth.value) 125 | const inputHeight = parseInt(this.$inputHeight.value) 126 | store.parent.canvasTemp.width = inputWidth 127 | store.parent.canvasTemp.height = inputHeight 128 | if (this.$checkCrop.checked) { 129 | const cropInfo = this.svgCroppy.getCropInfo() 130 | if (store.parent.uploadedImage.naturalHeight > 500) { 131 | cropInfo.height = store.parent.uploadedImage.naturalHeight / store.$imgPresentation.height * cropInfo.height 132 | cropInfo.width = store.parent.uploadedImage.naturalWidth / store.$imgPresentation.width * cropInfo.width 133 | cropInfo.offsetY = store.parent.uploadedImage.naturalHeight / store.$imgPresentation.height * cropInfo.offsetY 134 | cropInfo.offsetX = store.parent.uploadedImage.naturalWidth / store.$imgPresentation.width * cropInfo.offsetX 135 | } 136 | 137 | store.parent.mineartCanvas.setOriginalImage({ 138 | src: store.parent.uploadedImage.src, 139 | x: cropInfo.offsetX, 140 | y: cropInfo.offsetY, 141 | width: cropInfo.width, 142 | height: cropInfo.height 143 | }) 144 | 145 | const widthCropRatio = inputWidth / cropInfo.width 146 | const heightCropRatio = inputHeight / cropInfo.height 147 | this.ctxTemp.drawImage(store.parent.uploadedImage, 148 | -cropInfo.offsetX * widthCropRatio, 149 | -cropInfo.offsetY * heightCropRatio, 150 | store.parent.uploadedImage.naturalWidth * widthCropRatio, 151 | store.parent.uploadedImage.naturalHeight * heightCropRatio) 152 | } else { 153 | this.ctxTemp.drawImage(store.parent.uploadedImage, 0, 0, store.parent.canvasTemp.width, store.parent.canvasTemp.height) 154 | store.parent.mineartCanvas.setOriginalImage({ 155 | src: store.parent.uploadedImage.src, 156 | x: 0, 157 | y: 0, 158 | width: store.parent.uploadedImage.width, 159 | height: store.parent.uploadedImage.height 160 | }) 161 | } 162 | }, 163 | changeToEditorScreen() { 164 | document.querySelector('section.settings-screen').classList.add('hidden') 165 | document.querySelector('section.editor-screen').classList.remove('hidden') 166 | if (store.parent.uploadedType === 'schem') { 167 | store.parent.editorScreen.$settingsOriginal.disabled = true 168 | } else { 169 | store.parent.editorScreen.$settingsOriginal.disabled = false 170 | } 171 | }, 172 | resetScreen() { 173 | this.$groupAll.click() 174 | this.$checkCrop.checked = false 175 | this.$checkIgnoreRatio.checked = false 176 | this.$ignoreHeightLimit.checked = false 177 | this.$inputFilter.value = '' 178 | this.ignoreRatio = false 179 | document.querySelector('.size-inputs i').style.opacity = 1 180 | document.querySelectorAll('#settings-checkboxes-include input').forEach((item) => { 181 | item.checked = false 182 | }) 183 | document.querySelector('#settings-checkboxes-include input[name="include-falling"]').checked = true 184 | this.$tableBlocks.querySelectorAll('tbody tr').forEach((item) => { 185 | item.remove() 186 | }) 187 | 188 | }, 189 | setEventListeners() { 190 | this.$inputWidth.oninput = (e) => { 191 | e.target.value = e.target.value.replace(/\D/gi, '') 192 | if (!this.ignoreRatio) { 193 | this.$inputHeight.value = Math.round(this.$inputWidth.value / this.aspectRatio) 194 | } 195 | this.setEqualsString() 196 | } 197 | 198 | this.$inputHeight.oninput = (e) => { 199 | e.target.value = e.target.value.replace(/\D/gi, '') 200 | if (!this.ignoreRatio) { 201 | this.$inputWidth.value = Math.round(this.$inputHeight.value * this.aspectRatio) 202 | } 203 | this.setEqualsString() 204 | } 205 | 206 | this.$checkCrop.onchange = (e) => { 207 | if (e.target.checked) { 208 | this.svgCroppy.unhide() 209 | const cropInfo = this.svgCroppy.getCropInfo() 210 | if (store.parent.uploadedImage.naturalHeight > 500) { 211 | cropInfo.width = Math.round(store.parent.uploadedImage.naturalWidth / store.$imgPresentation.width * cropInfo.width) 212 | cropInfo.height = Math.round(store.parent.uploadedImage.naturalHeight / store.$imgPresentation.height * cropInfo.height) 213 | } 214 | this.setImageSizesString(cropInfo.width, cropInfo.height, true) 215 | this.aspectRatio = cropInfo.width / cropInfo.height 216 | } else { 217 | this.svgCroppy.hide() 218 | this.setImageSizesString(store.parent.uploadedImage.naturalWidth, store.parent.uploadedImage.naturalHeight) 219 | this.aspectRatio = store.parent.uploadedImage.width / store.parent.uploadedImage.height 220 | this.$inputWidth.value = store.parent.uploadedImage.width 221 | this.$inputHeight.value = store.parent.uploadedImage.height 222 | } 223 | this.setEqualsString() 224 | } 225 | 226 | this.$checkIgnoreRatio.onchange = (e) => { 227 | this.ignoreRatio = e.target.checked 228 | const icon = document.querySelector('.size-inputs i') 229 | if (e.target.checked === false) { 230 | this.$inputHeight.value = Math.round(this.$inputWidth.value / this.aspectRatio) 231 | this.$inputWidth.value = Math.round(this.$inputHeight.value * this.aspectRatio) 232 | this.setEqualsString() 233 | icon.style.opacity = 1 234 | } else { 235 | icon.style.opacity = 0.3 236 | } 237 | } 238 | 239 | this.$groupSurvival.onclick = (e) => { 240 | this.selectBoxGroup('survival') 241 | } 242 | 243 | this.$groupAll.onclick = (e) => { 244 | this.selectBoxGroup('all') 245 | } 246 | 247 | this.$groupCustom.onclick = (e) => { 248 | this.selectBoxGroup('custom') 249 | } 250 | 251 | this.$inputFilter.oninput = (e) => { 252 | this.filterTable(this.$inputFilter.value) 253 | } 254 | 255 | this.$tableCheckbox.oninput = (e) => { 256 | const checkboxes = this.$tableBlocks.querySelectorAll('tbody input') 257 | if (e.target.checked) { 258 | checkboxes.forEach((item) => { 259 | item.checked = true 260 | }) 261 | this.tableCounter = this.parent.blocksDefault.length 262 | } else { 263 | checkboxes.forEach((item) => { 264 | item.checked = false 265 | }) 266 | this.tableCounter = 0 267 | } 268 | this.setTableCounter() 269 | } 270 | 271 | this.$version.onchange = (e) => { 272 | store.parent.blocksDefault.forEach((item) => { 273 | let row = this.$tableBlocks.querySelector(`input[data-block-id='${item.id}']`).parentNode.parentNode 274 | if (item.version > parseInt(e.target.value)) { 275 | row.classList.remove('visible') 276 | } else { 277 | row.classList.add('visible') 278 | } 279 | }) 280 | this.setTableCounter() 281 | } 282 | 283 | this.$imgPresentation.addEventListener('croppytransformed', (e) => { 284 | const cropInfo = this.svgCroppy.getCropInfo() 285 | if (store.parent.uploadedImage.naturalWidth > 500) { 286 | cropInfo.width = Math.round(store.parent.uploadedImage.naturalWidth / store.$imgPresentation.width * cropInfo.width) 287 | cropInfo.height = Math.round(store.parent.uploadedImage.naturalHeight / store.$imgPresentation.height * cropInfo.height) 288 | } 289 | this.setImageSizesString(cropInfo.width, cropInfo.height, true) 290 | this.aspectRatio = cropInfo.width / cropInfo.height 291 | if (!this.ignoreRatio) { 292 | this.$inputHeight.value = Math.round(this.$inputWidth.value / this.aspectRatio) 293 | this.$inputWidth.value = Math.round(this.$inputHeight.value * this.aspectRatio) 294 | } 295 | this.setEqualsString() 296 | }) 297 | 298 | this.$submit.onclick = (e) => { 299 | const excludeArr = [] 300 | const blockGroup = document.querySelector('input[name=block-groups]:checked').value 301 | if (this.$inputHeight.value > 256 && this.$ignoreHeightLimit.checked === false) { 302 | store.parent.errors.triggerError('settings-screen', 'In-game height limit is 256 blocks.', 7000) 303 | return 304 | } 305 | 306 | if (this.$inputHeight.value > 1024) { 307 | store.parent.errors.triggerError('settings-screen', 'Maximum convert height is 1024.', 7000) 308 | return 309 | } 310 | 311 | if (this.$inputWidth.value > 1024) { 312 | store.parent.errors.triggerError('settings-screen', 'Maximum convert width is 1024.', 7000) 313 | return 314 | } 315 | 316 | if (this.$inputWidth.value <= 0 || this.$inputHeight.value <= 0) { 317 | store.parent.errors.triggerError('settings-screen', 'Width and height must be more than 0.', 7000) 318 | return 319 | } 320 | 321 | switch (blockGroup) { 322 | case 'all': 323 | break 324 | case 'survival': 325 | store.parent.blocksDefault.forEach((item) => { 326 | if (item.survival !== true) { 327 | excludeArr.push(item.id) 328 | } 329 | }) 330 | break 331 | case 'custom': 332 | const max = this.$tableBlocks.querySelectorAll('tr.visible').length 333 | let int = 0 334 | this.$tableBlocks.querySelectorAll('tr.visible td input').forEach((item) => { 335 | if (item.checked === false) { 336 | excludeArr.push(parseInt(item.dataset.blockId)) 337 | int++ 338 | } 339 | }) 340 | if (int >= max - 1) { 341 | store.parent.errors.triggerError('settings-screen', 'Please select at least 2 blocks.', 7000) 342 | return 343 | } 344 | break 345 | } 346 | if (blockGroup === 'all' || blockGroup === 'survival') { 347 | if (document.querySelector('input[name=include-transparent]').checked === false) { 348 | store.parent.blocksDefault.forEach((item) => { 349 | if (item.transparency === true) { 350 | excludeArr.push(item.id) 351 | } 352 | }) 353 | } 354 | if (document.querySelector('input[name=include-falling]').checked === false) { 355 | store.parent.blocksDefault.forEach((item) => { 356 | if (item.falling === true) { 357 | excludeArr.push(item.id) 358 | } 359 | }) 360 | } 361 | if (document.querySelector('input[name=include-redstone]').checked === false) { 362 | store.parent.blocksDefault.forEach((item) => { 363 | if (item.redstone === true) { 364 | excludeArr.push(item.id) 365 | } 366 | }) 367 | } 368 | if (document.querySelector('input[name=include-luminance]').checked === false) { 369 | store.parent.blocksDefault.forEach((item) => { 370 | if (item.luminance === true) { 371 | excludeArr.push(item.id) 372 | } 373 | }) 374 | } 375 | } 376 | const version = parseInt(this.$version.value) 377 | if (version < 13) { 378 | store.parent.blocksDefault.forEach((item) => { 379 | if (item.version > version) { 380 | excludeArr.push(item.id) 381 | } 382 | }) 383 | } else { 384 | store.parent.blocksDefault.forEach((item) => { 385 | if (item.game_id === 'minecraft:dried_kelp_block') { 386 | excludeArr.push(item.id) 387 | } 388 | }) 389 | } 390 | store.parent.editorScreen.resetScreen() 391 | store.parent.convertScreen.resetScreen() 392 | store.parent.mineartCanvas.setSettingsValue('minecraftVersion', version) 393 | store.parent.convertScreen.$selectVersion.value = version 394 | store.parent.localStorage.setItem('minecraftVersion', version) 395 | this.drawToCanvas() 396 | store.parent.editorScreen.$footbarRight.innerHTML = `Width: ${store.parent.canvasTemp.width} bl. | Height: ${store.parent.canvasTemp.height} bl.` 397 | store.parent.showLoading() 398 | store.parent.convertWorker.postMessage({ 399 | imgData: this.ctxTemp.getImageData(0, 0, store.parent.canvasTemp.width, store.parent.canvasTemp.height).data, 400 | exclude: excludeArr 401 | }) 402 | } 403 | } 404 | } 405 | 406 | export { store as output } -------------------------------------------------------------------------------- /app/screens/start.js: -------------------------------------------------------------------------------- 1 | import SchematicsHelper from '../models/schematics.js' 2 | const _URL = window.URL || window.webkitURL 3 | 4 | const store = { 5 | parent: null, 6 | init(parent) { 7 | this.parent = parent 8 | const nodeList = document.querySelectorAll('*[id^="start-"]').forEach((item) => { 9 | let key = '$' 10 | item.id.split('-').forEach((str, i) => { 11 | if (i > 1) { 12 | key += str.charAt(0).toUpperCase() + str.slice(1) 13 | } else if (i > 0) { 14 | key += str 15 | } 16 | }) 17 | this[key] = item 18 | }) 19 | this.setEventListeners() 20 | }, 21 | changeToSettingsScreen() { 22 | document.querySelector('section.start-screen').classList.add('hidden') 23 | document.querySelector('section.settings-screen').classList.remove('hidden') 24 | }, 25 | changeToEditorScreen() { 26 | if (store.parent.uploadedType === 'schem') { 27 | store.parent.editorScreen.$settingsOriginal.parentNode.setAttribute('disabled', '') 28 | store.parent.editorScreen.$settingsOriginal.disabled = true 29 | } else { 30 | store.parent.editorScreen.$settingsOriginal.parentNode.removeAttribute('disabled') 31 | store.parent.editorScreen.$settingsOriginal.disabled = false 32 | } 33 | document.querySelector('section.start-screen').classList.add('hidden') 34 | document.querySelector('section.editor-screen').classList.remove('hidden') 35 | store.parent.editorScreen.resetScreen() 36 | store.parent.convertScreen.resetScreen() 37 | }, 38 | setNameFile(str) { 39 | store.parent.uploadedImageName = str 40 | store.parent.editorScreen.$saveInput.value = str 41 | store.parent.convertScreen.$inputMcfunction.value = str 42 | }, 43 | uploadImage(src) { 44 | store.parent.uploadedType = 'image' 45 | store.parent.uploadedImage.src = src 46 | store.parent.uploadedImage.onload = () => { 47 | store.parent.settingsScreen.$imgPresentation.src = src 48 | store.parent.settingsScreen.$inputWidth.value = store.parent.uploadedImage.width 49 | store.parent.settingsScreen.$inputHeight.value = store.parent.uploadedImage.height 50 | store.parent.settingsScreen.aspectRatio = store.parent.uploadedImage.width / store.parent.uploadedImage.height 51 | store.parent.settingsScreen.setImageSizesString(store.parent.uploadedImage.naturalWidth, store.parent.uploadedImage.naturalHeight) 52 | store.parent.settingsScreen.setEqualsString() 53 | store.parent.settingsScreen.fillTable() 54 | this.changeToSettingsScreen() 55 | store.parent.settingsScreen.svgCroppy.init(store.parent.settingsScreen.$imgPresentation) 56 | store.parent.settingsScreen.svgCroppy.hide() 57 | if (store.parent.uploadedImage.naturalWidth < 100 || store.parent.uploadedImage.naturalHeight < 100) { 58 | store.parent.settingsScreen.$checkCrop.disabled = true 59 | store.parent.settingsScreen.$checkCrop.parentNode.setAttribute('disabled', '') 60 | } else { 61 | store.parent.settingsScreen.$checkCrop.disabled = false 62 | store.parent.settingsScreen.$checkCrop.parentNode.removeAttribute('disabled') 63 | } 64 | } 65 | }, 66 | uploadSchematic(file) { 67 | store.parent.showLoading() 68 | const errFunc = (str, timeout) => { 69 | store.parent.errors.triggerError('start-screen', str, 7200) 70 | store.parent.errors.triggerError('editor-screen', str, 7200) 71 | store.parent.hideLoading() 72 | } 73 | const schem = new SchematicsHelper() 74 | const reader = new FileReader() 75 | reader.readAsArrayBuffer(file) 76 | reader.onload = function(event) { 77 | try { 78 | schem.decode(new Uint8Array(event.target.result), (err, data) => { 79 | try { 80 | if (err && err.code === "Z_DATA_ERROR") { 81 | errFunc('There is something wrong with this .schematic file..
(File decompression error.)') 82 | return 83 | } else if (err) { 84 | errFunc('There is something wrong with this .schematic file..
(Unknown error.)') 85 | return 86 | } 87 | 88 | const blockIds = new Uint8Array(data.value['Blocks'].value) 89 | const dataIds = new Uint8Array(data.value['Data'].value) 90 | const arr = new Uint8Array(blockIds.length) 91 | const height = data.value['Height'].value 92 | let width, facing 93 | if (data.value['WEOffsetX'] && data.value['WEOffsetY'] && data.value['WEOffsetZ']) { 94 | if (data.value['Width'].value === 1) { 95 | width = data.value['Length'].value 96 | if (data.value['WEOffsetZ'].value > 0) { 97 | facing = 'south' 98 | } else { 99 | facing = 'north' 100 | } 101 | } else if (data.value['Length'].value === 1) { 102 | width = data.value['Width'].value 103 | if (data.value['WEOffsetX'].value > 0) { 104 | facing = 'east' 105 | } else { 106 | facing = 'west' 107 | } 108 | } else if (data.value['Width'].value === 1 && data.value['Length'].value === 1) { 109 | width = data.value['Width'].value 110 | facing = 'north' 111 | } else { 112 | errFunc('There is something wrong with this .schematic file..
(Width or length of the schematic must equal 1.)') 113 | return 114 | } 115 | } else { 116 | if (data.value['Width'].value === 1) { 117 | width = data.value['Length'].value 118 | facing = 'north' 119 | } else if (data.value['Length'].value === 1) { 120 | width = data.value['Width'].value 121 | facing = 'west' 122 | } else if (data.value['Width'].value === 1 && data.value['Length'].value === 1) { 123 | width = data.value['Width'].value 124 | facing = 'north' 125 | } else { 126 | errFunc('There is something wrong with this .schematic file..
(Width or length of the schematic must equal 1.)') 127 | return 128 | } 129 | } 130 | 131 | for (let i = 0; i < arr.length; i++) { 132 | let int 133 | if (facing === 'south' || facing === 'east') { 134 | int = (height - Math.ceil((i + 1) / width)) * width + (i % width) 135 | } else if (facing === 'north' || facing === 'west') { 136 | int = arr.length - i - 1 137 | } 138 | const block = store.parent.findBlockByGameId(blockIds[int], dataIds[int]) 139 | if (block) { 140 | arr[i] = block.id 141 | } 142 | } 143 | store.parent.errors.closeError('start-screen') 144 | store.parent.errors.closeError('editor-screen') 145 | store.parent.uploadedType = 'schem' 146 | store.parent.editorScreen.$footbarRight.innerHTML = `Width: ${width} bl. | Height: ${height} bl.` 147 | store.changeToEditorScreen() 148 | store.parent.mineartCanvas.init(store.parent.editorScreen.$canvas) 149 | store.parent.mineartCanvas.setImageSizes(width, height) 150 | store.parent.mineartCanvas.open(arr) 151 | store.parent.editorScreen.resetScreen() 152 | store.parent.editorScreen.setBrushSize(3) 153 | store.parent.hideLoading() 154 | } catch (err) { 155 | console.error(err) 156 | errFunc('There is something wrong with this .schematic file..
(File structure error.)') 157 | return 158 | } 159 | }) 160 | } catch (err) { 161 | console.error(err) 162 | errFunc('There is something wrong with this .schematic file..
(File structure error.)') 163 | return 164 | } 165 | } 166 | }, 167 | setEventListeners() { 168 | this.$dropzone.ondragover = (e) => { 169 | e.preventDefault() 170 | } 171 | 172 | this.$dropzone.ondrop = (e) => { 173 | e.preventDefault() 174 | 175 | if (e.dataTransfer.files.length !== 1) { 176 | store.parent.errors.triggerError('start-screen', 'Please, choose only one file.', 5000) 177 | return 178 | } 179 | 180 | const regexp = /(.*)\.([^.]*)/ 181 | const output = e.dataTransfer.files[0].name.match(regexp) 182 | let ext, name 183 | if (output) { 184 | ext = e.dataTransfer.files[0].name.match(regexp)[2] 185 | name = e.dataTransfer.files[0].name.match(regexp)[1] 186 | } else { 187 | store.parent.errors.triggerError('start-screen', 'Wrong file type. Try image (jpg, png, bmp) or .schematic file.', 5000) 188 | return 189 | } 190 | 191 | if (ext.match(/(jpeg|jpg|png|bmp)/i)) { 192 | this.setNameFile(name) 193 | this.uploadImage(_URL.createObjectURL(e.dataTransfer.files[0])) 194 | } else if (ext.match(/(schematic)/i)) { 195 | this.setNameFile(name) 196 | this.uploadSchematic(e.dataTransfer.files[0]) 197 | } else { 198 | store.parent.errors.triggerError('start-screen', 'Wrong file type. Try image (jpg, png, bmp) or .schematic file.', 5000) 199 | } 200 | } 201 | 202 | this.$fileInput.onchange = (e) => { 203 | const regexp = /(.*)\.([^.]*)/ 204 | const output = e.target.files[0].name.match(regexp) 205 | let ext, name 206 | 207 | if (output) { 208 | ext = e.target.files[0].name.match(regexp)[2] 209 | name = e.target.files[0].name.match(regexp)[1] 210 | } else { 211 | e.target.value = null 212 | store.parent.errors.triggerError('start-screen', 'Wrong file type. Try image (jpg, png, bmp) or .schematic file.', 5000) 213 | return 214 | } 215 | 216 | if (ext.match(/(jpeg|jpg|png|bmp)/i)) { 217 | this.setNameFile(name) 218 | this.uploadImage(_URL.createObjectURL(e.target.files[0])) 219 | } else if (ext.match(/(schematic)/i)) { 220 | this.setNameFile(name) 221 | this.uploadSchematic(e.target.files[0]) 222 | } else { 223 | e.target.value = null 224 | store.parent.errors.triggerError('start-screen', 'Wrong file type. Try image (jpg, png, bmp) or .schematic file.', 5000) 225 | } 226 | } 227 | } 228 | } 229 | 230 | export { store as output } -------------------------------------------------------------------------------- /build/webpack.base.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path') 4 | const webpack = require('webpack') 5 | const HtmlWebpackPlugin = require('html-webpack-plugin') 6 | const CopyWebpackPlugin = require('copy-webpack-plugin') 7 | 8 | module.exports = { 9 | context: path.join(__dirname, '../app'), 10 | entry: { 11 | index: './index.js' 12 | }, 13 | output: { 14 | path: path.join(__dirname, '../web'), 15 | filename: '[name].[hash].js' 16 | }, 17 | module: { 18 | loaders: [ 19 | { test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" }, 20 | { test: /\.(png|jpg|gif)$/, loader: 'file-loader' }, 21 | { test: /\.(svg|html)$/, loader: "raw-loader", exclude: /index\.html/}, 22 | { test: /\.css$/, loader: 'style-loader!css-loader' } 23 | ] 24 | }, 25 | plugins: [ 26 | new HtmlWebpackPlugin({ 27 | template: 'index.html', 28 | inject: true 29 | }) 30 | ] 31 | }; 32 | -------------------------------------------------------------------------------- /build/webpack.dev.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var path = require('path'); 4 | var merge = require('webpack-merge'); 5 | var baseWebpackConfig = require('./webpack.base.conf.js'); 6 | 7 | var devWebpackConfig = { 8 | devServer: { 9 | clientLogLevel: 'warning', 10 | historyApiFallback: true, 11 | hot: true, 12 | compress: true, 13 | host: 'localhost', 14 | port: 4000, 15 | // outputPath: path.join(__dirname, '../web'), 16 | contentBase: "./web", 17 | proxy: {}, 18 | quiet: true, // necessary for FriendlyErrorsPlugin 19 | watchOptions: { 20 | poll: false 21 | } 22 | } 23 | }; 24 | 25 | module.exports = merge(baseWebpackConfig, devWebpackConfig); 26 | console.log('Server launched on port: ' + devWebpackConfig.devServer.port) 27 | -------------------------------------------------------------------------------- /build/webpack.prod.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var path = require('path'); 4 | var webpack = require('webpack'); 5 | var merge = require('webpack-merge'); 6 | var baseWebpackConfig = require('./webpack.base.conf.js'); 7 | 8 | var prodWebpackConfig = { 9 | entry: { 10 | index: './index.js' 11 | }, 12 | plugins: [ 13 | new webpack.optimize.UglifyJsPlugin() 14 | ] 15 | }; 16 | 17 | 18 | module.exports = merge(baseWebpackConfig, prodWebpackConfig); 19 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minecraft-artifier-js", 3 | "version": "1.0.0", 4 | "scripts": { 5 | "dev": "webpack-dev-server --hot --inline --config=./build/webpack.dev.conf.js", 6 | "build": "del /s web && webpack --config=./build/webpack.prod.conf.js", 7 | "prepare": "node prepare.js" 8 | }, 9 | "dependencies": { 10 | "babel-core": "^6.26.0", 11 | "babel-loader": "^7.1.4", 12 | "babel-preset-env": "^1.6.1", 13 | "bulma": "^0.7.1", 14 | "copy-webpack-plugin": "^4.3.1", 15 | "css-loader": "^0.28.9", 16 | "file-loader": "^1.1.6", 17 | "html-webpack-plugin": "^2.30.1", 18 | "jimp": "^0.2.28", 19 | "nbt": "^0.7.0", 20 | "raw-loader": "^0.5.1", 21 | "style-loader": "^0.20.1", 22 | "svg-inline-loader": "^0.8.0", 23 | "webpack": "^3.11.0", 24 | "webpack-merge": "^4.1.1", 25 | "worker-loader": "^1.1.0", 26 | "zlibjs": "^0.3.1" 27 | }, 28 | "devDependencies": { 29 | "webpack-dev-server": "^2.11.0" 30 | }, 31 | "author": "Nikita Suhov", 32 | "license": "MIT" 33 | } 34 | -------------------------------------------------------------------------------- /prepare.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const Jimp = require("jimp") 3 | const fs = require('fs') 4 | const blocksDb = require('./static/blocks_12.json') 5 | const arr = [] 6 | const colors = [] 7 | 8 | function rgbToHsl(r, g, b){ 9 | r /= 255, g /= 255, b /= 255; 10 | var max = Math.max(r, g, b), min = Math.min(r, g, b); 11 | var h, s, l = (max + min) / 2; 12 | 13 | if(max == min){ 14 | h = s = 0; // achromatic 15 | }else{ 16 | var d = max - min; 17 | s = l > 0.5 ? d / (2 - max - min) : d / (max + min); 18 | switch(max){ 19 | case r: h = (g - b) / d + (g < b ? 6 : 0); break; 20 | case g: h = (b - r) / d + 2; break; 21 | case b: h = (r - g) / d + 4; break; 22 | } 23 | h /= 6; 24 | } 25 | 26 | return { 27 | h: Math.round(h * 360), 28 | s: Math.round(s * 100), 29 | l: Math.round(l * 100) 30 | } 31 | } 32 | 33 | blocksDb.forEach((item, i) => { 34 | item.id = i + 1 35 | arr.push(Jimp.read('./static/textures/' + item.texture_image).then(function (image) { 36 | let redSum = 0 37 | let greenSum = 0 38 | let blueSum = 0 39 | 40 | image.scan(0, 0, image.bitmap.width, image.bitmap.height, function (x, y, idx) { 41 | redSum += this.bitmap.data[ idx + 0 ] 42 | greenSum += this.bitmap.data[ idx + 1 ] 43 | blueSum += this.bitmap.data[ idx + 2 ] 44 | }) 45 | 46 | let red = Math.round(redSum / (image.bitmap.width * image.bitmap.height)) 47 | let green = Math.round(greenSum / (image.bitmap.width * image.bitmap.height)) 48 | let blue = Math.round(blueSum / (image.bitmap.width * image.bitmap.height)) 49 | 50 | const hsl = rgbToHsl(red, green, blue) 51 | 52 | item.red = red 53 | item.green = green 54 | item.blue = blue 55 | item.h = hsl.h 56 | item.s = hsl.s 57 | item.l = hsl.l 58 | })) 59 | }) 60 | 61 | Promise.all(arr).then(() => { 62 | fs.writeFile(path.join(__dirname, './static/baked_blocks.json'), JSON.stringify(blocksDb), function(err) { 63 | if(err) { 64 | return console.log(err); 65 | } else { 66 | console.log('Completed!') 67 | } 68 | }) 69 | }, reject => { 70 | console.log(reject) 71 | }) -------------------------------------------------------------------------------- /static/img/arrow.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/brush.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/bucket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/img/bucket.png -------------------------------------------------------------------------------- /static/img/bucket.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/eyedrop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/img/eyedrop.png -------------------------------------------------------------------------------- /static/img/eyedropper.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/img/favicon.png -------------------------------------------------------------------------------- /static/img/hold.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/pencil.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/selection.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/zoom.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/textures/bedrock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/bedrock.png -------------------------------------------------------------------------------- /static/textures/blue_ice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/blue_ice.png -------------------------------------------------------------------------------- /static/textures/bone_block_side.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/bone_block_side.png -------------------------------------------------------------------------------- /static/textures/bookshelf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/bookshelf.png -------------------------------------------------------------------------------- /static/textures/brain_coral_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/brain_coral_block.png -------------------------------------------------------------------------------- /static/textures/brick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/brick.png -------------------------------------------------------------------------------- /static/textures/bubble_coral_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/bubble_coral_block.png -------------------------------------------------------------------------------- /static/textures/chorus_flower.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/chorus_flower.png -------------------------------------------------------------------------------- /static/textures/chorus_plant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/chorus_plant.png -------------------------------------------------------------------------------- /static/textures/clay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/clay.png -------------------------------------------------------------------------------- /static/textures/coal_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/coal_block.png -------------------------------------------------------------------------------- /static/textures/coal_ore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/coal_ore.png -------------------------------------------------------------------------------- /static/textures/cobblestone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/cobblestone.png -------------------------------------------------------------------------------- /static/textures/cobblestone_mossy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/cobblestone_mossy.png -------------------------------------------------------------------------------- /static/textures/concrete_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_black.png -------------------------------------------------------------------------------- /static/textures/concrete_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_blue.png -------------------------------------------------------------------------------- /static/textures/concrete_brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_brown.png -------------------------------------------------------------------------------- /static/textures/concrete_cyan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_cyan.png -------------------------------------------------------------------------------- /static/textures/concrete_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_gray.png -------------------------------------------------------------------------------- /static/textures/concrete_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_green.png -------------------------------------------------------------------------------- /static/textures/concrete_light_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_light_blue.png -------------------------------------------------------------------------------- /static/textures/concrete_lime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_lime.png -------------------------------------------------------------------------------- /static/textures/concrete_magenta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_magenta.png -------------------------------------------------------------------------------- /static/textures/concrete_orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_orange.png -------------------------------------------------------------------------------- /static/textures/concrete_pink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_pink.png -------------------------------------------------------------------------------- /static/textures/concrete_powder_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_powder_black.png -------------------------------------------------------------------------------- /static/textures/concrete_powder_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_powder_blue.png -------------------------------------------------------------------------------- /static/textures/concrete_powder_brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_powder_brown.png -------------------------------------------------------------------------------- /static/textures/concrete_powder_cyan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_powder_cyan.png -------------------------------------------------------------------------------- /static/textures/concrete_powder_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_powder_gray.png -------------------------------------------------------------------------------- /static/textures/concrete_powder_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_powder_green.png -------------------------------------------------------------------------------- /static/textures/concrete_powder_light_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_powder_light_blue.png -------------------------------------------------------------------------------- /static/textures/concrete_powder_lime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_powder_lime.png -------------------------------------------------------------------------------- /static/textures/concrete_powder_magenta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_powder_magenta.png -------------------------------------------------------------------------------- /static/textures/concrete_powder_orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_powder_orange.png -------------------------------------------------------------------------------- /static/textures/concrete_powder_pink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_powder_pink.png -------------------------------------------------------------------------------- /static/textures/concrete_powder_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_powder_purple.png -------------------------------------------------------------------------------- /static/textures/concrete_powder_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_powder_red.png -------------------------------------------------------------------------------- /static/textures/concrete_powder_silver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_powder_silver.png -------------------------------------------------------------------------------- /static/textures/concrete_powder_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_powder_white.png -------------------------------------------------------------------------------- /static/textures/concrete_powder_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_powder_yellow.png -------------------------------------------------------------------------------- /static/textures/concrete_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_purple.png -------------------------------------------------------------------------------- /static/textures/concrete_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_red.png -------------------------------------------------------------------------------- /static/textures/concrete_silver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_silver.png -------------------------------------------------------------------------------- /static/textures/concrete_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_white.png -------------------------------------------------------------------------------- /static/textures/concrete_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/concrete_yellow.png -------------------------------------------------------------------------------- /static/textures/crafting_table_side.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/crafting_table_side.png -------------------------------------------------------------------------------- /static/textures/dead_brain_coral_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/dead_brain_coral_block.png -------------------------------------------------------------------------------- /static/textures/dead_bubble_coral_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/dead_bubble_coral_block.png -------------------------------------------------------------------------------- /static/textures/dead_fire_coral_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/dead_fire_coral_block.png -------------------------------------------------------------------------------- /static/textures/dead_horn_coral_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/dead_horn_coral_block.png -------------------------------------------------------------------------------- /static/textures/dead_tube_coral_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/dead_tube_coral_block.png -------------------------------------------------------------------------------- /static/textures/diamond_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/diamond_block.png -------------------------------------------------------------------------------- /static/textures/diamond_ore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/diamond_ore.png -------------------------------------------------------------------------------- /static/textures/dirt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/dirt.png -------------------------------------------------------------------------------- /static/textures/dried_kelp_side.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/dried_kelp_side.png -------------------------------------------------------------------------------- /static/textures/emerald_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/emerald_block.png -------------------------------------------------------------------------------- /static/textures/emerald_ore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/emerald_ore.png -------------------------------------------------------------------------------- /static/textures/end_bricks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/end_bricks.png -------------------------------------------------------------------------------- /static/textures/end_stone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/end_stone.png -------------------------------------------------------------------------------- /static/textures/fire_coral_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/fire_coral_block.png -------------------------------------------------------------------------------- /static/textures/glass_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glass_black.png -------------------------------------------------------------------------------- /static/textures/glass_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glass_blue.png -------------------------------------------------------------------------------- /static/textures/glass_brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glass_brown.png -------------------------------------------------------------------------------- /static/textures/glass_cyan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glass_cyan.png -------------------------------------------------------------------------------- /static/textures/glass_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glass_gray.png -------------------------------------------------------------------------------- /static/textures/glass_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glass_green.png -------------------------------------------------------------------------------- /static/textures/glass_light_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glass_light_blue.png -------------------------------------------------------------------------------- /static/textures/glass_lime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glass_lime.png -------------------------------------------------------------------------------- /static/textures/glass_magenta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glass_magenta.png -------------------------------------------------------------------------------- /static/textures/glass_orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glass_orange.png -------------------------------------------------------------------------------- /static/textures/glass_pink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glass_pink.png -------------------------------------------------------------------------------- /static/textures/glass_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glass_purple.png -------------------------------------------------------------------------------- /static/textures/glass_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glass_red.png -------------------------------------------------------------------------------- /static/textures/glass_silver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glass_silver.png -------------------------------------------------------------------------------- /static/textures/glass_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glass_white.png -------------------------------------------------------------------------------- /static/textures/glass_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glass_yellow.png -------------------------------------------------------------------------------- /static/textures/glazed_terracotta_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glazed_terracotta_black.png -------------------------------------------------------------------------------- /static/textures/glazed_terracotta_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glazed_terracotta_blue.png -------------------------------------------------------------------------------- /static/textures/glazed_terracotta_brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glazed_terracotta_brown.png -------------------------------------------------------------------------------- /static/textures/glazed_terracotta_cyan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glazed_terracotta_cyan.png -------------------------------------------------------------------------------- /static/textures/glazed_terracotta_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glazed_terracotta_gray.png -------------------------------------------------------------------------------- /static/textures/glazed_terracotta_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glazed_terracotta_green.png -------------------------------------------------------------------------------- /static/textures/glazed_terracotta_light_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glazed_terracotta_light_blue.png -------------------------------------------------------------------------------- /static/textures/glazed_terracotta_lime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glazed_terracotta_lime.png -------------------------------------------------------------------------------- /static/textures/glazed_terracotta_magenta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glazed_terracotta_magenta.png -------------------------------------------------------------------------------- /static/textures/glazed_terracotta_orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glazed_terracotta_orange.png -------------------------------------------------------------------------------- /static/textures/glazed_terracotta_pink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glazed_terracotta_pink.png -------------------------------------------------------------------------------- /static/textures/glazed_terracotta_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glazed_terracotta_purple.png -------------------------------------------------------------------------------- /static/textures/glazed_terracotta_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glazed_terracotta_red.png -------------------------------------------------------------------------------- /static/textures/glazed_terracotta_silver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glazed_terracotta_silver.png -------------------------------------------------------------------------------- /static/textures/glazed_terracotta_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glazed_terracotta_white.png -------------------------------------------------------------------------------- /static/textures/glazed_terracotta_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glazed_terracotta_yellow.png -------------------------------------------------------------------------------- /static/textures/glowstone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/glowstone.png -------------------------------------------------------------------------------- /static/textures/gold_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/gold_block.png -------------------------------------------------------------------------------- /static/textures/gold_ore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/gold_ore.png -------------------------------------------------------------------------------- /static/textures/grass_side.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/grass_side.png -------------------------------------------------------------------------------- /static/textures/gravel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/gravel.png -------------------------------------------------------------------------------- /static/textures/hardened_clay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/hardened_clay.png -------------------------------------------------------------------------------- /static/textures/hardened_clay_stained_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/hardened_clay_stained_black.png -------------------------------------------------------------------------------- /static/textures/hardened_clay_stained_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/hardened_clay_stained_blue.png -------------------------------------------------------------------------------- /static/textures/hardened_clay_stained_brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/hardened_clay_stained_brown.png -------------------------------------------------------------------------------- /static/textures/hardened_clay_stained_cyan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/hardened_clay_stained_cyan.png -------------------------------------------------------------------------------- /static/textures/hardened_clay_stained_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/hardened_clay_stained_gray.png -------------------------------------------------------------------------------- /static/textures/hardened_clay_stained_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/hardened_clay_stained_green.png -------------------------------------------------------------------------------- /static/textures/hardened_clay_stained_light_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/hardened_clay_stained_light_blue.png -------------------------------------------------------------------------------- /static/textures/hardened_clay_stained_lime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/hardened_clay_stained_lime.png -------------------------------------------------------------------------------- /static/textures/hardened_clay_stained_magenta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/hardened_clay_stained_magenta.png -------------------------------------------------------------------------------- /static/textures/hardened_clay_stained_orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/hardened_clay_stained_orange.png -------------------------------------------------------------------------------- /static/textures/hardened_clay_stained_pink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/hardened_clay_stained_pink.png -------------------------------------------------------------------------------- /static/textures/hardened_clay_stained_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/hardened_clay_stained_purple.png -------------------------------------------------------------------------------- /static/textures/hardened_clay_stained_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/hardened_clay_stained_red.png -------------------------------------------------------------------------------- /static/textures/hardened_clay_stained_silver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/hardened_clay_stained_silver.png -------------------------------------------------------------------------------- /static/textures/hardened_clay_stained_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/hardened_clay_stained_white.png -------------------------------------------------------------------------------- /static/textures/hardened_clay_stained_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/hardened_clay_stained_yellow.png -------------------------------------------------------------------------------- /static/textures/hay_block_side.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/hay_block_side.png -------------------------------------------------------------------------------- /static/textures/horn_coral_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/horn_coral_block.png -------------------------------------------------------------------------------- /static/textures/ice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/ice.png -------------------------------------------------------------------------------- /static/textures/iron_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/iron_block.png -------------------------------------------------------------------------------- /static/textures/iron_ore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/iron_ore.png -------------------------------------------------------------------------------- /static/textures/lapis_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/lapis_block.png -------------------------------------------------------------------------------- /static/textures/lapis_ore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/lapis_ore.png -------------------------------------------------------------------------------- /static/textures/leaves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/leaves.png -------------------------------------------------------------------------------- /static/textures/log_acacia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/log_acacia.png -------------------------------------------------------------------------------- /static/textures/log_acacia_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/log_acacia_top.png -------------------------------------------------------------------------------- /static/textures/log_big_oak.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/log_big_oak.png -------------------------------------------------------------------------------- /static/textures/log_big_oak_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/log_big_oak_top.png -------------------------------------------------------------------------------- /static/textures/log_birch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/log_birch.png -------------------------------------------------------------------------------- /static/textures/log_birch_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/log_birch_top.png -------------------------------------------------------------------------------- /static/textures/log_jungle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/log_jungle.png -------------------------------------------------------------------------------- /static/textures/log_jungle_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/log_jungle_top.png -------------------------------------------------------------------------------- /static/textures/log_oak.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/log_oak.png -------------------------------------------------------------------------------- /static/textures/log_oak_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/log_oak_top.png -------------------------------------------------------------------------------- /static/textures/log_spruce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/log_spruce.png -------------------------------------------------------------------------------- /static/textures/log_spruce_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/log_spruce_top.png -------------------------------------------------------------------------------- /static/textures/magma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/magma.png -------------------------------------------------------------------------------- /static/textures/melon_side.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/melon_side.png -------------------------------------------------------------------------------- /static/textures/mushroom_block_skin_brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/mushroom_block_skin_brown.png -------------------------------------------------------------------------------- /static/textures/mushroom_block_skin_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/mushroom_block_skin_red.png -------------------------------------------------------------------------------- /static/textures/mycelium_side.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/mycelium_side.png -------------------------------------------------------------------------------- /static/textures/nether_brick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/nether_brick.png -------------------------------------------------------------------------------- /static/textures/nether_wart_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/nether_wart_block.png -------------------------------------------------------------------------------- /static/textures/netherrack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/netherrack.png -------------------------------------------------------------------------------- /static/textures/no_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/no_block.png -------------------------------------------------------------------------------- /static/textures/noteblock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/noteblock.png -------------------------------------------------------------------------------- /static/textures/obsidian.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/obsidian.png -------------------------------------------------------------------------------- /static/textures/packed_ice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/packed_ice.png -------------------------------------------------------------------------------- /static/textures/planks_acacia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/planks_acacia.png -------------------------------------------------------------------------------- /static/textures/planks_big_oak.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/planks_big_oak.png -------------------------------------------------------------------------------- /static/textures/planks_birch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/planks_birch.png -------------------------------------------------------------------------------- /static/textures/planks_jungle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/planks_jungle.png -------------------------------------------------------------------------------- /static/textures/planks_oak.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/planks_oak.png -------------------------------------------------------------------------------- /static/textures/planks_spruce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/planks_spruce.png -------------------------------------------------------------------------------- /static/textures/prismarine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/prismarine.png -------------------------------------------------------------------------------- /static/textures/prismarine_bricks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/prismarine_bricks.png -------------------------------------------------------------------------------- /static/textures/prismarine_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/prismarine_dark.png -------------------------------------------------------------------------------- /static/textures/purpur_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/purpur_block.png -------------------------------------------------------------------------------- /static/textures/purpur_pillar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/purpur_pillar.png -------------------------------------------------------------------------------- /static/textures/quartz_block_chiseled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/quartz_block_chiseled.png -------------------------------------------------------------------------------- /static/textures/quartz_block_lines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/quartz_block_lines.png -------------------------------------------------------------------------------- /static/textures/quartz_block_side.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/quartz_block_side.png -------------------------------------------------------------------------------- /static/textures/quartz_ore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/quartz_ore.png -------------------------------------------------------------------------------- /static/textures/red_nether_brick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/red_nether_brick.png -------------------------------------------------------------------------------- /static/textures/red_sand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/red_sand.png -------------------------------------------------------------------------------- /static/textures/red_sandstone_carved.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/red_sandstone_carved.png -------------------------------------------------------------------------------- /static/textures/red_sandstone_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/red_sandstone_normal.png -------------------------------------------------------------------------------- /static/textures/red_sandstone_smooth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/red_sandstone_smooth.png -------------------------------------------------------------------------------- /static/textures/redstone_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/redstone_block.png -------------------------------------------------------------------------------- /static/textures/redstone_lamp_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/redstone_lamp_off.png -------------------------------------------------------------------------------- /static/textures/redstone_lamp_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/redstone_lamp_on.png -------------------------------------------------------------------------------- /static/textures/redstone_ore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/redstone_ore.png -------------------------------------------------------------------------------- /static/textures/sand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/sand.png -------------------------------------------------------------------------------- /static/textures/sandstone_carved.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/sandstone_carved.png -------------------------------------------------------------------------------- /static/textures/sandstone_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/sandstone_normal.png -------------------------------------------------------------------------------- /static/textures/sandstone_smooth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/sandstone_smooth.png -------------------------------------------------------------------------------- /static/textures/sea_lantern.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/sea_lantern.png -------------------------------------------------------------------------------- /static/textures/slime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/slime.png -------------------------------------------------------------------------------- /static/textures/snow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/snow.png -------------------------------------------------------------------------------- /static/textures/soul_sand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/soul_sand.png -------------------------------------------------------------------------------- /static/textures/sponge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/sponge.png -------------------------------------------------------------------------------- /static/textures/stone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stone.png -------------------------------------------------------------------------------- /static/textures/stone_andesite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stone_andesite.png -------------------------------------------------------------------------------- /static/textures/stone_andesite_smooth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stone_andesite_smooth.png -------------------------------------------------------------------------------- /static/textures/stone_diorite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stone_diorite.png -------------------------------------------------------------------------------- /static/textures/stone_diorite_smooth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stone_diorite_smooth.png -------------------------------------------------------------------------------- /static/textures/stone_granite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stone_granite.png -------------------------------------------------------------------------------- /static/textures/stone_granite_smooth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stone_granite_smooth.png -------------------------------------------------------------------------------- /static/textures/stonebrick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stonebrick.png -------------------------------------------------------------------------------- /static/textures/stonebrick_carved.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stonebrick_carved.png -------------------------------------------------------------------------------- /static/textures/stonebrick_cracked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stonebrick_cracked.png -------------------------------------------------------------------------------- /static/textures/stonebrick_mossy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stonebrick_mossy.png -------------------------------------------------------------------------------- /static/textures/stripped_acacia_log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stripped_acacia_log.png -------------------------------------------------------------------------------- /static/textures/stripped_acacia_log_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stripped_acacia_log_top.png -------------------------------------------------------------------------------- /static/textures/stripped_birch_log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stripped_birch_log.png -------------------------------------------------------------------------------- /static/textures/stripped_birch_log_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stripped_birch_log_top.png -------------------------------------------------------------------------------- /static/textures/stripped_dark_oak_log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stripped_dark_oak_log.png -------------------------------------------------------------------------------- /static/textures/stripped_dark_oak_log_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stripped_dark_oak_log_top.png -------------------------------------------------------------------------------- /static/textures/stripped_jungle_log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stripped_jungle_log.png -------------------------------------------------------------------------------- /static/textures/stripped_jungle_log_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stripped_jungle_log_top.png -------------------------------------------------------------------------------- /static/textures/stripped_oak_log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stripped_oak_log.png -------------------------------------------------------------------------------- /static/textures/stripped_oak_log_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stripped_oak_log_top.png -------------------------------------------------------------------------------- /static/textures/stripped_spruce_log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stripped_spruce_log.png -------------------------------------------------------------------------------- /static/textures/stripped_spruce_log_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/stripped_spruce_log_top.png -------------------------------------------------------------------------------- /static/textures/tnt_side.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/tnt_side.png -------------------------------------------------------------------------------- /static/textures/transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/transparent.png -------------------------------------------------------------------------------- /static/textures/tube_coral_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/tube_coral_block.png -------------------------------------------------------------------------------- /static/textures/wool_colored_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/wool_colored_black.png -------------------------------------------------------------------------------- /static/textures/wool_colored_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/wool_colored_blue.png -------------------------------------------------------------------------------- /static/textures/wool_colored_brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/wool_colored_brown.png -------------------------------------------------------------------------------- /static/textures/wool_colored_cyan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/wool_colored_cyan.png -------------------------------------------------------------------------------- /static/textures/wool_colored_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/wool_colored_gray.png -------------------------------------------------------------------------------- /static/textures/wool_colored_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/wool_colored_green.png -------------------------------------------------------------------------------- /static/textures/wool_colored_light_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/wool_colored_light_blue.png -------------------------------------------------------------------------------- /static/textures/wool_colored_lime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/wool_colored_lime.png -------------------------------------------------------------------------------- /static/textures/wool_colored_magenta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/wool_colored_magenta.png -------------------------------------------------------------------------------- /static/textures/wool_colored_orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/wool_colored_orange.png -------------------------------------------------------------------------------- /static/textures/wool_colored_pink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/wool_colored_pink.png -------------------------------------------------------------------------------- /static/textures/wool_colored_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/wool_colored_purple.png -------------------------------------------------------------------------------- /static/textures/wool_colored_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/wool_colored_red.png -------------------------------------------------------------------------------- /static/textures/wool_colored_silver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/wool_colored_silver.png -------------------------------------------------------------------------------- /static/textures/wool_colored_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/wool_colored_white.png -------------------------------------------------------------------------------- /static/textures/wool_colored_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explodey54/minecraft-artifier-js/df81723c4f7a488a49ba09f94d458eac3a74680f/static/textures/wool_colored_yellow.png --------------------------------------------------------------------------------