diff --git a/.build/index.js b/.build/index.js
deleted file mode 100644
index eefd4f7500baa144912f571ce8df79326564170a..0000000000000000000000000000000000000000
--- a/.build/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-const s = "\u6B22\u8FCE\u6765\u5230 InsCode";
-console.log(s);
-//# sourceMappingURL=index.js.map
diff --git a/.build/index.js.map b/.build/index.js.map
deleted file mode 100644
index bd551c6d794db71f1248463d8d77fef9bb8ec757..0000000000000000000000000000000000000000
--- a/.build/index.js.map
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "version": 3,
- "sources": ["../index.ts"],
- "sourcesContent": ["const s: string = \"\u6B22\u8FCE\u6765\u5230 InsCode\";\nconsole.log(s);\n"],
- "mappings": ";AAAA,MAAM,IAAY;AAClB,QAAQ,IAAI,CAAC;",
- "names": []
-}
diff --git a/.config/build.sh b/.config/build.sh
deleted file mode 100644
index 11fd4353d48e0cc7836f0c1e5347da11ded3ae4f..0000000000000000000000000000000000000000
--- a/.config/build.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-rm -rf .build
-mkdir -p ./.build
-
-ENTRYPOINTS=$(find -type f -name '*.[tj]s' -not -path './node_modules/*')
-
-esbuild $ENTRYPOINTS \
- --log-level=warning \
- --outdir='./.build' \
- --outbase=. \
- --sourcemap \
- --target='node16' \
- --platform='node' \
- --format='cjs'
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..15928bf0140cdb5c28965f8a99a672d4a5b25527
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+*-lock.yaml
diff --git a/.inscode b/.inscode
index ce46aa7d32cdcabc18c2aeed77a06d75edc8d9ae..3b99d97697b03a51e4f2759faad2196f6ce16fc4 100644
--- a/.inscode
+++ b/.inscode
@@ -1,4 +1,4 @@
-run = "node --enable-source-maps .build/index.js"
+run = "upm add guess;npm run dev"
entrypoint = "index.ts"
[nix]
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..180c25a1e5a3aa4ef74f3b393c86004e98a833b9
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 Vyse12138
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..3c015f9affacfcbe7a43bd03e9c72b17c292f192
--- /dev/null
+++ b/README.md
@@ -0,0 +1,30 @@
+# minecraft-threejs
+
+English | [中文](https://github.com/vyse12138/minecraft-threejs/blob/main/README_ZH.md)
+
+Minecraft clone made with Three.js and TypeScript
+
+Check it out: [Minecraft - Three.js](https://mc.yulei.me/)
+
+Recommend to use Chrome to get the best experience
+
+![preview](https://user-images.githubusercontent.com/88306344/154383952-9b33bad4-eebb-4a98-a12e-f5f137422d06.gif)
+
+## Features:
+
+- Destroy block and place block
+- Mouse wheel (or number key) to select different block types
+- Movement and collision detection
+- Random terrain / blocks / tree generations
+- Infinite world
+- Game save / load
+- Sound effect and BGM
+- Highlight the block at crosshair
+- Basic UI and settings
+- Mobile friendly
+
+## Working on:
+
+- Multiplayer
+- Generates water
+- Higher performance algorithm
diff --git a/README_ZH.md b/README_ZH.md
new file mode 100644
index 0000000000000000000000000000000000000000..cc4068d7f8868b34c7ae280830a8f01d62ee4ace
--- /dev/null
+++ b/README_ZH.md
@@ -0,0 +1,31 @@
+# minecraft-threejs
+
+中文 | [English](https://github.com/vyse12138/minecraft-threejs)
+
+基于 Three.js 和 TypeScript 的网页版我的世界
+
+试玩:[Minecraft - Three.js](https://mcz.yulei.me)
+
+建议使用 Chrome 来获得最佳的体验
+
+![preview](https://user-images.githubusercontent.com/88306344/154383952-9b33bad4-eebb-4a98-a12e-f5f137422d06.gif)
+
+## 已支持:
+
+- 方块的放置 / 破坏
+- 鼠标滚轮(数字键)选择不同的方块类型
+- 移动和碰撞检测
+- 随机的地形和树木生成
+- 无限的世界
+- 保存 / 读取游戏
+- 音效和背景音乐
+- 可调节的渲染距离和视野范围
+- 高亮准心方块
+- 基本的 UI
+- 支持桌面以及手机试玩
+
+## 开发中:
+
+- 更高效的算法(时间切片渲染算法和方块放置 / 破坏算法)
+- 生成水
+- 联机模式
diff --git a/index.html b/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..c444d9f3a41d633b04a6826703d763d4e1c10919
--- /dev/null
+++ b/index.html
@@ -0,0 +1,93 @@
+
+
+
+ Left-Click: destroy block
+ Right-Click: place block
+ Wheel / Number Key: change block
+ WASD: move
+ Space: jump
+ Q: normal / dev mode
+ Shift: fly up (in dev mode)
+ F: full screen
+ E: menu
+
+
+
+
+
+
Render Distance: 3
+
+
+
Field of View: 70
+
+
+
Music: On
+
+
+
+
+
+
+
+
Game Saved!
+
Game Loaded!
+
+
diff --git a/index.ts b/index.ts
deleted file mode 100644
index df8a3b59c0bb8c77ba2f987fdeda605e8cd07bf8..0000000000000000000000000000000000000000
--- a/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-const s: string = "欢迎来到 InsCode";
-console.log(s);
diff --git a/package.json b/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..c0fb3dafc88ef82c12c4d837abb05f851ac9c037
--- /dev/null
+++ b/package.json
@@ -0,0 +1,21 @@
+{
+ "name": "minecraft-threejs",
+ "version": "0.0.0",
+ "license": "MIT",
+ "author": "Yulei Zhu",
+ "description": "Minecraft clone made with Three.js and TypeScript",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview --port 8080",
+ "lint": "tsc --noEmit"
+ },
+ "devDependencies": {
+ "@types/three": "^0.137.0",
+ "typescript": "^4.5.5",
+ "vite": "^2.8.0"
+ },
+ "dependencies": {
+ "three": "^0.137.0"
+ }
+}
diff --git a/src/audio/blocks/dirt1.ogg b/src/audio/blocks/dirt1.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..97ae71e0923f814e006b275606d26d28a8c047a2
Binary files /dev/null and b/src/audio/blocks/dirt1.ogg differ
diff --git a/src/audio/blocks/dirt2.ogg b/src/audio/blocks/dirt2.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..5133141161422bfdf3c12e71e1d32385a15c3254
Binary files /dev/null and b/src/audio/blocks/dirt2.ogg differ
diff --git a/src/audio/blocks/dirt3.ogg b/src/audio/blocks/dirt3.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..1b8debd795fe93955bbc8a0727029a1839c7df5f
Binary files /dev/null and b/src/audio/blocks/dirt3.ogg differ
diff --git a/src/audio/blocks/dirt4.ogg b/src/audio/blocks/dirt4.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..94a0c1cbe86bb36a87ba7114e60e60d37a3f9302
Binary files /dev/null and b/src/audio/blocks/dirt4.ogg differ
diff --git a/src/audio/blocks/grass1.ogg b/src/audio/blocks/grass1.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..12f575110abad218ab5688899fdb29db5e5ec08c
Binary files /dev/null and b/src/audio/blocks/grass1.ogg differ
diff --git a/src/audio/blocks/grass2.ogg b/src/audio/blocks/grass2.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..05dff55c8fe2587119663e41c50d8b199ccf1465
Binary files /dev/null and b/src/audio/blocks/grass2.ogg differ
diff --git a/src/audio/blocks/grass3.ogg b/src/audio/blocks/grass3.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..e792b343e97865979e4286bba8e1184fd905f651
Binary files /dev/null and b/src/audio/blocks/grass3.ogg differ
diff --git a/src/audio/blocks/grass4.ogg b/src/audio/blocks/grass4.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..8421e6ae7f5baa5ae0b43a4a718c001222937e0a
Binary files /dev/null and b/src/audio/blocks/grass4.ogg differ
diff --git a/src/audio/blocks/leaf1.ogg b/src/audio/blocks/leaf1.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..3eee4c168ca6800fd66d01f280abcc9113ed4350
Binary files /dev/null and b/src/audio/blocks/leaf1.ogg differ
diff --git a/src/audio/blocks/leaf2.ogg b/src/audio/blocks/leaf2.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..0b480e36fc076c7981c35ebea6c428a9c37eaf80
Binary files /dev/null and b/src/audio/blocks/leaf2.ogg differ
diff --git a/src/audio/blocks/leaf3.ogg b/src/audio/blocks/leaf3.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..332945b4717bf04216d6c4de1a2caf2a768a6f32
Binary files /dev/null and b/src/audio/blocks/leaf3.ogg differ
diff --git a/src/audio/blocks/leaf4.ogg b/src/audio/blocks/leaf4.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..ac41361ed3eea05c2c301423180d368b822a3474
Binary files /dev/null and b/src/audio/blocks/leaf4.ogg differ
diff --git a/src/audio/blocks/sand1.ogg b/src/audio/blocks/sand1.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..e9cb62d711997bbb140fb5bd82adb43f4d3e842d
Binary files /dev/null and b/src/audio/blocks/sand1.ogg differ
diff --git a/src/audio/blocks/sand2.ogg b/src/audio/blocks/sand2.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..ce2eeb09da9ebca55c2977682127bd3cf25fbf1b
Binary files /dev/null and b/src/audio/blocks/sand2.ogg differ
diff --git a/src/audio/blocks/sand3.ogg b/src/audio/blocks/sand3.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..c94fc1b10f2af3926aa526b9bccff0464bcec372
Binary files /dev/null and b/src/audio/blocks/sand3.ogg differ
diff --git a/src/audio/blocks/sand4.ogg b/src/audio/blocks/sand4.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..ae2d818d0f09f612ef22e9848acb65419976d5ae
Binary files /dev/null and b/src/audio/blocks/sand4.ogg differ
diff --git a/src/audio/blocks/stone1.ogg b/src/audio/blocks/stone1.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..746d282e81c9fbcdfde0966a3123096ecf3c87ba
Binary files /dev/null and b/src/audio/blocks/stone1.ogg differ
diff --git a/src/audio/blocks/stone2.ogg b/src/audio/blocks/stone2.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..333c9704ece8e9482fd4097af66fe5c8596cba9a
Binary files /dev/null and b/src/audio/blocks/stone2.ogg differ
diff --git a/src/audio/blocks/stone3.ogg b/src/audio/blocks/stone3.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..f8b629fc3d782f588dc98ed562f2231425cb23ea
Binary files /dev/null and b/src/audio/blocks/stone3.ogg differ
diff --git a/src/audio/blocks/stone4.ogg b/src/audio/blocks/stone4.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..d705cf350e749642f45f3d035385c988d7dbed49
Binary files /dev/null and b/src/audio/blocks/stone4.ogg differ
diff --git a/src/audio/blocks/tree1.ogg b/src/audio/blocks/tree1.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..f9a474a38d5b67cc788e86b02c6d88cd69e9bce4
Binary files /dev/null and b/src/audio/blocks/tree1.ogg differ
diff --git a/src/audio/blocks/tree2.ogg b/src/audio/blocks/tree2.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..b55d49ba593ecee7396a9d1e6579657149da34f3
Binary files /dev/null and b/src/audio/blocks/tree2.ogg differ
diff --git a/src/audio/blocks/tree3.ogg b/src/audio/blocks/tree3.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..61922ae9a57b0abb1249056e9846caca00b0bd2e
Binary files /dev/null and b/src/audio/blocks/tree3.ogg differ
diff --git a/src/audio/blocks/tree4.ogg b/src/audio/blocks/tree4.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..f5a02c500713e72ef79f10493b9b07f3a11503f7
Binary files /dev/null and b/src/audio/blocks/tree4.ogg differ
diff --git a/src/audio/index.ts b/src/audio/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3c244a978a57b10ea2f9da6338e2485508943494
--- /dev/null
+++ b/src/audio/index.ts
@@ -0,0 +1,107 @@
+import * as THREE from 'three'
+import hal3 from './musics/hal3.ogg'
+import { BlockType } from '../terrain'
+
+import grass1 from './blocks/grass1.ogg'
+import grass2 from './blocks/grass2.ogg'
+import grass3 from './blocks/grass3.ogg'
+import grass4 from './blocks/grass4.ogg'
+
+import sand1 from './blocks/sand1.ogg'
+import sand2 from './blocks/sand2.ogg'
+import sand3 from './blocks/sand3.ogg'
+import sand4 from './blocks/sand4.ogg'
+
+import stone1 from './blocks/stone1.ogg'
+import stone2 from './blocks/stone2.ogg'
+import stone3 from './blocks/stone3.ogg'
+import stone4 from './blocks/stone4.ogg'
+
+import dirt1 from './blocks/dirt1.ogg'
+import dirt2 from './blocks/dirt2.ogg'
+import dirt3 from './blocks/dirt3.ogg'
+import dirt4 from './blocks/dirt4.ogg'
+
+import tree1 from './blocks/tree1.ogg'
+import tree2 from './blocks/tree2.ogg'
+import tree3 from './blocks/tree3.ogg'
+import tree4 from './blocks/tree4.ogg'
+
+import leaf1 from './blocks/leaf1.ogg'
+import leaf2 from './blocks/leaf2.ogg'
+import leaf3 from './blocks/leaf3.ogg'
+import leaf4 from './blocks/leaf4.ogg'
+import { isMobile } from '../utils'
+
+export default class Audio {
+ constructor(camera: THREE.PerspectiveCamera) {
+ if (isMobile) return
+
+ const listener = new THREE.AudioListener()
+ const audioLoader = new THREE.AudioLoader()
+ camera.add(listener)
+
+ // load bgm
+ const bgm = new THREE.Audio(listener)
+ bgm.autoplay = false
+ audioLoader.load(hal3, buffer => {
+ bgm.setBuffer(buffer)
+ bgm.setVolume(0.1)
+ bgm.setLoop(true)
+ if (bgm.isPlaying) {
+ bgm.pause()
+ bgm.play()
+ }
+ })
+
+ // play / pause bgm
+ document.addEventListener('pointerlockchange', () => {
+ if (document.pointerLockElement && !bgm.isPlaying && !this.disabled) {
+ bgm.play()
+ } else {
+ bgm.pause()
+ }
+ })
+
+ // load sound effect
+ for (const types of this.sourceSet) {
+ const audios: THREE.Audio[] = []
+ for (const type of types) {
+ audioLoader.load(type, buffer => {
+ const audio = new THREE.Audio(listener!)
+ audio.setBuffer(buffer)
+ audio.setVolume(0.15)
+ audios.push(audio)
+ })
+ }
+ this.soundSet.push(audios)
+ }
+ }
+
+ disabled = false
+
+ sourceSet = [
+ [grass1, grass2, grass3, grass4],
+ [sand1, sand2, sand3, sand4],
+ [tree1, tree2, tree3, tree4],
+ [leaf1, leaf2, leaf3, leaf4],
+ [dirt1, dirt2, dirt3, dirt4],
+ [stone1, stone2, stone3, stone4],
+ [stone1, stone2, stone3, stone4],
+ [tree1, tree2, tree3, tree4],
+ [stone1, stone2, stone3, stone4],
+ [stone1, stone2, stone3, stone4],
+ [stone1, stone2, stone3, stone4]
+ ]
+
+ soundSet: THREE.Audio[][] = []
+
+ index = 0
+
+ playSound(type: BlockType) {
+ if (!this.disabled && !isMobile) {
+ this.index++ === 3 && (this.index = 0)
+ this.soundSet[type]?.[this.index]?.play()
+ }
+ }
+}
diff --git a/src/audio/musics/calm1.ogg b/src/audio/musics/calm1.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..e76b31784018041a1a5c91294dc77b30f146fab9
Binary files /dev/null and b/src/audio/musics/calm1.ogg differ
diff --git a/src/audio/musics/calm2.ogg b/src/audio/musics/calm2.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..b02df7b9ba435568c2a9dff5543dc0216d568ecc
Binary files /dev/null and b/src/audio/musics/calm2.ogg differ
diff --git a/src/audio/musics/calm3.ogg b/src/audio/musics/calm3.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..a4cfafed0b17ab032e40b741a99f09d71e7018b5
Binary files /dev/null and b/src/audio/musics/calm3.ogg differ
diff --git a/src/audio/musics/hal1.ogg b/src/audio/musics/hal1.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..bcbe583a48f9253657ce1a49513c445ef0c8a8f8
Binary files /dev/null and b/src/audio/musics/hal1.ogg differ
diff --git a/src/audio/musics/hal2.ogg b/src/audio/musics/hal2.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..3ea6b6f609580abdc3ca27efc46e297a17680f6b
Binary files /dev/null and b/src/audio/musics/hal2.ogg differ
diff --git a/src/audio/musics/hal3.ogg b/src/audio/musics/hal3.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..6f8984f770f1b7b805e48808a8b67a716a9c71db
Binary files /dev/null and b/src/audio/musics/hal3.ogg differ
diff --git a/src/audio/musics/hal4.ogg b/src/audio/musics/hal4.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..e3f8dbf19a40e575faaa327b743d30d0ad9e4a33
Binary files /dev/null and b/src/audio/musics/hal4.ogg differ
diff --git a/src/audio/musics/piano1.ogg b/src/audio/musics/piano1.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..4c7254959d2596d194ebbebe1cd3d2471a4b7d9a
Binary files /dev/null and b/src/audio/musics/piano1.ogg differ
diff --git a/src/audio/musics/piano2.ogg b/src/audio/musics/piano2.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..ce138e726786f20e85ddaf591269f7d5ec89c9e9
Binary files /dev/null and b/src/audio/musics/piano2.ogg differ
diff --git a/src/audio/musics/piano3.ogg b/src/audio/musics/piano3.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..0b919924bad51b55d0b059df73a2e3e8810fa2de
Binary files /dev/null and b/src/audio/musics/piano3.ogg differ
diff --git a/src/control/index.ts b/src/control/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..036ad8aa0727537267eb0403fe043ce0c06b0a1c
--- /dev/null
+++ b/src/control/index.ts
@@ -0,0 +1,1109 @@
+import * as THREE from 'three'
+import { PointerLockControls } from 'three/examples/jsm/controls/PointerLockControls'
+import Player, { Mode } from '../player'
+import Terrain, { BlockType } from '../terrain'
+
+import Block from '../terrain/mesh/block'
+import Noise from '../terrain/noise'
+import Audio from '../audio'
+import { isMobile } from '../utils'
+enum Side {
+ front,
+ back,
+ left,
+ right,
+ down,
+ up
+}
+
+export default class Control {
+ constructor(
+ scene: THREE.Scene,
+ camera: THREE.PerspectiveCamera,
+ player: Player,
+ terrain: Terrain,
+ audio: Audio
+ ) {
+ this.scene = scene
+ this.camera = camera
+ this.player = player
+ this.terrain = terrain
+ this.control = new PointerLockControls(camera, document.body)
+ this.audio = audio
+
+ this.raycaster = new THREE.Raycaster()
+ this.raycaster.far = 8
+ this.far = this.player.body.height
+
+ this.initRayCaster()
+ this.initEventListeners()
+ }
+
+ // core properties
+ scene: THREE.Scene
+ camera: THREE.PerspectiveCamera
+ player: Player
+ terrain: Terrain
+ control: PointerLockControls
+ audio: Audio
+ velocity = new THREE.Vector3(0, 0, 0)
+
+ // collide and jump properties
+ frontCollide = false
+ backCollide = false
+ leftCollide = false
+ rightCollide = false
+ downCollide = true
+ upCollide = false
+ isJumping = false
+
+ raycasterDown = new THREE.Raycaster()
+ raycasterUp = new THREE.Raycaster()
+ raycasterFront = new THREE.Raycaster()
+ raycasterBack = new THREE.Raycaster()
+ raycasterRight = new THREE.Raycaster()
+ raycasterLeft = new THREE.Raycaster()
+
+ tempMesh = new THREE.InstancedMesh(
+ new THREE.BoxGeometry(1, 1, 1),
+ new THREE.MeshBasicMaterial(),
+ 100
+ )
+ tempMeshMatrix = new THREE.InstancedBufferAttribute(
+ new Float32Array(100 * 16),
+ 16
+ )
+
+ // other properties
+ p1 = performance.now()
+ p2 = performance.now()
+ raycaster: THREE.Raycaster
+ far: number
+
+ holdingBlock = BlockType.grass
+ holdingBlocks = [
+ BlockType.grass,
+ BlockType.stone,
+ BlockType.tree,
+ BlockType.wood,
+ BlockType.diamond,
+ BlockType.quartz,
+ BlockType.glass,
+ BlockType.grass,
+ BlockType.grass,
+ BlockType.grass
+ ]
+ holdingIndex = 0
+ wheelGap = false
+ clickInterval?: ReturnType
+ jumpInterval?: ReturnType
+ mouseHolding = false
+ spaceHolding = false
+
+ initRayCaster = () => {
+ this.raycasterUp.ray.direction = new THREE.Vector3(0, 1, 0)
+ this.raycasterDown.ray.direction = new THREE.Vector3(0, -1, 0)
+ this.raycasterFront.ray.direction = new THREE.Vector3(1, 0, 0)
+ this.raycasterBack.ray.direction = new THREE.Vector3(-1, 0, 0)
+ this.raycasterLeft.ray.direction = new THREE.Vector3(0, 0, -1)
+ this.raycasterRight.ray.direction = new THREE.Vector3(0, 0, 1)
+
+ this.raycasterUp.far = 1.2
+ this.raycasterDown.far = this.player.body.height
+ this.raycasterFront.far = this.player.body.width
+ this.raycasterBack.far = this.player.body.width
+ this.raycasterLeft.far = this.player.body.width
+ this.raycasterRight.far = this.player.body.width
+ }
+
+ setMovementHandler = (e: KeyboardEvent) => {
+ if (e.repeat) {
+ return
+ }
+
+ switch (e.key) {
+ case 'q':
+ if (this.player.mode === Mode.walking) {
+ this.player.setMode(Mode.flying)
+ } else {
+ this.player.setMode(Mode.walking)
+ }
+ this.velocity.y = 0
+ this.velocity.x = 0
+ this.velocity.z = 0
+ break
+ case 'w':
+ case 'W':
+ this.velocity.x += this.player.speed
+ break
+ case 's':
+ case 'S':
+ this.velocity.x -= this.player.speed
+ break
+ case 'a':
+ case 'A':
+ this.velocity.z -= this.player.speed
+ break
+ case 'd':
+ case 'D':
+ this.velocity.z += this.player.speed
+ break
+ case ' ':
+ if (this.player.mode === Mode.walking) {
+ // jump
+ if (!this.isJumping) {
+ this.velocity.y = 8
+ this.isJumping = true
+ this.downCollide = false
+ this.far = 0
+ setTimeout(() => {
+ this.far = this.player.body.height
+ }, 300)
+ }
+ } else {
+ this.velocity.y += this.player.speed
+ }
+ if (this.player.mode === Mode.walking && !this.spaceHolding) {
+ this.spaceHolding = true
+ this.jumpInterval = setInterval(() => {
+ this.setMovementHandler(e)
+ }, 10)
+ }
+ break
+ case 'Shift':
+ if (this.player.mode === Mode.walking) {
+ } else {
+ this.velocity.y -= this.player.speed
+ }
+ break
+ default:
+ break
+ }
+ }
+
+ resetMovementHandler = (e: KeyboardEvent) => {
+ if (e.repeat) {
+ return
+ }
+
+ switch (e.key) {
+ case 'w':
+ case 'W':
+ this.velocity.x = 0
+ break
+ case 's':
+ case 'S':
+ this.velocity.x = 0
+ break
+ case 'a':
+ case 'A':
+ this.velocity.z = 0
+ break
+ case 'd':
+ case 'D':
+ this.velocity.z = 0
+ break
+ case ' ':
+ this.jumpInterval && clearInterval(this.jumpInterval)
+ this.spaceHolding = false
+ if (this.player.mode === Mode.walking) {
+ return
+ }
+ this.velocity.y = 0
+ break
+ case 'Shift':
+ if (this.player.mode === Mode.walking) {
+ return
+ }
+ this.velocity.y = 0
+ break
+ default:
+ break
+ }
+ }
+
+ mousedownHandler = (e: MouseEvent) => {
+ e.preventDefault()
+ // let p1 = performance.now()
+ this.raycaster.setFromCamera({ x: 0, y: 0 }, this.camera)
+ const block = this.raycaster.intersectObjects(this.terrain.blocks)[0]
+ const matrix = new THREE.Matrix4()
+
+ switch (e.button) {
+ // left click to remove block
+ case 0:
+ {
+ if (block && block.object instanceof THREE.InstancedMesh) {
+ // calculate position
+ block.object.getMatrixAt(block.instanceId!, matrix)
+ const position = new THREE.Vector3().setFromMatrixPosition(matrix)
+
+ // don't remove bedrock
+ if (
+ (BlockType[block.object.name as any] as unknown as BlockType) ===
+ BlockType.bedrock
+ ) {
+ this.terrain.generateAdjacentBlocks(position)
+ return
+ }
+
+ // remove the block
+ block.object.setMatrixAt(
+ block.instanceId!,
+ new THREE.Matrix4().set(
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ )
+ )
+
+ // block and sound effect
+ this.audio.playSound(
+ BlockType[block.object.name as any] as unknown as BlockType
+ )
+
+ const mesh = new THREE.Mesh(
+ new THREE.BoxGeometry(1, 1, 1),
+ this.terrain.materials.get(
+ this.terrain.materialType[
+ parseInt(BlockType[block.object.name as any])
+ ]
+ )
+ )
+ mesh.position.set(position.x, position.y, position.z)
+ this.scene.add(mesh)
+ const time = performance.now()
+ let raf = 0
+ const animate = () => {
+ if (performance.now() - time > 250) {
+ this.scene.remove(mesh)
+ cancelAnimationFrame(raf)
+ return
+ }
+ raf = requestAnimationFrame(animate)
+ mesh.geometry.scale(0.85, 0.85, 0.85)
+ }
+ animate()
+
+ // update
+ block.object.instanceMatrix.needsUpdate = true
+
+ // check existence
+ let existed = false
+ for (const customBlock of this.terrain.customBlocks) {
+ if (
+ customBlock.x === position.x &&
+ customBlock.y === position.y &&
+ customBlock.z === position.z
+ ) {
+ existed = true
+ customBlock.placed = false
+ }
+ }
+
+ // add to custom blocks when it's not existed
+ if (!existed) {
+ this.terrain.customBlocks.push(
+ new Block(
+ position.x,
+ position.y,
+ position.z,
+ BlockType[block.object.name as any] as unknown as BlockType,
+ false
+ )
+ )
+ }
+
+ // generate adjacent blocks
+ this.terrain.generateAdjacentBlocks(position)
+ }
+ }
+ break
+
+ // right click to put block
+ case 2:
+ {
+ if (block && block.object instanceof THREE.InstancedMesh) {
+ // calculate normal and position
+ const normal = block.face!.normal
+ block.object.getMatrixAt(block.instanceId!, matrix)
+ const position = new THREE.Vector3().setFromMatrixPosition(matrix)
+
+ // return when block overlaps with player
+ if (
+ position.x + normal.x === Math.round(this.camera.position.x) &&
+ position.z + normal.z === Math.round(this.camera.position.z) &&
+ (position.y + normal.y === Math.round(this.camera.position.y) ||
+ position.y + normal.y ===
+ Math.round(this.camera.position.y - 1))
+ ) {
+ return
+ }
+
+ // put the block
+ matrix.setPosition(
+ normal.x + position.x,
+ normal.y + position.y,
+ normal.z + position.z
+ )
+ this.terrain.blocks[this.holdingBlock].setMatrixAt(
+ this.terrain.getCount(this.holdingBlock),
+ matrix
+ )
+ this.terrain.setCount(this.holdingBlock)
+
+ //sound effect
+ this.audio.playSound(this.holdingBlock)
+
+ // update
+ this.terrain.blocks[this.holdingBlock].instanceMatrix.needsUpdate =
+ true
+
+ // add to custom blocks
+ this.terrain.customBlocks.push(
+ new Block(
+ normal.x + position.x,
+ normal.y + position.y,
+ normal.z + position.z,
+ this.holdingBlock,
+ true
+ )
+ )
+ }
+ }
+ break
+ default:
+ break
+ }
+
+ if (!isMobile && !this.mouseHolding) {
+ this.mouseHolding = true
+ this.clickInterval = setInterval(() => {
+ this.mousedownHandler(e)
+ }, 333)
+ }
+
+ // console.log(performance.now() - p1)
+ }
+ mouseupHandler = () => {
+ this.clickInterval && clearInterval(this.clickInterval)
+ this.mouseHolding = false
+ }
+
+ changeHoldingBlockHandler = (e: KeyboardEvent) => {
+ if (isNaN(parseInt(e.key)) || e.key === '0') {
+ return
+ }
+ this.holdingIndex = parseInt(e.key) - 1
+
+ this.holdingBlock = this.holdingBlocks[this.holdingIndex] ?? BlockType.grass
+ }
+
+ wheelHandler = (e: WheelEvent) => {
+ if (!this.wheelGap) {
+ this.wheelGap = true
+ setTimeout(() => {
+ this.wheelGap = false
+ }, 100)
+ if (e.deltaY > 0) {
+ this.holdingIndex++
+ this.holdingIndex > 9 && (this.holdingIndex = 0)
+ } else if (e.deltaY < 0) {
+ this.holdingIndex--
+ this.holdingIndex < 0 && (this.holdingIndex = 9)
+ }
+ this.holdingBlock =
+ this.holdingBlocks[this.holdingIndex] ?? BlockType.grass
+ }
+ }
+
+ initEventListeners = () => {
+ // add / remove handler when pointer lock / unlock
+ document.addEventListener('pointerlockchange', () => {
+ if (document.pointerLockElement) {
+ document.body.addEventListener(
+ 'keydown',
+ this.changeHoldingBlockHandler
+ )
+ document.body.addEventListener('wheel', this.wheelHandler)
+ document.body.addEventListener('keydown', this.setMovementHandler)
+ document.body.addEventListener('keyup', this.resetMovementHandler)
+ document.body.addEventListener('mousedown', this.mousedownHandler)
+ document.body.addEventListener('mouseup', this.mouseupHandler)
+ } else {
+ document.body.removeEventListener(
+ 'keydown',
+ this.changeHoldingBlockHandler
+ )
+ document.body.removeEventListener('wheel', this.wheelHandler)
+ document.body.removeEventListener('keydown', this.setMovementHandler)
+ document.body.removeEventListener('keyup', this.resetMovementHandler)
+ document.body.removeEventListener('mousedown', this.mousedownHandler)
+ document.body.removeEventListener('mouseup', this.mouseupHandler)
+ this.velocity = new THREE.Vector3(0, 0, 0)
+ }
+ })
+ }
+
+ // move along X with direction factor
+ moveX(distance: number, delta: number) {
+ this.camera.position.x +=
+ distance * (this.player.speed / Math.PI) * 2 * delta
+ }
+
+ // move along Z with direction factor
+ moveZ = (distance: number, delta: number) => {
+ this.camera.position.z +=
+ distance * (this.player.speed / Math.PI) * 2 * delta
+ }
+
+ // collide checking
+ collideCheckAll = (
+ position: THREE.Vector3,
+ noise: Noise,
+ customBlocks: Block[],
+ far: number
+ ) => {
+ this.collideCheck(Side.down, position, noise, customBlocks, far)
+ this.collideCheck(Side.front, position, noise, customBlocks)
+ this.collideCheck(Side.back, position, noise, customBlocks)
+ this.collideCheck(Side.left, position, noise, customBlocks)
+ this.collideCheck(Side.right, position, noise, customBlocks)
+ this.collideCheck(Side.up, position, noise, customBlocks)
+ }
+
+ collideCheck = (
+ side: Side,
+ position: THREE.Vector3,
+ noise: Noise,
+ customBlocks: Block[],
+ far: number = this.player.body.width
+ ) => {
+ const matrix = new THREE.Matrix4()
+
+ //reset simulation blocks
+ let index = 0
+ this.tempMesh.instanceMatrix = new THREE.InstancedBufferAttribute(
+ new Float32Array(100 * 16),
+ 16
+ )
+
+ // block to remove
+ let removed = false
+ let treeRemoved = new Array(
+ this.terrain.noise.treeHeight + 1
+ ).fill(false)
+
+ // get block position
+ let x = Math.round(position.x)
+ let z = Math.round(position.z)
+
+ switch (side) {
+ case Side.front:
+ x++
+ this.raycasterFront.ray.origin = position
+ break
+ case Side.back:
+ x--
+ this.raycasterBack.ray.origin = position
+ break
+ case Side.left:
+ z--
+ this.raycasterLeft.ray.origin = position
+ break
+ case Side.right:
+ z++
+ this.raycasterRight.ray.origin = position
+ break
+ case Side.down:
+ this.raycasterDown.ray.origin = position
+ this.raycasterDown.far = far
+ break
+ case Side.up:
+ this.raycasterUp.ray.origin = new THREE.Vector3().copy(position)
+ this.raycasterUp.ray.origin.y--
+ break
+ }
+
+ let y =
+ Math.floor(
+ noise.get(x / noise.gap, z / noise.gap, noise.seed) * noise.amp
+ ) + 30
+
+ // check custom blocks
+ for (const block of customBlocks) {
+ if (block.x === x && block.z === z) {
+ if (block.placed) {
+ // placed blocks
+ matrix.setPosition(block.x, block.y, block.z)
+ this.tempMesh.setMatrixAt(index++, matrix)
+ } else if (block.y === y) {
+ // removed blocks
+ removed = true
+ } else {
+ for (let i = 1; i <= this.terrain.noise.treeHeight; i++) {
+ if (block.y === y + i) {
+ treeRemoved[i] = true
+ }
+ }
+ }
+ }
+ }
+
+ // update simulation blocks (ignore removed blocks)
+ if (!removed) {
+ matrix.setPosition(x, y, z)
+ this.tempMesh.setMatrixAt(index++, matrix)
+ }
+ for (let i = 1; i <= this.terrain.noise.treeHeight; i++) {
+ if (!treeRemoved[i]) {
+ let treeOffset =
+ noise.get(x / noise.treeGap, z / noise.treeGap, noise.treeSeed) *
+ noise.treeAmp
+
+ let stoneOffset =
+ noise.get(x / noise.stoneGap, z / noise.stoneGap, noise.stoneSeed) *
+ noise.stoneAmp
+
+ if (
+ treeOffset > noise.treeThreshold &&
+ y >= 27 &&
+ stoneOffset < noise.stoneThreshold
+ ) {
+ matrix.setPosition(x, y + i, z)
+ this.tempMesh.setMatrixAt(index++, matrix)
+ }
+ }
+ }
+
+ this.tempMesh.instanceMatrix.needsUpdate = true
+
+ // update collide
+ const origin = new THREE.Vector3(position.x, position.y - 1, position.z)
+ switch (side) {
+ case Side.front: {
+ const c1 = this.raycasterFront.intersectObject(this.tempMesh).length
+ this.raycasterFront.ray.origin = origin
+ const c2 = this.raycasterFront.intersectObject(this.tempMesh).length
+ c1 || c2 ? (this.frontCollide = true) : (this.frontCollide = false)
+
+ break
+ }
+ case Side.back: {
+ const c1 = this.raycasterBack.intersectObject(this.tempMesh).length
+ this.raycasterBack.ray.origin = origin
+ const c2 = this.raycasterBack.intersectObject(this.tempMesh).length
+ c1 || c2 ? (this.backCollide = true) : (this.backCollide = false)
+ break
+ }
+ case Side.left: {
+ const c1 = this.raycasterLeft.intersectObject(this.tempMesh).length
+ this.raycasterLeft.ray.origin = origin
+ const c2 = this.raycasterLeft.intersectObject(this.tempMesh).length
+ c1 || c2 ? (this.leftCollide = true) : (this.leftCollide = false)
+ break
+ }
+ case Side.right: {
+ const c1 = this.raycasterRight.intersectObject(this.tempMesh).length
+ this.raycasterRight.ray.origin = origin
+ const c2 = this.raycasterRight.intersectObject(this.tempMesh).length
+ c1 || c2 ? (this.rightCollide = true) : (this.rightCollide = false)
+ break
+ }
+ case Side.down: {
+ const c1 = this.raycasterDown.intersectObject(this.tempMesh).length
+ c1 ? (this.downCollide = true) : (this.downCollide = false)
+ break
+ }
+ case Side.up: {
+ const c1 = this.raycasterUp.intersectObject(this.tempMesh).length
+ c1 ? (this.upCollide = true) : (this.upCollide = false)
+ break
+ }
+ }
+ }
+
+ update = () => {
+ this.p1 = performance.now()
+ const delta = (this.p1 - this.p2) / 1000
+ if (
+ // dev mode
+ this.player.mode === Mode.flying
+ ) {
+ this.control.moveForward(this.velocity.x * delta)
+ this.control.moveRight(this.velocity.z * delta)
+ this.camera.position.y += this.velocity.y * delta
+ } else {
+ // normal mode
+ this.collideCheckAll(
+ this.camera.position,
+ this.terrain.noise,
+ this.terrain.customBlocks,
+ this.far - this.velocity.y * delta
+ )
+
+ // gravity
+ if (Math.abs(this.velocity.y) < this.player.falling) {
+ this.velocity.y -= 25 * delta
+ }
+
+ // up collide handler
+ if (this.upCollide) {
+ this.velocity.y = -225 * delta
+ this.far = this.player.body.height
+ }
+
+ // down collide and jump handler
+ if (this.downCollide && !this.isJumping) {
+ this.velocity.y = 0
+ } else if (this.downCollide && this.isJumping) {
+ this.isJumping = false
+ }
+
+ // side collide handler
+ let vector = new THREE.Vector3(0, 0, -1).applyQuaternion(
+ this.camera.quaternion
+ )
+ let direction = Math.atan2(vector.x, vector.z)
+ if (
+ this.frontCollide ||
+ this.backCollide ||
+ this.leftCollide ||
+ this.rightCollide
+ ) {
+ // collide front (positive x)
+ if (this.frontCollide) {
+ // camera front
+ if (direction < Math.PI && direction > 0 && this.velocity.x > 0) {
+ if (
+ (!this.leftCollide && direction > Math.PI / 2) ||
+ (!this.rightCollide && direction < Math.PI / 2)
+ ) {
+ this.moveZ(Math.PI / 2 - direction, delta)
+ }
+ } else if (
+ !this.leftCollide &&
+ !this.rightCollide &&
+ this.velocity.x > 0
+ ) {
+ this.control.moveForward(this.velocity.x * delta)
+ }
+
+ // camera back
+ if (direction < 0 && direction > -Math.PI && this.velocity.x < 0) {
+ if (
+ (!this.leftCollide && direction > -Math.PI / 2) ||
+ (!this.rightCollide && direction < -Math.PI / 2)
+ ) {
+ this.moveZ(-Math.PI / 2 - direction, delta)
+ }
+ } else if (
+ !this.leftCollide &&
+ !this.rightCollide &&
+ this.velocity.x < 0
+ ) {
+ this.control.moveForward(this.velocity.x * delta)
+ }
+
+ // camera left
+ if (
+ direction < Math.PI / 2 &&
+ direction > -Math.PI / 2 &&
+ this.velocity.z < 0
+ ) {
+ if (
+ (!this.rightCollide && direction < 0) ||
+ (!this.leftCollide && direction > 0)
+ ) {
+ this.moveZ(-direction, delta)
+ }
+ } else if (
+ !this.leftCollide &&
+ !this.rightCollide &&
+ this.velocity.z < 0
+ ) {
+ this.control.moveRight(this.velocity.z * delta)
+ }
+
+ // camera right
+ if (
+ (direction < -Math.PI / 2 || direction > Math.PI / 2) &&
+ this.velocity.z > 0
+ ) {
+ if (!this.rightCollide && direction > 0) {
+ this.moveZ(Math.PI - direction, delta)
+ }
+ if (!this.leftCollide && direction < 0) {
+ this.moveZ(-Math.PI - direction, delta)
+ }
+ } else if (
+ !this.leftCollide &&
+ !this.rightCollide &&
+ this.velocity.z > 0
+ ) {
+ this.control.moveRight(this.velocity.z * delta)
+ }
+ }
+
+ // collide back (negative x)
+ if (this.backCollide) {
+ // camera front
+ if (direction < 0 && direction > -Math.PI && this.velocity.x > 0) {
+ if (
+ (!this.leftCollide && direction < -Math.PI / 2) ||
+ (!this.rightCollide && direction > -Math.PI / 2)
+ ) {
+ this.moveZ(Math.PI / 2 + direction, delta)
+ }
+ } else if (
+ !this.leftCollide &&
+ !this.rightCollide &&
+ this.velocity.x > 0
+ ) {
+ this.control.moveForward(this.velocity.x * delta)
+ }
+
+ // camera back
+ if (direction < Math.PI && direction > 0 && this.velocity.x < 0) {
+ if (
+ (!this.leftCollide && direction < Math.PI / 2) ||
+ (!this.rightCollide && direction > Math.PI / 2)
+ ) {
+ this.moveZ(direction - Math.PI / 2, delta)
+ }
+ } else if (
+ !this.leftCollide &&
+ !this.rightCollide &&
+ this.velocity.x < 0
+ ) {
+ this.control.moveForward(this.velocity.x * delta)
+ }
+
+ // camera left
+ if (
+ (direction < -Math.PI / 2 || direction > Math.PI / 2) &&
+ this.velocity.z < 0
+ ) {
+ if (!this.leftCollide && direction > 0) {
+ this.moveZ(-Math.PI + direction, delta)
+ }
+ if (!this.rightCollide && direction < 0) {
+ this.moveZ(Math.PI + direction, delta)
+ }
+ } else if (
+ !this.leftCollide &&
+ !this.rightCollide &&
+ this.velocity.z < 0
+ ) {
+ this.control.moveRight(this.velocity.z * delta)
+ }
+
+ // camera right
+ if (
+ direction < Math.PI / 2 &&
+ direction > -Math.PI / 2 &&
+ this.velocity.z > 0
+ ) {
+ if (
+ (!this.leftCollide && direction < 0) ||
+ (!this.rightCollide && direction > 0)
+ ) {
+ this.moveZ(direction, delta)
+ }
+ } else if (
+ !this.leftCollide &&
+ !this.rightCollide &&
+ this.velocity.z > 0
+ ) {
+ this.control.moveRight(this.velocity.z * delta)
+ }
+ }
+
+ // collide left (negative z)
+ if (this.leftCollide) {
+ // camera front
+ if (
+ (direction < -Math.PI / 2 || direction > Math.PI / 2) &&
+ this.velocity.x > 0
+ ) {
+ if (!this.frontCollide && direction > 0) {
+ this.moveX(Math.PI - direction, delta)
+ }
+ if (!this.backCollide && direction < 0) {
+ this.moveX(-Math.PI - direction, delta)
+ }
+ } else if (
+ !this.frontCollide &&
+ !this.backCollide &&
+ this.velocity.x > 0
+ ) {
+ this.control.moveForward(this.velocity.x * delta)
+ } else if (
+ this.frontCollide &&
+ direction < 0 &&
+ direction > -Math.PI / 2 &&
+ this.velocity.x > 0
+ ) {
+ this.control.moveForward(this.velocity.x * delta)
+ } else if (
+ this.backCollide &&
+ direction < Math.PI / 2 &&
+ direction > 0 &&
+ this.velocity.x > 0
+ ) {
+ this.control.moveForward(this.velocity.x * delta)
+ }
+
+ // camera back
+ if (
+ direction < Math.PI / 2 &&
+ direction > -Math.PI / 2 &&
+ this.velocity.x < 0
+ ) {
+ if (
+ (!this.frontCollide && direction < 0) ||
+ (!this.backCollide && direction > 0)
+ ) {
+ this.moveX(-direction, delta)
+ }
+ } else if (
+ !this.frontCollide &&
+ !this.backCollide &&
+ this.velocity.x < 0
+ ) {
+ this.control.moveForward(this.velocity.x * delta)
+ } else if (
+ this.frontCollide &&
+ direction < Math.PI &&
+ direction > Math.PI / 2 &&
+ this.velocity.x < 0
+ ) {
+ this.control.moveForward(this.velocity.x * delta)
+ } else if (
+ this.backCollide &&
+ direction > -Math.PI &&
+ direction < -Math.PI / 2 &&
+ this.velocity.x < 0
+ ) {
+ this.control.moveForward(this.velocity.x * delta)
+ }
+
+ // camera left
+ if (direction > 0 && direction < Math.PI && this.velocity.z < 0) {
+ if (
+ (!this.backCollide && direction > Math.PI / 2) ||
+ (!this.frontCollide && direction < Math.PI / 2)
+ ) {
+ this.moveX(Math.PI / 2 - direction, delta)
+ }
+ } else if (
+ !this.frontCollide &&
+ !this.backCollide &&
+ this.velocity.z < 0
+ ) {
+ this.control.moveRight(this.velocity.z * delta)
+ } else if (
+ this.frontCollide &&
+ direction > -Math.PI &&
+ direction < -Math.PI / 2 &&
+ this.velocity.z < 0
+ ) {
+ this.control.moveRight(this.velocity.z * delta)
+ } else if (
+ this.backCollide &&
+ direction > -Math.PI / 2 &&
+ direction < 0 &&
+ this.velocity.z < 0
+ ) {
+ this.control.moveRight(this.velocity.z * delta)
+ }
+
+ // camera right
+ if (direction < 0 && direction > -Math.PI && this.velocity.z > 0) {
+ if (
+ (!this.backCollide && direction > -Math.PI / 2) ||
+ (!this.frontCollide && direction < -Math.PI / 2)
+ ) {
+ this.moveX(-Math.PI / 2 - direction, delta)
+ }
+ } else if (
+ !this.frontCollide &&
+ !this.backCollide &&
+ this.velocity.z > 0
+ ) {
+ this.control.moveRight(this.velocity.z * delta)
+ } else if (
+ this.frontCollide &&
+ direction < Math.PI / 2 &&
+ direction > 0 &&
+ this.velocity.z > 0
+ ) {
+ this.control.moveRight(this.velocity.z * delta)
+ } else if (
+ this.backCollide &&
+ direction < Math.PI &&
+ direction > Math.PI / 2 &&
+ this.velocity.z > 0
+ ) {
+ this.control.moveRight(this.velocity.z * delta)
+ }
+ }
+
+ // collide right (positive z)
+ if (this.rightCollide) {
+ // camera front
+ if (
+ direction < Math.PI / 2 &&
+ direction > -Math.PI / 2 &&
+ this.velocity.x > 0
+ ) {
+ if (
+ (!this.backCollide && direction < 0) ||
+ (!this.frontCollide && direction > 0)
+ ) {
+ this.moveX(direction, delta)
+ }
+ } else if (
+ !this.frontCollide &&
+ !this.backCollide &&
+ this.velocity.x > 0
+ ) {
+ this.control.moveForward(this.velocity.x * delta)
+ } else if (
+ this.frontCollide &&
+ direction < -Math.PI / 2 &&
+ direction > -Math.PI &&
+ this.velocity.x > 0
+ ) {
+ this.control.moveForward(this.velocity.x * delta)
+ } else if (
+ this.backCollide &&
+ direction < Math.PI &&
+ direction > Math.PI / 2 &&
+ this.velocity.x > 0
+ ) {
+ this.control.moveForward(this.velocity.x * delta)
+ }
+
+ // camera back
+ if (
+ (direction < -Math.PI / 2 || direction > Math.PI / 2) &&
+ this.velocity.x < 0
+ ) {
+ if (!this.backCollide && direction > 0) {
+ this.moveX(-Math.PI + direction, delta)
+ }
+ if (!this.frontCollide && direction < 0) {
+ this.moveX(Math.PI + direction, delta)
+ }
+ } else if (
+ !this.frontCollide &&
+ !this.backCollide &&
+ this.velocity.x < 0
+ ) {
+ this.control.moveForward(this.velocity.x * delta)
+ } else if (
+ this.frontCollide &&
+ direction < Math.PI / 2 &&
+ direction > 0 &&
+ this.velocity.x < 0
+ ) {
+ this.control.moveForward(this.velocity.x * delta)
+ } else if (
+ this.backCollide &&
+ direction < 0 &&
+ direction > -Math.PI / 2 &&
+ this.velocity.x < 0
+ ) {
+ this.control.moveForward(this.velocity.x * delta)
+ }
+
+ // camera left
+ if (direction < 0 && direction > -Math.PI && this.velocity.z < 0) {
+ if (
+ (!this.frontCollide && direction > -Math.PI / 2) ||
+ (!this.backCollide && direction < -Math.PI / 2)
+ ) {
+ this.moveX(Math.PI / 2 + direction, delta)
+ }
+ } else if (
+ !this.frontCollide &&
+ !this.backCollide &&
+ this.velocity.z < 0
+ ) {
+ this.control.moveRight(this.velocity.z * delta)
+ } else if (
+ this.frontCollide &&
+ direction > Math.PI / 2 &&
+ direction < Math.PI &&
+ this.velocity.z < 0
+ ) {
+ this.control.moveRight(this.velocity.z * delta)
+ } else if (
+ this.backCollide &&
+ direction > 0 &&
+ direction < Math.PI / 2 &&
+ this.velocity.z < 0
+ ) {
+ this.control.moveRight(this.velocity.z * delta)
+ }
+
+ // camera right
+ if (direction > 0 && direction < Math.PI && this.velocity.z > 0) {
+ if (
+ (!this.frontCollide && direction > Math.PI / 2) ||
+ (!this.backCollide && direction < Math.PI / 2)
+ ) {
+ this.moveX(direction - Math.PI / 2, delta)
+ }
+ } else if (
+ !this.frontCollide &&
+ !this.backCollide &&
+ this.velocity.z > 0
+ ) {
+ this.control.moveRight(this.velocity.z * delta)
+ } else if (
+ this.frontCollide &&
+ direction > -Math.PI / 2 &&
+ direction < 0 &&
+ this.velocity.z > 0
+ ) {
+ this.control.moveRight(this.velocity.z * delta)
+ } else if (
+ this.backCollide &&
+ direction > -Math.PI &&
+ direction < -Math.PI / 2 &&
+ this.velocity.z > 0
+ ) {
+ this.control.moveRight(this.velocity.z * delta)
+ }
+ }
+ } else {
+ // no collide
+ this.control.moveForward(this.velocity.x * delta)
+ this.control.moveRight(this.velocity.z * delta)
+ }
+
+ this.camera.position.y += this.velocity.y * delta
+
+ // catching net
+ if (this.camera.position.y < -100) {
+ this.camera.position.y = 60
+ }
+ }
+ this.p2 = this.p1
+ }
+}
diff --git a/src/control/worker/downCollide.ts b/src/control/worker/downCollide.ts
new file mode 100644
index 0000000000000000000000000000000000000000..895e23ed11e6ddbcf30d4e15786f70eb7ed29dad
--- /dev/null
+++ b/src/control/worker/downCollide.ts
@@ -0,0 +1,74 @@
+//legacy
+
+import * as THREE from 'three'
+import Block from '../../terrain/mesh/block'
+import { ImprovedNoise } from 'three/examples/jsm/math/ImprovedNoise'
+
+const noise = new ImprovedNoise()
+const raycaster = new THREE.Raycaster(
+ new THREE.Vector3(),
+ new THREE.Vector3(0, -1, 0),
+ 0,
+ 1.8
+)
+
+onmessage = (
+ msg: MessageEvent<{
+ position: THREE.Vector3
+ far: number
+ blocks: Block[]
+ seed: number
+ noiseGap: number
+ noiseAmp: number
+ }>
+) => {
+ raycaster.ray.origin = new THREE.Vector3(
+ msg.data.position.x,
+ msg.data.position.y,
+ msg.data.position.z
+ )
+ raycaster.far = msg.data.far
+
+ let index = 0
+ const mesh = new THREE.InstancedMesh(
+ new THREE.BoxGeometry(1, 1, 1),
+ new THREE.MeshBasicMaterial(),
+ 100
+ )
+ const matrix = new THREE.Matrix4()
+
+ let x = Math.round(msg.data.position.x)
+ let z = Math.round(msg.data.position.z)
+ let y =
+ Math.floor(
+ noise.noise(x / msg.data.noiseGap, z / msg.data.noiseGap, msg.data.seed) *
+ msg.data.noiseAmp
+ ) + 30
+ let removed = false
+
+ for (const block of msg.data.blocks) {
+ if (
+ block.x === Math.round(msg.data.position.x) &&
+ block.z === Math.round(msg.data.position.z)
+ ) {
+ if (block.placed) {
+ matrix.setPosition(new THREE.Vector3(block.x, block.y, block.z))
+ mesh.setMatrixAt(index++, matrix)
+ } else if (block.y === y) {
+ removed = true
+ }
+ }
+ }
+
+ if (!removed) {
+ matrix.setPosition(new THREE.Vector3(x, y, z))
+ mesh.setMatrixAt(index++, matrix)
+ }
+
+ mesh.instanceMatrix.needsUpdate = true
+ if (raycaster.intersectObject(mesh).length) {
+ postMessage(true)
+ } else {
+ postMessage(false)
+ }
+}
diff --git a/src/control/worker/sideCollide.ts b/src/control/worker/sideCollide.ts
new file mode 100644
index 0000000000000000000000000000000000000000..636a874d6d2f3afdf5ef2c48ae478149e9956d6b
--- /dev/null
+++ b/src/control/worker/sideCollide.ts
@@ -0,0 +1,39 @@
+//legacy
+
+import * as THREE from 'three'
+
+onmessage = (
+ msg: MessageEvent<{
+ count: number
+ matrices: THREE.InstancedBufferAttribute[]
+ position: THREE.Vector3
+ }>
+) => {
+ let meshes = []
+
+ let raycaster = new THREE.Raycaster(
+ new THREE.Vector3(
+ msg.data.position.x,
+ msg.data.position.y - 1,
+ msg.data.position.z
+ ),
+ new THREE.Vector3(1, 0, 0),
+ 0,
+ 0.6
+ )
+
+ for (let matrix of msg.data.matrices) {
+ let mesh = new THREE.InstancedMesh(
+ new THREE.BoxGeometry(1, 1, 1),
+ new THREE.MeshBasicMaterial(),
+ msg.data.count
+ )
+ mesh.instanceMatrix = matrix
+ meshes.push(mesh)
+ }
+ if (raycaster.intersectObjects(meshes).length) {
+ postMessage(true)
+ } else {
+ postMessage(false)
+ }
+}
diff --git a/src/core/index.ts b/src/core/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..33a0508fdca4fa3638f31354f931418d1994aa1f
--- /dev/null
+++ b/src/core/index.ts
@@ -0,0 +1,60 @@
+import * as THREE from 'three'
+
+export default class Core {
+ constructor() {
+ this.camera = new THREE.PerspectiveCamera()
+ this.renderer = new THREE.WebGLRenderer()
+ this.scene = new THREE.Scene()
+ this.initScene()
+ this.initRenderer()
+ this.initCamera()
+ }
+
+ camera: THREE.PerspectiveCamera
+ scene: THREE.Scene
+ renderer: THREE.Renderer
+
+ initCamera = () => {
+ this.camera.fov = 50
+ this.camera.aspect = window.innerWidth / window.innerHeight
+ this.camera.near = 0.01
+ this.camera.far = 500
+ this.camera.updateProjectionMatrix()
+ this.camera.position.set(8, 50, 8)
+
+ this.camera.lookAt(100, 30, 100)
+
+ window.addEventListener('resize', () => {
+ this.camera.aspect = window.innerWidth / window.innerHeight
+ this.camera.updateProjectionMatrix()
+ })
+ }
+
+ initScene = () => {
+ this.scene = new THREE.Scene()
+ const backgroundColor = 0x87ceeb
+
+ this.scene.fog = new THREE.Fog(backgroundColor, 1, 96)
+ this.scene.background = new THREE.Color(backgroundColor)
+
+ const sunLight = new THREE.PointLight(0xffffff, 0.5)
+ sunLight.position.set(500, 500, 500)
+ this.scene.add(sunLight)
+
+ const sunLight2 = new THREE.PointLight(0xffffff, 0.2)
+ sunLight2.position.set(-500, 500, -500)
+ this.scene.add(sunLight2)
+
+ const reflectionLight = new THREE.AmbientLight(0x404040)
+ this.scene.add(reflectionLight)
+ }
+
+ initRenderer = () => {
+ this.renderer.setSize(window.innerWidth, window.innerHeight)
+ document.body.appendChild(this.renderer.domElement)
+
+ window.addEventListener('resize', () => {
+ this.renderer.setSize(window.innerWidth, window.innerHeight)
+ })
+ }
+}
diff --git a/src/main.ts b/src/main.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e84212863493faf3feb5e0c4ffbea7a2f39eee14
--- /dev/null
+++ b/src/main.ts
@@ -0,0 +1,34 @@
+import Core from './core'
+import Control from './control'
+import Player from './player'
+import Terrain from './terrain'
+import UI from './ui'
+import Audio from './audio'
+
+import './style.css'
+
+const core = new Core()
+const camera = core.camera
+const scene = core.scene
+const renderer = core.renderer
+
+const player = new Player()
+const audio = new Audio(camera)
+
+const terrain = new Terrain(scene, camera)
+const control = new Control(scene, camera, player, terrain, audio)
+
+const ui = new UI(terrain, control)
+
+// animation
+;(function animate() {
+ // let p1 = performance.now()
+ requestAnimationFrame(animate)
+
+ control.update()
+ terrain.update()
+ ui.update()
+
+ renderer.render(scene, camera)
+ // console.log(performance.now()-p1)
+})()
diff --git a/src/player/index.ts b/src/player/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..769346f93cb72fb4fe07eb76d4f55f4ff0e1d855
--- /dev/null
+++ b/src/player/index.ts
@@ -0,0 +1,34 @@
+export enum Mode {
+ walking = 'walking',
+ sprinting = 'sprinting',
+ flying = 'flying',
+ sprintFlying = 'sprintFlying',
+ sneaking = 'sneaking'
+}
+
+export enum Speed {
+ // walking = 4.317,
+ walking = 5.612,
+ sprinting = 5.612,
+ // flying = 10.89,
+ flying = 21.78,
+ sprintFlying = 21.78,
+ sneaking = 1.95
+}
+export default class Player {
+ mode = Mode.walking
+ speed = Speed[this.mode]
+
+ setMode(Mode: Mode) {
+ this.mode = Mode
+ this.speed = Speed[this.mode]
+ }
+ falling = 38.4
+
+ jump = 1.2522
+
+ body = {
+ height: 1.8,
+ width: 0.5
+ }
+}
diff --git a/src/static/block-icon/diamond.png b/src/static/block-icon/diamond.png
new file mode 100644
index 0000000000000000000000000000000000000000..302f2fbbc92519918b094a1591c3d35d8e23a664
Binary files /dev/null and b/src/static/block-icon/diamond.png differ
diff --git a/src/static/block-icon/glass.png b/src/static/block-icon/glass.png
new file mode 100644
index 0000000000000000000000000000000000000000..458d306bfeb4b2a47b45b3a2aaa7a1a1f655f853
Binary files /dev/null and b/src/static/block-icon/glass.png differ
diff --git a/src/static/block-icon/grass.png b/src/static/block-icon/grass.png
new file mode 100644
index 0000000000000000000000000000000000000000..e80fc85dba008956d92601c86cf898207f24e5db
Binary files /dev/null and b/src/static/block-icon/grass.png differ
diff --git a/src/static/block-icon/quartz.png b/src/static/block-icon/quartz.png
new file mode 100644
index 0000000000000000000000000000000000000000..d807c6428b6a4e124336f87d4e4e9c85c65638d4
Binary files /dev/null and b/src/static/block-icon/quartz.png differ
diff --git a/src/static/block-icon/stone.png b/src/static/block-icon/stone.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a7400317653704fcc0443c7f0a4ca9b4f0eab9b
Binary files /dev/null and b/src/static/block-icon/stone.png differ
diff --git a/src/static/block-icon/tree.png b/src/static/block-icon/tree.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba0534fb2f0527dee27307267b863a8b421bab18
Binary files /dev/null and b/src/static/block-icon/tree.png differ
diff --git a/src/static/block-icon/wood.png b/src/static/block-icon/wood.png
new file mode 100644
index 0000000000000000000000000000000000000000..96862b2614a48395c26133c16156206f18da7fc4
Binary files /dev/null and b/src/static/block-icon/wood.png differ
diff --git a/src/static/github.svg b/src/static/github.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5a3abf8b070b8c786a109a5a67b7addaab77d312
--- /dev/null
+++ b/src/static/github.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/static/mc-font-zh.ttf b/src/static/mc-font-zh.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..bc4153722df1c14cca6b620bb7eb132b54b0db8d
Binary files /dev/null and b/src/static/mc-font-zh.ttf differ
diff --git a/src/static/mc-font.otf b/src/static/mc-font.otf
new file mode 100644
index 0000000000000000000000000000000000000000..54f08ad42ae2c7e9eb4d46c7b621544e32cfc9a2
Binary files /dev/null and b/src/static/mc-font.otf differ
diff --git a/src/static/mc.ico b/src/static/mc.ico
new file mode 100644
index 0000000000000000000000000000000000000000..ecc93ff12b32772e61b54ddd3be456cea8d47442
Binary files /dev/null and b/src/static/mc.ico differ
diff --git a/src/static/menu.jpeg b/src/static/menu.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..933fe734bb45a8160e67ae04c78a536b96f4ae31
Binary files /dev/null and b/src/static/menu.jpeg differ
diff --git a/src/static/textures/block/acacia_door_bottom.png b/src/static/textures/block/acacia_door_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..53979a2efde3d9dbe4d01a19756b474e802b26f3
Binary files /dev/null and b/src/static/textures/block/acacia_door_bottom.png differ
diff --git a/src/static/textures/block/acacia_door_top.png b/src/static/textures/block/acacia_door_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b634d6f905da2b8a3c0cb23794c436529afcfd7
Binary files /dev/null and b/src/static/textures/block/acacia_door_top.png differ
diff --git a/src/static/textures/block/acacia_leaves.png b/src/static/textures/block/acacia_leaves.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5c90f2f274d01f6aea698e60b88292e4e911b7a
Binary files /dev/null and b/src/static/textures/block/acacia_leaves.png differ
diff --git a/src/static/textures/block/acacia_log.png b/src/static/textures/block/acacia_log.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c58949b5c5dd765e38f212e04a306b056bf250e
Binary files /dev/null and b/src/static/textures/block/acacia_log.png differ
diff --git a/src/static/textures/block/acacia_log_top.png b/src/static/textures/block/acacia_log_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..4e5c675a5ba9a68b269b8d5f0c236d8ef742374f
Binary files /dev/null and b/src/static/textures/block/acacia_log_top.png differ
diff --git a/src/static/textures/block/acacia_planks.png b/src/static/textures/block/acacia_planks.png
new file mode 100644
index 0000000000000000000000000000000000000000..c24d4c1b816269d87381e560ab4a5bb71de07d9b
Binary files /dev/null and b/src/static/textures/block/acacia_planks.png differ
diff --git a/src/static/textures/block/acacia_sapling.png b/src/static/textures/block/acacia_sapling.png
new file mode 100644
index 0000000000000000000000000000000000000000..6817397cb4f451cbd06656c1a97b45b050fd32dd
Binary files /dev/null and b/src/static/textures/block/acacia_sapling.png differ
diff --git a/src/static/textures/block/activator_rail.png b/src/static/textures/block/activator_rail.png
new file mode 100644
index 0000000000000000000000000000000000000000..721f3f5f03408103dd06ba79eb4af7680adb9f2e
Binary files /dev/null and b/src/static/textures/block/activator_rail.png differ
diff --git a/src/static/textures/block/activator_rail_on.png b/src/static/textures/block/activator_rail_on.png
new file mode 100644
index 0000000000000000000000000000000000000000..59844b0c2ab870ff82b049c1054d0f97839a79a0
Binary files /dev/null and b/src/static/textures/block/activator_rail_on.png differ
diff --git a/src/static/textures/block/allium.png b/src/static/textures/block/allium.png
new file mode 100644
index 0000000000000000000000000000000000000000..118d8fd2839c10ba5b58cbe38a6c4e268bd2cd95
Binary files /dev/null and b/src/static/textures/block/allium.png differ
diff --git a/src/static/textures/block/andesite.png b/src/static/textures/block/andesite.png
new file mode 100644
index 0000000000000000000000000000000000000000..830e2a81effb2f4e0f1395130e3417838a0bd76c
Binary files /dev/null and b/src/static/textures/block/andesite.png differ
diff --git a/src/static/textures/block/anvil.png b/src/static/textures/block/anvil.png
new file mode 100644
index 0000000000000000000000000000000000000000..732038ec7781db0cafd1d1e64b4e0c44905eac34
Binary files /dev/null and b/src/static/textures/block/anvil.png differ
diff --git a/src/static/textures/block/anvil_top.png b/src/static/textures/block/anvil_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..f1f6bf71355058641506fee1d3466b9237dd9109
Binary files /dev/null and b/src/static/textures/block/anvil_top.png differ
diff --git a/src/static/textures/block/attached_melon_stem.png b/src/static/textures/block/attached_melon_stem.png
new file mode 100644
index 0000000000000000000000000000000000000000..62ad943a8c3012bee3a33130f2564794d4fa3872
Binary files /dev/null and b/src/static/textures/block/attached_melon_stem.png differ
diff --git a/src/static/textures/block/azure_bluet.png b/src/static/textures/block/azure_bluet.png
new file mode 100644
index 0000000000000000000000000000000000000000..40a346dbe38975ff6252eda28c77a61a5b8911d3
Binary files /dev/null and b/src/static/textures/block/azure_bluet.png differ
diff --git a/src/static/textures/block/beacon.png b/src/static/textures/block/beacon.png
new file mode 100644
index 0000000000000000000000000000000000000000..11468850245e0a1226c9aca1358c06c7d1e70206
Binary files /dev/null and b/src/static/textures/block/beacon.png differ
diff --git a/src/static/textures/block/bedrock.png b/src/static/textures/block/bedrock.png
new file mode 100644
index 0000000000000000000000000000000000000000..3192fc763524cdd7daa2df0b4eb6ce37a1723628
Binary files /dev/null and b/src/static/textures/block/bedrock.png differ
diff --git a/src/static/textures/block/beetroots_stage0.png b/src/static/textures/block/beetroots_stage0.png
new file mode 100644
index 0000000000000000000000000000000000000000..af583d8b991491930020c209fd251f00083c19e2
Binary files /dev/null and b/src/static/textures/block/beetroots_stage0.png differ
diff --git a/src/static/textures/block/beetroots_stage1.png b/src/static/textures/block/beetroots_stage1.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c09ec667bba8c015b31bbd47643e38a7c3631af
Binary files /dev/null and b/src/static/textures/block/beetroots_stage1.png differ
diff --git a/src/static/textures/block/beetroots_stage2.png b/src/static/textures/block/beetroots_stage2.png
new file mode 100644
index 0000000000000000000000000000000000000000..426b2af6f0658314c0e315d3e4227908a3ebdd81
Binary files /dev/null and b/src/static/textures/block/beetroots_stage2.png differ
diff --git a/src/static/textures/block/beetroots_stage3.png b/src/static/textures/block/beetroots_stage3.png
new file mode 100644
index 0000000000000000000000000000000000000000..125dabb356821fd6d6948c3cb0a1a99c0cbde56c
Binary files /dev/null and b/src/static/textures/block/beetroots_stage3.png differ
diff --git a/src/static/textures/block/birch_door_bottom.png b/src/static/textures/block/birch_door_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..b29d01ad68e1b79d8fe3c606a6cefda3a12a4969
Binary files /dev/null and b/src/static/textures/block/birch_door_bottom.png differ
diff --git a/src/static/textures/block/birch_door_top.png b/src/static/textures/block/birch_door_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e0e6afdee583dab0877df8d729f57c78936c0ab
Binary files /dev/null and b/src/static/textures/block/birch_door_top.png differ
diff --git a/src/static/textures/block/birch_leaves.png b/src/static/textures/block/birch_leaves.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce7b162798b14d492e9e25ca937c5a92967bf646
Binary files /dev/null and b/src/static/textures/block/birch_leaves.png differ
diff --git a/src/static/textures/block/birch_log.png b/src/static/textures/block/birch_log.png
new file mode 100644
index 0000000000000000000000000000000000000000..6496565213e482e5a000f564bc35079794cca02b
Binary files /dev/null and b/src/static/textures/block/birch_log.png differ
diff --git a/src/static/textures/block/birch_log_top.png b/src/static/textures/block/birch_log_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..174b337c88c23e9cb71ba35251f67cc104cdfe34
Binary files /dev/null and b/src/static/textures/block/birch_log_top.png differ
diff --git a/src/static/textures/block/birch_planks.png b/src/static/textures/block/birch_planks.png
new file mode 100644
index 0000000000000000000000000000000000000000..8c75067da21c459c538c8753ee0941166b761c26
Binary files /dev/null and b/src/static/textures/block/birch_planks.png differ
diff --git a/src/static/textures/block/birch_sapling.png b/src/static/textures/block/birch_sapling.png
new file mode 100644
index 0000000000000000000000000000000000000000..d33b34ca8371f2c9a14c8aba4ef4384f0eda7afb
Binary files /dev/null and b/src/static/textures/block/birch_sapling.png differ
diff --git a/src/static/textures/block/blue_orchid.png b/src/static/textures/block/blue_orchid.png
new file mode 100644
index 0000000000000000000000000000000000000000..5889e1b94c0a2fc2b5eaceb67204e61841f45a5f
Binary files /dev/null and b/src/static/textures/block/blue_orchid.png differ
diff --git a/src/static/textures/block/bone_block_side.png b/src/static/textures/block/bone_block_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f1a1618e3b96634dd8df319c1c895d7d37de791
Binary files /dev/null and b/src/static/textures/block/bone_block_side.png differ
diff --git a/src/static/textures/block/bone_block_top.png b/src/static/textures/block/bone_block_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..72e642ef11586639ea3dc35872bf463cdb54f1f4
Binary files /dev/null and b/src/static/textures/block/bone_block_top.png differ
diff --git a/src/static/textures/block/bookshelf.png b/src/static/textures/block/bookshelf.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a2c24d40d0d9db813ee0bfb52ecc1d13a867923
Binary files /dev/null and b/src/static/textures/block/bookshelf.png differ
diff --git a/src/static/textures/block/brewing_stand.png b/src/static/textures/block/brewing_stand.png
new file mode 100644
index 0000000000000000000000000000000000000000..af2333fb5dff6cfe869a3af6dea6940819197cef
Binary files /dev/null and b/src/static/textures/block/brewing_stand.png differ
diff --git a/src/static/textures/block/brewing_stand_base.png b/src/static/textures/block/brewing_stand_base.png
new file mode 100644
index 0000000000000000000000000000000000000000..6c7369d377777a3c8928d14a8fee4296b4ddef95
Binary files /dev/null and b/src/static/textures/block/brewing_stand_base.png differ
diff --git a/src/static/textures/block/bricks.png b/src/static/textures/block/bricks.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ed16c413320d2e2d854316dc4226065c10f200b
Binary files /dev/null and b/src/static/textures/block/bricks.png differ
diff --git a/src/static/textures/block/brown_mushroom.png b/src/static/textures/block/brown_mushroom.png
new file mode 100644
index 0000000000000000000000000000000000000000..57b94d500a0ef536e62c076b80093a4dd6c0a0ed
Binary files /dev/null and b/src/static/textures/block/brown_mushroom.png differ
diff --git a/src/static/textures/block/brown_mushroom_block.png b/src/static/textures/block/brown_mushroom_block.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab3b4c8bccdbae4c24d6a10f2585068958f2915a
Binary files /dev/null and b/src/static/textures/block/brown_mushroom_block.png differ
diff --git a/src/static/textures/block/cactus_bottom.png b/src/static/textures/block/cactus_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..c613b88632625014544775e1e9bd44f172587f12
Binary files /dev/null and b/src/static/textures/block/cactus_bottom.png differ
diff --git a/src/static/textures/block/cactus_side.png b/src/static/textures/block/cactus_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..69d689d75a0aaec30020d0dbd5e7130a8b50a662
Binary files /dev/null and b/src/static/textures/block/cactus_side.png differ
diff --git a/src/static/textures/block/cactus_top.png b/src/static/textures/block/cactus_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6905a5255bd685516a4fa3c6dd6fd6ece84b44d
Binary files /dev/null and b/src/static/textures/block/cactus_top.png differ
diff --git a/src/static/textures/block/cake_bottom.png b/src/static/textures/block/cake_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..86b49993bc6a0682c471788e4d3f2442cb77e429
Binary files /dev/null and b/src/static/textures/block/cake_bottom.png differ
diff --git a/src/static/textures/block/cake_inner.png b/src/static/textures/block/cake_inner.png
new file mode 100644
index 0000000000000000000000000000000000000000..77234d56c163dedfdf085d80e6b0002ac39cad32
Binary files /dev/null and b/src/static/textures/block/cake_inner.png differ
diff --git a/src/static/textures/block/cake_side.png b/src/static/textures/block/cake_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3014b79cb19dd4cf330e2f97b046f80a8591bae
Binary files /dev/null and b/src/static/textures/block/cake_side.png differ
diff --git a/src/static/textures/block/cake_top.png b/src/static/textures/block/cake_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..4eb484ec0e968f19a541df20adc11881308816e5
Binary files /dev/null and b/src/static/textures/block/cake_top.png differ
diff --git a/src/static/textures/block/carrots_stage0.png b/src/static/textures/block/carrots_stage0.png
new file mode 100644
index 0000000000000000000000000000000000000000..b329b581573d67ce446e8e82cecb43981ae1375b
Binary files /dev/null and b/src/static/textures/block/carrots_stage0.png differ
diff --git a/src/static/textures/block/carrots_stage1.png b/src/static/textures/block/carrots_stage1.png
new file mode 100644
index 0000000000000000000000000000000000000000..e211d6d6d39d2351ea67964717ff4c0eceb6e0da
Binary files /dev/null and b/src/static/textures/block/carrots_stage1.png differ
diff --git a/src/static/textures/block/carrots_stage2.png b/src/static/textures/block/carrots_stage2.png
new file mode 100644
index 0000000000000000000000000000000000000000..f8f8959f9ade2e40ef76eaa38eb4f40ebdce8f12
Binary files /dev/null and b/src/static/textures/block/carrots_stage2.png differ
diff --git a/src/static/textures/block/carrots_stage3.png b/src/static/textures/block/carrots_stage3.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7b6a8886b93b860bee7a3ac6cfcb8618babd877
Binary files /dev/null and b/src/static/textures/block/carrots_stage3.png differ
diff --git a/src/static/textures/block/carved_pumpkin.png b/src/static/textures/block/carved_pumpkin.png
new file mode 100644
index 0000000000000000000000000000000000000000..944a32268f4a0954016615460a16849301eb15c5
Binary files /dev/null and b/src/static/textures/block/carved_pumpkin.png differ
diff --git a/src/static/textures/block/cauldron_bottom.png b/src/static/textures/block/cauldron_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c8591a20ff8f6554abbe9baee8f1348230e9eb9
Binary files /dev/null and b/src/static/textures/block/cauldron_bottom.png differ
diff --git a/src/static/textures/block/cauldron_inner.png b/src/static/textures/block/cauldron_inner.png
new file mode 100644
index 0000000000000000000000000000000000000000..17fcf4faa6467591c5ab355fcfc390f3dc6586e8
Binary files /dev/null and b/src/static/textures/block/cauldron_inner.png differ
diff --git a/src/static/textures/block/cauldron_side.png b/src/static/textures/block/cauldron_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..3bf024ea17bc1c528a4a86a7d5fd504e8da17fd3
Binary files /dev/null and b/src/static/textures/block/cauldron_side.png differ
diff --git a/src/static/textures/block/cauldron_top.png b/src/static/textures/block/cauldron_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd672b39ed40f16dff5fdf421b49d9c5315e1bd3
Binary files /dev/null and b/src/static/textures/block/cauldron_top.png differ
diff --git a/src/static/textures/block/chain_command_block_back.png b/src/static/textures/block/chain_command_block_back.png
new file mode 100644
index 0000000000000000000000000000000000000000..d50623b6365020958a88035b513434ee6b197a92
Binary files /dev/null and b/src/static/textures/block/chain_command_block_back.png differ
diff --git a/src/static/textures/block/chain_command_block_back.png.mcmeta b/src/static/textures/block/chain_command_block_back.png.mcmeta
new file mode 100644
index 0000000000000000000000000000000000000000..4894b537c138a0cd21e4d64f93ce7ce5206d629a
--- /dev/null
+++ b/src/static/textures/block/chain_command_block_back.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "interpolate": true,
+ "frametime": 10
+ }
+}
diff --git a/src/static/textures/block/chain_command_block_conditional.png b/src/static/textures/block/chain_command_block_conditional.png
new file mode 100644
index 0000000000000000000000000000000000000000..6cb6ccc278921b5b06f23b3df945df519bdd22be
Binary files /dev/null and b/src/static/textures/block/chain_command_block_conditional.png differ
diff --git a/src/static/textures/block/chain_command_block_conditional.png.mcmeta b/src/static/textures/block/chain_command_block_conditional.png.mcmeta
new file mode 100644
index 0000000000000000000000000000000000000000..4894b537c138a0cd21e4d64f93ce7ce5206d629a
--- /dev/null
+++ b/src/static/textures/block/chain_command_block_conditional.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "interpolate": true,
+ "frametime": 10
+ }
+}
diff --git a/src/static/textures/block/chain_command_block_front.png b/src/static/textures/block/chain_command_block_front.png
new file mode 100644
index 0000000000000000000000000000000000000000..420431d83a82319e0f9d59ce3f597a40cbffef81
Binary files /dev/null and b/src/static/textures/block/chain_command_block_front.png differ
diff --git a/src/static/textures/block/chain_command_block_front.png.mcmeta b/src/static/textures/block/chain_command_block_front.png.mcmeta
new file mode 100644
index 0000000000000000000000000000000000000000..4894b537c138a0cd21e4d64f93ce7ce5206d629a
--- /dev/null
+++ b/src/static/textures/block/chain_command_block_front.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "interpolate": true,
+ "frametime": 10
+ }
+}
diff --git a/src/static/textures/block/chain_command_block_side.png b/src/static/textures/block/chain_command_block_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..31f9ad72a7b7c03e489b674be4f21dd6ae46ff71
Binary files /dev/null and b/src/static/textures/block/chain_command_block_side.png differ
diff --git a/src/static/textures/block/chain_command_block_side.png.mcmeta b/src/static/textures/block/chain_command_block_side.png.mcmeta
new file mode 100644
index 0000000000000000000000000000000000000000..4894b537c138a0cd21e4d64f93ce7ce5206d629a
--- /dev/null
+++ b/src/static/textures/block/chain_command_block_side.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "interpolate": true,
+ "frametime": 10
+ }
+}
diff --git a/src/static/textures/block/chipped_anvil_top.png b/src/static/textures/block/chipped_anvil_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..89d20c69fdbd8b7ef16ec5fd383d8ef524c27f38
Binary files /dev/null and b/src/static/textures/block/chipped_anvil_top.png differ
diff --git a/src/static/textures/block/chiseled_quartz_block.png b/src/static/textures/block/chiseled_quartz_block.png
new file mode 100644
index 0000000000000000000000000000000000000000..13d7686eb1604af64157ffed8d7a594db112aac3
Binary files /dev/null and b/src/static/textures/block/chiseled_quartz_block.png differ
diff --git a/src/static/textures/block/chiseled_quartz_block_top.png b/src/static/textures/block/chiseled_quartz_block_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..35a9ef21a48cd28d1d22668a8696321ec1071691
Binary files /dev/null and b/src/static/textures/block/chiseled_quartz_block_top.png differ
diff --git a/src/static/textures/block/chiseled_red_sandstone.png b/src/static/textures/block/chiseled_red_sandstone.png
new file mode 100644
index 0000000000000000000000000000000000000000..9095e19bfcd46e593a5f2066e5253bb9eb32eb95
Binary files /dev/null and b/src/static/textures/block/chiseled_red_sandstone.png differ
diff --git a/src/static/textures/block/chiseled_sandstone.png b/src/static/textures/block/chiseled_sandstone.png
new file mode 100644
index 0000000000000000000000000000000000000000..fba6f6da564ad1238626eadf517160d883ce0580
Binary files /dev/null and b/src/static/textures/block/chiseled_sandstone.png differ
diff --git a/src/static/textures/block/chiseled_stone_bricks.png b/src/static/textures/block/chiseled_stone_bricks.png
new file mode 100644
index 0000000000000000000000000000000000000000..a565d8a14e356b77b300b6c704d81017e0b1cf2b
Binary files /dev/null and b/src/static/textures/block/chiseled_stone_bricks.png differ
diff --git a/src/static/textures/block/chorus_flower.png b/src/static/textures/block/chorus_flower.png
new file mode 100644
index 0000000000000000000000000000000000000000..d075807262694d2e356362c1697c9de6f1458d99
Binary files /dev/null and b/src/static/textures/block/chorus_flower.png differ
diff --git a/src/static/textures/block/chorus_flower_dead.png b/src/static/textures/block/chorus_flower_dead.png
new file mode 100644
index 0000000000000000000000000000000000000000..21f315521ed84dbadbb0907dfc8c72040cfc6a07
Binary files /dev/null and b/src/static/textures/block/chorus_flower_dead.png differ
diff --git a/src/static/textures/block/chorus_plant.png b/src/static/textures/block/chorus_plant.png
new file mode 100644
index 0000000000000000000000000000000000000000..39924b986be471835f1e6921fe3d9157fd251569
Binary files /dev/null and b/src/static/textures/block/chorus_plant.png differ
diff --git a/src/static/textures/block/clay.png b/src/static/textures/block/clay.png
new file mode 100644
index 0000000000000000000000000000000000000000..54fd57afa2d3c61af3c1b4841ec56a7855caa57f
Binary files /dev/null and b/src/static/textures/block/clay.png differ
diff --git a/src/static/textures/block/coal_block.png b/src/static/textures/block/coal_block.png
new file mode 100644
index 0000000000000000000000000000000000000000..25351c71ed3eec7302d932208af8c9ea0737db42
Binary files /dev/null and b/src/static/textures/block/coal_block.png differ
diff --git a/src/static/textures/block/coal_ore.png b/src/static/textures/block/coal_ore.png
new file mode 100644
index 0000000000000000000000000000000000000000..a62d6c1e84039f5c4d75138fe21b6a006ff8bdd2
Binary files /dev/null and b/src/static/textures/block/coal_ore.png differ
diff --git a/src/static/textures/block/cobblestone.png b/src/static/textures/block/cobblestone.png
new file mode 100644
index 0000000000000000000000000000000000000000..ecf88b23e9a2d99ae126267f24a49b59831e4cc1
Binary files /dev/null and b/src/static/textures/block/cobblestone.png differ
diff --git a/src/static/textures/block/cobweb.png b/src/static/textures/block/cobweb.png
new file mode 100644
index 0000000000000000000000000000000000000000..d31d5b4265863832903333acc03c213c64750d24
Binary files /dev/null and b/src/static/textures/block/cobweb.png differ
diff --git a/src/static/textures/block/cocoa_stage0.png b/src/static/textures/block/cocoa_stage0.png
new file mode 100644
index 0000000000000000000000000000000000000000..4fcaaee753ca1e24b4b04f0a2a53cac3002010cb
Binary files /dev/null and b/src/static/textures/block/cocoa_stage0.png differ
diff --git a/src/static/textures/block/cocoa_stage1.png b/src/static/textures/block/cocoa_stage1.png
new file mode 100644
index 0000000000000000000000000000000000000000..9bc8e5dd28f17988345b1a1b9b37dc8aa5fb23ec
Binary files /dev/null and b/src/static/textures/block/cocoa_stage1.png differ
diff --git a/src/static/textures/block/cocoa_stage2.png b/src/static/textures/block/cocoa_stage2.png
new file mode 100644
index 0000000000000000000000000000000000000000..901ca3244b7815bd8229e70f9c3caff1e9c1d0af
Binary files /dev/null and b/src/static/textures/block/cocoa_stage2.png differ
diff --git a/src/static/textures/block/command_block_back.png b/src/static/textures/block/command_block_back.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3e9676833de3a3019fd6a6ffd70e4e586c6ab0b
Binary files /dev/null and b/src/static/textures/block/command_block_back.png differ
diff --git a/src/static/textures/block/command_block_back.png.mcmeta b/src/static/textures/block/command_block_back.png.mcmeta
new file mode 100644
index 0000000000000000000000000000000000000000..4894b537c138a0cd21e4d64f93ce7ce5206d629a
--- /dev/null
+++ b/src/static/textures/block/command_block_back.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "interpolate": true,
+ "frametime": 10
+ }
+}
diff --git a/src/static/textures/block/command_block_conditional.png b/src/static/textures/block/command_block_conditional.png
new file mode 100644
index 0000000000000000000000000000000000000000..861d11c5d277efd330af074ce782bdf55b48750a
Binary files /dev/null and b/src/static/textures/block/command_block_conditional.png differ
diff --git a/src/static/textures/block/command_block_conditional.png.mcmeta b/src/static/textures/block/command_block_conditional.png.mcmeta
new file mode 100644
index 0000000000000000000000000000000000000000..4894b537c138a0cd21e4d64f93ce7ce5206d629a
--- /dev/null
+++ b/src/static/textures/block/command_block_conditional.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "interpolate": true,
+ "frametime": 10
+ }
+}
diff --git a/src/static/textures/block/command_block_front.png b/src/static/textures/block/command_block_front.png
new file mode 100644
index 0000000000000000000000000000000000000000..469eaefbe88244c523e72e9e59ae05581f35c009
Binary files /dev/null and b/src/static/textures/block/command_block_front.png differ
diff --git a/src/static/textures/block/command_block_front.png.mcmeta b/src/static/textures/block/command_block_front.png.mcmeta
new file mode 100644
index 0000000000000000000000000000000000000000..4894b537c138a0cd21e4d64f93ce7ce5206d629a
--- /dev/null
+++ b/src/static/textures/block/command_block_front.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "interpolate": true,
+ "frametime": 10
+ }
+}
diff --git a/src/static/textures/block/command_block_side.png b/src/static/textures/block/command_block_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c998139c67bc3501e6421c30d070f235f58ca0d
Binary files /dev/null and b/src/static/textures/block/command_block_side.png differ
diff --git a/src/static/textures/block/command_block_side.png.mcmeta b/src/static/textures/block/command_block_side.png.mcmeta
new file mode 100644
index 0000000000000000000000000000000000000000..4894b537c138a0cd21e4d64f93ce7ce5206d629a
--- /dev/null
+++ b/src/static/textures/block/command_block_side.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "interpolate": true,
+ "frametime": 10
+ }
+}
diff --git a/src/static/textures/block/comparator.png b/src/static/textures/block/comparator.png
new file mode 100644
index 0000000000000000000000000000000000000000..f47ebf18298733fbedcc402ea4eb7eff654f6ae1
Binary files /dev/null and b/src/static/textures/block/comparator.png differ
diff --git a/src/static/textures/block/comparator_on.png b/src/static/textures/block/comparator_on.png
new file mode 100644
index 0000000000000000000000000000000000000000..85cefb89a0dd3e4f12fc057c4909167701f99392
Binary files /dev/null and b/src/static/textures/block/comparator_on.png differ
diff --git a/src/static/textures/block/cracked_stone_bricks.png b/src/static/textures/block/cracked_stone_bricks.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd8a39cce696d750ea3492f661f064639f3f2536
Binary files /dev/null and b/src/static/textures/block/cracked_stone_bricks.png differ
diff --git a/src/static/textures/block/crafting_table_front.png b/src/static/textures/block/crafting_table_front.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c292d942907b0e5977037d0babe83270be1519d
Binary files /dev/null and b/src/static/textures/block/crafting_table_front.png differ
diff --git a/src/static/textures/block/crafting_table_side.png b/src/static/textures/block/crafting_table_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..e4f402e6681fc318f9e6cae68f149609e9874694
Binary files /dev/null and b/src/static/textures/block/crafting_table_side.png differ
diff --git a/src/static/textures/block/crafting_table_top.png b/src/static/textures/block/crafting_table_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c7dfa1cd6b85db05b815575db0e7393c84cf750
Binary files /dev/null and b/src/static/textures/block/crafting_table_top.png differ
diff --git a/src/static/textures/block/cut_red_sandstone.png b/src/static/textures/block/cut_red_sandstone.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a9a1b72078beea2ea613a2073b18b8d29a862b8
Binary files /dev/null and b/src/static/textures/block/cut_red_sandstone.png differ
diff --git a/src/static/textures/block/cut_sandstone.png b/src/static/textures/block/cut_sandstone.png
new file mode 100644
index 0000000000000000000000000000000000000000..a11f122364a95f34c467b7bd9b0ad0104f7253ae
Binary files /dev/null and b/src/static/textures/block/cut_sandstone.png differ
diff --git a/src/static/textures/block/damaged_anvil_top.png b/src/static/textures/block/damaged_anvil_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..a8060884349fcf71b6a63de3fd39db2520dfa05d
Binary files /dev/null and b/src/static/textures/block/damaged_anvil_top.png differ
diff --git a/src/static/textures/block/dandelion.png b/src/static/textures/block/dandelion.png
new file mode 100644
index 0000000000000000000000000000000000000000..80c5be391a6b0232d55b414562b0f1027209cd5e
Binary files /dev/null and b/src/static/textures/block/dandelion.png differ
diff --git a/src/static/textures/block/dark_oak_door_bottom.png b/src/static/textures/block/dark_oak_door_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..0dc8fa29523981a8351151ff21b27c223d80acbc
Binary files /dev/null and b/src/static/textures/block/dark_oak_door_bottom.png differ
diff --git a/src/static/textures/block/dark_oak_door_top.png b/src/static/textures/block/dark_oak_door_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..9143ff93ef48ab1687e39892dafc65b3c30647da
Binary files /dev/null and b/src/static/textures/block/dark_oak_door_top.png differ
diff --git a/src/static/textures/block/dark_oak_leaves.png b/src/static/textures/block/dark_oak_leaves.png
new file mode 100644
index 0000000000000000000000000000000000000000..292def18745ff5e1c2768c05d421c12e2cf5cccf
Binary files /dev/null and b/src/static/textures/block/dark_oak_leaves.png differ
diff --git a/src/static/textures/block/dark_oak_log.png b/src/static/textures/block/dark_oak_log.png
new file mode 100644
index 0000000000000000000000000000000000000000..8e414b428841c7d9d67808ad15712a6f6c7e224e
Binary files /dev/null and b/src/static/textures/block/dark_oak_log.png differ
diff --git a/src/static/textures/block/dark_oak_log_top.png b/src/static/textures/block/dark_oak_log_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..755b235b44e39546188add94b67ef4dbdcc8cc99
Binary files /dev/null and b/src/static/textures/block/dark_oak_log_top.png differ
diff --git a/src/static/textures/block/dark_oak_planks.png b/src/static/textures/block/dark_oak_planks.png
new file mode 100644
index 0000000000000000000000000000000000000000..05e34d75bbe1c9854683967fbfe8a8126d671e61
Binary files /dev/null and b/src/static/textures/block/dark_oak_planks.png differ
diff --git a/src/static/textures/block/dark_oak_sapling.png b/src/static/textures/block/dark_oak_sapling.png
new file mode 100644
index 0000000000000000000000000000000000000000..0cd95d3ae5dba698ea9c457cf37433a7c10ccbb1
Binary files /dev/null and b/src/static/textures/block/dark_oak_sapling.png differ
diff --git a/src/static/textures/block/dark_prismarine.png b/src/static/textures/block/dark_prismarine.png
new file mode 100644
index 0000000000000000000000000000000000000000..f89d4433cf14a3dffbf3c566d649394c02ab4399
Binary files /dev/null and b/src/static/textures/block/dark_prismarine.png differ
diff --git a/src/static/textures/block/dead_bush.png b/src/static/textures/block/dead_bush.png
new file mode 100644
index 0000000000000000000000000000000000000000..16bb8449c31cb809bdda8b17b6cd04f1634e2aa3
Binary files /dev/null and b/src/static/textures/block/dead_bush.png differ
diff --git a/src/static/textures/block/detector_rail.png b/src/static/textures/block/detector_rail.png
new file mode 100644
index 0000000000000000000000000000000000000000..924fbb3454d497288ec5a64c1ee42a84b42db809
Binary files /dev/null and b/src/static/textures/block/detector_rail.png differ
diff --git a/src/static/textures/block/detector_rail_on.png b/src/static/textures/block/detector_rail_on.png
new file mode 100644
index 0000000000000000000000000000000000000000..b0d9c4794e7a76e1ecbbc2934aca179bc73785d1
Binary files /dev/null and b/src/static/textures/block/detector_rail_on.png differ
diff --git a/src/static/textures/block/diamond_block.png b/src/static/textures/block/diamond_block.png
new file mode 100644
index 0000000000000000000000000000000000000000..2b81f48356c894c609f509546e3e156196e82845
Binary files /dev/null and b/src/static/textures/block/diamond_block.png differ
diff --git a/src/static/textures/block/diamond_ore.png b/src/static/textures/block/diamond_ore.png
new file mode 100644
index 0000000000000000000000000000000000000000..4fb805513155c8172c506cc8875efcacce0fb30f
Binary files /dev/null and b/src/static/textures/block/diamond_ore.png differ
diff --git a/src/static/textures/block/diorite.png b/src/static/textures/block/diorite.png
new file mode 100644
index 0000000000000000000000000000000000000000..a390580503c4b21967a2b0e560401702656f7cb9
Binary files /dev/null and b/src/static/textures/block/diorite.png differ
diff --git a/src/static/textures/block/dirt.png b/src/static/textures/block/dirt.png
new file mode 100644
index 0000000000000000000000000000000000000000..617d353e0d67a14a2952b2a98375eb8a50b97d79
Binary files /dev/null and b/src/static/textures/block/dirt.png differ
diff --git a/src/static/textures/block/dispenser_front.png b/src/static/textures/block/dispenser_front.png
new file mode 100644
index 0000000000000000000000000000000000000000..60de10fc0a881831d501a406a2dde94d77c776b5
Binary files /dev/null and b/src/static/textures/block/dispenser_front.png differ
diff --git a/src/static/textures/block/dispenser_front_vertical.png b/src/static/textures/block/dispenser_front_vertical.png
new file mode 100644
index 0000000000000000000000000000000000000000..4d433d986243f4de503c50f8b8d8c76c9ccd9bd1
Binary files /dev/null and b/src/static/textures/block/dispenser_front_vertical.png differ
diff --git a/src/static/textures/block/dropper_front.png b/src/static/textures/block/dropper_front.png
new file mode 100644
index 0000000000000000000000000000000000000000..8fe70ec49ba7b3d49076f5194d83dbdc2426bfac
Binary files /dev/null and b/src/static/textures/block/dropper_front.png differ
diff --git a/src/static/textures/block/dropper_front_vertical.png b/src/static/textures/block/dropper_front_vertical.png
new file mode 100644
index 0000000000000000000000000000000000000000..325f8da417c5c2543654a21573c34a4cf74346e3
Binary files /dev/null and b/src/static/textures/block/dropper_front_vertical.png differ
diff --git a/src/static/textures/block/emerald_block.png b/src/static/textures/block/emerald_block.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f271687c1ffbfa05755d4f659b2ecd304495326
Binary files /dev/null and b/src/static/textures/block/emerald_block.png differ
diff --git a/src/static/textures/block/emerald_ore.png b/src/static/textures/block/emerald_ore.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a110aa59e345a06657d513ff552a0464c49d013
Binary files /dev/null and b/src/static/textures/block/emerald_ore.png differ
diff --git a/src/static/textures/block/enchanting_table_bottom.png b/src/static/textures/block/enchanting_table_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..65be807496f49a39133709055d315c4d5d4edb76
Binary files /dev/null and b/src/static/textures/block/enchanting_table_bottom.png differ
diff --git a/src/static/textures/block/enchanting_table_side.png b/src/static/textures/block/enchanting_table_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..5930c87d18f3b28d106a851a254ce33e14145f85
Binary files /dev/null and b/src/static/textures/block/enchanting_table_side.png differ
diff --git a/src/static/textures/block/enchanting_table_top.png b/src/static/textures/block/enchanting_table_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef5eea5ba337a9a578f30f571aa633f2723d515c
Binary files /dev/null and b/src/static/textures/block/enchanting_table_top.png differ
diff --git a/src/static/textures/block/end_portal_frame_eye.png b/src/static/textures/block/end_portal_frame_eye.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ff33f9bc7f77849529495d7d622ae255a4c8982
Binary files /dev/null and b/src/static/textures/block/end_portal_frame_eye.png differ
diff --git a/src/static/textures/block/end_portal_frame_side.png b/src/static/textures/block/end_portal_frame_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..30140f757fc4411e72838d70b751d4f63e07941b
Binary files /dev/null and b/src/static/textures/block/end_portal_frame_side.png differ
diff --git a/src/static/textures/block/end_portal_frame_top.png b/src/static/textures/block/end_portal_frame_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..ced8cafa19fbd21d058385d3a60bd928dbc5fee4
Binary files /dev/null and b/src/static/textures/block/end_portal_frame_top.png differ
diff --git a/src/static/textures/block/end_rod.png b/src/static/textures/block/end_rod.png
new file mode 100644
index 0000000000000000000000000000000000000000..a710490cc80c25002acff34cd27c4503f8ffbe71
Binary files /dev/null and b/src/static/textures/block/end_rod.png differ
diff --git a/src/static/textures/block/end_stone.png b/src/static/textures/block/end_stone.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf71b3690aefa20ec6a450a3336c506d7a2076e2
Binary files /dev/null and b/src/static/textures/block/end_stone.png differ
diff --git a/src/static/textures/block/end_stone_bricks.png b/src/static/textures/block/end_stone_bricks.png
new file mode 100644
index 0000000000000000000000000000000000000000..afa774b705caf36564b6ccfb1c623f5b732503d9
Binary files /dev/null and b/src/static/textures/block/end_stone_bricks.png differ
diff --git a/src/static/textures/block/farmland.png b/src/static/textures/block/farmland.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a42810dd4efd82e1c523b1ce317954cd96e461e
Binary files /dev/null and b/src/static/textures/block/farmland.png differ
diff --git a/src/static/textures/block/farmland_moist.png b/src/static/textures/block/farmland_moist.png
new file mode 100644
index 0000000000000000000000000000000000000000..24a074b3b022b4f0c2b1408276ee7e1a885bd8df
Binary files /dev/null and b/src/static/textures/block/farmland_moist.png differ
diff --git a/src/static/textures/block/fern.png b/src/static/textures/block/fern.png
new file mode 100644
index 0000000000000000000000000000000000000000..1beec0e019fb0d1b28145aac7ba19359ea0885cd
Binary files /dev/null and b/src/static/textures/block/fern.png differ
diff --git a/src/static/textures/block/flower_pot.png b/src/static/textures/block/flower_pot.png
new file mode 100644
index 0000000000000000000000000000000000000000..7a584f6f3796f36f130ffd6df43b63fe05040a22
Binary files /dev/null and b/src/static/textures/block/flower_pot.png differ
diff --git a/src/static/textures/block/frosted_ice_0.png b/src/static/textures/block/frosted_ice_0.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a9b5c7afb6cc457f1cf2e185e72e34a25c1c935
Binary files /dev/null and b/src/static/textures/block/frosted_ice_0.png differ
diff --git a/src/static/textures/block/frosted_ice_1.png b/src/static/textures/block/frosted_ice_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..e01008be839dbaa5b42c606efb027f0df4478da2
Binary files /dev/null and b/src/static/textures/block/frosted_ice_1.png differ
diff --git a/src/static/textures/block/frosted_ice_2.png b/src/static/textures/block/frosted_ice_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..42aef9549277fa74d15d2f53958d40fdad17ced5
Binary files /dev/null and b/src/static/textures/block/frosted_ice_2.png differ
diff --git a/src/static/textures/block/frosted_ice_3.png b/src/static/textures/block/frosted_ice_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..8676e60b9595be1901d157b25ddf3a2c0cad6bf2
Binary files /dev/null and b/src/static/textures/block/frosted_ice_3.png differ
diff --git a/src/static/textures/block/furnace_front.png b/src/static/textures/block/furnace_front.png
new file mode 100644
index 0000000000000000000000000000000000000000..cbab85d5e79a1fc2e5442d7dcc297c5855871df9
Binary files /dev/null and b/src/static/textures/block/furnace_front.png differ
diff --git a/src/static/textures/block/furnace_front_on.png b/src/static/textures/block/furnace_front_on.png
new file mode 100644
index 0000000000000000000000000000000000000000..e8a1ffb140369acc17721f7cc7d4c553382318e6
Binary files /dev/null and b/src/static/textures/block/furnace_front_on.png differ
diff --git a/src/static/textures/block/furnace_side.png b/src/static/textures/block/furnace_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..69c5a5dbc7188f18b91abc65a37b560fbac6190c
Binary files /dev/null and b/src/static/textures/block/furnace_side.png differ
diff --git a/src/static/textures/block/furnace_top.png b/src/static/textures/block/furnace_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..083e5991b50303121ea41049d817d4bbce30de1c
Binary files /dev/null and b/src/static/textures/block/furnace_top.png differ
diff --git a/src/static/textures/block/glass.png b/src/static/textures/block/glass.png
new file mode 100644
index 0000000000000000000000000000000000000000..285b47f5e362c3b3142f35430ceec65811523e8a
Binary files /dev/null and b/src/static/textures/block/glass.png differ
diff --git a/src/static/textures/block/glass_pane_top.png b/src/static/textures/block/glass_pane_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..02de5877d8fae5bc97f22db353258646380dd0a4
Binary files /dev/null and b/src/static/textures/block/glass_pane_top.png differ
diff --git a/src/static/textures/block/glowstone.png b/src/static/textures/block/glowstone.png
new file mode 100644
index 0000000000000000000000000000000000000000..aa0c6da96e30059837540f79cb12db5c129c35ee
Binary files /dev/null and b/src/static/textures/block/glowstone.png differ
diff --git a/src/static/textures/block/gold_block.png b/src/static/textures/block/gold_block.png
new file mode 100644
index 0000000000000000000000000000000000000000..289618fe2b1df15b2a4f3c4525bac43a2218ba11
Binary files /dev/null and b/src/static/textures/block/gold_block.png differ
diff --git a/src/static/textures/block/gold_ore.png b/src/static/textures/block/gold_ore.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb405116a9e5652d37cfa88d2ca12377c7fcffcf
Binary files /dev/null and b/src/static/textures/block/gold_ore.png differ
diff --git a/src/static/textures/block/granite.png b/src/static/textures/block/granite.png
new file mode 100644
index 0000000000000000000000000000000000000000..390e0b9a6e0ca21769ea8ae033f5d332f2a9c285
Binary files /dev/null and b/src/static/textures/block/granite.png differ
diff --git a/src/static/textures/block/grass.png b/src/static/textures/block/grass.png
new file mode 100644
index 0000000000000000000000000000000000000000..51a9417fa40d8b6cf6bc4cec8637ae9c86028dd0
Binary files /dev/null and b/src/static/textures/block/grass.png differ
diff --git a/src/static/textures/block/grass_block_side.png b/src/static/textures/block/grass_block_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..a4975e53478ee3b1fad636c7cc99a2798a043b16
Binary files /dev/null and b/src/static/textures/block/grass_block_side.png differ
diff --git a/src/static/textures/block/grass_block_side_overlay.png b/src/static/textures/block/grass_block_side_overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc3fa9d727b3b8d66bcedd4a3ff057b89b3b9377
Binary files /dev/null and b/src/static/textures/block/grass_block_side_overlay.png differ
diff --git a/src/static/textures/block/grass_block_snow.png b/src/static/textures/block/grass_block_snow.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b28fc7a03b70454c509aa0c7942d6778cde6593
Binary files /dev/null and b/src/static/textures/block/grass_block_snow.png differ
diff --git a/src/static/textures/block/grass_block_top.png b/src/static/textures/block/grass_block_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..eaa7e458f702c46fe6eb7d58efdd091cca089530
Binary files /dev/null and b/src/static/textures/block/grass_block_top.png differ
diff --git a/src/static/textures/block/grass_path_side.png b/src/static/textures/block/grass_path_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9de13528ed4076faeb0c05c4dcc516c974695d1
Binary files /dev/null and b/src/static/textures/block/grass_path_side.png differ
diff --git a/src/static/textures/block/grass_path_top.png b/src/static/textures/block/grass_path_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..9de12c36f762c4f6029fef2a61e6d18d67febcf8
Binary files /dev/null and b/src/static/textures/block/grass_path_top.png differ
diff --git a/src/static/textures/block/grass_top_green.png b/src/static/textures/block/grass_top_green.png
new file mode 100644
index 0000000000000000000000000000000000000000..5344a0845ceb16d561db009f43601272579b0954
Binary files /dev/null and b/src/static/textures/block/grass_top_green.png differ
diff --git a/src/static/textures/block/gravel.png b/src/static/textures/block/gravel.png
new file mode 100644
index 0000000000000000000000000000000000000000..09bdcef301725101566036ab92689c435cf1b68e
Binary files /dev/null and b/src/static/textures/block/gravel.png differ
diff --git a/src/static/textures/block/hay_block_side.png b/src/static/textures/block/hay_block_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..7b734ebc58d889477085c9ffeb70a41934936a6f
Binary files /dev/null and b/src/static/textures/block/hay_block_side.png differ
diff --git a/src/static/textures/block/hay_block_top.png b/src/static/textures/block/hay_block_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..84ee05ea4188ea5ba3ad4ffc7b2f129fd3ab3a39
Binary files /dev/null and b/src/static/textures/block/hay_block_top.png differ
diff --git a/src/static/textures/block/hopper_inside.png b/src/static/textures/block/hopper_inside.png
new file mode 100644
index 0000000000000000000000000000000000000000..17fcf4faa6467591c5ab355fcfc390f3dc6586e8
Binary files /dev/null and b/src/static/textures/block/hopper_inside.png differ
diff --git a/src/static/textures/block/hopper_outside.png b/src/static/textures/block/hopper_outside.png
new file mode 100644
index 0000000000000000000000000000000000000000..b6265ea93744b54e850abca8247fecce40959ccb
Binary files /dev/null and b/src/static/textures/block/hopper_outside.png differ
diff --git a/src/static/textures/block/hopper_top.png b/src/static/textures/block/hopper_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..709badc2609759e653661ee8241aa8678d36cd6a
Binary files /dev/null and b/src/static/textures/block/hopper_top.png differ
diff --git a/src/static/textures/block/ice.png b/src/static/textures/block/ice.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ae701d0bfd4079ba8cfd464bec2210c63410b5a
Binary files /dev/null and b/src/static/textures/block/ice.png differ
diff --git a/src/static/textures/block/iron_bars.png b/src/static/textures/block/iron_bars.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7df799f71498a76a6db1e333fb6d8980a6a669c
Binary files /dev/null and b/src/static/textures/block/iron_bars.png differ
diff --git a/src/static/textures/block/iron_block.png b/src/static/textures/block/iron_block.png
new file mode 100644
index 0000000000000000000000000000000000000000..5ecaf7fe6d2657915e0ed7b279788304d1ac2072
Binary files /dev/null and b/src/static/textures/block/iron_block.png differ
diff --git a/src/static/textures/block/iron_door_bottom.png b/src/static/textures/block/iron_door_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..240f8ae56a85ec2dedb47b0056b72ffe43ccff3a
Binary files /dev/null and b/src/static/textures/block/iron_door_bottom.png differ
diff --git a/src/static/textures/block/iron_door_top.png b/src/static/textures/block/iron_door_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..9b134f3004d2e883b4ed0f88f18b1efb0967b614
Binary files /dev/null and b/src/static/textures/block/iron_door_top.png differ
diff --git a/src/static/textures/block/iron_ore.png b/src/static/textures/block/iron_ore.png
new file mode 100644
index 0000000000000000000000000000000000000000..31b655bbfaf94bbe1a66e73cdb50809479f8ed02
Binary files /dev/null and b/src/static/textures/block/iron_ore.png differ
diff --git a/src/static/textures/block/iron_trapdoor.png b/src/static/textures/block/iron_trapdoor.png
new file mode 100644
index 0000000000000000000000000000000000000000..6000d27353223440ba2f841bec4ca38544dd2a0e
Binary files /dev/null and b/src/static/textures/block/iron_trapdoor.png differ
diff --git a/src/static/textures/block/item_frame.png b/src/static/textures/block/item_frame.png
new file mode 100644
index 0000000000000000000000000000000000000000..095de1c97c7eea94e1aa660dd443feb5d4bf9656
Binary files /dev/null and b/src/static/textures/block/item_frame.png differ
diff --git a/src/static/textures/block/jack_o_lantern.png b/src/static/textures/block/jack_o_lantern.png
new file mode 100644
index 0000000000000000000000000000000000000000..813db302e84216f7bf97477e3e10d6ecadd5e42e
Binary files /dev/null and b/src/static/textures/block/jack_o_lantern.png differ
diff --git a/src/static/textures/block/jukebox_side.png b/src/static/textures/block/jukebox_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..82430ca0c7a86381c8fa2987d9f6ce9d9183b2c8
Binary files /dev/null and b/src/static/textures/block/jukebox_side.png differ
diff --git a/src/static/textures/block/jukebox_top.png b/src/static/textures/block/jukebox_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..da45dfe8dae6abb821f430b5a6b68b242da43488
Binary files /dev/null and b/src/static/textures/block/jukebox_top.png differ
diff --git a/src/static/textures/block/jungle_door_bottom.png b/src/static/textures/block/jungle_door_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9fdb9a3999f1ea3e8821a75f384c8cffa04910d
Binary files /dev/null and b/src/static/textures/block/jungle_door_bottom.png differ
diff --git a/src/static/textures/block/jungle_door_top.png b/src/static/textures/block/jungle_door_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..f1068296b2a7a6515c0d74678fffaf07a2ebd7ae
Binary files /dev/null and b/src/static/textures/block/jungle_door_top.png differ
diff --git a/src/static/textures/block/jungle_leaves.png b/src/static/textures/block/jungle_leaves.png
new file mode 100644
index 0000000000000000000000000000000000000000..435d02159aaa9dd2cfdf39b8efaeb4a1ffa979cb
Binary files /dev/null and b/src/static/textures/block/jungle_leaves.png differ
diff --git a/src/static/textures/block/jungle_log.png b/src/static/textures/block/jungle_log.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e05f9a8aa4d4eb14f33deb924bcc909485f0136
Binary files /dev/null and b/src/static/textures/block/jungle_log.png differ
diff --git a/src/static/textures/block/jungle_log_top.png b/src/static/textures/block/jungle_log_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..f419b1bf2a38c95caf41d4d6ca11a8e040bf7c8d
Binary files /dev/null and b/src/static/textures/block/jungle_log_top.png differ
diff --git a/src/static/textures/block/jungle_planks.png b/src/static/textures/block/jungle_planks.png
new file mode 100644
index 0000000000000000000000000000000000000000..511c3597e223ee6679619f3c87d9a3877a3c2625
Binary files /dev/null and b/src/static/textures/block/jungle_planks.png differ
diff --git a/src/static/textures/block/jungle_sapling.png b/src/static/textures/block/jungle_sapling.png
new file mode 100644
index 0000000000000000000000000000000000000000..a33daa7addf82a7d4cf132b3517be5424d737e96
Binary files /dev/null and b/src/static/textures/block/jungle_sapling.png differ
diff --git a/src/static/textures/block/ladder.png b/src/static/textures/block/ladder.png
new file mode 100644
index 0000000000000000000000000000000000000000..129ec763e4ce3cb47f7fd60aada14dede5c67892
Binary files /dev/null and b/src/static/textures/block/ladder.png differ
diff --git a/src/static/textures/block/lapis_block.png b/src/static/textures/block/lapis_block.png
new file mode 100644
index 0000000000000000000000000000000000000000..6987aa5dd4bfd6af859e7ebd14f8d29da6325489
Binary files /dev/null and b/src/static/textures/block/lapis_block.png differ
diff --git a/src/static/textures/block/lapis_ore.png b/src/static/textures/block/lapis_ore.png
new file mode 100644
index 0000000000000000000000000000000000000000..c48ec2415c335d0f34d34338090cd898b3bbd9ac
Binary files /dev/null and b/src/static/textures/block/lapis_ore.png differ
diff --git a/src/static/textures/block/large_fern_bottom.png b/src/static/textures/block/large_fern_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9d29c27642ba953a8bcec7d629f6fd0d924ae16
Binary files /dev/null and b/src/static/textures/block/large_fern_bottom.png differ
diff --git a/src/static/textures/block/large_fern_top.png b/src/static/textures/block/large_fern_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..65eb565774190cc741dee3ffb4a33857506ff7bb
Binary files /dev/null and b/src/static/textures/block/large_fern_top.png differ
diff --git a/src/static/textures/block/lever.png b/src/static/textures/block/lever.png
new file mode 100644
index 0000000000000000000000000000000000000000..102f5d73286a3b1cb9771f1c1d6796d17ff1970f
Binary files /dev/null and b/src/static/textures/block/lever.png differ
diff --git a/src/static/textures/block/lilac_bottom.png b/src/static/textures/block/lilac_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..26b403558a80acd83878014470eea70dffab2aca
Binary files /dev/null and b/src/static/textures/block/lilac_bottom.png differ
diff --git a/src/static/textures/block/lilac_top.png b/src/static/textures/block/lilac_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..bada10cc7b9c37a31b0b751bf53d3ad95412edf9
Binary files /dev/null and b/src/static/textures/block/lilac_top.png differ
diff --git a/src/static/textures/block/lily_pad.png b/src/static/textures/block/lily_pad.png
new file mode 100644
index 0000000000000000000000000000000000000000..51608269d0825e1969a29ad7f6bc93089ea5296e
Binary files /dev/null and b/src/static/textures/block/lily_pad.png differ
diff --git a/src/static/textures/block/magma.png b/src/static/textures/block/magma.png
new file mode 100644
index 0000000000000000000000000000000000000000..702265d016ebf861dbc58a6d0b3ffb6a75308976
Binary files /dev/null and b/src/static/textures/block/magma.png differ
diff --git a/src/static/textures/block/magma.png.mcmeta b/src/static/textures/block/magma.png.mcmeta
new file mode 100644
index 0000000000000000000000000000000000000000..ffc3e52835ab4b700099ad1b838052a868b9a0e9
--- /dev/null
+++ b/src/static/textures/block/magma.png.mcmeta
@@ -0,0 +1,11 @@
+{
+ "animation": {
+ "frametime": 8,
+ "interpolate": true,
+ "frames": [
+ 0,
+ 1,
+ 2
+ ]
+ }
+}
diff --git a/src/static/textures/block/melon_side.png b/src/static/textures/block/melon_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..0a12fb96a0447cfaced0048cc1145913c876c171
Binary files /dev/null and b/src/static/textures/block/melon_side.png differ
diff --git a/src/static/textures/block/melon_top.png b/src/static/textures/block/melon_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..82234a85a0ec6528cf62bbb6aed9c0691a3594d7
Binary files /dev/null and b/src/static/textures/block/melon_top.png differ
diff --git a/src/static/textures/block/mossy_cobblestone.png b/src/static/textures/block/mossy_cobblestone.png
new file mode 100644
index 0000000000000000000000000000000000000000..b3e8290af87df775c0c8b6e78e8aa78cd1dcffc6
Binary files /dev/null and b/src/static/textures/block/mossy_cobblestone.png differ
diff --git a/src/static/textures/block/mossy_stone_bricks.png b/src/static/textures/block/mossy_stone_bricks.png
new file mode 100644
index 0000000000000000000000000000000000000000..b72ce2283e44f1bd42f6e674e4d62dcd2966f0b7
Binary files /dev/null and b/src/static/textures/block/mossy_stone_bricks.png differ
diff --git a/src/static/textures/block/mushroom_block_inside.png b/src/static/textures/block/mushroom_block_inside.png
new file mode 100644
index 0000000000000000000000000000000000000000..194114a02ccddbfda1106d845c3bb45040b98c58
Binary files /dev/null and b/src/static/textures/block/mushroom_block_inside.png differ
diff --git a/src/static/textures/block/mushroom_stem.png b/src/static/textures/block/mushroom_stem.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad6af2c4cf6c72fc77f2cc83b9879f49683dd2c0
Binary files /dev/null and b/src/static/textures/block/mushroom_stem.png differ
diff --git a/src/static/textures/block/mycelium_side.png b/src/static/textures/block/mycelium_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..8522236bd9ad9d2c411dcac6a18034b34d758635
Binary files /dev/null and b/src/static/textures/block/mycelium_side.png differ
diff --git a/src/static/textures/block/mycelium_top.png b/src/static/textures/block/mycelium_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..d98ad615d71240ac395b9191d11946bae65214cc
Binary files /dev/null and b/src/static/textures/block/mycelium_top.png differ
diff --git a/src/static/textures/block/nether_bricks.png b/src/static/textures/block/nether_bricks.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c67de5da8bb582567398906eab75777863b9981
Binary files /dev/null and b/src/static/textures/block/nether_bricks.png differ
diff --git a/src/static/textures/block/nether_quartz_ore.png b/src/static/textures/block/nether_quartz_ore.png
new file mode 100644
index 0000000000000000000000000000000000000000..e4cf57023411fcfbdff32fc72a624ad4a4d70ff9
Binary files /dev/null and b/src/static/textures/block/nether_quartz_ore.png differ
diff --git a/src/static/textures/block/nether_wart_block.png b/src/static/textures/block/nether_wart_block.png
new file mode 100644
index 0000000000000000000000000000000000000000..a71d08989102a7f4175913d05b76ff0d2a19a8e9
Binary files /dev/null and b/src/static/textures/block/nether_wart_block.png differ
diff --git a/src/static/textures/block/nether_wart_stage0.png b/src/static/textures/block/nether_wart_stage0.png
new file mode 100644
index 0000000000000000000000000000000000000000..c422334860d1322ff8f98ab994c452f1d484eca9
Binary files /dev/null and b/src/static/textures/block/nether_wart_stage0.png differ
diff --git a/src/static/textures/block/nether_wart_stage1.png b/src/static/textures/block/nether_wart_stage1.png
new file mode 100644
index 0000000000000000000000000000000000000000..7051185cd9fb20ae8eb16188c4d5a0aa745e333b
Binary files /dev/null and b/src/static/textures/block/nether_wart_stage1.png differ
diff --git a/src/static/textures/block/nether_wart_stage2.png b/src/static/textures/block/nether_wart_stage2.png
new file mode 100644
index 0000000000000000000000000000000000000000..b3d724bb5714a31b207f4e5956d8b685efdf2449
Binary files /dev/null and b/src/static/textures/block/nether_wart_stage2.png differ
diff --git a/src/static/textures/block/netherrack.png b/src/static/textures/block/netherrack.png
new file mode 100644
index 0000000000000000000000000000000000000000..4cb2361ab76d5bbbe8ecba34fa1556e568b971d7
Binary files /dev/null and b/src/static/textures/block/netherrack.png differ
diff --git a/src/static/textures/block/note_block.png b/src/static/textures/block/note_block.png
new file mode 100644
index 0000000000000000000000000000000000000000..40ecc58a2263965e9b6d5d9cead2b2b8b7348d33
Binary files /dev/null and b/src/static/textures/block/note_block.png differ
diff --git a/src/static/textures/block/oak_door_bottom.png b/src/static/textures/block/oak_door_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..360cadc890d5c9173625f530991662196805e18d
Binary files /dev/null and b/src/static/textures/block/oak_door_bottom.png differ
diff --git a/src/static/textures/block/oak_door_top.png b/src/static/textures/block/oak_door_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..35790f416fb995c599edfba1c45e189005a845bf
Binary files /dev/null and b/src/static/textures/block/oak_door_top.png differ
diff --git a/src/static/textures/block/oak_leaves.png b/src/static/textures/block/oak_leaves.png
new file mode 100644
index 0000000000000000000000000000000000000000..5fcd721443f9d94bc10d47f1f8103a2c8a94f9a1
Binary files /dev/null and b/src/static/textures/block/oak_leaves.png differ
diff --git a/src/static/textures/block/oak_log.png b/src/static/textures/block/oak_log.png
new file mode 100644
index 0000000000000000000000000000000000000000..527b9e37c63ebc49461268e309c69d05edc9eb30
Binary files /dev/null and b/src/static/textures/block/oak_log.png differ
diff --git a/src/static/textures/block/oak_log_top.png b/src/static/textures/block/oak_log_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..38d7eb1c7003bfc1565f14e3d6609cbe6ebd6320
Binary files /dev/null and b/src/static/textures/block/oak_log_top.png differ
diff --git a/src/static/textures/block/oak_planks.png b/src/static/textures/block/oak_planks.png
new file mode 100644
index 0000000000000000000000000000000000000000..39a00be7d241a8fc1378d511fbaeadc5b943c40a
Binary files /dev/null and b/src/static/textures/block/oak_planks.png differ
diff --git a/src/static/textures/block/oak_sapling.png b/src/static/textures/block/oak_sapling.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ac141a041d707e8ff961162401498db648310bf
Binary files /dev/null and b/src/static/textures/block/oak_sapling.png differ
diff --git a/src/static/textures/block/oak_trapdoor.png b/src/static/textures/block/oak_trapdoor.png
new file mode 100644
index 0000000000000000000000000000000000000000..cba143b9ea1874457f45f18a129fe2d48dccb220
Binary files /dev/null and b/src/static/textures/block/oak_trapdoor.png differ
diff --git a/src/static/textures/block/observer_back.png b/src/static/textures/block/observer_back.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9f6f3cbceee3696dbb8875858b8ad79594f0711
Binary files /dev/null and b/src/static/textures/block/observer_back.png differ
diff --git a/src/static/textures/block/observer_back_on.png b/src/static/textures/block/observer_back_on.png
new file mode 100644
index 0000000000000000000000000000000000000000..4957e0c0ad541377ff02c89bae6b6a0cc15e53da
Binary files /dev/null and b/src/static/textures/block/observer_back_on.png differ
diff --git a/src/static/textures/block/observer_front.png b/src/static/textures/block/observer_front.png
new file mode 100644
index 0000000000000000000000000000000000000000..46321305c4d1bba6fccf6a145d09d40570d7edb2
Binary files /dev/null and b/src/static/textures/block/observer_front.png differ
diff --git a/src/static/textures/block/observer_side.png b/src/static/textures/block/observer_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..c157097aab1fbd59c7ac6ddf4ff75856020f0f13
Binary files /dev/null and b/src/static/textures/block/observer_side.png differ
diff --git a/src/static/textures/block/observer_top.png b/src/static/textures/block/observer_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..58ab1e97103c74d5411047e2821403fdac3d5e41
Binary files /dev/null and b/src/static/textures/block/observer_top.png differ
diff --git a/src/static/textures/block/obsidian.png b/src/static/textures/block/obsidian.png
new file mode 100644
index 0000000000000000000000000000000000000000..65be807496f49a39133709055d315c4d5d4edb76
Binary files /dev/null and b/src/static/textures/block/obsidian.png differ
diff --git a/src/static/textures/block/orange_tulip.png b/src/static/textures/block/orange_tulip.png
new file mode 100644
index 0000000000000000000000000000000000000000..b90fafecb9a3e7b892de61a18587694fa3332531
Binary files /dev/null and b/src/static/textures/block/orange_tulip.png differ
diff --git a/src/static/textures/block/oxeye_daisy.png b/src/static/textures/block/oxeye_daisy.png
new file mode 100644
index 0000000000000000000000000000000000000000..b41d76e22931c937b7dd0d627dd8077b4baa912f
Binary files /dev/null and b/src/static/textures/block/oxeye_daisy.png differ
diff --git a/src/static/textures/block/packed_ice.png b/src/static/textures/block/packed_ice.png
new file mode 100644
index 0000000000000000000000000000000000000000..3567697f13afa932845aafbc9bbaa3e85633f8ac
Binary files /dev/null and b/src/static/textures/block/packed_ice.png differ
diff --git a/src/static/textures/block/peony_bottom.png b/src/static/textures/block/peony_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..85dc0561973f86ea4834d66981457cb05f7f73fa
Binary files /dev/null and b/src/static/textures/block/peony_bottom.png differ
diff --git a/src/static/textures/block/peony_top.png b/src/static/textures/block/peony_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f464a9fdd8a86ffa85e6ca20fe477da7e1ad4f9
Binary files /dev/null and b/src/static/textures/block/peony_top.png differ
diff --git a/src/static/textures/block/pink_tulip.png b/src/static/textures/block/pink_tulip.png
new file mode 100644
index 0000000000000000000000000000000000000000..9425addae0a881bd31f57f770552437933171764
Binary files /dev/null and b/src/static/textures/block/pink_tulip.png differ
diff --git a/src/static/textures/block/piston_bottom.png b/src/static/textures/block/piston_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..db43b1c2e4e1e2ce3bcb74f44b67cc58341f47fc
Binary files /dev/null and b/src/static/textures/block/piston_bottom.png differ
diff --git a/src/static/textures/block/piston_inner.png b/src/static/textures/block/piston_inner.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ae58fc64dd40af855cc3d4af01682fee46df2f4
Binary files /dev/null and b/src/static/textures/block/piston_inner.png differ
diff --git a/src/static/textures/block/piston_side.png b/src/static/textures/block/piston_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..db5d89cb5145f97406fa1fd8b0fdfe9e295e6efd
Binary files /dev/null and b/src/static/textures/block/piston_side.png differ
diff --git a/src/static/textures/block/piston_top.png b/src/static/textures/block/piston_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..320c97b42b485ff733583582bf4d2cf004c25959
Binary files /dev/null and b/src/static/textures/block/piston_top.png differ
diff --git a/src/static/textures/block/piston_top_sticky.png b/src/static/textures/block/piston_top_sticky.png
new file mode 100644
index 0000000000000000000000000000000000000000..048e0c62960c43a147e406ac49a71db3cf23e52c
Binary files /dev/null and b/src/static/textures/block/piston_top_sticky.png differ
diff --git a/src/static/textures/block/podzol_top.png b/src/static/textures/block/podzol_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..fed5258051e33545a360f49c22c055af06990468
Binary files /dev/null and b/src/static/textures/block/podzol_top.png differ
diff --git a/src/static/textures/block/polished_andesite.png b/src/static/textures/block/polished_andesite.png
new file mode 100644
index 0000000000000000000000000000000000000000..4d09c954383a1f910bc9e80df28d9190b481ec6f
Binary files /dev/null and b/src/static/textures/block/polished_andesite.png differ
diff --git a/src/static/textures/block/polished_diorite.png b/src/static/textures/block/polished_diorite.png
new file mode 100644
index 0000000000000000000000000000000000000000..b204aa230d466b0b4bb2d90e8cee4e2321ce58e8
Binary files /dev/null and b/src/static/textures/block/polished_diorite.png differ
diff --git a/src/static/textures/block/polished_granite.png b/src/static/textures/block/polished_granite.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad56724265763e1e4df92b665461ba6b2d2d997f
Binary files /dev/null and b/src/static/textures/block/polished_granite.png differ
diff --git a/src/static/textures/block/poppy.png b/src/static/textures/block/poppy.png
new file mode 100644
index 0000000000000000000000000000000000000000..44e767430455b61c8a40570f0b32d2b81877ed64
Binary files /dev/null and b/src/static/textures/block/poppy.png differ
diff --git a/src/static/textures/block/potatoes_stage0.png b/src/static/textures/block/potatoes_stage0.png
new file mode 100644
index 0000000000000000000000000000000000000000..c93c4c2ba102df1c23db24061e25bcab91d5e25f
Binary files /dev/null and b/src/static/textures/block/potatoes_stage0.png differ
diff --git a/src/static/textures/block/potatoes_stage1.png b/src/static/textures/block/potatoes_stage1.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7989e99293b058b36035ebd63daa8596e7830bb
Binary files /dev/null and b/src/static/textures/block/potatoes_stage1.png differ
diff --git a/src/static/textures/block/potatoes_stage2.png b/src/static/textures/block/potatoes_stage2.png
new file mode 100644
index 0000000000000000000000000000000000000000..51aa6978573ffffd82ac2b0305763f6f1054fa4d
Binary files /dev/null and b/src/static/textures/block/potatoes_stage2.png differ
diff --git a/src/static/textures/block/potatoes_stage3.png b/src/static/textures/block/potatoes_stage3.png
new file mode 100644
index 0000000000000000000000000000000000000000..49c3737103d6ab208004b1802cd0f854dde0fb75
Binary files /dev/null and b/src/static/textures/block/potatoes_stage3.png differ
diff --git a/src/static/textures/block/powered_rail.png b/src/static/textures/block/powered_rail.png
new file mode 100644
index 0000000000000000000000000000000000000000..4353bf7755d96c84c2854261983b56d28a04a714
Binary files /dev/null and b/src/static/textures/block/powered_rail.png differ
diff --git a/src/static/textures/block/powered_rail_on.png b/src/static/textures/block/powered_rail_on.png
new file mode 100644
index 0000000000000000000000000000000000000000..55f18f40a93384c562a308bc9a89badb5463cd2f
Binary files /dev/null and b/src/static/textures/block/powered_rail_on.png differ
diff --git a/src/static/textures/block/prismarine.png b/src/static/textures/block/prismarine.png
new file mode 100644
index 0000000000000000000000000000000000000000..e45234b3d3745fd87d66c511e992b1cce41aa09c
Binary files /dev/null and b/src/static/textures/block/prismarine.png differ
diff --git a/src/static/textures/block/prismarine.png.mcmeta b/src/static/textures/block/prismarine.png.mcmeta
new file mode 100644
index 0000000000000000000000000000000000000000..410b327ffd98ceb8b4dc2328769c13ccd52425de
--- /dev/null
+++ b/src/static/textures/block/prismarine.png.mcmeta
@@ -0,0 +1,30 @@
+{
+ "animation": {
+ "frametime": 300,
+ "interpolate": true,
+ "frames": [
+ 0,
+ 1,
+ 0,
+ 2,
+ 0,
+ 3,
+ 0,
+ 1,
+ 2,
+ 1,
+ 3,
+ 1,
+ 0,
+ 2,
+ 1,
+ 2,
+ 3,
+ 2,
+ 0,
+ 3,
+ 1,
+ 3
+ ]
+ }
+}
diff --git a/src/static/textures/block/prismarine_bricks.png b/src/static/textures/block/prismarine_bricks.png
new file mode 100644
index 0000000000000000000000000000000000000000..ee2b8063bb4120bd1b6c311ee2b12725b6ca77bc
Binary files /dev/null and b/src/static/textures/block/prismarine_bricks.png differ
diff --git a/src/static/textures/block/pumpkin_side.png b/src/static/textures/block/pumpkin_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce90346c073c5a443c9436650a0bec6c89571a0d
Binary files /dev/null and b/src/static/textures/block/pumpkin_side.png differ
diff --git a/src/static/textures/block/pumpkin_stem.png b/src/static/textures/block/pumpkin_stem.png
new file mode 100644
index 0000000000000000000000000000000000000000..da7787fe69bec67b8f7bd207642fb7ca664e5c36
Binary files /dev/null and b/src/static/textures/block/pumpkin_stem.png differ
diff --git a/src/static/textures/block/pumpkin_top.png b/src/static/textures/block/pumpkin_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6a8f5e29d36563e0325ae75a900873fbbc9fa24
Binary files /dev/null and b/src/static/textures/block/pumpkin_top.png differ
diff --git a/src/static/textures/block/purpur_block.png b/src/static/textures/block/purpur_block.png
new file mode 100644
index 0000000000000000000000000000000000000000..69c3898116be3729116ec46e09f8954078b5d65a
Binary files /dev/null and b/src/static/textures/block/purpur_block.png differ
diff --git a/src/static/textures/block/purpur_pillar.png b/src/static/textures/block/purpur_pillar.png
new file mode 100644
index 0000000000000000000000000000000000000000..e22d27beb79e96eb1467bd6a48e8e9afc4771236
Binary files /dev/null and b/src/static/textures/block/purpur_pillar.png differ
diff --git a/src/static/textures/block/purpur_pillar_top.png b/src/static/textures/block/purpur_pillar_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..2502aed5ba7efdfb2435f45d49a923f0a325f988
Binary files /dev/null and b/src/static/textures/block/purpur_pillar_top.png differ
diff --git a/src/static/textures/block/quartz_block_bottom.png b/src/static/textures/block/quartz_block_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f832aa3c3d230dc45fe73e3c7f14f4ec7ae7aaf
Binary files /dev/null and b/src/static/textures/block/quartz_block_bottom.png differ
diff --git a/src/static/textures/block/quartz_block_side.png b/src/static/textures/block/quartz_block_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d6ee66ed0e4551b4a58800e885b947cac6854d6
Binary files /dev/null and b/src/static/textures/block/quartz_block_side.png differ
diff --git a/src/static/textures/block/quartz_block_top.png b/src/static/textures/block/quartz_block_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..b777e4dc93be354b8874d1e0ecf8cf119f724820
Binary files /dev/null and b/src/static/textures/block/quartz_block_top.png differ
diff --git a/src/static/textures/block/quartz_pillar.png b/src/static/textures/block/quartz_pillar.png
new file mode 100644
index 0000000000000000000000000000000000000000..719a7eb88394b82796128ff1df195b141ef2d13d
Binary files /dev/null and b/src/static/textures/block/quartz_pillar.png differ
diff --git a/src/static/textures/block/quartz_pillar_top.png b/src/static/textures/block/quartz_pillar_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..41f5e144b9afea5c6035203746093300d038bd5f
Binary files /dev/null and b/src/static/textures/block/quartz_pillar_top.png differ
diff --git a/src/static/textures/block/rail.png b/src/static/textures/block/rail.png
new file mode 100644
index 0000000000000000000000000000000000000000..5bd29576ce0023ed466da405e7da899d633055bd
Binary files /dev/null and b/src/static/textures/block/rail.png differ
diff --git a/src/static/textures/block/rail_corner.png b/src/static/textures/block/rail_corner.png
new file mode 100644
index 0000000000000000000000000000000000000000..43eaf6201c74237d9637b8bb19a3bdb7ff6ee527
Binary files /dev/null and b/src/static/textures/block/rail_corner.png differ
diff --git a/src/static/textures/block/red_mushroom.png b/src/static/textures/block/red_mushroom.png
new file mode 100644
index 0000000000000000000000000000000000000000..6b983990e3c8cad105838821b666dea4855ae6db
Binary files /dev/null and b/src/static/textures/block/red_mushroom.png differ
diff --git a/src/static/textures/block/red_mushroom_block.png b/src/static/textures/block/red_mushroom_block.png
new file mode 100644
index 0000000000000000000000000000000000000000..a77969e30c1fb622c7fb234331350ff91a17ab45
Binary files /dev/null and b/src/static/textures/block/red_mushroom_block.png differ
diff --git a/src/static/textures/block/red_nether_bricks.png b/src/static/textures/block/red_nether_bricks.png
new file mode 100644
index 0000000000000000000000000000000000000000..0b7d471ac8d6a00a37696328a71b65cd8c0645c9
Binary files /dev/null and b/src/static/textures/block/red_nether_bricks.png differ
diff --git a/src/static/textures/block/red_sand.png b/src/static/textures/block/red_sand.png
new file mode 100644
index 0000000000000000000000000000000000000000..1309006d813a9c4fc6ced7ea241bc76ff470ad81
Binary files /dev/null and b/src/static/textures/block/red_sand.png differ
diff --git a/src/static/textures/block/red_sandstone.png b/src/static/textures/block/red_sandstone.png
new file mode 100644
index 0000000000000000000000000000000000000000..f6c5f7e5f4499479b644771fd6ce1d3f7afb2fcb
Binary files /dev/null and b/src/static/textures/block/red_sandstone.png differ
diff --git a/src/static/textures/block/red_sandstone_bottom.png b/src/static/textures/block/red_sandstone_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a91b8169392748a583022d2ebfb18b5b6108673
Binary files /dev/null and b/src/static/textures/block/red_sandstone_bottom.png differ
diff --git a/src/static/textures/block/red_sandstone_top.png b/src/static/textures/block/red_sandstone_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..61aaa69f2debf6352cc1d2b7f54a88bae5c7eecc
Binary files /dev/null and b/src/static/textures/block/red_sandstone_top.png differ
diff --git a/src/static/textures/block/red_tulip.png b/src/static/textures/block/red_tulip.png
new file mode 100644
index 0000000000000000000000000000000000000000..09c47dfb1d1c782ac02f456f0b9f4ab9e9aaddf2
Binary files /dev/null and b/src/static/textures/block/red_tulip.png differ
diff --git a/src/static/textures/block/redstone_block.png b/src/static/textures/block/redstone_block.png
new file mode 100644
index 0000000000000000000000000000000000000000..4391e518225edd246a7bcad47c7042587ca8d01c
Binary files /dev/null and b/src/static/textures/block/redstone_block.png differ
diff --git a/src/static/textures/block/redstone_lamp.png b/src/static/textures/block/redstone_lamp.png
new file mode 100644
index 0000000000000000000000000000000000000000..36091677ad89f84cbc74fb0eaf45e1f0652aa18f
Binary files /dev/null and b/src/static/textures/block/redstone_lamp.png differ
diff --git a/src/static/textures/block/redstone_lamp_on.png b/src/static/textures/block/redstone_lamp_on.png
new file mode 100644
index 0000000000000000000000000000000000000000..d89222714899e80bf177d583734ae0d407332d5e
Binary files /dev/null and b/src/static/textures/block/redstone_lamp_on.png differ
diff --git a/src/static/textures/block/redstone_ore.png b/src/static/textures/block/redstone_ore.png
new file mode 100644
index 0000000000000000000000000000000000000000..2490e21562785772f048b6db44ac4a5d7f6ede85
Binary files /dev/null and b/src/static/textures/block/redstone_ore.png differ
diff --git a/src/static/textures/block/redstone_torch.png b/src/static/textures/block/redstone_torch.png
new file mode 100644
index 0000000000000000000000000000000000000000..d49a7a9d6f13ba7d0d3b9ce658bca4fb9181c2cf
Binary files /dev/null and b/src/static/textures/block/redstone_torch.png differ
diff --git a/src/static/textures/block/redstone_torch_off.png b/src/static/textures/block/redstone_torch_off.png
new file mode 100644
index 0000000000000000000000000000000000000000..cd82b6414b7e6ba25c0f242586bc18ac7bebcc4e
Binary files /dev/null and b/src/static/textures/block/redstone_torch_off.png differ
diff --git a/src/static/textures/block/repeater.png b/src/static/textures/block/repeater.png
new file mode 100644
index 0000000000000000000000000000000000000000..3daa5e6d0f530a28d6af1a6f52d169144ff8ea13
Binary files /dev/null and b/src/static/textures/block/repeater.png differ
diff --git a/src/static/textures/block/repeater_on.png b/src/static/textures/block/repeater_on.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e6c2ac6f5922411f6e58954d4c266a4af387e0f
Binary files /dev/null and b/src/static/textures/block/repeater_on.png differ
diff --git a/src/static/textures/block/repeating_command_block_back.png b/src/static/textures/block/repeating_command_block_back.png
new file mode 100644
index 0000000000000000000000000000000000000000..87225347899e704d84b84a93bf1d82b0a771e60f
Binary files /dev/null and b/src/static/textures/block/repeating_command_block_back.png differ
diff --git a/src/static/textures/block/repeating_command_block_back.png.mcmeta b/src/static/textures/block/repeating_command_block_back.png.mcmeta
new file mode 100644
index 0000000000000000000000000000000000000000..4894b537c138a0cd21e4d64f93ce7ce5206d629a
--- /dev/null
+++ b/src/static/textures/block/repeating_command_block_back.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "interpolate": true,
+ "frametime": 10
+ }
+}
diff --git a/src/static/textures/block/repeating_command_block_conditional.png b/src/static/textures/block/repeating_command_block_conditional.png
new file mode 100644
index 0000000000000000000000000000000000000000..34ccc51a10f37f8046f5e5c3c2c681447ef6772c
Binary files /dev/null and b/src/static/textures/block/repeating_command_block_conditional.png differ
diff --git a/src/static/textures/block/repeating_command_block_conditional.png.mcmeta b/src/static/textures/block/repeating_command_block_conditional.png.mcmeta
new file mode 100644
index 0000000000000000000000000000000000000000..4894b537c138a0cd21e4d64f93ce7ce5206d629a
--- /dev/null
+++ b/src/static/textures/block/repeating_command_block_conditional.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "interpolate": true,
+ "frametime": 10
+ }
+}
diff --git a/src/static/textures/block/repeating_command_block_front.png b/src/static/textures/block/repeating_command_block_front.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d909244e99bfed3ac24e53c65b070713f3f4fc3
Binary files /dev/null and b/src/static/textures/block/repeating_command_block_front.png differ
diff --git a/src/static/textures/block/repeating_command_block_front.png.mcmeta b/src/static/textures/block/repeating_command_block_front.png.mcmeta
new file mode 100644
index 0000000000000000000000000000000000000000..4894b537c138a0cd21e4d64f93ce7ce5206d629a
--- /dev/null
+++ b/src/static/textures/block/repeating_command_block_front.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "interpolate": true,
+ "frametime": 10
+ }
+}
diff --git a/src/static/textures/block/repeating_command_block_side.png b/src/static/textures/block/repeating_command_block_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..89305d9fb927a85d1490622a165d110552651cfa
Binary files /dev/null and b/src/static/textures/block/repeating_command_block_side.png differ
diff --git a/src/static/textures/block/repeating_command_block_side.png.mcmeta b/src/static/textures/block/repeating_command_block_side.png.mcmeta
new file mode 100644
index 0000000000000000000000000000000000000000..4894b537c138a0cd21e4d64f93ce7ce5206d629a
--- /dev/null
+++ b/src/static/textures/block/repeating_command_block_side.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "interpolate": true,
+ "frametime": 10
+ }
+}
diff --git a/src/static/textures/block/rose_bush_bottom.png b/src/static/textures/block/rose_bush_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..140a45f6de008d98082e86aaba4c42507b85f988
Binary files /dev/null and b/src/static/textures/block/rose_bush_bottom.png differ
diff --git a/src/static/textures/block/rose_bush_top.png b/src/static/textures/block/rose_bush_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b3207d2b388bd21660fcbe98555bee0cce14a62
Binary files /dev/null and b/src/static/textures/block/rose_bush_top.png differ
diff --git a/src/static/textures/block/sand.png b/src/static/textures/block/sand.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc48301a6f571835e05876129cbedd4f2c78b316
Binary files /dev/null and b/src/static/textures/block/sand.png differ
diff --git a/src/static/textures/block/sandstone.png b/src/static/textures/block/sandstone.png
new file mode 100644
index 0000000000000000000000000000000000000000..38e10bf8c0e45f73e6bb546852f6cdaa8c2692a0
Binary files /dev/null and b/src/static/textures/block/sandstone.png differ
diff --git a/src/static/textures/block/sandstone_bottom.png b/src/static/textures/block/sandstone_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..09a47a4201be114c931a0e9435f8b7c27790b8c7
Binary files /dev/null and b/src/static/textures/block/sandstone_bottom.png differ
diff --git a/src/static/textures/block/sandstone_top.png b/src/static/textures/block/sandstone_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd5ef755fd090c013c497d09fb5c49fb972cb531
Binary files /dev/null and b/src/static/textures/block/sandstone_top.png differ
diff --git a/src/static/textures/block/slime_block.png b/src/static/textures/block/slime_block.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c45c4ec636e6b71826ca8832eccdcc983f8e113
Binary files /dev/null and b/src/static/textures/block/slime_block.png differ
diff --git a/src/static/textures/block/smooth_stone.png b/src/static/textures/block/smooth_stone.png
new file mode 100644
index 0000000000000000000000000000000000000000..ffbf234c5c640502a3cf5e980ae06e5efe872ed0
Binary files /dev/null and b/src/static/textures/block/smooth_stone.png differ
diff --git a/src/static/textures/block/smooth_stone_slab_side.png b/src/static/textures/block/smooth_stone_slab_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..9560c4ab481d6ca4845e4d9a88207eecc28f34bd
Binary files /dev/null and b/src/static/textures/block/smooth_stone_slab_side.png differ
diff --git a/src/static/textures/block/snow.png b/src/static/textures/block/snow.png
new file mode 100644
index 0000000000000000000000000000000000000000..802c4163a3fb859c8720b039038911555071d91f
Binary files /dev/null and b/src/static/textures/block/snow.png differ
diff --git a/src/static/textures/block/soul_sand.png b/src/static/textures/block/soul_sand.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e4b1a6d758fb79c704034099ebc1c368111b60c
Binary files /dev/null and b/src/static/textures/block/soul_sand.png differ
diff --git a/src/static/textures/block/spawner.png b/src/static/textures/block/spawner.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f85452f78cbab3e7f9422980a0d6d2c2a5bc16f
Binary files /dev/null and b/src/static/textures/block/spawner.png differ
diff --git a/src/static/textures/block/sponge.png b/src/static/textures/block/sponge.png
new file mode 100644
index 0000000000000000000000000000000000000000..ffb122959a60ef7b08be9379f77ea95f2bb64e3a
Binary files /dev/null and b/src/static/textures/block/sponge.png differ
diff --git a/src/static/textures/block/spruce_door_bottom.png b/src/static/textures/block/spruce_door_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..356c422dfd115c68234b6aadf6061b9a835e961f
Binary files /dev/null and b/src/static/textures/block/spruce_door_bottom.png differ
diff --git a/src/static/textures/block/spruce_door_top.png b/src/static/textures/block/spruce_door_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..7b2ec280fbfcdc3cbb5775eae8b3895fdb662484
Binary files /dev/null and b/src/static/textures/block/spruce_door_top.png differ
diff --git a/src/static/textures/block/spruce_leaves.png b/src/static/textures/block/spruce_leaves.png
new file mode 100644
index 0000000000000000000000000000000000000000..875922d99b9b2673178bd609e1272fec9988fdda
Binary files /dev/null and b/src/static/textures/block/spruce_leaves.png differ
diff --git a/src/static/textures/block/spruce_log.png b/src/static/textures/block/spruce_log.png
new file mode 100644
index 0000000000000000000000000000000000000000..b254569d781241ea2c31b16e58a46e7a9c020cb1
Binary files /dev/null and b/src/static/textures/block/spruce_log.png differ
diff --git a/src/static/textures/block/spruce_log_top.png b/src/static/textures/block/spruce_log_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5a8516ed3bf8a89de394a07b697545d3562e695
Binary files /dev/null and b/src/static/textures/block/spruce_log_top.png differ
diff --git a/src/static/textures/block/spruce_planks.png b/src/static/textures/block/spruce_planks.png
new file mode 100644
index 0000000000000000000000000000000000000000..f6c0622560cbce214b59f9e742ed436e955bafb8
Binary files /dev/null and b/src/static/textures/block/spruce_planks.png differ
diff --git a/src/static/textures/block/spruce_sapling.png b/src/static/textures/block/spruce_sapling.png
new file mode 100644
index 0000000000000000000000000000000000000000..37aeb9c013e21644ab345979745d555ce2dc1c9e
Binary files /dev/null and b/src/static/textures/block/spruce_sapling.png differ
diff --git a/src/static/textures/block/spruce_trapdoor.png b/src/static/textures/block/spruce_trapdoor.png
new file mode 100644
index 0000000000000000000000000000000000000000..f26d7d819ac475f4546826ba49e06b17dcb3c929
Binary files /dev/null and b/src/static/textures/block/spruce_trapdoor.png differ
diff --git a/src/static/textures/block/stone.png b/src/static/textures/block/stone.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c52c6fe177fe7c3686305a8a45e77ba15cbe848
Binary files /dev/null and b/src/static/textures/block/stone.png differ
diff --git a/src/static/textures/block/stone_bricks.png b/src/static/textures/block/stone_bricks.png
new file mode 100644
index 0000000000000000000000000000000000000000..3cf3520480dfc7e1bdf63832db826d6d5a19b4c3
Binary files /dev/null and b/src/static/textures/block/stone_bricks.png differ
diff --git a/src/static/textures/block/stripped_acacia_log_top.png b/src/static/textures/block/stripped_acacia_log_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..7dc7599ad5e0e77e00ed034f2594f43d8d707a39
Binary files /dev/null and b/src/static/textures/block/stripped_acacia_log_top.png differ
diff --git a/src/static/textures/block/stripped_birch_log_top.png b/src/static/textures/block/stripped_birch_log_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..b50ee12a721464897b74628d758153fe5dac5c83
Binary files /dev/null and b/src/static/textures/block/stripped_birch_log_top.png differ
diff --git a/src/static/textures/block/stripped_dark_oak_log_top.png b/src/static/textures/block/stripped_dark_oak_log_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..d760d5cfc4b701d6d678e913bfd3da3aaa5d0242
Binary files /dev/null and b/src/static/textures/block/stripped_dark_oak_log_top.png differ
diff --git a/src/static/textures/block/stripped_jungle_log_top.png b/src/static/textures/block/stripped_jungle_log_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7bfa4212814a834f9549c91fbf4d8ed929c6637
Binary files /dev/null and b/src/static/textures/block/stripped_jungle_log_top.png differ
diff --git a/src/static/textures/block/stripped_oak_log_top.png b/src/static/textures/block/stripped_oak_log_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..8917a4b868946af1327ab9a804096a67e9eecc73
Binary files /dev/null and b/src/static/textures/block/stripped_oak_log_top.png differ
diff --git a/src/static/textures/block/stripped_spruce_log_top.png b/src/static/textures/block/stripped_spruce_log_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..c5601b6fc7fd4adc43a0c7731a50093cccb2c320
Binary files /dev/null and b/src/static/textures/block/stripped_spruce_log_top.png differ
diff --git a/src/static/textures/block/sunflower_back.png b/src/static/textures/block/sunflower_back.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab287cee4b11d7cc3ff401965ac0b08ebb547976
Binary files /dev/null and b/src/static/textures/block/sunflower_back.png differ
diff --git a/src/static/textures/block/sunflower_bottom.png b/src/static/textures/block/sunflower_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..21414d568b0340acb656540f258e4258bf0ff456
Binary files /dev/null and b/src/static/textures/block/sunflower_bottom.png differ
diff --git a/src/static/textures/block/sunflower_front.png b/src/static/textures/block/sunflower_front.png
new file mode 100644
index 0000000000000000000000000000000000000000..cd2720d02badad21fa60c2935b0fe3ad3b78e40a
Binary files /dev/null and b/src/static/textures/block/sunflower_front.png differ
diff --git a/src/static/textures/block/sunflower_top.png b/src/static/textures/block/sunflower_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..0927112380453052912769e87babc0c686128be3
Binary files /dev/null and b/src/static/textures/block/sunflower_top.png differ
diff --git a/src/static/textures/block/tall_grass_bottom.png b/src/static/textures/block/tall_grass_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..0bd08db69b66ab0754e22d1ea893f3c9bb41a060
Binary files /dev/null and b/src/static/textures/block/tall_grass_bottom.png differ
diff --git a/src/static/textures/block/tall_grass_top.png b/src/static/textures/block/tall_grass_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..6aba39e92539c2c255e75eb9f36ce07f064a7367
Binary files /dev/null and b/src/static/textures/block/tall_grass_top.png differ
diff --git a/src/static/textures/block/terracotta.png b/src/static/textures/block/terracotta.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f78b1556e0725d6a6d0e3ce098458572af49ac1
Binary files /dev/null and b/src/static/textures/block/terracotta.png differ
diff --git a/src/static/textures/block/tnt_bottom.png b/src/static/textures/block/tnt_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..53f78d706be13723d917a81fa7adaa1df810e911
Binary files /dev/null and b/src/static/textures/block/tnt_bottom.png differ
diff --git a/src/static/textures/block/tnt_side.png b/src/static/textures/block/tnt_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..74d66c70dc5b1646ed834a3e778b3c7b1fead37d
Binary files /dev/null and b/src/static/textures/block/tnt_side.png differ
diff --git a/src/static/textures/block/tnt_top.png b/src/static/textures/block/tnt_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..078dc312067df90a09604e025565c3dc0a223bbe
Binary files /dev/null and b/src/static/textures/block/tnt_top.png differ
diff --git a/src/static/textures/block/torch.png b/src/static/textures/block/torch.png
new file mode 100644
index 0000000000000000000000000000000000000000..7d2ec9b1ae392e6289d9e43167f47cae547f2797
Binary files /dev/null and b/src/static/textures/block/torch.png differ
diff --git a/src/static/textures/block/tripwire_hook.png b/src/static/textures/block/tripwire_hook.png
new file mode 100644
index 0000000000000000000000000000000000000000..1eda9ef66ba534f8c606e6f3c6ede927eacea2c1
Binary files /dev/null and b/src/static/textures/block/tripwire_hook.png differ
diff --git a/src/static/textures/block/vine.png b/src/static/textures/block/vine.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d4f836f1af4c29767623a3f5a43a1906d54f86b
Binary files /dev/null and b/src/static/textures/block/vine.png differ
diff --git a/src/static/textures/block/water.png b/src/static/textures/block/water.png
new file mode 100644
index 0000000000000000000000000000000000000000..8eb28349a83b75e48e3fe0e37958e3a318a3c024
Binary files /dev/null and b/src/static/textures/block/water.png differ
diff --git a/src/static/textures/block/wet_sponge.png b/src/static/textures/block/wet_sponge.png
new file mode 100644
index 0000000000000000000000000000000000000000..13b95c3b38a95907834c951a50021c41e31aa3db
Binary files /dev/null and b/src/static/textures/block/wet_sponge.png differ
diff --git a/src/static/textures/block/wheat_stage0.png b/src/static/textures/block/wheat_stage0.png
new file mode 100644
index 0000000000000000000000000000000000000000..a4ce8263a63dd046061527436422a911d6674f0c
Binary files /dev/null and b/src/static/textures/block/wheat_stage0.png differ
diff --git a/src/static/textures/block/wheat_stage1.png b/src/static/textures/block/wheat_stage1.png
new file mode 100644
index 0000000000000000000000000000000000000000..a9a4517cb74265d88759936b3ac1fce36880bf4e
Binary files /dev/null and b/src/static/textures/block/wheat_stage1.png differ
diff --git a/src/static/textures/block/wheat_stage2.png b/src/static/textures/block/wheat_stage2.png
new file mode 100644
index 0000000000000000000000000000000000000000..dec081ffb0520329d74fd345328bd4fc3272df54
Binary files /dev/null and b/src/static/textures/block/wheat_stage2.png differ
diff --git a/src/static/textures/block/wheat_stage3.png b/src/static/textures/block/wheat_stage3.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b2c0ca9afa7c99521bb7daa75c1bb1fffd74e23
Binary files /dev/null and b/src/static/textures/block/wheat_stage3.png differ
diff --git a/src/static/textures/block/wheat_stage4.png b/src/static/textures/block/wheat_stage4.png
new file mode 100644
index 0000000000000000000000000000000000000000..55158823a7fe7e23fb0de5fed2e653b63fb7109e
Binary files /dev/null and b/src/static/textures/block/wheat_stage4.png differ
diff --git a/src/static/textures/block/wheat_stage5.png b/src/static/textures/block/wheat_stage5.png
new file mode 100644
index 0000000000000000000000000000000000000000..cbdea26c318d0839915179aad3406da3bbaa441a
Binary files /dev/null and b/src/static/textures/block/wheat_stage5.png differ
diff --git a/src/static/textures/block/wheat_stage6.png b/src/static/textures/block/wheat_stage6.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ccae7620a5399fe40613a03f6bb9db2bd87859c
Binary files /dev/null and b/src/static/textures/block/wheat_stage6.png differ
diff --git a/src/static/textures/block/wheat_stage7.png b/src/static/textures/block/wheat_stage7.png
new file mode 100644
index 0000000000000000000000000000000000000000..5da710a2b5f6ca51a4a11ff83aa44efe60f2267e
Binary files /dev/null and b/src/static/textures/block/wheat_stage7.png differ
diff --git a/src/static/textures/block/white_tulip.png b/src/static/textures/block/white_tulip.png
new file mode 100644
index 0000000000000000000000000000000000000000..cf7ef07716300a3d6394f3f9f3103deea1f21be0
Binary files /dev/null and b/src/static/textures/block/white_tulip.png differ
diff --git a/src/static/textures/entity/alex.png b/src/static/textures/entity/alex.png
new file mode 100644
index 0000000000000000000000000000000000000000..ffd8e0719a1a4fac1f58895ed3a30130d3aa4b46
Binary files /dev/null and b/src/static/textures/entity/alex.png differ
diff --git a/src/static/textures/entity/armorstand/wood.png b/src/static/textures/entity/armorstand/wood.png
new file mode 100644
index 0000000000000000000000000000000000000000..e03750a466901b30c8d7f6c7b4f1f825e111d02e
Binary files /dev/null and b/src/static/textures/entity/armorstand/wood.png differ
diff --git a/src/static/textures/entity/arrow.png b/src/static/textures/entity/arrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d58b2cc48fce89b3146541d0662c661a3d4fda8
Binary files /dev/null and b/src/static/textures/entity/arrow.png differ
diff --git a/src/static/textures/entity/banner/base.png b/src/static/textures/entity/banner/base.png
new file mode 100644
index 0000000000000000000000000000000000000000..a590eabcbf03f653da26d02ce9d096d24a536cb3
Binary files /dev/null and b/src/static/textures/entity/banner/base.png differ
diff --git a/src/static/textures/entity/banner/border.png b/src/static/textures/entity/banner/border.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e5fb43277bf0f1e7cb2b2a57c26b96be8f892cd
Binary files /dev/null and b/src/static/textures/entity/banner/border.png differ
diff --git a/src/static/textures/entity/banner/bricks.png b/src/static/textures/entity/banner/bricks.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0d49a7cfff60fe8b1415f004c5b2d0cbf06fdb8
Binary files /dev/null and b/src/static/textures/entity/banner/bricks.png differ
diff --git a/src/static/textures/entity/banner/circle.png b/src/static/textures/entity/banner/circle.png
new file mode 100644
index 0000000000000000000000000000000000000000..5e1e20cd5b204b0f5d07766ed5e9635060e42407
Binary files /dev/null and b/src/static/textures/entity/banner/circle.png differ
diff --git a/src/static/textures/entity/banner/creeper.png b/src/static/textures/entity/banner/creeper.png
new file mode 100644
index 0000000000000000000000000000000000000000..2949472b3b1d5a65ee2b9406b855326b7b4b9c3a
Binary files /dev/null and b/src/static/textures/entity/banner/creeper.png differ
diff --git a/src/static/textures/entity/banner/cross.png b/src/static/textures/entity/banner/cross.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a6c8c67446c37f5342d40154c8b70973d56737b
Binary files /dev/null and b/src/static/textures/entity/banner/cross.png differ
diff --git a/src/static/textures/entity/banner/curly_border.png b/src/static/textures/entity/banner/curly_border.png
new file mode 100644
index 0000000000000000000000000000000000000000..d94a79a6dcfc45df0f52123aa289ba2b4041bcb4
Binary files /dev/null and b/src/static/textures/entity/banner/curly_border.png differ
diff --git a/src/static/textures/entity/banner/diagonal_left.png b/src/static/textures/entity/banner/diagonal_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..f3712198073c9bcd8f37168e8562b892ff8c6c27
Binary files /dev/null and b/src/static/textures/entity/banner/diagonal_left.png differ
diff --git a/src/static/textures/entity/banner/diagonal_right.png b/src/static/textures/entity/banner/diagonal_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f2b34b31a893b396e11aa4b8a1b20c1025af2a7
Binary files /dev/null and b/src/static/textures/entity/banner/diagonal_right.png differ
diff --git a/src/static/textures/entity/banner/diagonal_up_left.png b/src/static/textures/entity/banner/diagonal_up_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..c1bfa32a7c2fc04482d92c59789bf2147809f569
Binary files /dev/null and b/src/static/textures/entity/banner/diagonal_up_left.png differ
diff --git a/src/static/textures/entity/banner/diagonal_up_right.png b/src/static/textures/entity/banner/diagonal_up_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e99514d80997951bb817a6cb6eddffa4e831394
Binary files /dev/null and b/src/static/textures/entity/banner/diagonal_up_right.png differ
diff --git a/src/static/textures/entity/banner/flower.png b/src/static/textures/entity/banner/flower.png
new file mode 100644
index 0000000000000000000000000000000000000000..6efa798c4b456ec11eb1ab43d7e53274bdbb74f4
Binary files /dev/null and b/src/static/textures/entity/banner/flower.png differ
diff --git a/src/static/textures/entity/banner/gradient.png b/src/static/textures/entity/banner/gradient.png
new file mode 100644
index 0000000000000000000000000000000000000000..8bc09cf7486c948cc014260b9daf4915798a2b8d
Binary files /dev/null and b/src/static/textures/entity/banner/gradient.png differ
diff --git a/src/static/textures/entity/banner/gradient_up.png b/src/static/textures/entity/banner/gradient_up.png
new file mode 100644
index 0000000000000000000000000000000000000000..59591815aefd6ae2a8af60633249ff3475942121
Binary files /dev/null and b/src/static/textures/entity/banner/gradient_up.png differ
diff --git a/src/static/textures/entity/banner/half_horizontal.png b/src/static/textures/entity/banner/half_horizontal.png
new file mode 100644
index 0000000000000000000000000000000000000000..0ab546894ec3c4738062916bc1ff4d61badb2db5
Binary files /dev/null and b/src/static/textures/entity/banner/half_horizontal.png differ
diff --git a/src/static/textures/entity/banner/half_horizontal_bottom.png b/src/static/textures/entity/banner/half_horizontal_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..c91c8cd46ad7eb2f2935ea6542a98e0ad0546f41
Binary files /dev/null and b/src/static/textures/entity/banner/half_horizontal_bottom.png differ
diff --git a/src/static/textures/entity/banner/half_vertical.png b/src/static/textures/entity/banner/half_vertical.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f36e216a6972ee606027f21fa2eae632bc7a121
Binary files /dev/null and b/src/static/textures/entity/banner/half_vertical.png differ
diff --git a/src/static/textures/entity/banner/half_vertical_right.png b/src/static/textures/entity/banner/half_vertical_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..a8a9eb159c3b4bb0bb33ba5dad322cb5d9c75e93
Binary files /dev/null and b/src/static/textures/entity/banner/half_vertical_right.png differ
diff --git a/src/static/textures/entity/banner/mojang.png b/src/static/textures/entity/banner/mojang.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f993a770b6fc52d7202f3dda7b474ba46b0625b
Binary files /dev/null and b/src/static/textures/entity/banner/mojang.png differ
diff --git a/src/static/textures/entity/banner/rhombus.png b/src/static/textures/entity/banner/rhombus.png
new file mode 100644
index 0000000000000000000000000000000000000000..4657c81e6a74243cbbc0b3e577dfd0d515491794
Binary files /dev/null and b/src/static/textures/entity/banner/rhombus.png differ
diff --git a/src/static/textures/entity/banner/skull.png b/src/static/textures/entity/banner/skull.png
new file mode 100644
index 0000000000000000000000000000000000000000..77135d4226b439c71f7daa01f567a8b72c04cb9a
Binary files /dev/null and b/src/static/textures/entity/banner/skull.png differ
diff --git a/src/static/textures/entity/banner/small_stripes.png b/src/static/textures/entity/banner/small_stripes.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d2fe6b6e987803ff01f4f74ed155aa830289d0b
Binary files /dev/null and b/src/static/textures/entity/banner/small_stripes.png differ
diff --git a/src/static/textures/entity/banner/square_bottom_left.png b/src/static/textures/entity/banner/square_bottom_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f68ec37ed5d906db44be87022a624bb7044e664
Binary files /dev/null and b/src/static/textures/entity/banner/square_bottom_left.png differ
diff --git a/src/static/textures/entity/banner/square_bottom_right.png b/src/static/textures/entity/banner/square_bottom_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..799ba3c7af06f422bceef458cd43d1b9145454bf
Binary files /dev/null and b/src/static/textures/entity/banner/square_bottom_right.png differ
diff --git a/src/static/textures/entity/banner/square_top_left.png b/src/static/textures/entity/banner/square_top_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..02a40e41547b832f276c2f5c9c38f27f19df48f2
Binary files /dev/null and b/src/static/textures/entity/banner/square_top_left.png differ
diff --git a/src/static/textures/entity/banner/square_top_right.png b/src/static/textures/entity/banner/square_top_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..43f67b89913df8338d92d1db4357ea0f54c952cc
Binary files /dev/null and b/src/static/textures/entity/banner/square_top_right.png differ
diff --git a/src/static/textures/entity/banner/straight_cross.png b/src/static/textures/entity/banner/straight_cross.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d5a8c6cd4df1f0e55a22df79319be68edc168c7
Binary files /dev/null and b/src/static/textures/entity/banner/straight_cross.png differ
diff --git a/src/static/textures/entity/banner/stripe_bottom.png b/src/static/textures/entity/banner/stripe_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..b6aafa5c22a3adf36631a47b245fc69e116c4623
Binary files /dev/null and b/src/static/textures/entity/banner/stripe_bottom.png differ
diff --git a/src/static/textures/entity/banner/stripe_center.png b/src/static/textures/entity/banner/stripe_center.png
new file mode 100644
index 0000000000000000000000000000000000000000..5383cae488ffc2b7f85c91c333070a9a175a6499
Binary files /dev/null and b/src/static/textures/entity/banner/stripe_center.png differ
diff --git a/src/static/textures/entity/banner/stripe_downleft.png b/src/static/textures/entity/banner/stripe_downleft.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff79d2a0b46de8a77205c0ae9fab03e05a087ffa
Binary files /dev/null and b/src/static/textures/entity/banner/stripe_downleft.png differ
diff --git a/src/static/textures/entity/banner/stripe_downright.png b/src/static/textures/entity/banner/stripe_downright.png
new file mode 100644
index 0000000000000000000000000000000000000000..79bbbd06316cc0e1f99d99541f02b7138b32c62a
Binary files /dev/null and b/src/static/textures/entity/banner/stripe_downright.png differ
diff --git a/src/static/textures/entity/banner/stripe_left.png b/src/static/textures/entity/banner/stripe_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..45dabd3a67b45f98c5bcd63d325a559e98624440
Binary files /dev/null and b/src/static/textures/entity/banner/stripe_left.png differ
diff --git a/src/static/textures/entity/banner/stripe_middle.png b/src/static/textures/entity/banner/stripe_middle.png
new file mode 100644
index 0000000000000000000000000000000000000000..e98e6a8b82478e20d0c2f5a0cacd2b98b01bf824
Binary files /dev/null and b/src/static/textures/entity/banner/stripe_middle.png differ
diff --git a/src/static/textures/entity/banner/stripe_right.png b/src/static/textures/entity/banner/stripe_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..1dc458a6e21d38761da78d13892b7f6bca41ad7b
Binary files /dev/null and b/src/static/textures/entity/banner/stripe_right.png differ
diff --git a/src/static/textures/entity/banner/stripe_top.png b/src/static/textures/entity/banner/stripe_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c260396a5b8cb62d9e6f2ef98eb18079ecf1d01
Binary files /dev/null and b/src/static/textures/entity/banner/stripe_top.png differ
diff --git a/src/static/textures/entity/banner/triangle_bottom.png b/src/static/textures/entity/banner/triangle_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..03cd25446480b8dacf73b4c788d4ee901b2d77cd
Binary files /dev/null and b/src/static/textures/entity/banner/triangle_bottom.png differ
diff --git a/src/static/textures/entity/banner/triangle_top.png b/src/static/textures/entity/banner/triangle_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..852336cbc8d66003a8bf34c2ca9b59764ba29903
Binary files /dev/null and b/src/static/textures/entity/banner/triangle_top.png differ
diff --git a/src/static/textures/entity/banner/triangles_bottom.png b/src/static/textures/entity/banner/triangles_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..75631252ec4e1ffd2a052965dedcf912643536d8
Binary files /dev/null and b/src/static/textures/entity/banner/triangles_bottom.png differ
diff --git a/src/static/textures/entity/banner/triangles_top.png b/src/static/textures/entity/banner/triangles_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..25158e93ca85f3980801ccf697eaf0e096d7b678
Binary files /dev/null and b/src/static/textures/entity/banner/triangles_top.png differ
diff --git a/src/static/textures/entity/banner_base.png b/src/static/textures/entity/banner_base.png
new file mode 100644
index 0000000000000000000000000000000000000000..5ef802b4d4d26ab9cfa5826ec60f54b6ee830c44
Binary files /dev/null and b/src/static/textures/entity/banner_base.png differ
diff --git a/src/static/textures/entity/bat.png b/src/static/textures/entity/bat.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f71bc4797b2f080715853357470eaf0ef2518ff
Binary files /dev/null and b/src/static/textures/entity/bat.png differ
diff --git a/src/static/textures/entity/beacon_beam.png b/src/static/textures/entity/beacon_beam.png
new file mode 100644
index 0000000000000000000000000000000000000000..a2da8c6f4be3796cf393de7394444125b8e16783
Binary files /dev/null and b/src/static/textures/entity/beacon_beam.png differ
diff --git a/src/static/textures/entity/bear/polarbear.png b/src/static/textures/entity/bear/polarbear.png
new file mode 100644
index 0000000000000000000000000000000000000000..59de9a1c1be2ce7c5fcba8378c061ee3c8108aac
Binary files /dev/null and b/src/static/textures/entity/bear/polarbear.png differ
diff --git a/src/static/textures/entity/bed/black.png b/src/static/textures/entity/bed/black.png
new file mode 100644
index 0000000000000000000000000000000000000000..c35406749702e9f083410b77d306c1a2565a8307
Binary files /dev/null and b/src/static/textures/entity/bed/black.png differ
diff --git a/src/static/textures/entity/bed/blue.png b/src/static/textures/entity/bed/blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..c958553377418886901d8f093d61235eeecc7b6f
Binary files /dev/null and b/src/static/textures/entity/bed/blue.png differ
diff --git a/src/static/textures/entity/bed/brown.png b/src/static/textures/entity/bed/brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..8e4376171721c1c1d4a0099b020632fff8fc077c
Binary files /dev/null and b/src/static/textures/entity/bed/brown.png differ
diff --git a/src/static/textures/entity/bed/cyan.png b/src/static/textures/entity/bed/cyan.png
new file mode 100644
index 0000000000000000000000000000000000000000..f06c0224ba370e68b1e8425e54527ae5104e6a60
Binary files /dev/null and b/src/static/textures/entity/bed/cyan.png differ
diff --git a/src/static/textures/entity/bed/gray.png b/src/static/textures/entity/bed/gray.png
new file mode 100644
index 0000000000000000000000000000000000000000..5e78b0028e4b0394e3146d57ebee94323a6425a6
Binary files /dev/null and b/src/static/textures/entity/bed/gray.png differ
diff --git a/src/static/textures/entity/bed/green.png b/src/static/textures/entity/bed/green.png
new file mode 100644
index 0000000000000000000000000000000000000000..46ca48db7fa5b4ae5ea6e8b6e6eeca3a799f3698
Binary files /dev/null and b/src/static/textures/entity/bed/green.png differ
diff --git a/src/static/textures/entity/bed/light_blue.png b/src/static/textures/entity/bed/light_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ce3438628b86fce761770ee5352ce84b7fe4b65
Binary files /dev/null and b/src/static/textures/entity/bed/light_blue.png differ
diff --git a/src/static/textures/entity/bed/light_gray.png b/src/static/textures/entity/bed/light_gray.png
new file mode 100644
index 0000000000000000000000000000000000000000..d9750242544f4dd9710d697e5da86d4d1a36fc50
Binary files /dev/null and b/src/static/textures/entity/bed/light_gray.png differ
diff --git a/src/static/textures/entity/bed/lime.png b/src/static/textures/entity/bed/lime.png
new file mode 100644
index 0000000000000000000000000000000000000000..df400273132d8485fe39c74018f076f27f8b8f50
Binary files /dev/null and b/src/static/textures/entity/bed/lime.png differ
diff --git a/src/static/textures/entity/bed/magenta.png b/src/static/textures/entity/bed/magenta.png
new file mode 100644
index 0000000000000000000000000000000000000000..5695d9b20f485ff9663507767611ccfe7618e0db
Binary files /dev/null and b/src/static/textures/entity/bed/magenta.png differ
diff --git a/src/static/textures/entity/bed/orange.png b/src/static/textures/entity/bed/orange.png
new file mode 100644
index 0000000000000000000000000000000000000000..f202506b17bbe7baf1e3a8f1c26339d35e3bb1c1
Binary files /dev/null and b/src/static/textures/entity/bed/orange.png differ
diff --git a/src/static/textures/entity/bed/pink.png b/src/static/textures/entity/bed/pink.png
new file mode 100644
index 0000000000000000000000000000000000000000..79053b4cdc147e18aaa44d1ed9b1bed0a23aa5fc
Binary files /dev/null and b/src/static/textures/entity/bed/pink.png differ
diff --git a/src/static/textures/entity/bed/purple.png b/src/static/textures/entity/bed/purple.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd73a8d2d7e669df3d4ea0e414e7104ee3bcbe1e
Binary files /dev/null and b/src/static/textures/entity/bed/purple.png differ
diff --git a/src/static/textures/entity/bed/red.png b/src/static/textures/entity/bed/red.png
new file mode 100644
index 0000000000000000000000000000000000000000..1fcc696c5c0cc41819bcc7bbf86db5d5c0ae7378
Binary files /dev/null and b/src/static/textures/entity/bed/red.png differ
diff --git a/src/static/textures/entity/bed/white.png b/src/static/textures/entity/bed/white.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9100293c336fcd9322f73b8a9ac2965a0ea901c
Binary files /dev/null and b/src/static/textures/entity/bed/white.png differ
diff --git a/src/static/textures/entity/bed/yellow.png b/src/static/textures/entity/bed/yellow.png
new file mode 100644
index 0000000000000000000000000000000000000000..f694c9b0d1580403139b68e7cf3104a42c98382d
Binary files /dev/null and b/src/static/textures/entity/bed/yellow.png differ
diff --git a/src/static/textures/entity/blaze.png b/src/static/textures/entity/blaze.png
new file mode 100644
index 0000000000000000000000000000000000000000..afcc89f69f7e82bda5afc14d701cfe368e09fa0a
Binary files /dev/null and b/src/static/textures/entity/blaze.png differ
diff --git a/src/static/textures/entity/boat/acacia.png b/src/static/textures/entity/boat/acacia.png
new file mode 100644
index 0000000000000000000000000000000000000000..c2d4a9f8c9319785589cabf7d4f19830b4543b49
Binary files /dev/null and b/src/static/textures/entity/boat/acacia.png differ
diff --git a/src/static/textures/entity/boat/birch.png b/src/static/textures/entity/boat/birch.png
new file mode 100644
index 0000000000000000000000000000000000000000..80ece7f4539d47a04fc7e4db8fc516188e84a72d
Binary files /dev/null and b/src/static/textures/entity/boat/birch.png differ
diff --git a/src/static/textures/entity/boat/dark_oak.png b/src/static/textures/entity/boat/dark_oak.png
new file mode 100644
index 0000000000000000000000000000000000000000..93af354a5c29500e096c6e1c32d90d029b3543ce
Binary files /dev/null and b/src/static/textures/entity/boat/dark_oak.png differ
diff --git a/src/static/textures/entity/boat/jungle.png b/src/static/textures/entity/boat/jungle.png
new file mode 100644
index 0000000000000000000000000000000000000000..868f2c64137cd1e3ff15ba466728c68bca4d21b0
Binary files /dev/null and b/src/static/textures/entity/boat/jungle.png differ
diff --git a/src/static/textures/entity/boat/oak.png b/src/static/textures/entity/boat/oak.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef01f7c1e98e1578aaf9d5fc0e475cb455273e9e
Binary files /dev/null and b/src/static/textures/entity/boat/oak.png differ
diff --git a/src/static/textures/entity/boat/spruce.png b/src/static/textures/entity/boat/spruce.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c604d737c90795806e08b15e51e5f78d267e918
Binary files /dev/null and b/src/static/textures/entity/boat/spruce.png differ
diff --git a/src/static/textures/entity/cat/black.png b/src/static/textures/entity/cat/black.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c9334abb1ac9fd3c39109e2471724bfff7fdd2f
Binary files /dev/null and b/src/static/textures/entity/cat/black.png differ
diff --git a/src/static/textures/entity/cat/ocelot.png b/src/static/textures/entity/cat/ocelot.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f24e606b631f653e3816739c6ceb7f015096344
Binary files /dev/null and b/src/static/textures/entity/cat/ocelot.png differ
diff --git a/src/static/textures/entity/cat/red.png b/src/static/textures/entity/cat/red.png
new file mode 100644
index 0000000000000000000000000000000000000000..68edb25e90aa211a6e2cc6a4048b35c5f31234bb
Binary files /dev/null and b/src/static/textures/entity/cat/red.png differ
diff --git a/src/static/textures/entity/cat/siamese.png b/src/static/textures/entity/cat/siamese.png
new file mode 100644
index 0000000000000000000000000000000000000000..8131120c08fb1925397387f2cf5efde6cf0e0cc5
Binary files /dev/null and b/src/static/textures/entity/cat/siamese.png differ
diff --git a/src/static/textures/entity/chest/christmas.png b/src/static/textures/entity/chest/christmas.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a0fa73ff271e39de135aca5a6c43d427d94a7a0
Binary files /dev/null and b/src/static/textures/entity/chest/christmas.png differ
diff --git a/src/static/textures/entity/chest/christmas_double.png b/src/static/textures/entity/chest/christmas_double.png
new file mode 100644
index 0000000000000000000000000000000000000000..fe14d144c4059a63c94dbc53a60f4ccfc63265a0
Binary files /dev/null and b/src/static/textures/entity/chest/christmas_double.png differ
diff --git a/src/static/textures/entity/chest/ender.png b/src/static/textures/entity/chest/ender.png
new file mode 100644
index 0000000000000000000000000000000000000000..642fe4cbdd07d0cb2e6e3ce48967934634d7a820
Binary files /dev/null and b/src/static/textures/entity/chest/ender.png differ
diff --git a/src/static/textures/entity/chest/normal.png b/src/static/textures/entity/chest/normal.png
new file mode 100644
index 0000000000000000000000000000000000000000..cbf73176145bd87b8e87971ec188979cec8d9ccc
Binary files /dev/null and b/src/static/textures/entity/chest/normal.png differ
diff --git a/src/static/textures/entity/chest/normal_double.png b/src/static/textures/entity/chest/normal_double.png
new file mode 100644
index 0000000000000000000000000000000000000000..cd9be7d3af99ee94e5528cd549031a2bf693e4fa
Binary files /dev/null and b/src/static/textures/entity/chest/normal_double.png differ
diff --git a/src/static/textures/entity/chest/trapped.png b/src/static/textures/entity/chest/trapped.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb00a5be5dc578b0678e2c2748d118054d0cb267
Binary files /dev/null and b/src/static/textures/entity/chest/trapped.png differ
diff --git a/src/static/textures/entity/chest/trapped_double.png b/src/static/textures/entity/chest/trapped_double.png
new file mode 100644
index 0000000000000000000000000000000000000000..8ab8e63a36a2093566028e971e17aad1c127df6f
Binary files /dev/null and b/src/static/textures/entity/chest/trapped_double.png differ
diff --git a/src/static/textures/entity/chicken.png b/src/static/textures/entity/chicken.png
new file mode 100644
index 0000000000000000000000000000000000000000..474d417d5c720b6f9756d49312fadab8b8bcb137
Binary files /dev/null and b/src/static/textures/entity/chicken.png differ
diff --git a/src/static/textures/entity/cow/cow.png b/src/static/textures/entity/cow/cow.png
new file mode 100644
index 0000000000000000000000000000000000000000..28af09b411843e16dbc4810f1c267bdc0e1625d9
Binary files /dev/null and b/src/static/textures/entity/cow/cow.png differ
diff --git a/src/static/textures/entity/cow/mooshroom.png b/src/static/textures/entity/cow/mooshroom.png
new file mode 100644
index 0000000000000000000000000000000000000000..d9af0878be6a4f62dee103097ed8acc4decebe9a
Binary files /dev/null and b/src/static/textures/entity/cow/mooshroom.png differ
diff --git a/src/static/textures/entity/creeper/creeper.png b/src/static/textures/entity/creeper/creeper.png
new file mode 100644
index 0000000000000000000000000000000000000000..671f979fb21d78a1e0aa6a0f2deb6f190478d03e
Binary files /dev/null and b/src/static/textures/entity/creeper/creeper.png differ
diff --git a/src/static/textures/entity/creeper/creeper_armor.png b/src/static/textures/entity/creeper/creeper_armor.png
new file mode 100644
index 0000000000000000000000000000000000000000..cc905d4daaf71e51ffd2b8d1d88ca8746f31c5c2
Binary files /dev/null and b/src/static/textures/entity/creeper/creeper_armor.png differ
diff --git a/src/static/textures/entity/elytra.png b/src/static/textures/entity/elytra.png
new file mode 100644
index 0000000000000000000000000000000000000000..f3389ab787806cd8d8a28bfb8c8817cd8b657b81
Binary files /dev/null and b/src/static/textures/entity/elytra.png differ
diff --git a/src/static/textures/entity/enchanting_table_book.png b/src/static/textures/entity/enchanting_table_book.png
new file mode 100644
index 0000000000000000000000000000000000000000..7a4c21648a2b29a5bd5b8e13d01e006aa920d1f5
Binary files /dev/null and b/src/static/textures/entity/enchanting_table_book.png differ
diff --git a/src/static/textures/entity/end_gateway_beam.png b/src/static/textures/entity/end_gateway_beam.png
new file mode 100644
index 0000000000000000000000000000000000000000..e5071ee77addf4b07b723aa31987cfcad5fdccea
Binary files /dev/null and b/src/static/textures/entity/end_gateway_beam.png differ
diff --git a/src/static/textures/entity/end_portal.png b/src/static/textures/entity/end_portal.png
new file mode 100644
index 0000000000000000000000000000000000000000..173731a1fd75aeef5e1398ea43693fa4cf258a7e
Binary files /dev/null and b/src/static/textures/entity/end_portal.png differ
diff --git a/src/static/textures/entity/endercrystal/endercrystal.png b/src/static/textures/entity/endercrystal/endercrystal.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc7cf0d04a8dedb79bc3d27ad63a4b08f5e16775
Binary files /dev/null and b/src/static/textures/entity/endercrystal/endercrystal.png differ
diff --git a/src/static/textures/entity/endercrystal/endercrystal_beam.png b/src/static/textures/entity/endercrystal/endercrystal_beam.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c2e187cd9b0282a5ed587a379716c8dbebb96e7
Binary files /dev/null and b/src/static/textures/entity/endercrystal/endercrystal_beam.png differ
diff --git a/src/static/textures/entity/enderdragon/dragon.png b/src/static/textures/entity/enderdragon/dragon.png
new file mode 100644
index 0000000000000000000000000000000000000000..05c7d7e11dd401b176bf795d41028cf4975929ca
Binary files /dev/null and b/src/static/textures/entity/enderdragon/dragon.png differ
diff --git a/src/static/textures/entity/enderdragon/dragon_exploding.png b/src/static/textures/entity/enderdragon/dragon_exploding.png
new file mode 100644
index 0000000000000000000000000000000000000000..a47a3732ae91086833c1d06a8edf9f74811a6625
Binary files /dev/null and b/src/static/textures/entity/enderdragon/dragon_exploding.png differ
diff --git a/src/static/textures/entity/enderdragon/dragon_eyes.png b/src/static/textures/entity/enderdragon/dragon_eyes.png
new file mode 100644
index 0000000000000000000000000000000000000000..146d604e0b8fb604d277e6b6bb298a36f3122995
Binary files /dev/null and b/src/static/textures/entity/enderdragon/dragon_eyes.png differ
diff --git a/src/static/textures/entity/enderdragon/dragon_fireball.png b/src/static/textures/entity/enderdragon/dragon_fireball.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a3fe5530f95216418280be354c357cd06663eb4
Binary files /dev/null and b/src/static/textures/entity/enderdragon/dragon_fireball.png differ
diff --git a/src/static/textures/entity/enderman/enderman.png b/src/static/textures/entity/enderman/enderman.png
new file mode 100644
index 0000000000000000000000000000000000000000..0413f8c5885faf2f6826dcd1ad3c646aa29821d3
Binary files /dev/null and b/src/static/textures/entity/enderman/enderman.png differ
diff --git a/src/static/textures/entity/enderman/enderman_eyes.png b/src/static/textures/entity/enderman/enderman_eyes.png
new file mode 100644
index 0000000000000000000000000000000000000000..ade580efd10bfafef8f0c4f64a254e9361ab48f3
Binary files /dev/null and b/src/static/textures/entity/enderman/enderman_eyes.png differ
diff --git a/src/static/textures/entity/endermite.png b/src/static/textures/entity/endermite.png
new file mode 100644
index 0000000000000000000000000000000000000000..066bde7482406b59159182b41db8f10ef79c242c
Binary files /dev/null and b/src/static/textures/entity/endermite.png differ
diff --git a/src/static/textures/entity/experience_orb.png b/src/static/textures/entity/experience_orb.png
new file mode 100644
index 0000000000000000000000000000000000000000..0a56f0f61d26a6a524a0e7696b25f3a32fe9717f
Binary files /dev/null and b/src/static/textures/entity/experience_orb.png differ
diff --git a/src/static/textures/entity/explosion.png b/src/static/textures/entity/explosion.png
new file mode 100644
index 0000000000000000000000000000000000000000..f51ab53cb8f047fdb5ad2cb91433f0e3f9fe9659
Binary files /dev/null and b/src/static/textures/entity/explosion.png differ
diff --git a/src/static/textures/entity/ghast/ghast.png b/src/static/textures/entity/ghast/ghast.png
new file mode 100644
index 0000000000000000000000000000000000000000..ca2823e9d459a779f014203946e6e10923862a2a
Binary files /dev/null and b/src/static/textures/entity/ghast/ghast.png differ
diff --git a/src/static/textures/entity/ghast/ghast_shooting.png b/src/static/textures/entity/ghast/ghast_shooting.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e6badbd81eb7ddf525e1711cb8b50dfe24e8a7a
Binary files /dev/null and b/src/static/textures/entity/ghast/ghast_shooting.png differ
diff --git a/src/static/textures/entity/guardian.png b/src/static/textures/entity/guardian.png
new file mode 100644
index 0000000000000000000000000000000000000000..9945242bb8494ade260ffe78d1a0eb2268dbfc5f
Binary files /dev/null and b/src/static/textures/entity/guardian.png differ
diff --git a/src/static/textures/entity/guardian_beam.png b/src/static/textures/entity/guardian_beam.png
new file mode 100644
index 0000000000000000000000000000000000000000..73a23109d058a73841d1ec20c14c9dbab9372608
Binary files /dev/null and b/src/static/textures/entity/guardian_beam.png differ
diff --git a/src/static/textures/entity/guardian_elder.png b/src/static/textures/entity/guardian_elder.png
new file mode 100644
index 0000000000000000000000000000000000000000..79e0f2c10de600676412b6fa0046d3c0c3f0d6b7
Binary files /dev/null and b/src/static/textures/entity/guardian_elder.png differ
diff --git a/src/static/textures/entity/horse/armor/horse_armor_diamond.png b/src/static/textures/entity/horse/armor/horse_armor_diamond.png
new file mode 100644
index 0000000000000000000000000000000000000000..e9e299039e1faf7eb0dccb8a952d4c4faf791462
Binary files /dev/null and b/src/static/textures/entity/horse/armor/horse_armor_diamond.png differ
diff --git a/src/static/textures/entity/horse/armor/horse_armor_gold.png b/src/static/textures/entity/horse/armor/horse_armor_gold.png
new file mode 100644
index 0000000000000000000000000000000000000000..094ecb4a59ab58ad9d03c52251ffecddd7937cdc
Binary files /dev/null and b/src/static/textures/entity/horse/armor/horse_armor_gold.png differ
diff --git a/src/static/textures/entity/horse/armor/horse_armor_iron.png b/src/static/textures/entity/horse/armor/horse_armor_iron.png
new file mode 100644
index 0000000000000000000000000000000000000000..3925a0578b3bf5a98b15077e5e60114ed612d792
Binary files /dev/null and b/src/static/textures/entity/horse/armor/horse_armor_iron.png differ
diff --git a/src/static/textures/entity/horse/armor/horsearmor.zip b/src/static/textures/entity/horse/armor/horsearmor.zip
new file mode 100644
index 0000000000000000000000000000000000000000..fc88289c8cb2b2a6de53e05ded03f07eaa796e1e
Binary files /dev/null and b/src/static/textures/entity/horse/armor/horsearmor.zip differ
diff --git a/src/static/textures/entity/horse/donkey.png b/src/static/textures/entity/horse/donkey.png
new file mode 100644
index 0000000000000000000000000000000000000000..3dc9f53b2d29516feb010b5ece92f094b4cfe6f2
Binary files /dev/null and b/src/static/textures/entity/horse/donkey.png differ
diff --git a/src/static/textures/entity/horse/horse_black.png b/src/static/textures/entity/horse/horse_black.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b002fce32feecca647a16d16fc4f9bfd0e4e0ee
Binary files /dev/null and b/src/static/textures/entity/horse/horse_black.png differ
diff --git a/src/static/textures/entity/horse/horse_brown.png b/src/static/textures/entity/horse/horse_brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ecb7807e26862b74176d9f1271bc9c6b8edcb30
Binary files /dev/null and b/src/static/textures/entity/horse/horse_brown.png differ
diff --git a/src/static/textures/entity/horse/horse_chestnut.png b/src/static/textures/entity/horse/horse_chestnut.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d3ff5cfb7faa883c3c356003e455802a140ad90
Binary files /dev/null and b/src/static/textures/entity/horse/horse_chestnut.png differ
diff --git a/src/static/textures/entity/horse/horse_creamy.png b/src/static/textures/entity/horse/horse_creamy.png
new file mode 100644
index 0000000000000000000000000000000000000000..a3f05d70e1904b783a84de85f74ee83eca69595e
Binary files /dev/null and b/src/static/textures/entity/horse/horse_creamy.png differ
diff --git a/src/static/textures/entity/horse/horse_darkbrown.png b/src/static/textures/entity/horse/horse_darkbrown.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c9e2f6dc905630b53d435839622d198bfc34ec8
Binary files /dev/null and b/src/static/textures/entity/horse/horse_darkbrown.png differ
diff --git a/src/static/textures/entity/horse/horse_gray.png b/src/static/textures/entity/horse/horse_gray.png
new file mode 100644
index 0000000000000000000000000000000000000000..747d418dac10e1c9ab4e94e21759136ec432f72b
Binary files /dev/null and b/src/static/textures/entity/horse/horse_gray.png differ
diff --git a/src/static/textures/entity/horse/horse_markings_blackdots.png b/src/static/textures/entity/horse/horse_markings_blackdots.png
new file mode 100644
index 0000000000000000000000000000000000000000..90bbd826276074dd3280db3aac492e0e51ea4236
Binary files /dev/null and b/src/static/textures/entity/horse/horse_markings_blackdots.png differ
diff --git a/src/static/textures/entity/horse/horse_markings_white.png b/src/static/textures/entity/horse/horse_markings_white.png
new file mode 100644
index 0000000000000000000000000000000000000000..4799ff6a9f02dc3c263712366020745e6fcea31a
Binary files /dev/null and b/src/static/textures/entity/horse/horse_markings_white.png differ
diff --git a/src/static/textures/entity/horse/horse_markings_whitedots.png b/src/static/textures/entity/horse/horse_markings_whitedots.png
new file mode 100644
index 0000000000000000000000000000000000000000..42a8fd0cead8406f97b3aa1323996607a47f38f1
Binary files /dev/null and b/src/static/textures/entity/horse/horse_markings_whitedots.png differ
diff --git a/src/static/textures/entity/horse/horse_markings_whitefield.png b/src/static/textures/entity/horse/horse_markings_whitefield.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7432314be3befdc80e3972c19c303bbebbbca72
Binary files /dev/null and b/src/static/textures/entity/horse/horse_markings_whitefield.png differ
diff --git a/src/static/textures/entity/horse/horse_skeleton.png b/src/static/textures/entity/horse/horse_skeleton.png
new file mode 100644
index 0000000000000000000000000000000000000000..1442ed76b61722dd941fa571380df5aaf103f645
Binary files /dev/null and b/src/static/textures/entity/horse/horse_skeleton.png differ
diff --git a/src/static/textures/entity/horse/horse_white.png b/src/static/textures/entity/horse/horse_white.png
new file mode 100644
index 0000000000000000000000000000000000000000..63abedc3f65ae7368c5da76a5a6793852fb07622
Binary files /dev/null and b/src/static/textures/entity/horse/horse_white.png differ
diff --git a/src/static/textures/entity/horse/horse_zombie.png b/src/static/textures/entity/horse/horse_zombie.png
new file mode 100644
index 0000000000000000000000000000000000000000..1aaaa8d3f4c87fcc913602f5ff7a243bda7a5a0e
Binary files /dev/null and b/src/static/textures/entity/horse/horse_zombie.png differ
diff --git a/src/static/textures/entity/horse/mule.png b/src/static/textures/entity/horse/mule.png
new file mode 100644
index 0000000000000000000000000000000000000000..897cc726b6fe10bbceaf2bf0a9d53b2b3b204371
Binary files /dev/null and b/src/static/textures/entity/horse/mule.png differ
diff --git a/src/static/textures/entity/illager/evoker.png b/src/static/textures/entity/illager/evoker.png
new file mode 100644
index 0000000000000000000000000000000000000000..480dc616fcdac2dc4ca149e77609faeeb49b108a
Binary files /dev/null and b/src/static/textures/entity/illager/evoker.png differ
diff --git a/src/static/textures/entity/illager/evoker_fangs.png b/src/static/textures/entity/illager/evoker_fangs.png
new file mode 100644
index 0000000000000000000000000000000000000000..98db535a5a5ad387034030464a7a8e9a51febe68
Binary files /dev/null and b/src/static/textures/entity/illager/evoker_fangs.png differ
diff --git a/src/static/textures/entity/illager/illusioner.png b/src/static/textures/entity/illager/illusioner.png
new file mode 100644
index 0000000000000000000000000000000000000000..72f5ee8e713ff8aee4c3abde642fedf5827e3fc2
Binary files /dev/null and b/src/static/textures/entity/illager/illusioner.png differ
diff --git a/src/static/textures/entity/illager/vex.png b/src/static/textures/entity/illager/vex.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd538e7ddc7b77c17f93d15c3f6e776bd8b68425
Binary files /dev/null and b/src/static/textures/entity/illager/vex.png differ
diff --git a/src/static/textures/entity/illager/vex_charging.png b/src/static/textures/entity/illager/vex_charging.png
new file mode 100644
index 0000000000000000000000000000000000000000..971114e7d199eb5829943cc8113d314420b7ce14
Binary files /dev/null and b/src/static/textures/entity/illager/vex_charging.png differ
diff --git a/src/static/textures/entity/illager/vindicator.png b/src/static/textures/entity/illager/vindicator.png
new file mode 100644
index 0000000000000000000000000000000000000000..9903ac56aaa89498d343412446305d26052a9687
Binary files /dev/null and b/src/static/textures/entity/illager/vindicator.png differ
diff --git a/src/static/textures/entity/iron_golem.png b/src/static/textures/entity/iron_golem.png
new file mode 100644
index 0000000000000000000000000000000000000000..bceb861ece8805c240211218e0239825553941b8
Binary files /dev/null and b/src/static/textures/entity/iron_golem.png differ
diff --git a/src/static/textures/entity/lead_knot.png b/src/static/textures/entity/lead_knot.png
new file mode 100644
index 0000000000000000000000000000000000000000..d6783071be8693109b9a84eec638b6c33244e4fb
Binary files /dev/null and b/src/static/textures/entity/lead_knot.png differ
diff --git a/src/static/textures/entity/llama/brown.png b/src/static/textures/entity/llama/brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..1099137660164d3b18a11304a758adbdd6a4a758
Binary files /dev/null and b/src/static/textures/entity/llama/brown.png differ
diff --git a/src/static/textures/entity/llama/creamy.png b/src/static/textures/entity/llama/creamy.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a4b6877ef84ba7560fcbe4ad605c474563e3a82
Binary files /dev/null and b/src/static/textures/entity/llama/creamy.png differ
diff --git a/src/static/textures/entity/llama/decor/black.png b/src/static/textures/entity/llama/decor/black.png
new file mode 100644
index 0000000000000000000000000000000000000000..92387637188b970feac121015f704d2041a7358a
Binary files /dev/null and b/src/static/textures/entity/llama/decor/black.png differ
diff --git a/src/static/textures/entity/llama/decor/blue.png b/src/static/textures/entity/llama/decor/blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf7762e190f791b7afe19b3dcbf8be35372e4d00
Binary files /dev/null and b/src/static/textures/entity/llama/decor/blue.png differ
diff --git a/src/static/textures/entity/llama/decor/brown.png b/src/static/textures/entity/llama/decor/brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..03a80e1256c3298467efacd33c9677990e0e5190
Binary files /dev/null and b/src/static/textures/entity/llama/decor/brown.png differ
diff --git a/src/static/textures/entity/llama/decor/cyan.png b/src/static/textures/entity/llama/decor/cyan.png
new file mode 100644
index 0000000000000000000000000000000000000000..f149b9cdc906a9585f0bb825f7c4a86a7fd7b339
Binary files /dev/null and b/src/static/textures/entity/llama/decor/cyan.png differ
diff --git a/src/static/textures/entity/llama/decor/gray.png b/src/static/textures/entity/llama/decor/gray.png
new file mode 100644
index 0000000000000000000000000000000000000000..a2f1b4f0157401679b80483d4d7feab1b8015f90
Binary files /dev/null and b/src/static/textures/entity/llama/decor/gray.png differ
diff --git a/src/static/textures/entity/llama/decor/green.png b/src/static/textures/entity/llama/decor/green.png
new file mode 100644
index 0000000000000000000000000000000000000000..732d7ec1c3c83a1c3c9749f87ded831138930b4e
Binary files /dev/null and b/src/static/textures/entity/llama/decor/green.png differ
diff --git a/src/static/textures/entity/llama/decor/light_blue.png b/src/static/textures/entity/llama/decor/light_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..500a404f377fda981efb6f6d1cd8d95c20ed8b2f
Binary files /dev/null and b/src/static/textures/entity/llama/decor/light_blue.png differ
diff --git a/src/static/textures/entity/llama/decor/light_gray.png b/src/static/textures/entity/llama/decor/light_gray.png
new file mode 100644
index 0000000000000000000000000000000000000000..01cda39515096da215be764fbe31095b3301b8db
Binary files /dev/null and b/src/static/textures/entity/llama/decor/light_gray.png differ
diff --git a/src/static/textures/entity/llama/decor/lime.png b/src/static/textures/entity/llama/decor/lime.png
new file mode 100644
index 0000000000000000000000000000000000000000..238eff412191e9ca5c4fc8952734094fef0846fd
Binary files /dev/null and b/src/static/textures/entity/llama/decor/lime.png differ
diff --git a/src/static/textures/entity/llama/decor/magenta.png b/src/static/textures/entity/llama/decor/magenta.png
new file mode 100644
index 0000000000000000000000000000000000000000..0ff23355960dcf272274c79145bb3bfd305959b6
Binary files /dev/null and b/src/static/textures/entity/llama/decor/magenta.png differ
diff --git a/src/static/textures/entity/llama/decor/orange.png b/src/static/textures/entity/llama/decor/orange.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b24951a62952081be4492cfcb914642b3a01c52
Binary files /dev/null and b/src/static/textures/entity/llama/decor/orange.png differ
diff --git a/src/static/textures/entity/llama/decor/pink.png b/src/static/textures/entity/llama/decor/pink.png
new file mode 100644
index 0000000000000000000000000000000000000000..897ba65db9015fd168c59b1eaaa5ee9c2b9b68c0
Binary files /dev/null and b/src/static/textures/entity/llama/decor/pink.png differ
diff --git a/src/static/textures/entity/llama/decor/purple.png b/src/static/textures/entity/llama/decor/purple.png
new file mode 100644
index 0000000000000000000000000000000000000000..308adbecb735103bc4620af9a4d49817150f9bbe
Binary files /dev/null and b/src/static/textures/entity/llama/decor/purple.png differ
diff --git a/src/static/textures/entity/llama/decor/red.png b/src/static/textures/entity/llama/decor/red.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b83dc37b06b948eeb6951f87cdb117102fbffd4
Binary files /dev/null and b/src/static/textures/entity/llama/decor/red.png differ
diff --git a/src/static/textures/entity/llama/decor/white.png b/src/static/textures/entity/llama/decor/white.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8cf176122095ede5941e327837bad06f049eb77
Binary files /dev/null and b/src/static/textures/entity/llama/decor/white.png differ
diff --git a/src/static/textures/entity/llama/decor/yellow.png b/src/static/textures/entity/llama/decor/yellow.png
new file mode 100644
index 0000000000000000000000000000000000000000..64144cf525ce6ccfbdc2c27375b0486952cb2c7a
Binary files /dev/null and b/src/static/textures/entity/llama/decor/yellow.png differ
diff --git a/src/static/textures/entity/llama/gray.png b/src/static/textures/entity/llama/gray.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e170d117e0d4a23ed2a42746f4a99a28a0d082c
Binary files /dev/null and b/src/static/textures/entity/llama/gray.png differ
diff --git a/src/static/textures/entity/llama/spit.png b/src/static/textures/entity/llama/spit.png
new file mode 100644
index 0000000000000000000000000000000000000000..fdcc4b1219109b8a4b1cefabc08699895668d2c4
Binary files /dev/null and b/src/static/textures/entity/llama/spit.png differ
diff --git a/src/static/textures/entity/llama/white.png b/src/static/textures/entity/llama/white.png
new file mode 100644
index 0000000000000000000000000000000000000000..d84fe1575e7492f4a1c77f425df1647d825d47b1
Binary files /dev/null and b/src/static/textures/entity/llama/white.png differ
diff --git a/src/static/textures/entity/minecart.png b/src/static/textures/entity/minecart.png
new file mode 100644
index 0000000000000000000000000000000000000000..5ca94c005f98b8f1a1b1a703dad8120ae2a7d572
Binary files /dev/null and b/src/static/textures/entity/minecart.png differ
diff --git a/src/static/textures/entity/parrot/parrot_blue.png b/src/static/textures/entity/parrot/parrot_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..ae93edf489877b83f112199a28638eecdf15626f
Binary files /dev/null and b/src/static/textures/entity/parrot/parrot_blue.png differ
diff --git a/src/static/textures/entity/parrot/parrot_green.png b/src/static/textures/entity/parrot/parrot_green.png
new file mode 100644
index 0000000000000000000000000000000000000000..efa83d916f3a46a39884b5fb37ab02244776ad84
Binary files /dev/null and b/src/static/textures/entity/parrot/parrot_green.png differ
diff --git a/src/static/textures/entity/parrot/parrot_grey.png b/src/static/textures/entity/parrot/parrot_grey.png
new file mode 100644
index 0000000000000000000000000000000000000000..8de45ef596e50006b786e7b17c21dc229aaeffce
Binary files /dev/null and b/src/static/textures/entity/parrot/parrot_grey.png differ
diff --git a/src/static/textures/entity/parrot/parrot_red_blue.png b/src/static/textures/entity/parrot/parrot_red_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..3287808651cc14ddc190f7aef52d889c6c24855a
Binary files /dev/null and b/src/static/textures/entity/parrot/parrot_red_blue.png differ
diff --git a/src/static/textures/entity/parrot/parrot_yellow_blue.png b/src/static/textures/entity/parrot/parrot_yellow_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..91e54255047a79ee210609d0e18cf65926be59d6
Binary files /dev/null and b/src/static/textures/entity/parrot/parrot_yellow_blue.png differ
diff --git a/src/static/textures/entity/pig/pig.png b/src/static/textures/entity/pig/pig.png
new file mode 100644
index 0000000000000000000000000000000000000000..940f4fa763dc3efe751e9bd433c47905edfae8b2
Binary files /dev/null and b/src/static/textures/entity/pig/pig.png differ
diff --git a/src/static/textures/entity/pig/pig_saddle.png b/src/static/textures/entity/pig/pig_saddle.png
new file mode 100644
index 0000000000000000000000000000000000000000..6bedbb2b92dc69fec859c00523dde832cbc01ade
Binary files /dev/null and b/src/static/textures/entity/pig/pig_saddle.png differ
diff --git a/src/static/textures/entity/projectiles/arrow.png b/src/static/textures/entity/projectiles/arrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..b1214231fe42ee29805dd6d6e0dd3a8101f8558f
Binary files /dev/null and b/src/static/textures/entity/projectiles/arrow.png differ
diff --git a/src/static/textures/entity/projectiles/spectral_arrow.png b/src/static/textures/entity/projectiles/spectral_arrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..22a9d00b099092df486639b9e21e7cf1f138c1a7
Binary files /dev/null and b/src/static/textures/entity/projectiles/spectral_arrow.png differ
diff --git a/src/static/textures/entity/projectiles/tipped_arrow.png b/src/static/textures/entity/projectiles/tipped_arrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..b1214231fe42ee29805dd6d6e0dd3a8101f8558f
Binary files /dev/null and b/src/static/textures/entity/projectiles/tipped_arrow.png differ
diff --git a/src/static/textures/entity/rabbit/black.png b/src/static/textures/entity/rabbit/black.png
new file mode 100644
index 0000000000000000000000000000000000000000..afb0fbc406504a8d0dbd989136fc0f08e1d6ce8d
Binary files /dev/null and b/src/static/textures/entity/rabbit/black.png differ
diff --git a/src/static/textures/entity/rabbit/brown.png b/src/static/textures/entity/rabbit/brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..b8dc8ccc76c0c29ff0abe9c73c741d5261da8a3b
Binary files /dev/null and b/src/static/textures/entity/rabbit/brown.png differ
diff --git a/src/static/textures/entity/rabbit/caerbannog.png b/src/static/textures/entity/rabbit/caerbannog.png
new file mode 100644
index 0000000000000000000000000000000000000000..409a4fc3d29caa8d043cb28de7165bd31a970a37
Binary files /dev/null and b/src/static/textures/entity/rabbit/caerbannog.png differ
diff --git a/src/static/textures/entity/rabbit/gold.png b/src/static/textures/entity/rabbit/gold.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f649f851bd47a163f1fcd271f827cd61e0a3f32
Binary files /dev/null and b/src/static/textures/entity/rabbit/gold.png differ
diff --git a/src/static/textures/entity/rabbit/salt.png b/src/static/textures/entity/rabbit/salt.png
new file mode 100644
index 0000000000000000000000000000000000000000..5afe309ed38666af40c35d68c5a60f32f2478f24
Binary files /dev/null and b/src/static/textures/entity/rabbit/salt.png differ
diff --git a/src/static/textures/entity/rabbit/toast.png b/src/static/textures/entity/rabbit/toast.png
new file mode 100644
index 0000000000000000000000000000000000000000..56c666785efcf5ea1d1af4bb069328888a9e2244
Binary files /dev/null and b/src/static/textures/entity/rabbit/toast.png differ
diff --git a/src/static/textures/entity/rabbit/white.png b/src/static/textures/entity/rabbit/white.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0ea1a156f97b4ccc5a2917e3e477829c1636c6e
Binary files /dev/null and b/src/static/textures/entity/rabbit/white.png differ
diff --git a/src/static/textures/entity/rabbit/white_splotched.png b/src/static/textures/entity/rabbit/white_splotched.png
new file mode 100644
index 0000000000000000000000000000000000000000..3cd3cdfe2dcb14e4e0f114b20877158f2e9f2ce0
Binary files /dev/null and b/src/static/textures/entity/rabbit/white_splotched.png differ
diff --git a/src/static/textures/entity/sheep/sheep.png b/src/static/textures/entity/sheep/sheep.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a4c1191b2d47b34c2ef66bf59a3203d66f078a5
Binary files /dev/null and b/src/static/textures/entity/sheep/sheep.png differ
diff --git a/src/static/textures/entity/sheep/sheep_fur.png b/src/static/textures/entity/sheep/sheep_fur.png
new file mode 100644
index 0000000000000000000000000000000000000000..4d58751eebb7a501410afecc6c0e61947b392d06
Binary files /dev/null and b/src/static/textures/entity/sheep/sheep_fur.png differ
diff --git a/src/static/textures/entity/shield/base.png b/src/static/textures/entity/shield/base.png
new file mode 100644
index 0000000000000000000000000000000000000000..3297e7f3673747a436243e895d4c93918e63ffbf
Binary files /dev/null and b/src/static/textures/entity/shield/base.png differ
diff --git a/src/static/textures/entity/shield/border.png b/src/static/textures/entity/shield/border.png
new file mode 100644
index 0000000000000000000000000000000000000000..82e13d9832d9f58040ffd23dcd0eb107a977e378
Binary files /dev/null and b/src/static/textures/entity/shield/border.png differ
diff --git a/src/static/textures/entity/shield/bricks.png b/src/static/textures/entity/shield/bricks.png
new file mode 100644
index 0000000000000000000000000000000000000000..da9d147f81df3d3de1a1119ba104f48e49ee5081
Binary files /dev/null and b/src/static/textures/entity/shield/bricks.png differ
diff --git a/src/static/textures/entity/shield/circle.png b/src/static/textures/entity/shield/circle.png
new file mode 100644
index 0000000000000000000000000000000000000000..86506deb8e00b27d343fa786fb26a2e9a7b8efcc
Binary files /dev/null and b/src/static/textures/entity/shield/circle.png differ
diff --git a/src/static/textures/entity/shield/creeper.png b/src/static/textures/entity/shield/creeper.png
new file mode 100644
index 0000000000000000000000000000000000000000..b98b3d0a0810db7daeec4f28f0b2c9917a9aff5e
Binary files /dev/null and b/src/static/textures/entity/shield/creeper.png differ
diff --git a/src/static/textures/entity/shield/cross.png b/src/static/textures/entity/shield/cross.png
new file mode 100644
index 0000000000000000000000000000000000000000..241aca14bf65e8a62768e128c30571f58276a267
Binary files /dev/null and b/src/static/textures/entity/shield/cross.png differ
diff --git a/src/static/textures/entity/shield/curly_border.png b/src/static/textures/entity/shield/curly_border.png
new file mode 100644
index 0000000000000000000000000000000000000000..76c520778a7b5fb8378c541e16262fb663b6bea6
Binary files /dev/null and b/src/static/textures/entity/shield/curly_border.png differ
diff --git a/src/static/textures/entity/shield/diagonal_left.png b/src/static/textures/entity/shield/diagonal_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..06a187064377c6aef506579e4d9c5d8a3b1aaeec
Binary files /dev/null and b/src/static/textures/entity/shield/diagonal_left.png differ
diff --git a/src/static/textures/entity/shield/diagonal_right.png b/src/static/textures/entity/shield/diagonal_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..2eb15cee33a572bf33bee3d01f6c7326607aa8e4
Binary files /dev/null and b/src/static/textures/entity/shield/diagonal_right.png differ
diff --git a/src/static/textures/entity/shield/diagonal_up_left.png b/src/static/textures/entity/shield/diagonal_up_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..1d475c449f1e8387d8f5e5edf4a7b90bd1d49162
Binary files /dev/null and b/src/static/textures/entity/shield/diagonal_up_left.png differ
diff --git a/src/static/textures/entity/shield/diagonal_up_right.png b/src/static/textures/entity/shield/diagonal_up_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..e863fe8c2ca90ae0e0bc696e3c1ca23b1b748039
Binary files /dev/null and b/src/static/textures/entity/shield/diagonal_up_right.png differ
diff --git a/src/static/textures/entity/shield/flower.png b/src/static/textures/entity/shield/flower.png
new file mode 100644
index 0000000000000000000000000000000000000000..a20c753ac7a2f33b04ac8998004b250a28824bb5
Binary files /dev/null and b/src/static/textures/entity/shield/flower.png differ
diff --git a/src/static/textures/entity/shield/gradient.png b/src/static/textures/entity/shield/gradient.png
new file mode 100644
index 0000000000000000000000000000000000000000..d1abad8b2707346861b648202f9f245fb7216acb
Binary files /dev/null and b/src/static/textures/entity/shield/gradient.png differ
diff --git a/src/static/textures/entity/shield/gradient_up.png b/src/static/textures/entity/shield/gradient_up.png
new file mode 100644
index 0000000000000000000000000000000000000000..7921b3b2d117f5804441d2757f3ea4bf9fa7764d
Binary files /dev/null and b/src/static/textures/entity/shield/gradient_up.png differ
diff --git a/src/static/textures/entity/shield/half_horizontal.png b/src/static/textures/entity/shield/half_horizontal.png
new file mode 100644
index 0000000000000000000000000000000000000000..b6680525de934c124c9b5ba1b1cb2fae56035174
Binary files /dev/null and b/src/static/textures/entity/shield/half_horizontal.png differ
diff --git a/src/static/textures/entity/shield/half_horizontal_bottom.png b/src/static/textures/entity/shield/half_horizontal_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..4bd2e96eb45b86d8b683431daf3e4455f2ff3037
Binary files /dev/null and b/src/static/textures/entity/shield/half_horizontal_bottom.png differ
diff --git a/src/static/textures/entity/shield/half_vertical.png b/src/static/textures/entity/shield/half_vertical.png
new file mode 100644
index 0000000000000000000000000000000000000000..cafda3141852ce2e15e0afe08f72dea7209b030d
Binary files /dev/null and b/src/static/textures/entity/shield/half_vertical.png differ
diff --git a/src/static/textures/entity/shield/half_vertical_right.png b/src/static/textures/entity/shield/half_vertical_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..2600259fe247308fb0ee7449bd73cf6eff8778de
Binary files /dev/null and b/src/static/textures/entity/shield/half_vertical_right.png differ
diff --git a/src/static/textures/entity/shield/mojang.png b/src/static/textures/entity/shield/mojang.png
new file mode 100644
index 0000000000000000000000000000000000000000..0343c52ca458ccd4decfe7fdf180a2ec70943844
Binary files /dev/null and b/src/static/textures/entity/shield/mojang.png differ
diff --git a/src/static/textures/entity/shield/rhombus.png b/src/static/textures/entity/shield/rhombus.png
new file mode 100644
index 0000000000000000000000000000000000000000..73826cea54a5e7db7e4f5024e0b44ee78c9b390a
Binary files /dev/null and b/src/static/textures/entity/shield/rhombus.png differ
diff --git a/src/static/textures/entity/shield/skull.png b/src/static/textures/entity/shield/skull.png
new file mode 100644
index 0000000000000000000000000000000000000000..7e35b2bbd213bc988cd347e8c0c58ff4900b1f80
Binary files /dev/null and b/src/static/textures/entity/shield/skull.png differ
diff --git a/src/static/textures/entity/shield/small_stripes.png b/src/static/textures/entity/shield/small_stripes.png
new file mode 100644
index 0000000000000000000000000000000000000000..0463217561ca0089cc55444a4073deb69bbbfbc8
Binary files /dev/null and b/src/static/textures/entity/shield/small_stripes.png differ
diff --git a/src/static/textures/entity/shield/square_bottom_left.png b/src/static/textures/entity/shield/square_bottom_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..b88380a8944c77198bb19cb6e450401274366c69
Binary files /dev/null and b/src/static/textures/entity/shield/square_bottom_left.png differ
diff --git a/src/static/textures/entity/shield/square_bottom_right.png b/src/static/textures/entity/shield/square_bottom_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..a9bcd06176de62576641d1df7ec7b24de24b1d39
Binary files /dev/null and b/src/static/textures/entity/shield/square_bottom_right.png differ
diff --git a/src/static/textures/entity/shield/square_top_left.png b/src/static/textures/entity/shield/square_top_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..a47d54b5fa7badbc79f66e6239866ca1f7342b75
Binary files /dev/null and b/src/static/textures/entity/shield/square_top_left.png differ
diff --git a/src/static/textures/entity/shield/square_top_right.png b/src/static/textures/entity/shield/square_top_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..2592b93849dca1557a1a8284f47fea6af66ea513
Binary files /dev/null and b/src/static/textures/entity/shield/square_top_right.png differ
diff --git a/src/static/textures/entity/shield/straight_cross.png b/src/static/textures/entity/shield/straight_cross.png
new file mode 100644
index 0000000000000000000000000000000000000000..c613b973d18f2a3bf2538f21e472a1817c2cec91
Binary files /dev/null and b/src/static/textures/entity/shield/straight_cross.png differ
diff --git a/src/static/textures/entity/shield/stripe_bottom.png b/src/static/textures/entity/shield/stripe_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..b13d3020030bbb9fb77f06c7e3ba2e55bd72ddc6
Binary files /dev/null and b/src/static/textures/entity/shield/stripe_bottom.png differ
diff --git a/src/static/textures/entity/shield/stripe_center.png b/src/static/textures/entity/shield/stripe_center.png
new file mode 100644
index 0000000000000000000000000000000000000000..35372717070a2a85dd46f566a8db96f8b925232c
Binary files /dev/null and b/src/static/textures/entity/shield/stripe_center.png differ
diff --git a/src/static/textures/entity/shield/stripe_downleft.png b/src/static/textures/entity/shield/stripe_downleft.png
new file mode 100644
index 0000000000000000000000000000000000000000..178755a14bf2483e3b7b506319d3d8c667178fac
Binary files /dev/null and b/src/static/textures/entity/shield/stripe_downleft.png differ
diff --git a/src/static/textures/entity/shield/stripe_downright.png b/src/static/textures/entity/shield/stripe_downright.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb042d15b706d1431b11e77c2ed30fa03d337066
Binary files /dev/null and b/src/static/textures/entity/shield/stripe_downright.png differ
diff --git a/src/static/textures/entity/shield/stripe_left.png b/src/static/textures/entity/shield/stripe_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..0bf94a61a96e8e095acbc91c0965cdea253a5152
Binary files /dev/null and b/src/static/textures/entity/shield/stripe_left.png differ
diff --git a/src/static/textures/entity/shield/stripe_middle.png b/src/static/textures/entity/shield/stripe_middle.png
new file mode 100644
index 0000000000000000000000000000000000000000..33c8d187dd2bc9aecff8e94f2ba0ba44a90c1040
Binary files /dev/null and b/src/static/textures/entity/shield/stripe_middle.png differ
diff --git a/src/static/textures/entity/shield/stripe_right.png b/src/static/textures/entity/shield/stripe_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..697da64edc28cb773fd5ce47877d73b21b21cfd3
Binary files /dev/null and b/src/static/textures/entity/shield/stripe_right.png differ
diff --git a/src/static/textures/entity/shield/stripe_top.png b/src/static/textures/entity/shield/stripe_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..eca1076ada2632a99008ab05c36716c298eede89
Binary files /dev/null and b/src/static/textures/entity/shield/stripe_top.png differ
diff --git a/src/static/textures/entity/shield/triangle_bottom.png b/src/static/textures/entity/shield/triangle_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..03c37d32cd0dc150b208e580e07c83d4b0b99d2c
Binary files /dev/null and b/src/static/textures/entity/shield/triangle_bottom.png differ
diff --git a/src/static/textures/entity/shield/triangle_top.png b/src/static/textures/entity/shield/triangle_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..26412bf8aef2593df9914b23e1f088c11e2f1785
Binary files /dev/null and b/src/static/textures/entity/shield/triangle_top.png differ
diff --git a/src/static/textures/entity/shield/triangles_bottom.png b/src/static/textures/entity/shield/triangles_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a18dbd759b2329489fbeeaae207cf4f330e70db
Binary files /dev/null and b/src/static/textures/entity/shield/triangles_bottom.png differ
diff --git a/src/static/textures/entity/shield/triangles_top.png b/src/static/textures/entity/shield/triangles_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e07c37cd08506289e6fedc517171c292ffa51e4
Binary files /dev/null and b/src/static/textures/entity/shield/triangles_top.png differ
diff --git a/src/static/textures/entity/shield_base.png b/src/static/textures/entity/shield_base.png
new file mode 100644
index 0000000000000000000000000000000000000000..8015a92bf8d8811c0a8e4a2a152f2419afb07c2e
Binary files /dev/null and b/src/static/textures/entity/shield_base.png differ
diff --git a/src/static/textures/entity/shield_base_nopattern.png b/src/static/textures/entity/shield_base_nopattern.png
new file mode 100644
index 0000000000000000000000000000000000000000..7011454d1c9791bae6cbeaf0bd51f1ec76e27bca
Binary files /dev/null and b/src/static/textures/entity/shield_base_nopattern.png differ
diff --git a/src/static/textures/entity/shulker/shulker.png b/src/static/textures/entity/shulker/shulker.png
new file mode 100644
index 0000000000000000000000000000000000000000..d21605ab706597004cac3c2c0ea31397ded1e2a3
Binary files /dev/null and b/src/static/textures/entity/shulker/shulker.png differ
diff --git a/src/static/textures/entity/shulker/shulker_black.png b/src/static/textures/entity/shulker/shulker_black.png
new file mode 100644
index 0000000000000000000000000000000000000000..2800401d80793eac670324b4fd538b4ac7b4d0ef
Binary files /dev/null and b/src/static/textures/entity/shulker/shulker_black.png differ
diff --git a/src/static/textures/entity/shulker/shulker_blue.png b/src/static/textures/entity/shulker/shulker_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c4244fd273e8a6bcc68642e0934e68167d47456
Binary files /dev/null and b/src/static/textures/entity/shulker/shulker_blue.png differ
diff --git a/src/static/textures/entity/shulker/shulker_brown.png b/src/static/textures/entity/shulker/shulker_brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..9237440b2717e1608b0a63463522c3ded85b914f
Binary files /dev/null and b/src/static/textures/entity/shulker/shulker_brown.png differ
diff --git a/src/static/textures/entity/shulker/shulker_cyan.png b/src/static/textures/entity/shulker/shulker_cyan.png
new file mode 100644
index 0000000000000000000000000000000000000000..13b82557ebcb7b19238a0b85718f7a37b7dde92f
Binary files /dev/null and b/src/static/textures/entity/shulker/shulker_cyan.png differ
diff --git a/src/static/textures/entity/shulker/shulker_gray.png b/src/static/textures/entity/shulker/shulker_gray.png
new file mode 100644
index 0000000000000000000000000000000000000000..f365c6aff0497580d9a7fdf3162fe8dc1a65639b
Binary files /dev/null and b/src/static/textures/entity/shulker/shulker_gray.png differ
diff --git a/src/static/textures/entity/shulker/shulker_green.png b/src/static/textures/entity/shulker/shulker_green.png
new file mode 100644
index 0000000000000000000000000000000000000000..b09b655d98cb7a596aa84a8a921a434da7ed3970
Binary files /dev/null and b/src/static/textures/entity/shulker/shulker_green.png differ
diff --git a/src/static/textures/entity/shulker/shulker_light_blue.png b/src/static/textures/entity/shulker/shulker_light_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..6646995c8ec19590a9f5aba60f42ac70bb1fad03
Binary files /dev/null and b/src/static/textures/entity/shulker/shulker_light_blue.png differ
diff --git a/src/static/textures/entity/shulker/shulker_light_gray.png b/src/static/textures/entity/shulker/shulker_light_gray.png
new file mode 100644
index 0000000000000000000000000000000000000000..d709f7aea0fd18002ada9f108bb1311a61093a88
Binary files /dev/null and b/src/static/textures/entity/shulker/shulker_light_gray.png differ
diff --git a/src/static/textures/entity/shulker/shulker_lime.png b/src/static/textures/entity/shulker/shulker_lime.png
new file mode 100644
index 0000000000000000000000000000000000000000..e02f983d19b954321f6ed3b3739c5ac945fbd438
Binary files /dev/null and b/src/static/textures/entity/shulker/shulker_lime.png differ
diff --git a/src/static/textures/entity/shulker/shulker_magenta.png b/src/static/textures/entity/shulker/shulker_magenta.png
new file mode 100644
index 0000000000000000000000000000000000000000..a713f81a1a0b96874969acfccf150f2dcfb6a202
Binary files /dev/null and b/src/static/textures/entity/shulker/shulker_magenta.png differ
diff --git a/src/static/textures/entity/shulker/shulker_orange.png b/src/static/textures/entity/shulker/shulker_orange.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ebf14827e15c5716716828516a9ad6e72319868
Binary files /dev/null and b/src/static/textures/entity/shulker/shulker_orange.png differ
diff --git a/src/static/textures/entity/shulker/shulker_pink.png b/src/static/textures/entity/shulker/shulker_pink.png
new file mode 100644
index 0000000000000000000000000000000000000000..1cac5170c18ba876bcb35ba7131778fbd309a9a5
Binary files /dev/null and b/src/static/textures/entity/shulker/shulker_pink.png differ
diff --git a/src/static/textures/entity/shulker/shulker_red.png b/src/static/textures/entity/shulker/shulker_red.png
new file mode 100644
index 0000000000000000000000000000000000000000..c80c499fdc3528263c591e0c9f7aacd55424d453
Binary files /dev/null and b/src/static/textures/entity/shulker/shulker_red.png differ
diff --git a/src/static/textures/entity/shulker/shulker_white.png b/src/static/textures/entity/shulker/shulker_white.png
new file mode 100644
index 0000000000000000000000000000000000000000..6b21cac8cae282a858092e3e613bb90c6a46c49d
Binary files /dev/null and b/src/static/textures/entity/shulker/shulker_white.png differ
diff --git a/src/static/textures/entity/shulker/shulker_yellow.png b/src/static/textures/entity/shulker/shulker_yellow.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b5436d2695982323876a23b513a7b7a58d48547
Binary files /dev/null and b/src/static/textures/entity/shulker/shulker_yellow.png differ
diff --git a/src/static/textures/entity/shulker/spark.png b/src/static/textures/entity/shulker/spark.png
new file mode 100644
index 0000000000000000000000000000000000000000..69315a9e245d2c89575ee8d1712f34f1a8ebd105
Binary files /dev/null and b/src/static/textures/entity/shulker/spark.png differ
diff --git a/src/static/textures/entity/sign.png b/src/static/textures/entity/sign.png
new file mode 100644
index 0000000000000000000000000000000000000000..e0f23685847bf73d98a5fa3b07cc67b87c8bd525
Binary files /dev/null and b/src/static/textures/entity/sign.png differ
diff --git a/src/static/textures/entity/silverfish.png b/src/static/textures/entity/silverfish.png
new file mode 100644
index 0000000000000000000000000000000000000000..54dd997ddefbdcd45b118402ca2e1887fe93636b
Binary files /dev/null and b/src/static/textures/entity/silverfish.png differ
diff --git a/src/static/textures/entity/skeleton/skeleton.png b/src/static/textures/entity/skeleton/skeleton.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc8af339a737fb6c26af023b5cc5134a05b8f5dd
Binary files /dev/null and b/src/static/textures/entity/skeleton/skeleton.png differ
diff --git a/src/static/textures/entity/skeleton/stray.png b/src/static/textures/entity/skeleton/stray.png
new file mode 100644
index 0000000000000000000000000000000000000000..430ffc29874a3e5e82c81f46f9618bf8429be1b4
Binary files /dev/null and b/src/static/textures/entity/skeleton/stray.png differ
diff --git a/src/static/textures/entity/skeleton/stray_overlay.png b/src/static/textures/entity/skeleton/stray_overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..c1e6ac8eb37f3efabdb12176bd028b33b1bef84c
Binary files /dev/null and b/src/static/textures/entity/skeleton/stray_overlay.png differ
diff --git a/src/static/textures/entity/skeleton/wither_skeleton.png b/src/static/textures/entity/skeleton/wither_skeleton.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7b0c16e71ba2bbefd29bcdefee8224cdccec916
Binary files /dev/null and b/src/static/textures/entity/skeleton/wither_skeleton.png differ
diff --git a/src/static/textures/entity/slime/magmacube.png b/src/static/textures/entity/slime/magmacube.png
new file mode 100644
index 0000000000000000000000000000000000000000..50abb9ea00319dde0b975cf3af22f00b295496da
Binary files /dev/null and b/src/static/textures/entity/slime/magmacube.png differ
diff --git a/src/static/textures/entity/slime/slime.png b/src/static/textures/entity/slime/slime.png
new file mode 100644
index 0000000000000000000000000000000000000000..0b316be278fd9c3138b739e07e908ca942487599
Binary files /dev/null and b/src/static/textures/entity/slime/slime.png differ
diff --git a/src/static/textures/entity/snow_golem.png b/src/static/textures/entity/snow_golem.png
new file mode 100644
index 0000000000000000000000000000000000000000..53c52978030b3b757c75007ac083775268d94c66
Binary files /dev/null and b/src/static/textures/entity/snow_golem.png differ
diff --git a/src/static/textures/entity/spider/cave_spider.png b/src/static/textures/entity/spider/cave_spider.png
new file mode 100644
index 0000000000000000000000000000000000000000..4f4a47a506b6988e5aa407a3fcd0727cfba6535a
Binary files /dev/null and b/src/static/textures/entity/spider/cave_spider.png differ
diff --git a/src/static/textures/entity/spider/spider.png b/src/static/textures/entity/spider/spider.png
new file mode 100644
index 0000000000000000000000000000000000000000..895bac24a511d9db874b1fcf8193a463c8b3dc6d
Binary files /dev/null and b/src/static/textures/entity/spider/spider.png differ
diff --git a/src/static/textures/entity/spider_eyes.png b/src/static/textures/entity/spider_eyes.png
new file mode 100644
index 0000000000000000000000000000000000000000..f49b78ff8e5bd3e9842f944ad3da4ddd29c85dcd
Binary files /dev/null and b/src/static/textures/entity/spider_eyes.png differ
diff --git a/src/static/textures/entity/squid.png b/src/static/textures/entity/squid.png
new file mode 100644
index 0000000000000000000000000000000000000000..db97d6daab64979b7aad2d721d721eb7b969d777
Binary files /dev/null and b/src/static/textures/entity/squid.png differ
diff --git a/src/static/textures/entity/steve.png b/src/static/textures/entity/steve.png
new file mode 100644
index 0000000000000000000000000000000000000000..90d4fa236b5512e124a1aaaa2a2a357cca907e99
Binary files /dev/null and b/src/static/textures/entity/steve.png differ
diff --git a/src/static/textures/entity/sweep.png b/src/static/textures/entity/sweep.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b2eebf8e23f01b882a9116c42c7b98d31cdf8d6
Binary files /dev/null and b/src/static/textures/entity/sweep.png differ
diff --git a/src/static/textures/entity/witch.png b/src/static/textures/entity/witch.png
new file mode 100644
index 0000000000000000000000000000000000000000..d253cf0a0f4513aa4e4553d15cefa4e0ffd83876
Binary files /dev/null and b/src/static/textures/entity/witch.png differ
diff --git a/src/static/textures/entity/wither/wither.png b/src/static/textures/entity/wither/wither.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c9782b57def739e747468be4d844e343036e969
Binary files /dev/null and b/src/static/textures/entity/wither/wither.png differ
diff --git a/src/static/textures/entity/wither/wither_armor.png b/src/static/textures/entity/wither/wither_armor.png
new file mode 100644
index 0000000000000000000000000000000000000000..61e6da8795fd319f229c615e6edb7309ebc973d4
Binary files /dev/null and b/src/static/textures/entity/wither/wither_armor.png differ
diff --git a/src/static/textures/entity/wither/wither_invulnerable.png b/src/static/textures/entity/wither/wither_invulnerable.png
new file mode 100644
index 0000000000000000000000000000000000000000..f69e543f879c3f39e83b99b5427f3b0b24d65950
Binary files /dev/null and b/src/static/textures/entity/wither/wither_invulnerable.png differ
diff --git a/src/static/textures/entity/wolf/wolf.png b/src/static/textures/entity/wolf/wolf.png
new file mode 100644
index 0000000000000000000000000000000000000000..85c73d319d201e98b138d31181190486a89c4b63
Binary files /dev/null and b/src/static/textures/entity/wolf/wolf.png differ
diff --git a/src/static/textures/entity/wolf/wolf_angry.png b/src/static/textures/entity/wolf/wolf_angry.png
new file mode 100644
index 0000000000000000000000000000000000000000..72581a04c92acf2bea9162d31e510042268b4d27
Binary files /dev/null and b/src/static/textures/entity/wolf/wolf_angry.png differ
diff --git a/src/static/textures/entity/wolf/wolf_collar.png b/src/static/textures/entity/wolf/wolf_collar.png
new file mode 100644
index 0000000000000000000000000000000000000000..052cab72a6c69689c28f6fcbdedad5ab822e592a
Binary files /dev/null and b/src/static/textures/entity/wolf/wolf_collar.png differ
diff --git a/src/static/textures/entity/wolf/wolf_tame.png b/src/static/textures/entity/wolf/wolf_tame.png
new file mode 100644
index 0000000000000000000000000000000000000000..6c71b067b2f5ad883440d2e3848ba5d706fbc9e8
Binary files /dev/null and b/src/static/textures/entity/wolf/wolf_tame.png differ
diff --git a/src/static/textures/entity/zombie/husk.png b/src/static/textures/entity/zombie/husk.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b22b38cdf7681410c3d3138dd5bc2a03a3f1750
Binary files /dev/null and b/src/static/textures/entity/zombie/husk.png differ
diff --git a/src/static/textures/entity/zombie/zombie.png b/src/static/textures/entity/zombie/zombie.png
new file mode 100644
index 0000000000000000000000000000000000000000..5ad846e1c74f9b6aa77d972d13f43aa945175eed
Binary files /dev/null and b/src/static/textures/entity/zombie/zombie.png differ
diff --git a/src/static/textures/entity/zombie_pigman.png b/src/static/textures/entity/zombie_pigman.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d2615a6ee75e051d87d34336c6362ca164f816e
Binary files /dev/null and b/src/static/textures/entity/zombie_pigman.png differ
diff --git a/src/static/textures/gui/container/inventory.png b/src/static/textures/gui/container/inventory.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff5e9313c50f70c25ad1ab446220978af8542a1f
Binary files /dev/null and b/src/static/textures/gui/container/inventory.png differ
diff --git a/src/static/textures/item/acacia_boat.png b/src/static/textures/item/acacia_boat.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9bf658fbc11c4cd48b7b771f6a254bce4985544
Binary files /dev/null and b/src/static/textures/item/acacia_boat.png differ
diff --git a/src/static/textures/item/acacia_door.png b/src/static/textures/item/acacia_door.png
new file mode 100644
index 0000000000000000000000000000000000000000..201f93a7548a0251a21c3692b58b6fbe5eee77bd
Binary files /dev/null and b/src/static/textures/item/acacia_door.png differ
diff --git a/src/static/textures/item/apple.png b/src/static/textures/item/apple.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ee2b885717563fb943f521c0cf834b72ecdb183
Binary files /dev/null and b/src/static/textures/item/apple.png differ
diff --git a/src/static/textures/item/armor_stand.png b/src/static/textures/item/armor_stand.png
new file mode 100644
index 0000000000000000000000000000000000000000..c65badebe5d657aa540f1684f812662430e431d2
Binary files /dev/null and b/src/static/textures/item/armor_stand.png differ
diff --git a/src/static/textures/item/arrow.png b/src/static/textures/item/arrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..4f748a002f863bc423486817b6cd5f85c5dc5f5d
Binary files /dev/null and b/src/static/textures/item/arrow.png differ
diff --git a/src/static/textures/item/baked_potato.png b/src/static/textures/item/baked_potato.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8d3cbabb6f4673ba01a8c32e596c0ed3b139cbb
Binary files /dev/null and b/src/static/textures/item/baked_potato.png differ
diff --git a/src/static/textures/item/banner_overlay.png b/src/static/textures/item/banner_overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..999d01587d4373c56612cc1c11508b0f7f9e8557
Binary files /dev/null and b/src/static/textures/item/banner_overlay.png differ
diff --git a/src/static/textures/item/barrier.png b/src/static/textures/item/barrier.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e68169edfd910f64a73e0980d6d50becfdffa04
Binary files /dev/null and b/src/static/textures/item/barrier.png differ
diff --git a/src/static/textures/item/beef.png b/src/static/textures/item/beef.png
new file mode 100644
index 0000000000000000000000000000000000000000..6334716abdd6c6c70ce057c74c7802cfe8a1a930
Binary files /dev/null and b/src/static/textures/item/beef.png differ
diff --git a/src/static/textures/item/beetroot.png b/src/static/textures/item/beetroot.png
new file mode 100644
index 0000000000000000000000000000000000000000..48ccf011e5af9fca7f093d80d49134ba57731f4c
Binary files /dev/null and b/src/static/textures/item/beetroot.png differ
diff --git a/src/static/textures/item/beetroot_seeds.png b/src/static/textures/item/beetroot_seeds.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7529ad72dbcc4f26ced8f1b503328bc6fb7ab49
Binary files /dev/null and b/src/static/textures/item/beetroot_seeds.png differ
diff --git a/src/static/textures/item/beetroot_soup.png b/src/static/textures/item/beetroot_soup.png
new file mode 100644
index 0000000000000000000000000000000000000000..e26fe6e7a92b5f9e2969cac7125ca89852b25d5b
Binary files /dev/null and b/src/static/textures/item/beetroot_soup.png differ
diff --git a/src/static/textures/item/birch_boat.png b/src/static/textures/item/birch_boat.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c1ba55d9ad978e3c8a3b81a00ffd49b7a2da9aa
Binary files /dev/null and b/src/static/textures/item/birch_boat.png differ
diff --git a/src/static/textures/item/birch_door.png b/src/static/textures/item/birch_door.png
new file mode 100644
index 0000000000000000000000000000000000000000..d279ef1bc83580215e6e1f51145561699ebb2f6c
Binary files /dev/null and b/src/static/textures/item/birch_door.png differ
diff --git a/src/static/textures/item/blaze_powder.png b/src/static/textures/item/blaze_powder.png
new file mode 100644
index 0000000000000000000000000000000000000000..89c57d6ea68cb9dd66be63d214393cb2802fcdba
Binary files /dev/null and b/src/static/textures/item/blaze_powder.png differ
diff --git a/src/static/textures/item/blaze_rod.png b/src/static/textures/item/blaze_rod.png
new file mode 100644
index 0000000000000000000000000000000000000000..7050e10f07c550363f63329df08c38780c63ce25
Binary files /dev/null and b/src/static/textures/item/blaze_rod.png differ
diff --git a/src/static/textures/item/bone.png b/src/static/textures/item/bone.png
new file mode 100644
index 0000000000000000000000000000000000000000..7bb81afac10c5d5648e289f038ab79c8c41d4930
Binary files /dev/null and b/src/static/textures/item/bone.png differ
diff --git a/src/static/textures/item/bone_meal.png b/src/static/textures/item/bone_meal.png
new file mode 100644
index 0000000000000000000000000000000000000000..74dc137a506720aae69e64f3a9666ed3789c578a
Binary files /dev/null and b/src/static/textures/item/bone_meal.png differ
diff --git a/src/static/textures/item/book.png b/src/static/textures/item/book.png
new file mode 100644
index 0000000000000000000000000000000000000000..68abee6602ed2261459c45d15d1986dda6f6648e
Binary files /dev/null and b/src/static/textures/item/book.png differ
diff --git a/src/static/textures/item/bow.png b/src/static/textures/item/bow.png
new file mode 100644
index 0000000000000000000000000000000000000000..d709b9c8d77979eed3e65943595d59baa0e890d3
Binary files /dev/null and b/src/static/textures/item/bow.png differ
diff --git a/src/static/textures/item/bow_pulling_0.png b/src/static/textures/item/bow_pulling_0.png
new file mode 100644
index 0000000000000000000000000000000000000000..2022aabd80587668d4370770d60824a577ed100d
Binary files /dev/null and b/src/static/textures/item/bow_pulling_0.png differ
diff --git a/src/static/textures/item/bow_pulling_1.png b/src/static/textures/item/bow_pulling_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..a13207956f3d3a909f53324f1a8c654bb501852d
Binary files /dev/null and b/src/static/textures/item/bow_pulling_1.png differ
diff --git a/src/static/textures/item/bow_pulling_2.png b/src/static/textures/item/bow_pulling_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..d459e685693388ff1ea0ab911ab3a25d30687feb
Binary files /dev/null and b/src/static/textures/item/bow_pulling_2.png differ
diff --git a/src/static/textures/item/bowl.png b/src/static/textures/item/bowl.png
new file mode 100644
index 0000000000000000000000000000000000000000..826be5a46631d81f42af277967a4f19c38fe9b34
Binary files /dev/null and b/src/static/textures/item/bowl.png differ
diff --git a/src/static/textures/item/bread.png b/src/static/textures/item/bread.png
new file mode 100644
index 0000000000000000000000000000000000000000..b3943266ac4efc1633c17483d54f2930bbb59fd6
Binary files /dev/null and b/src/static/textures/item/bread.png differ
diff --git a/src/static/textures/item/brewing_stand.png b/src/static/textures/item/brewing_stand.png
new file mode 100644
index 0000000000000000000000000000000000000000..66e9d8dae47a6376d78c7744be3fe346ea7cd4c9
Binary files /dev/null and b/src/static/textures/item/brewing_stand.png differ
diff --git a/src/static/textures/item/brick.png b/src/static/textures/item/brick.png
new file mode 100644
index 0000000000000000000000000000000000000000..1fb55776cd0244e61e0cc7f9e124f1d66f482215
Binary files /dev/null and b/src/static/textures/item/brick.png differ
diff --git a/src/static/textures/item/broken_elytra.png b/src/static/textures/item/broken_elytra.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd92e7f759491063fb9b7f11f888d4dc9e61968b
Binary files /dev/null and b/src/static/textures/item/broken_elytra.png differ
diff --git a/src/static/textures/item/bucket.png b/src/static/textures/item/bucket.png
new file mode 100644
index 0000000000000000000000000000000000000000..735a4afb22247b199992b8fb989a66b72bb06293
Binary files /dev/null and b/src/static/textures/item/bucket.png differ
diff --git a/src/static/textures/item/cactus_green.png b/src/static/textures/item/cactus_green.png
new file mode 100644
index 0000000000000000000000000000000000000000..7a24b8edab259256df523db88e3c1622f23ece69
Binary files /dev/null and b/src/static/textures/item/cactus_green.png differ
diff --git a/src/static/textures/item/cake.png b/src/static/textures/item/cake.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c2b675869ddc5a82de99239d4bf860178a19aba
Binary files /dev/null and b/src/static/textures/item/cake.png differ
diff --git a/src/static/textures/item/carrot.png b/src/static/textures/item/carrot.png
new file mode 100644
index 0000000000000000000000000000000000000000..620ce48b570d9d13d1b76cf32c463832e40050ce
Binary files /dev/null and b/src/static/textures/item/carrot.png differ
diff --git a/src/static/textures/item/carrot_on_a_stick.png b/src/static/textures/item/carrot_on_a_stick.png
new file mode 100644
index 0000000000000000000000000000000000000000..51b5191903b12717d378cfeec00cb2f342427ec0
Binary files /dev/null and b/src/static/textures/item/carrot_on_a_stick.png differ
diff --git a/src/static/textures/item/cauldron.png b/src/static/textures/item/cauldron.png
new file mode 100644
index 0000000000000000000000000000000000000000..8aabc21c0536f6006231c3dcb443561b660dbd1c
Binary files /dev/null and b/src/static/textures/item/cauldron.png differ
diff --git a/src/static/textures/item/chainmail_boots.png b/src/static/textures/item/chainmail_boots.png
new file mode 100644
index 0000000000000000000000000000000000000000..6857585f084ca4ed5305829782479f0251d577a4
Binary files /dev/null and b/src/static/textures/item/chainmail_boots.png differ
diff --git a/src/static/textures/item/chainmail_chestplate.png b/src/static/textures/item/chainmail_chestplate.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d32264de54209527e19fba726de3223d5eac3ec
Binary files /dev/null and b/src/static/textures/item/chainmail_chestplate.png differ
diff --git a/src/static/textures/item/chainmail_helmet.png b/src/static/textures/item/chainmail_helmet.png
new file mode 100644
index 0000000000000000000000000000000000000000..0865f14bde1026579c25a5dfc26672015f954ff1
Binary files /dev/null and b/src/static/textures/item/chainmail_helmet.png differ
diff --git a/src/static/textures/item/chainmail_leggings.png b/src/static/textures/item/chainmail_leggings.png
new file mode 100644
index 0000000000000000000000000000000000000000..4198cc5f9248214197e230c64631bffc2a2a05f5
Binary files /dev/null and b/src/static/textures/item/chainmail_leggings.png differ
diff --git a/src/static/textures/item/charcoal.png b/src/static/textures/item/charcoal.png
new file mode 100644
index 0000000000000000000000000000000000000000..9f7ee32d169f9e90cdac95a0379e43733d4a9e15
Binary files /dev/null and b/src/static/textures/item/charcoal.png differ
diff --git a/src/static/textures/item/chest_minecart.png b/src/static/textures/item/chest_minecart.png
new file mode 100644
index 0000000000000000000000000000000000000000..7a9e5d45d06c4dceefa37d62783389df5ca5f7d2
Binary files /dev/null and b/src/static/textures/item/chest_minecart.png differ
diff --git a/src/static/textures/item/chicken.png b/src/static/textures/item/chicken.png
new file mode 100644
index 0000000000000000000000000000000000000000..34dc33acef7e5db7a66f0e37cfc0cf555ed2f2e5
Binary files /dev/null and b/src/static/textures/item/chicken.png differ
diff --git a/src/static/textures/item/chorus_fruit.png b/src/static/textures/item/chorus_fruit.png
new file mode 100644
index 0000000000000000000000000000000000000000..676e2cea0c0ba2ce1bf5ea10b9c863318f2072eb
Binary files /dev/null and b/src/static/textures/item/chorus_fruit.png differ
diff --git a/src/static/textures/item/clay_ball.png b/src/static/textures/item/clay_ball.png
new file mode 100644
index 0000000000000000000000000000000000000000..786b1a371928da2143265bdf979cf3282053edbc
Binary files /dev/null and b/src/static/textures/item/clay_ball.png differ
diff --git a/src/static/textures/item/coal.png b/src/static/textures/item/coal.png
new file mode 100644
index 0000000000000000000000000000000000000000..513e9c69e538718d92f85ba794b72def36907b61
Binary files /dev/null and b/src/static/textures/item/coal.png differ
diff --git a/src/static/textures/item/cocoa_beans.png b/src/static/textures/item/cocoa_beans.png
new file mode 100644
index 0000000000000000000000000000000000000000..90b51d63bd67068fd401219de059dbd1547d6a6d
Binary files /dev/null and b/src/static/textures/item/cocoa_beans.png differ
diff --git a/src/static/textures/item/cod_bucket.png b/src/static/textures/item/cod_bucket.png
new file mode 100644
index 0000000000000000000000000000000000000000..70128e5876fdcb339af066a842cf6dfe9a24f0b0
Binary files /dev/null and b/src/static/textures/item/cod_bucket.png differ
diff --git a/src/static/textures/item/command_block_minecart.png b/src/static/textures/item/command_block_minecart.png
new file mode 100644
index 0000000000000000000000000000000000000000..efe6feb2e739ec3144708ad989bfa948bce8bc8a
Binary files /dev/null and b/src/static/textures/item/command_block_minecart.png differ
diff --git a/src/static/textures/item/comparator.png b/src/static/textures/item/comparator.png
new file mode 100644
index 0000000000000000000000000000000000000000..ee5a38e10eb761dc12484e66a0ffa64c4f6fc52e
Binary files /dev/null and b/src/static/textures/item/comparator.png differ
diff --git a/src/static/textures/item/cooked_beef.png b/src/static/textures/item/cooked_beef.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f2d657db5362688fd7568d42283964d94d00aab
Binary files /dev/null and b/src/static/textures/item/cooked_beef.png differ
diff --git a/src/static/textures/item/cooked_chicken.png b/src/static/textures/item/cooked_chicken.png
new file mode 100644
index 0000000000000000000000000000000000000000..db7bbeed8475a04edb3a9688fb05cf1999a69ed0
Binary files /dev/null and b/src/static/textures/item/cooked_chicken.png differ
diff --git a/src/static/textures/item/cooked_mutton.png b/src/static/textures/item/cooked_mutton.png
new file mode 100644
index 0000000000000000000000000000000000000000..26bf7dd69a23b5d499b1fb61f6668ae1b9776955
Binary files /dev/null and b/src/static/textures/item/cooked_mutton.png differ
diff --git a/src/static/textures/item/cooked_porkchop.png b/src/static/textures/item/cooked_porkchop.png
new file mode 100644
index 0000000000000000000000000000000000000000..0988066f6596daeb102d9fcddd2d6b922a7e5b72
Binary files /dev/null and b/src/static/textures/item/cooked_porkchop.png differ
diff --git a/src/static/textures/item/cooked_rabbit.png b/src/static/textures/item/cooked_rabbit.png
new file mode 100644
index 0000000000000000000000000000000000000000..20438043bc0eba99b6b69c669f5930c5b0cc9a4d
Binary files /dev/null and b/src/static/textures/item/cooked_rabbit.png differ
diff --git a/src/static/textures/item/cooked_salmon.png b/src/static/textures/item/cooked_salmon.png
new file mode 100644
index 0000000000000000000000000000000000000000..69c7b4d27fde1bb57872c34205a55b05466e3e89
Binary files /dev/null and b/src/static/textures/item/cooked_salmon.png differ
diff --git a/src/static/textures/item/cookie.png b/src/static/textures/item/cookie.png
new file mode 100644
index 0000000000000000000000000000000000000000..9eb5e8cf329c1f593c70a4afebf1a758984ca17c
Binary files /dev/null and b/src/static/textures/item/cookie.png differ
diff --git a/src/static/textures/item/cyan_dye.png b/src/static/textures/item/cyan_dye.png
new file mode 100644
index 0000000000000000000000000000000000000000..eafaee3b4d7b9634817870076954a278a611f64a
Binary files /dev/null and b/src/static/textures/item/cyan_dye.png differ
diff --git a/src/static/textures/item/dandelion_yellow.png b/src/static/textures/item/dandelion_yellow.png
new file mode 100644
index 0000000000000000000000000000000000000000..1cea9ee26fbf611fe22aa469122cd436e1252442
Binary files /dev/null and b/src/static/textures/item/dandelion_yellow.png differ
diff --git a/src/static/textures/item/dark_oak_boat.png b/src/static/textures/item/dark_oak_boat.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a1f451952d603d291b95f48e33400f5ee48a317
Binary files /dev/null and b/src/static/textures/item/dark_oak_boat.png differ
diff --git a/src/static/textures/item/dark_oak_door.png b/src/static/textures/item/dark_oak_door.png
new file mode 100644
index 0000000000000000000000000000000000000000..4d2474dd3f3f6bd11ed529677ce3776ad3b1ef05
Binary files /dev/null and b/src/static/textures/item/dark_oak_door.png differ
diff --git a/src/static/textures/item/diamond.png b/src/static/textures/item/diamond.png
new file mode 100644
index 0000000000000000000000000000000000000000..8ce901e9cc1a877bf0c998abc54d6fa74b21cd34
Binary files /dev/null and b/src/static/textures/item/diamond.png differ
diff --git a/src/static/textures/item/diamond_axe.png b/src/static/textures/item/diamond_axe.png
new file mode 100644
index 0000000000000000000000000000000000000000..5213ea7b3820421b705a151f363af8eb34aad853
Binary files /dev/null and b/src/static/textures/item/diamond_axe.png differ
diff --git a/src/static/textures/item/diamond_boots.png b/src/static/textures/item/diamond_boots.png
new file mode 100644
index 0000000000000000000000000000000000000000..bdc3b0a617520b7fcf7ff97c24099963608869d8
Binary files /dev/null and b/src/static/textures/item/diamond_boots.png differ
diff --git a/src/static/textures/item/diamond_chestplate.png b/src/static/textures/item/diamond_chestplate.png
new file mode 100644
index 0000000000000000000000000000000000000000..88d21bf92816ad95ffb8b26a8401e6693e9e9528
Binary files /dev/null and b/src/static/textures/item/diamond_chestplate.png differ
diff --git a/src/static/textures/item/diamond_helmet.png b/src/static/textures/item/diamond_helmet.png
new file mode 100644
index 0000000000000000000000000000000000000000..aa0375a7a38c8121e797fdd8598c37eb21b5d256
Binary files /dev/null and b/src/static/textures/item/diamond_helmet.png differ
diff --git a/src/static/textures/item/diamond_hoe.png b/src/static/textures/item/diamond_hoe.png
new file mode 100644
index 0000000000000000000000000000000000000000..8fe701452916dd8c9d6510906323e8f4c16d5e26
Binary files /dev/null and b/src/static/textures/item/diamond_hoe.png differ
diff --git a/src/static/textures/item/diamond_horse_armor.png b/src/static/textures/item/diamond_horse_armor.png
new file mode 100644
index 0000000000000000000000000000000000000000..e40c1ec1e81bee685b7e96b6580f918914672977
Binary files /dev/null and b/src/static/textures/item/diamond_horse_armor.png differ
diff --git a/src/static/textures/item/diamond_leggings.png b/src/static/textures/item/diamond_leggings.png
new file mode 100644
index 0000000000000000000000000000000000000000..035be4155e26fd2048449465bf0a8a44f54288e0
Binary files /dev/null and b/src/static/textures/item/diamond_leggings.png differ
diff --git a/src/static/textures/item/diamond_pickaxe.png b/src/static/textures/item/diamond_pickaxe.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b456d1b9f9b29a6abb92cbb8402ca09cb901bde
Binary files /dev/null and b/src/static/textures/item/diamond_pickaxe.png differ
diff --git a/src/static/textures/item/diamond_shovel.png b/src/static/textures/item/diamond_shovel.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e798c6d65b2909854e4d38806ce04f8b9e4fec1
Binary files /dev/null and b/src/static/textures/item/diamond_shovel.png differ
diff --git a/src/static/textures/item/diamond_sword.png b/src/static/textures/item/diamond_sword.png
new file mode 100644
index 0000000000000000000000000000000000000000..49e0e6058b7a0f5ebd6d47ded3832ec07eeaa9d7
Binary files /dev/null and b/src/static/textures/item/diamond_sword.png differ
diff --git a/src/static/textures/item/dragon_breath.png b/src/static/textures/item/dragon_breath.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ea773bc7434a60a8094d5c90727567509a0c5ac
Binary files /dev/null and b/src/static/textures/item/dragon_breath.png differ
diff --git a/src/static/textures/item/egg.png b/src/static/textures/item/egg.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c56b906d069cfbf84a4fdccb45f3aa4c494d29b
Binary files /dev/null and b/src/static/textures/item/egg.png differ
diff --git a/src/static/textures/item/elytra.png b/src/static/textures/item/elytra.png
new file mode 100644
index 0000000000000000000000000000000000000000..79c0bab04455ddc94ad66c80253de6910008beab
Binary files /dev/null and b/src/static/textures/item/elytra.png differ
diff --git a/src/static/textures/item/emerald.png b/src/static/textures/item/emerald.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e19051cc581772c2c36291c248f0d4892b3410b
Binary files /dev/null and b/src/static/textures/item/emerald.png differ
diff --git a/src/static/textures/item/empty_armor_slot_boots.png b/src/static/textures/item/empty_armor_slot_boots.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd7e05faf9c9058a66a90fb262cbe6cc546d765f
Binary files /dev/null and b/src/static/textures/item/empty_armor_slot_boots.png differ
diff --git a/src/static/textures/item/empty_armor_slot_chestplate.png b/src/static/textures/item/empty_armor_slot_chestplate.png
new file mode 100644
index 0000000000000000000000000000000000000000..6e632b9daca85ced819c24cd97953f84aa98ca3f
Binary files /dev/null and b/src/static/textures/item/empty_armor_slot_chestplate.png differ
diff --git a/src/static/textures/item/empty_armor_slot_helmet.png b/src/static/textures/item/empty_armor_slot_helmet.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a455f3f5916bb29af5fcd79473d55b6d1952023
Binary files /dev/null and b/src/static/textures/item/empty_armor_slot_helmet.png differ
diff --git a/src/static/textures/item/empty_armor_slot_leggings.png b/src/static/textures/item/empty_armor_slot_leggings.png
new file mode 100644
index 0000000000000000000000000000000000000000..28b2c494acbc3bbb8ae23b4632be9b436a7839bf
Binary files /dev/null and b/src/static/textures/item/empty_armor_slot_leggings.png differ
diff --git a/src/static/textures/item/empty_armor_slot_shield.png b/src/static/textures/item/empty_armor_slot_shield.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa12e4333843a3075d3ec7f612114f2f4612939d
Binary files /dev/null and b/src/static/textures/item/empty_armor_slot_shield.png differ
diff --git a/src/static/textures/item/enchanted_book.png b/src/static/textures/item/enchanted_book.png
new file mode 100644
index 0000000000000000000000000000000000000000..a67e1b81642a881ef2c041fa85eae806e1b7bd0d
Binary files /dev/null and b/src/static/textures/item/enchanted_book.png differ
diff --git a/src/static/textures/item/end_crystal.png b/src/static/textures/item/end_crystal.png
new file mode 100644
index 0000000000000000000000000000000000000000..b1d0d1403ebde7d67d6ffb00080ee7a62da14342
Binary files /dev/null and b/src/static/textures/item/end_crystal.png differ
diff --git a/src/static/textures/item/ender_eye.png b/src/static/textures/item/ender_eye.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef379aca9c827035a6572d963de63a42b12f66e4
Binary files /dev/null and b/src/static/textures/item/ender_eye.png differ
diff --git a/src/static/textures/item/ender_pearl.png b/src/static/textures/item/ender_pearl.png
new file mode 100644
index 0000000000000000000000000000000000000000..8282898800d5542913161cfa717a17ee7f3e9b1a
Binary files /dev/null and b/src/static/textures/item/ender_pearl.png differ
diff --git a/src/static/textures/item/experience_bottle.png b/src/static/textures/item/experience_bottle.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb27866de557b91ae23670bd55be45f1ac707b06
Binary files /dev/null and b/src/static/textures/item/experience_bottle.png differ
diff --git a/src/static/textures/item/feather.png b/src/static/textures/item/feather.png
new file mode 100644
index 0000000000000000000000000000000000000000..074373ff1b640c9c2dde2296a114fc213c60fa41
Binary files /dev/null and b/src/static/textures/item/feather.png differ
diff --git a/src/static/textures/item/fermented_spider_eye.png b/src/static/textures/item/fermented_spider_eye.png
new file mode 100644
index 0000000000000000000000000000000000000000..c79c2f2fd32bf957d1a4a7e121fe0178be4a204b
Binary files /dev/null and b/src/static/textures/item/fermented_spider_eye.png differ
diff --git a/src/static/textures/item/filled_map.png b/src/static/textures/item/filled_map.png
new file mode 100644
index 0000000000000000000000000000000000000000..45019a54f2bc9009ae2f1cc3519b2e0650693a4f
Binary files /dev/null and b/src/static/textures/item/filled_map.png differ
diff --git a/src/static/textures/item/filled_map_markings.png b/src/static/textures/item/filled_map_markings.png
new file mode 100644
index 0000000000000000000000000000000000000000..7eaa311edc66bfc1b9131fcfe81bba742c78a650
Binary files /dev/null and b/src/static/textures/item/filled_map_markings.png differ
diff --git a/src/static/textures/item/fire_charge.png b/src/static/textures/item/fire_charge.png
new file mode 100644
index 0000000000000000000000000000000000000000..1816e87bbcaf89d80de382e0d6239af2375f00f5
Binary files /dev/null and b/src/static/textures/item/fire_charge.png differ
diff --git a/src/static/textures/item/firework_rocket.png b/src/static/textures/item/firework_rocket.png
new file mode 100644
index 0000000000000000000000000000000000000000..1d60c42116c067d2b03414c03a01062f96c4b9ea
Binary files /dev/null and b/src/static/textures/item/firework_rocket.png differ
diff --git a/src/static/textures/item/firework_star.png b/src/static/textures/item/firework_star.png
new file mode 100644
index 0000000000000000000000000000000000000000..a2e67af107d9214689eccd2b0c95334cdab24a9d
Binary files /dev/null and b/src/static/textures/item/firework_star.png differ
diff --git a/src/static/textures/item/firework_star_overlay.png b/src/static/textures/item/firework_star_overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..d8b91a92c236463ca9c798bd92d149c577a42c35
Binary files /dev/null and b/src/static/textures/item/firework_star_overlay.png differ
diff --git a/src/static/textures/item/fishing_rod.png b/src/static/textures/item/fishing_rod.png
new file mode 100644
index 0000000000000000000000000000000000000000..a6926b5138a5e1cb2241c9b65cbc4ad3ea9d2b50
Binary files /dev/null and b/src/static/textures/item/fishing_rod.png differ
diff --git a/src/static/textures/item/fishing_rod_cast.png b/src/static/textures/item/fishing_rod_cast.png
new file mode 100644
index 0000000000000000000000000000000000000000..250a1cf1370cc00c69dd217fc5b0d3efd87019a5
Binary files /dev/null and b/src/static/textures/item/fishing_rod_cast.png differ
diff --git a/src/static/textures/item/flint.png b/src/static/textures/item/flint.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa332a8620ae86e09ea9e4c0f2f315e785dccf49
Binary files /dev/null and b/src/static/textures/item/flint.png differ
diff --git a/src/static/textures/item/flint_and_steel.png b/src/static/textures/item/flint_and_steel.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed1197af36907bdda0ad9c6f450a682b8fcc327a
Binary files /dev/null and b/src/static/textures/item/flint_and_steel.png differ
diff --git a/src/static/textures/item/flower_pot.png b/src/static/textures/item/flower_pot.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a101cf108798eea213738f61684dcc4ff61b85e
Binary files /dev/null and b/src/static/textures/item/flower_pot.png differ
diff --git a/src/static/textures/item/furnace_minecart.png b/src/static/textures/item/furnace_minecart.png
new file mode 100644
index 0000000000000000000000000000000000000000..f17efac2d04bf22acae0ae5a6887ff900b5f8879
Binary files /dev/null and b/src/static/textures/item/furnace_minecart.png differ
diff --git a/src/static/textures/item/ghast_tear.png b/src/static/textures/item/ghast_tear.png
new file mode 100644
index 0000000000000000000000000000000000000000..8fa46e8f932070fed084b2e1789aa34922ab6e92
Binary files /dev/null and b/src/static/textures/item/ghast_tear.png differ
diff --git a/src/static/textures/item/glass_bottle.png b/src/static/textures/item/glass_bottle.png
new file mode 100644
index 0000000000000000000000000000000000000000..b86b4b7f27ee23ac212890441e7c67631489446f
Binary files /dev/null and b/src/static/textures/item/glass_bottle.png differ
diff --git a/src/static/textures/item/glistering_melon_slice.png b/src/static/textures/item/glistering_melon_slice.png
new file mode 100644
index 0000000000000000000000000000000000000000..e8923d1636dd4c142058bb618ac638a7c6ea3447
Binary files /dev/null and b/src/static/textures/item/glistering_melon_slice.png differ
diff --git a/src/static/textures/item/glowstone_dust.png b/src/static/textures/item/glowstone_dust.png
new file mode 100644
index 0000000000000000000000000000000000000000..24181098ad8dc82e9dadd2caeb7925aa3eb677bb
Binary files /dev/null and b/src/static/textures/item/glowstone_dust.png differ
diff --git a/src/static/textures/item/gold_ingot.png b/src/static/textures/item/gold_ingot.png
new file mode 100644
index 0000000000000000000000000000000000000000..d3684df745a96229c416f7c3dc28d8b464937d23
Binary files /dev/null and b/src/static/textures/item/gold_ingot.png differ
diff --git a/src/static/textures/item/gold_nugget.png b/src/static/textures/item/gold_nugget.png
new file mode 100644
index 0000000000000000000000000000000000000000..a8b4b87e15f70a1241133a296c7a5e22fd4627f6
Binary files /dev/null and b/src/static/textures/item/gold_nugget.png differ
diff --git a/src/static/textures/item/golden_apple.png b/src/static/textures/item/golden_apple.png
new file mode 100644
index 0000000000000000000000000000000000000000..43b787ea834cb8681a10917f5ccd11a1ff103628
Binary files /dev/null and b/src/static/textures/item/golden_apple.png differ
diff --git a/src/static/textures/item/golden_axe.png b/src/static/textures/item/golden_axe.png
new file mode 100644
index 0000000000000000000000000000000000000000..e0b268df9ec4adeb3b5ce560f12392a703502f93
Binary files /dev/null and b/src/static/textures/item/golden_axe.png differ
diff --git a/src/static/textures/item/golden_boots.png b/src/static/textures/item/golden_boots.png
new file mode 100644
index 0000000000000000000000000000000000000000..519ee0241e29d1d52b16ecadd24b083348822b52
Binary files /dev/null and b/src/static/textures/item/golden_boots.png differ
diff --git a/src/static/textures/item/golden_carrot.png b/src/static/textures/item/golden_carrot.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab5c788d117f67fc5c44eaff09ca7df4a3dbed26
Binary files /dev/null and b/src/static/textures/item/golden_carrot.png differ
diff --git a/src/static/textures/item/golden_chestplate.png b/src/static/textures/item/golden_chestplate.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc8b0697db91482124f7752b9daca3235fdd9d78
Binary files /dev/null and b/src/static/textures/item/golden_chestplate.png differ
diff --git a/src/static/textures/item/golden_helmet.png b/src/static/textures/item/golden_helmet.png
new file mode 100644
index 0000000000000000000000000000000000000000..5bcc109cc11f420944d8cf1cba1558a16ac17025
Binary files /dev/null and b/src/static/textures/item/golden_helmet.png differ
diff --git a/src/static/textures/item/golden_hoe.png b/src/static/textures/item/golden_hoe.png
new file mode 100644
index 0000000000000000000000000000000000000000..e3d1e70d0548e457849877780d93e7c1195d9e37
Binary files /dev/null and b/src/static/textures/item/golden_hoe.png differ
diff --git a/src/static/textures/item/golden_horse_armor.png b/src/static/textures/item/golden_horse_armor.png
new file mode 100644
index 0000000000000000000000000000000000000000..87efd238d19c1f28707a9931270575887989e407
Binary files /dev/null and b/src/static/textures/item/golden_horse_armor.png differ
diff --git a/src/static/textures/item/golden_leggings.png b/src/static/textures/item/golden_leggings.png
new file mode 100644
index 0000000000000000000000000000000000000000..b514f0bdc664b2cca551fede2acc96e9dcffe4ca
Binary files /dev/null and b/src/static/textures/item/golden_leggings.png differ
diff --git a/src/static/textures/item/golden_pickaxe.png b/src/static/textures/item/golden_pickaxe.png
new file mode 100644
index 0000000000000000000000000000000000000000..29f450c3f885543ed533bd05aff2497c9e2aca59
Binary files /dev/null and b/src/static/textures/item/golden_pickaxe.png differ
diff --git a/src/static/textures/item/golden_shovel.png b/src/static/textures/item/golden_shovel.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a38193d302b762dd5a182c4a3c8ec991b0d09d8
Binary files /dev/null and b/src/static/textures/item/golden_shovel.png differ
diff --git a/src/static/textures/item/golden_sword.png b/src/static/textures/item/golden_sword.png
new file mode 100644
index 0000000000000000000000000000000000000000..1d827cfd2fcf6f664eb35f37965bbc9240570f9b
Binary files /dev/null and b/src/static/textures/item/golden_sword.png differ
diff --git a/src/static/textures/item/gray_dye.png b/src/static/textures/item/gray_dye.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a9c2d8bbc39cfea76c92f21b430078c999eb67c
Binary files /dev/null and b/src/static/textures/item/gray_dye.png differ
diff --git a/src/static/textures/item/gunpowder.png b/src/static/textures/item/gunpowder.png
new file mode 100644
index 0000000000000000000000000000000000000000..18e88ece063ac605072cf81510fbfd8bbb9e0425
Binary files /dev/null and b/src/static/textures/item/gunpowder.png differ
diff --git a/src/static/textures/item/hopper.png b/src/static/textures/item/hopper.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d1731a6a91926d482277b157f016a92c58fc99b
Binary files /dev/null and b/src/static/textures/item/hopper.png differ
diff --git a/src/static/textures/item/hopper_minecart.png b/src/static/textures/item/hopper_minecart.png
new file mode 100644
index 0000000000000000000000000000000000000000..08aea54da1162815ada332a9cd4d94903ffe2db5
Binary files /dev/null and b/src/static/textures/item/hopper_minecart.png differ
diff --git a/src/static/textures/item/ink_sac.png b/src/static/textures/item/ink_sac.png
new file mode 100644
index 0000000000000000000000000000000000000000..dcabb0ab7b12ce7a7958e2576730df4d28ac8275
Binary files /dev/null and b/src/static/textures/item/ink_sac.png differ
diff --git a/src/static/textures/item/iron_axe.png b/src/static/textures/item/iron_axe.png
new file mode 100644
index 0000000000000000000000000000000000000000..43e742c28f79eff61144a25b07d9207da6f17d83
Binary files /dev/null and b/src/static/textures/item/iron_axe.png differ
diff --git a/src/static/textures/item/iron_boots.png b/src/static/textures/item/iron_boots.png
new file mode 100644
index 0000000000000000000000000000000000000000..e96092450e6c490afc45cc5fbbdbf156c4f0ae4c
Binary files /dev/null and b/src/static/textures/item/iron_boots.png differ
diff --git a/src/static/textures/item/iron_chestplate.png b/src/static/textures/item/iron_chestplate.png
new file mode 100644
index 0000000000000000000000000000000000000000..bab56132b9b0b0f83aadc5f7038b72baf72c85eb
Binary files /dev/null and b/src/static/textures/item/iron_chestplate.png differ
diff --git a/src/static/textures/item/iron_door.png b/src/static/textures/item/iron_door.png
new file mode 100644
index 0000000000000000000000000000000000000000..c878badbdd36c02d9fb89af435df2a2ce78a9ff6
Binary files /dev/null and b/src/static/textures/item/iron_door.png differ
diff --git a/src/static/textures/item/iron_helmet.png b/src/static/textures/item/iron_helmet.png
new file mode 100644
index 0000000000000000000000000000000000000000..085dd585e5ac00a01a6f5674f99ea112b59bffbb
Binary files /dev/null and b/src/static/textures/item/iron_helmet.png differ
diff --git a/src/static/textures/item/iron_hoe.png b/src/static/textures/item/iron_hoe.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5a78604e66b7a615585c97e08e12f32494dd19d
Binary files /dev/null and b/src/static/textures/item/iron_hoe.png differ
diff --git a/src/static/textures/item/iron_horse_armor.png b/src/static/textures/item/iron_horse_armor.png
new file mode 100644
index 0000000000000000000000000000000000000000..c5650f0e7f1c535aa7221382bb62dce3762cf392
Binary files /dev/null and b/src/static/textures/item/iron_horse_armor.png differ
diff --git a/src/static/textures/item/iron_ingot.png b/src/static/textures/item/iron_ingot.png
new file mode 100644
index 0000000000000000000000000000000000000000..c332bd2ca95f685c0ff89b29c836303efa885e5d
Binary files /dev/null and b/src/static/textures/item/iron_ingot.png differ
diff --git a/src/static/textures/item/iron_leggings.png b/src/static/textures/item/iron_leggings.png
new file mode 100644
index 0000000000000000000000000000000000000000..5ea16729f49f101fa629d19c90132b169c594685
Binary files /dev/null and b/src/static/textures/item/iron_leggings.png differ
diff --git a/src/static/textures/item/iron_nugget.png b/src/static/textures/item/iron_nugget.png
new file mode 100644
index 0000000000000000000000000000000000000000..13515d36c9754538943a7a6fed7a3a1660c93ca5
Binary files /dev/null and b/src/static/textures/item/iron_nugget.png differ
diff --git a/src/static/textures/item/iron_pickaxe.png b/src/static/textures/item/iron_pickaxe.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac75a0101b5b852a0ab5b2216c5637c6c675434b
Binary files /dev/null and b/src/static/textures/item/iron_pickaxe.png differ
diff --git a/src/static/textures/item/iron_shovel.png b/src/static/textures/item/iron_shovel.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb726a027d567881737ad0f9f1958e315d3b9742
Binary files /dev/null and b/src/static/textures/item/iron_shovel.png differ
diff --git a/src/static/textures/item/iron_sword.png b/src/static/textures/item/iron_sword.png
new file mode 100644
index 0000000000000000000000000000000000000000..eec41ee90c47e00d6c5dd9038868bf94a82df2f3
Binary files /dev/null and b/src/static/textures/item/iron_sword.png differ
diff --git a/src/static/textures/item/item_frame.png b/src/static/textures/item/item_frame.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a3c312e2997186f1cb3668880d16fd0bb0ce0a5
Binary files /dev/null and b/src/static/textures/item/item_frame.png differ
diff --git a/src/static/textures/item/jungle_boat.png b/src/static/textures/item/jungle_boat.png
new file mode 100644
index 0000000000000000000000000000000000000000..f71b966eddf10c616723f45fce1ae90e902f6b05
Binary files /dev/null and b/src/static/textures/item/jungle_boat.png differ
diff --git a/src/static/textures/item/jungle_door.png b/src/static/textures/item/jungle_door.png
new file mode 100644
index 0000000000000000000000000000000000000000..422401fbdbde55d9b2f7b8882a47a3ad4208643d
Binary files /dev/null and b/src/static/textures/item/jungle_door.png differ
diff --git a/src/static/textures/item/knowledge_book.png b/src/static/textures/item/knowledge_book.png
new file mode 100644
index 0000000000000000000000000000000000000000..68a7a1aa3de5e9832a9bc2c77592ba0c5bbdeb11
Binary files /dev/null and b/src/static/textures/item/knowledge_book.png differ
diff --git a/src/static/textures/item/lapis_lazuli.png b/src/static/textures/item/lapis_lazuli.png
new file mode 100644
index 0000000000000000000000000000000000000000..646813fa0dd4f171dafd164b9d60f328f4d3341d
Binary files /dev/null and b/src/static/textures/item/lapis_lazuli.png differ
diff --git a/src/static/textures/item/lava_bucket.png b/src/static/textures/item/lava_bucket.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f7b926317f5d5ce38727d1792528cfb3b780a87
Binary files /dev/null and b/src/static/textures/item/lava_bucket.png differ
diff --git a/src/static/textures/item/lead.png b/src/static/textures/item/lead.png
new file mode 100644
index 0000000000000000000000000000000000000000..be1cb62ae6a1a228c6f03d99c09a4865c9d1c8cc
Binary files /dev/null and b/src/static/textures/item/lead.png differ
diff --git a/src/static/textures/item/leather.png b/src/static/textures/item/leather.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0dee336fb1696cbd4c7b84d15d1ce955636f942
Binary files /dev/null and b/src/static/textures/item/leather.png differ
diff --git a/src/static/textures/item/leather_boots.png b/src/static/textures/item/leather_boots.png
new file mode 100644
index 0000000000000000000000000000000000000000..0dad1ba09de520233d8fed438e79a9089ede8cd3
Binary files /dev/null and b/src/static/textures/item/leather_boots.png differ
diff --git a/src/static/textures/item/leather_boots_overlay.png b/src/static/textures/item/leather_boots_overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..37506525aba73bb19b226c1077e29337466659fa
Binary files /dev/null and b/src/static/textures/item/leather_boots_overlay.png differ
diff --git a/src/static/textures/item/leather_chestplate.png b/src/static/textures/item/leather_chestplate.png
new file mode 100644
index 0000000000000000000000000000000000000000..5aa01e38baa5800ed6939e443570debfd62b37f9
Binary files /dev/null and b/src/static/textures/item/leather_chestplate.png differ
diff --git a/src/static/textures/item/leather_chestplate_overlay.png b/src/static/textures/item/leather_chestplate_overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..2f6464bf7aeb78fb56185792b74d2c793aeea6e4
Binary files /dev/null and b/src/static/textures/item/leather_chestplate_overlay.png differ
diff --git a/src/static/textures/item/leather_helmet.png b/src/static/textures/item/leather_helmet.png
new file mode 100644
index 0000000000000000000000000000000000000000..9504867d89f40539a49a3f533a0c88f8397e537f
Binary files /dev/null and b/src/static/textures/item/leather_helmet.png differ
diff --git a/src/static/textures/item/leather_helmet_overlay.png b/src/static/textures/item/leather_helmet_overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..670653ce560d396ba0e8828799f346873e56cba2
Binary files /dev/null and b/src/static/textures/item/leather_helmet_overlay.png differ
diff --git a/src/static/textures/item/leather_leggings.png b/src/static/textures/item/leather_leggings.png
new file mode 100644
index 0000000000000000000000000000000000000000..a1530c0967b511e6bbaccf6d80dadcf9638bed5e
Binary files /dev/null and b/src/static/textures/item/leather_leggings.png differ
diff --git a/src/static/textures/item/leather_leggings_overlay.png b/src/static/textures/item/leather_leggings_overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..bdbf632fa811cec7bf9e2658bc0baadf6b3df538
Binary files /dev/null and b/src/static/textures/item/leather_leggings_overlay.png differ
diff --git a/src/static/textures/item/light_blue_dye.png b/src/static/textures/item/light_blue_dye.png
new file mode 100644
index 0000000000000000000000000000000000000000..e614b893840a67e2761863d25f231bb2ae66f290
Binary files /dev/null and b/src/static/textures/item/light_blue_dye.png differ
diff --git a/src/static/textures/item/light_gray_dye.png b/src/static/textures/item/light_gray_dye.png
new file mode 100644
index 0000000000000000000000000000000000000000..bbb5acc4d8e940cdb5ca6670f6dc73cff9b822ed
Binary files /dev/null and b/src/static/textures/item/light_gray_dye.png differ
diff --git a/src/static/textures/item/lime_dye.png b/src/static/textures/item/lime_dye.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9ce8f0b9505b0fbcdbe75ec23488696e3ba905e
Binary files /dev/null and b/src/static/textures/item/lime_dye.png differ
diff --git a/src/static/textures/item/lingering_potion.png b/src/static/textures/item/lingering_potion.png
new file mode 100644
index 0000000000000000000000000000000000000000..a05ec6e6f91fe2986db5e876cbd3c61e3f76114c
Binary files /dev/null and b/src/static/textures/item/lingering_potion.png differ
diff --git a/src/static/textures/item/magenta_dye.png b/src/static/textures/item/magenta_dye.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b8412a28dcaf1614f384df9422222ba6d5375c9
Binary files /dev/null and b/src/static/textures/item/magenta_dye.png differ
diff --git a/src/static/textures/item/magma_cream.png b/src/static/textures/item/magma_cream.png
new file mode 100644
index 0000000000000000000000000000000000000000..398d66c66048836b73c6c94b256cfb0376195c97
Binary files /dev/null and b/src/static/textures/item/magma_cream.png differ
diff --git a/src/static/textures/item/map.png b/src/static/textures/item/map.png
new file mode 100644
index 0000000000000000000000000000000000000000..45019a54f2bc9009ae2f1cc3519b2e0650693a4f
Binary files /dev/null and b/src/static/textures/item/map.png differ
diff --git a/src/static/textures/item/melon_seeds.png b/src/static/textures/item/melon_seeds.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef84499c25a5a16ed8212300e9d00492e5522f51
Binary files /dev/null and b/src/static/textures/item/melon_seeds.png differ
diff --git a/src/static/textures/item/melon_slice.png b/src/static/textures/item/melon_slice.png
new file mode 100644
index 0000000000000000000000000000000000000000..0ebdca88d915984d5ff28af5fe1330fdb62d3d43
Binary files /dev/null and b/src/static/textures/item/melon_slice.png differ
diff --git a/src/static/textures/item/milk_bucket.png b/src/static/textures/item/milk_bucket.png
new file mode 100644
index 0000000000000000000000000000000000000000..c1b15c1fe310188ab465b51c71925f9f3126040c
Binary files /dev/null and b/src/static/textures/item/milk_bucket.png differ
diff --git a/src/static/textures/item/minecart.png b/src/static/textures/item/minecart.png
new file mode 100644
index 0000000000000000000000000000000000000000..7e09e5456d7b24fdff3e79e14ca80914ae58bb53
Binary files /dev/null and b/src/static/textures/item/minecart.png differ
diff --git a/src/static/textures/item/mushroom_stew.png b/src/static/textures/item/mushroom_stew.png
new file mode 100644
index 0000000000000000000000000000000000000000..d38b0e0b2e30d58b9b9ba59a0a5938d448360d5c
Binary files /dev/null and b/src/static/textures/item/mushroom_stew.png differ
diff --git a/src/static/textures/item/music_disc_11.png b/src/static/textures/item/music_disc_11.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d333b6af8717d8a78e39867ca8995b268fa78f2
Binary files /dev/null and b/src/static/textures/item/music_disc_11.png differ
diff --git a/src/static/textures/item/music_disc_13.png b/src/static/textures/item/music_disc_13.png
new file mode 100644
index 0000000000000000000000000000000000000000..8cd91b943414a3d9e5815b74c754199cb9f1f600
Binary files /dev/null and b/src/static/textures/item/music_disc_13.png differ
diff --git a/src/static/textures/item/music_disc_blocks.png b/src/static/textures/item/music_disc_blocks.png
new file mode 100644
index 0000000000000000000000000000000000000000..3732d6c97a212ec4dd6005105d4ad7b3f4ba89b9
Binary files /dev/null and b/src/static/textures/item/music_disc_blocks.png differ
diff --git a/src/static/textures/item/music_disc_cat.png b/src/static/textures/item/music_disc_cat.png
new file mode 100644
index 0000000000000000000000000000000000000000..b3527efb985fdd73bff7c840ecdfb0e9fef11951
Binary files /dev/null and b/src/static/textures/item/music_disc_cat.png differ
diff --git a/src/static/textures/item/music_disc_chirp.png b/src/static/textures/item/music_disc_chirp.png
new file mode 100644
index 0000000000000000000000000000000000000000..63068e1a6595daa186643161e0742d053ee1b5f9
Binary files /dev/null and b/src/static/textures/item/music_disc_chirp.png differ
diff --git a/src/static/textures/item/music_disc_far.png b/src/static/textures/item/music_disc_far.png
new file mode 100644
index 0000000000000000000000000000000000000000..443ded2347a8beafe7c829d1653fffc5b5e15bc3
Binary files /dev/null and b/src/static/textures/item/music_disc_far.png differ
diff --git a/src/static/textures/item/music_disc_mall.png b/src/static/textures/item/music_disc_mall.png
new file mode 100644
index 0000000000000000000000000000000000000000..a2bf0d61d11df4932d29a1ff10c48bf47312cde1
Binary files /dev/null and b/src/static/textures/item/music_disc_mall.png differ
diff --git a/src/static/textures/item/music_disc_mellohi.png b/src/static/textures/item/music_disc_mellohi.png
new file mode 100644
index 0000000000000000000000000000000000000000..466f5af43b0a6271b8c30596ac3502e738408f04
Binary files /dev/null and b/src/static/textures/item/music_disc_mellohi.png differ
diff --git a/src/static/textures/item/music_disc_stal.png b/src/static/textures/item/music_disc_stal.png
new file mode 100644
index 0000000000000000000000000000000000000000..731dad6310ad51b9264ca5ca587dabfb2f4e6d4b
Binary files /dev/null and b/src/static/textures/item/music_disc_stal.png differ
diff --git a/src/static/textures/item/music_disc_strad.png b/src/static/textures/item/music_disc_strad.png
new file mode 100644
index 0000000000000000000000000000000000000000..c7e42ccd09067e9f219b05de9f4217f6ba2d241c
Binary files /dev/null and b/src/static/textures/item/music_disc_strad.png differ
diff --git a/src/static/textures/item/music_disc_wait.png b/src/static/textures/item/music_disc_wait.png
new file mode 100644
index 0000000000000000000000000000000000000000..5306b514f10fb5061dc92ea79e61cef1200999c6
Binary files /dev/null and b/src/static/textures/item/music_disc_wait.png differ
diff --git a/src/static/textures/item/music_disc_ward.png b/src/static/textures/item/music_disc_ward.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d053fe9979bf8144ec26b6fd89ca3fd7ce461e3
Binary files /dev/null and b/src/static/textures/item/music_disc_ward.png differ
diff --git a/src/static/textures/item/mutton.png b/src/static/textures/item/mutton.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd6fa0f45f231a115384e6dfdcf32575969bf058
Binary files /dev/null and b/src/static/textures/item/mutton.png differ
diff --git a/src/static/textures/item/name_tag.png b/src/static/textures/item/name_tag.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a47e0242a29eda373b58137d2739d28899163b2
Binary files /dev/null and b/src/static/textures/item/name_tag.png differ
diff --git a/src/static/textures/item/nether_brick.png b/src/static/textures/item/nether_brick.png
new file mode 100644
index 0000000000000000000000000000000000000000..e4ef83f66ea44e2deaa8c827ca56e540f992a1e2
Binary files /dev/null and b/src/static/textures/item/nether_brick.png differ
diff --git a/src/static/textures/item/nether_star.png b/src/static/textures/item/nether_star.png
new file mode 100644
index 0000000000000000000000000000000000000000..bdacaee1bb6608f3132125ecfe143ef7df7df6f6
Binary files /dev/null and b/src/static/textures/item/nether_star.png differ
diff --git a/src/static/textures/item/nether_wart.png b/src/static/textures/item/nether_wart.png
new file mode 100644
index 0000000000000000000000000000000000000000..09da1e33f1f4082fbe49d263e58e5749ffc25d94
Binary files /dev/null and b/src/static/textures/item/nether_wart.png differ
diff --git a/src/static/textures/item/oak_boat.png b/src/static/textures/item/oak_boat.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e9e518e635d12fc9bb404e4ab3afac6de52949b
Binary files /dev/null and b/src/static/textures/item/oak_boat.png differ
diff --git a/src/static/textures/item/oak_door.png b/src/static/textures/item/oak_door.png
new file mode 100644
index 0000000000000000000000000000000000000000..6501fa45df52a07e8df737b009c8d5d81b559680
Binary files /dev/null and b/src/static/textures/item/oak_door.png differ
diff --git a/src/static/textures/item/orange_dye.png b/src/static/textures/item/orange_dye.png
new file mode 100644
index 0000000000000000000000000000000000000000..fcec14a4cb46c8673051dcd470368fef76bc6dd4
Binary files /dev/null and b/src/static/textures/item/orange_dye.png differ
diff --git a/src/static/textures/item/painting.png b/src/static/textures/item/painting.png
new file mode 100644
index 0000000000000000000000000000000000000000..c20db4ff5cd6cd53bbf60bc36e377a667096e358
Binary files /dev/null and b/src/static/textures/item/painting.png differ
diff --git a/src/static/textures/item/paper.png b/src/static/textures/item/paper.png
new file mode 100644
index 0000000000000000000000000000000000000000..b30fb261d6de5c56ef0f4662943bacfbb3fceeec
Binary files /dev/null and b/src/static/textures/item/paper.png differ
diff --git a/src/static/textures/item/pink_dye.png b/src/static/textures/item/pink_dye.png
new file mode 100644
index 0000000000000000000000000000000000000000..aaeb77aa8116a49658bcca4a2f646eb0e016934c
Binary files /dev/null and b/src/static/textures/item/pink_dye.png differ
diff --git a/src/static/textures/item/poisonous_potato.png b/src/static/textures/item/poisonous_potato.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea03238b9f257f1b823f9b235759a1bf017aaa10
Binary files /dev/null and b/src/static/textures/item/poisonous_potato.png differ
diff --git a/src/static/textures/item/popped_chorus_fruit.png b/src/static/textures/item/popped_chorus_fruit.png
new file mode 100644
index 0000000000000000000000000000000000000000..c83d418e7f1ab7a25745bd2634a02ee2c5c1142c
Binary files /dev/null and b/src/static/textures/item/popped_chorus_fruit.png differ
diff --git a/src/static/textures/item/porkchop.png b/src/static/textures/item/porkchop.png
new file mode 100644
index 0000000000000000000000000000000000000000..4490271e6c173051b0827b5c66fd2a02a080051a
Binary files /dev/null and b/src/static/textures/item/porkchop.png differ
diff --git a/src/static/textures/item/potato.png b/src/static/textures/item/potato.png
new file mode 100644
index 0000000000000000000000000000000000000000..c071e69b7fc849bdb24db5dc31b1bec7875a3a86
Binary files /dev/null and b/src/static/textures/item/potato.png differ
diff --git a/src/static/textures/item/potion.png b/src/static/textures/item/potion.png
new file mode 100644
index 0000000000000000000000000000000000000000..b86b4b7f27ee23ac212890441e7c67631489446f
Binary files /dev/null and b/src/static/textures/item/potion.png differ
diff --git a/src/static/textures/item/potion_overlay.png b/src/static/textures/item/potion_overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..852260d71a6c2f400d49c0fff0e35172df6328f8
Binary files /dev/null and b/src/static/textures/item/potion_overlay.png differ
diff --git a/src/static/textures/item/prismarine_crystals.png b/src/static/textures/item/prismarine_crystals.png
new file mode 100644
index 0000000000000000000000000000000000000000..aba9497082c661f6ef81eea38a5e70f339d9de2e
Binary files /dev/null and b/src/static/textures/item/prismarine_crystals.png differ
diff --git a/src/static/textures/item/prismarine_shard.png b/src/static/textures/item/prismarine_shard.png
new file mode 100644
index 0000000000000000000000000000000000000000..3cd7db7ceddd06d58f0e02a993bc7d1346c2d7ea
Binary files /dev/null and b/src/static/textures/item/prismarine_shard.png differ
diff --git a/src/static/textures/item/pufferfish_bucket.png b/src/static/textures/item/pufferfish_bucket.png
new file mode 100644
index 0000000000000000000000000000000000000000..7039f3f2b05a23d9da07de287a0ed870243356cb
Binary files /dev/null and b/src/static/textures/item/pufferfish_bucket.png differ
diff --git a/src/static/textures/item/pumpkin_pie.png b/src/static/textures/item/pumpkin_pie.png
new file mode 100644
index 0000000000000000000000000000000000000000..310177cbed9bd73917f8e5b681295cdd5e7e2d81
Binary files /dev/null and b/src/static/textures/item/pumpkin_pie.png differ
diff --git a/src/static/textures/item/pumpkin_seeds.png b/src/static/textures/item/pumpkin_seeds.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d8f076142b90a93cb8f2d0011963abe95ace4c6
Binary files /dev/null and b/src/static/textures/item/pumpkin_seeds.png differ
diff --git a/src/static/textures/item/purple_dye.png b/src/static/textures/item/purple_dye.png
new file mode 100644
index 0000000000000000000000000000000000000000..e1618e22b27192966404a4862bb767b659a28eea
Binary files /dev/null and b/src/static/textures/item/purple_dye.png differ
diff --git a/src/static/textures/item/quartz.png b/src/static/textures/item/quartz.png
new file mode 100644
index 0000000000000000000000000000000000000000..a4c6e2ff38bbe6afe8c64a6a0cb0898bb3e1b0af
Binary files /dev/null and b/src/static/textures/item/quartz.png differ
diff --git a/src/static/textures/item/rabbit.png b/src/static/textures/item/rabbit.png
new file mode 100644
index 0000000000000000000000000000000000000000..058505fa1379531f5dccf0e5141463791eb206b4
Binary files /dev/null and b/src/static/textures/item/rabbit.png differ
diff --git a/src/static/textures/item/rabbit_foot.png b/src/static/textures/item/rabbit_foot.png
new file mode 100644
index 0000000000000000000000000000000000000000..0b06899450149055c5d65e1933fcd033405bc127
Binary files /dev/null and b/src/static/textures/item/rabbit_foot.png differ
diff --git a/src/static/textures/item/rabbit_hide.png b/src/static/textures/item/rabbit_hide.png
new file mode 100644
index 0000000000000000000000000000000000000000..a49f0b10480cd9afca91642db68c8f6026d671ef
Binary files /dev/null and b/src/static/textures/item/rabbit_hide.png differ
diff --git a/src/static/textures/item/rabbit_stew.png b/src/static/textures/item/rabbit_stew.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed1d33c839c34136cf7bb9e1abca5b1fa05373f3
Binary files /dev/null and b/src/static/textures/item/rabbit_stew.png differ
diff --git a/src/static/textures/item/redstone.png b/src/static/textures/item/redstone.png
new file mode 100644
index 0000000000000000000000000000000000000000..ddf9b54b78a3f79db4294a5f2216fcfa57dd9ebd
Binary files /dev/null and b/src/static/textures/item/redstone.png differ
diff --git a/src/static/textures/item/repeater.png b/src/static/textures/item/repeater.png
new file mode 100644
index 0000000000000000000000000000000000000000..a8d406828b334ad0a756c742a8cb9a308013d865
Binary files /dev/null and b/src/static/textures/item/repeater.png differ
diff --git a/src/static/textures/item/rose_red.png b/src/static/textures/item/rose_red.png
new file mode 100644
index 0000000000000000000000000000000000000000..03a371c9a82a869ba03197e6ac89d741a5cffd9d
Binary files /dev/null and b/src/static/textures/item/rose_red.png differ
diff --git a/src/static/textures/item/rotten_flesh.png b/src/static/textures/item/rotten_flesh.png
new file mode 100644
index 0000000000000000000000000000000000000000..a5f1dfb8ee3cf9ad41012fa2fa680d78a6521b3e
Binary files /dev/null and b/src/static/textures/item/rotten_flesh.png differ
diff --git a/src/static/textures/item/ruby.png b/src/static/textures/item/ruby.png
new file mode 100644
index 0000000000000000000000000000000000000000..4f288d959b7e8b8e3cd9e4cc567b00d4588f3279
Binary files /dev/null and b/src/static/textures/item/ruby.png differ
diff --git a/src/static/textures/item/saddle.png b/src/static/textures/item/saddle.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b1ed0bb94a6519e38669bb67e3599a942a18440
Binary files /dev/null and b/src/static/textures/item/saddle.png differ
diff --git a/src/static/textures/item/salmon.png b/src/static/textures/item/salmon.png
new file mode 100644
index 0000000000000000000000000000000000000000..97e2ed010d06a88626ba4f6dd1a51424cf0013a3
Binary files /dev/null and b/src/static/textures/item/salmon.png differ
diff --git a/src/static/textures/item/salmon_bucket.png b/src/static/textures/item/salmon_bucket.png
new file mode 100644
index 0000000000000000000000000000000000000000..0194d19b3eb80c933eaa76285646d6ddde9cfe4c
Binary files /dev/null and b/src/static/textures/item/salmon_bucket.png differ
diff --git a/src/static/textures/item/shears.png b/src/static/textures/item/shears.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac05b41f23ebc2576cc69ce489a516e19e7dbd9a
Binary files /dev/null and b/src/static/textures/item/shears.png differ
diff --git a/src/static/textures/item/shulker_shell.png b/src/static/textures/item/shulker_shell.png
new file mode 100644
index 0000000000000000000000000000000000000000..0bae3cfb64c0430882a48390d4a13ad12a1c35b1
Binary files /dev/null and b/src/static/textures/item/shulker_shell.png differ
diff --git a/src/static/textures/item/sign.png b/src/static/textures/item/sign.png
new file mode 100644
index 0000000000000000000000000000000000000000..06fb7501eaef7d75b9825cc0ae3720b60dd85e7a
Binary files /dev/null and b/src/static/textures/item/sign.png differ
diff --git a/src/static/textures/item/slime_ball.png b/src/static/textures/item/slime_ball.png
new file mode 100644
index 0000000000000000000000000000000000000000..7192a111a239398069cc737614a0b34a67c2fa81
Binary files /dev/null and b/src/static/textures/item/slime_ball.png differ
diff --git a/src/static/textures/item/snowball.png b/src/static/textures/item/snowball.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a4f767647ecb222314c1c6f90a792ebecd61049
Binary files /dev/null and b/src/static/textures/item/snowball.png differ
diff --git a/src/static/textures/item/spawn_egg.png b/src/static/textures/item/spawn_egg.png
new file mode 100644
index 0000000000000000000000000000000000000000..f4c7dee1d40e3cb53fd09e6def877c9261274447
Binary files /dev/null and b/src/static/textures/item/spawn_egg.png differ
diff --git a/src/static/textures/item/spawn_egg_overlay.png b/src/static/textures/item/spawn_egg_overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..83ec78f172c9aa50293d688829e1760f44e83a2d
Binary files /dev/null and b/src/static/textures/item/spawn_egg_overlay.png differ
diff --git a/src/static/textures/item/spectral_arrow.png b/src/static/textures/item/spectral_arrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c2c24a398b300148a9872c55481ca7fb1d4df79
Binary files /dev/null and b/src/static/textures/item/spectral_arrow.png differ
diff --git a/src/static/textures/item/spider_eye.png b/src/static/textures/item/spider_eye.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c0b784cdfc4ee49fa041a429aabecb9545f51f5
Binary files /dev/null and b/src/static/textures/item/spider_eye.png differ
diff --git a/src/static/textures/item/splash_potion.png b/src/static/textures/item/splash_potion.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d3fa39de70e5b19b29d0618c4eec5f11f36e736
Binary files /dev/null and b/src/static/textures/item/splash_potion.png differ
diff --git a/src/static/textures/item/spruce_boat.png b/src/static/textures/item/spruce_boat.png
new file mode 100644
index 0000000000000000000000000000000000000000..d764262a5c3a520c2aba4ee6fe558501e930fbea
Binary files /dev/null and b/src/static/textures/item/spruce_boat.png differ
diff --git a/src/static/textures/item/spruce_door.png b/src/static/textures/item/spruce_door.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d915f359cedd6dfd049703f76417e2e9bbee489
Binary files /dev/null and b/src/static/textures/item/spruce_door.png differ
diff --git a/src/static/textures/item/stick.png b/src/static/textures/item/stick.png
new file mode 100644
index 0000000000000000000000000000000000000000..a6971ed3381a2271901550ff7778b5830f1b5510
Binary files /dev/null and b/src/static/textures/item/stick.png differ
diff --git a/src/static/textures/item/stone_axe.png b/src/static/textures/item/stone_axe.png
new file mode 100644
index 0000000000000000000000000000000000000000..2b726136ccabc7801c4efc5b1879da1f959aee3f
Binary files /dev/null and b/src/static/textures/item/stone_axe.png differ
diff --git a/src/static/textures/item/stone_hoe.png b/src/static/textures/item/stone_hoe.png
new file mode 100644
index 0000000000000000000000000000000000000000..0038410779096ed4e478b676844a33cca6691785
Binary files /dev/null and b/src/static/textures/item/stone_hoe.png differ
diff --git a/src/static/textures/item/stone_pickaxe.png b/src/static/textures/item/stone_pickaxe.png
new file mode 100644
index 0000000000000000000000000000000000000000..71c261ac42693209c30601a6bb20ffe47998acb7
Binary files /dev/null and b/src/static/textures/item/stone_pickaxe.png differ
diff --git a/src/static/textures/item/stone_shovel.png b/src/static/textures/item/stone_shovel.png
new file mode 100644
index 0000000000000000000000000000000000000000..d9b1faa19b39e3ac5161ca6f61ba21e8c2f119d3
Binary files /dev/null and b/src/static/textures/item/stone_shovel.png differ
diff --git a/src/static/textures/item/stone_sword.png b/src/static/textures/item/stone_sword.png
new file mode 100644
index 0000000000000000000000000000000000000000..68f8aa2386f1268a17bc5101a22c765bcc697622
Binary files /dev/null and b/src/static/textures/item/stone_sword.png differ
diff --git a/src/static/textures/item/string.png b/src/static/textures/item/string.png
new file mode 100644
index 0000000000000000000000000000000000000000..c4234313541053a852a2a43b6cfe6ea2bc1b2580
Binary files /dev/null and b/src/static/textures/item/string.png differ
diff --git a/src/static/textures/item/structure_void.png b/src/static/textures/item/structure_void.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b150003e8c50b61dc7aae6f7112cdb6894f69d8
Binary files /dev/null and b/src/static/textures/item/structure_void.png differ
diff --git a/src/static/textures/item/sugar.png b/src/static/textures/item/sugar.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab9f1478a59529a0984e76542fda79d116a4c7fa
Binary files /dev/null and b/src/static/textures/item/sugar.png differ
diff --git a/src/static/textures/item/sugar_cane.png b/src/static/textures/item/sugar_cane.png
new file mode 100644
index 0000000000000000000000000000000000000000..610f464b5d335da0aef60f2f99091dbb6ee02d93
Binary files /dev/null and b/src/static/textures/item/sugar_cane.png differ
diff --git a/src/static/textures/item/tipped_arrow_base.png b/src/static/textures/item/tipped_arrow_base.png
new file mode 100644
index 0000000000000000000000000000000000000000..a1b298cab7574451907f76a446bc677015387500
Binary files /dev/null and b/src/static/textures/item/tipped_arrow_base.png differ
diff --git a/src/static/textures/item/tipped_arrow_head.png b/src/static/textures/item/tipped_arrow_head.png
new file mode 100644
index 0000000000000000000000000000000000000000..7000bfc24d9c3c27ce8324515fedd8e259a04548
Binary files /dev/null and b/src/static/textures/item/tipped_arrow_head.png differ
diff --git a/src/static/textures/item/tnt_minecart.png b/src/static/textures/item/tnt_minecart.png
new file mode 100644
index 0000000000000000000000000000000000000000..cc81b8d184a05af10890f02b6043544c03372d84
Binary files /dev/null and b/src/static/textures/item/tnt_minecart.png differ
diff --git a/src/static/textures/item/totem_of_undying.png b/src/static/textures/item/totem_of_undying.png
new file mode 100644
index 0000000000000000000000000000000000000000..51599c507c7df717f1f435678aea7b50a971e3bc
Binary files /dev/null and b/src/static/textures/item/totem_of_undying.png differ
diff --git a/src/static/textures/item/tropical_fish.png b/src/static/textures/item/tropical_fish.png
new file mode 100644
index 0000000000000000000000000000000000000000..0790f278b76c9fd570a9e7a204fc9feb9d7a3169
Binary files /dev/null and b/src/static/textures/item/tropical_fish.png differ
diff --git a/src/static/textures/item/tropical_fish_bucket.png b/src/static/textures/item/tropical_fish_bucket.png
new file mode 100644
index 0000000000000000000000000000000000000000..cd98596ded5cabd2656c510d1d57a9d0abace5ff
Binary files /dev/null and b/src/static/textures/item/tropical_fish_bucket.png differ
diff --git a/src/static/textures/item/water_bucket.png b/src/static/textures/item/water_bucket.png
new file mode 100644
index 0000000000000000000000000000000000000000..52bf7853f24ec07c182f364d40f575e3f957c924
Binary files /dev/null and b/src/static/textures/item/water_bucket.png differ
diff --git a/src/static/textures/item/wheat.png b/src/static/textures/item/wheat.png
new file mode 100644
index 0000000000000000000000000000000000000000..62bbd6c741e7418cddb983c1fc389b41fc7e980b
Binary files /dev/null and b/src/static/textures/item/wheat.png differ
diff --git a/src/static/textures/item/wheat_seeds.png b/src/static/textures/item/wheat_seeds.png
new file mode 100644
index 0000000000000000000000000000000000000000..83d23a6ecc5e2ddd3225eb72fda3a686a7c18295
Binary files /dev/null and b/src/static/textures/item/wheat_seeds.png differ
diff --git a/src/static/textures/item/wooden_axe.png b/src/static/textures/item/wooden_axe.png
new file mode 100644
index 0000000000000000000000000000000000000000..bec1381d490204395845725bee61275d97fe5a5f
Binary files /dev/null and b/src/static/textures/item/wooden_axe.png differ
diff --git a/src/static/textures/item/wooden_hoe.png b/src/static/textures/item/wooden_hoe.png
new file mode 100644
index 0000000000000000000000000000000000000000..a3b4bd0d1ac65806106975bae689a049a09f6e57
Binary files /dev/null and b/src/static/textures/item/wooden_hoe.png differ
diff --git a/src/static/textures/item/wooden_pickaxe.png b/src/static/textures/item/wooden_pickaxe.png
new file mode 100644
index 0000000000000000000000000000000000000000..75830c02130a15cc89cea7abcf6b301185384bf2
Binary files /dev/null and b/src/static/textures/item/wooden_pickaxe.png differ
diff --git a/src/static/textures/item/wooden_shovel.png b/src/static/textures/item/wooden_shovel.png
new file mode 100644
index 0000000000000000000000000000000000000000..9481942b8c35b01e2c354f4f80bebe1cd974fcb2
Binary files /dev/null and b/src/static/textures/item/wooden_shovel.png differ
diff --git a/src/static/textures/item/wooden_sword.png b/src/static/textures/item/wooden_sword.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c53ef408268d68be38eb0f298b7ff1427ebf3d9
Binary files /dev/null and b/src/static/textures/item/wooden_sword.png differ
diff --git a/src/static/textures/item/writable_book.png b/src/static/textures/item/writable_book.png
new file mode 100644
index 0000000000000000000000000000000000000000..33af2fb07754e3f06972729412ba195922621a07
Binary files /dev/null and b/src/static/textures/item/writable_book.png differ
diff --git a/src/static/textures/item/written_book.png b/src/static/textures/item/written_book.png
new file mode 100644
index 0000000000000000000000000000000000000000..371a790f7346e89ac7e472bedae5e64ff22d04de
Binary files /dev/null and b/src/static/textures/item/written_book.png differ
diff --git a/src/static/textures/models/armor/chainmail_layer_1.png b/src/static/textures/models/armor/chainmail_layer_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..c28e0a3b98625b55e06ad9fb1d98a4ce21698c53
Binary files /dev/null and b/src/static/textures/models/armor/chainmail_layer_1.png differ
diff --git a/src/static/textures/models/armor/chainmail_layer_2.png b/src/static/textures/models/armor/chainmail_layer_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..60bf1d7700bb4bedcc235aa773835ab055a0116b
Binary files /dev/null and b/src/static/textures/models/armor/chainmail_layer_2.png differ
diff --git a/src/static/textures/models/armor/diamond_layer_1.png b/src/static/textures/models/armor/diamond_layer_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..44e2fc531f239493fa011d15aa9387dff405fcf2
Binary files /dev/null and b/src/static/textures/models/armor/diamond_layer_1.png differ
diff --git a/src/static/textures/models/armor/diamond_layer_2.png b/src/static/textures/models/armor/diamond_layer_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..2de240e2acbd50fc60cbc6cb9607574e1d4740b1
Binary files /dev/null and b/src/static/textures/models/armor/diamond_layer_2.png differ
diff --git a/src/static/textures/models/armor/gold_layer_1.png b/src/static/textures/models/armor/gold_layer_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..567d9023e173ec2f9ca25c735998a25af48aa2fe
Binary files /dev/null and b/src/static/textures/models/armor/gold_layer_1.png differ
diff --git a/src/static/textures/models/armor/gold_layer_2.png b/src/static/textures/models/armor/gold_layer_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..c179399b02e0c7a8343eb5accbeb85a11350ddcd
Binary files /dev/null and b/src/static/textures/models/armor/gold_layer_2.png differ
diff --git a/src/static/textures/models/armor/iron_layer_1.png b/src/static/textures/models/armor/iron_layer_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..1da5d26375e34794596d375b92f050ee0a4a8cb9
Binary files /dev/null and b/src/static/textures/models/armor/iron_layer_1.png differ
diff --git a/src/static/textures/models/armor/iron_layer_2.png b/src/static/textures/models/armor/iron_layer_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..3170869e4dece4fb5f22a4f757eca4f1c3d3d790
Binary files /dev/null and b/src/static/textures/models/armor/iron_layer_2.png differ
diff --git a/src/static/textures/models/armor/leather_layer_1.png b/src/static/textures/models/armor/leather_layer_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..cf4aada13a4b457daa9b31d3d3a735073addeb70
Binary files /dev/null and b/src/static/textures/models/armor/leather_layer_1.png differ
diff --git a/src/static/textures/models/armor/leather_layer_1_overlay.png b/src/static/textures/models/armor/leather_layer_1_overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..98dd02afe43a357c704d896bc46bfd2846ed5818
Binary files /dev/null and b/src/static/textures/models/armor/leather_layer_1_overlay.png differ
diff --git a/src/static/textures/models/armor/leather_layer_2.png b/src/static/textures/models/armor/leather_layer_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..abd64e6b2afc513de9bb4794d53f15f5860b47e4
Binary files /dev/null and b/src/static/textures/models/armor/leather_layer_2.png differ
diff --git a/src/static/textures/models/armor/leather_layer_2_overlay.png b/src/static/textures/models/armor/leather_layer_2_overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..4faea6d65b021018577bab2b0b24edb8cc59df91
Binary files /dev/null and b/src/static/textures/models/armor/leather_layer_2_overlay.png differ
diff --git a/src/style.css b/src/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..b4d59de43feeeedc44cecd69296cb2251c8a98bf
--- /dev/null
+++ b/src/style.css
@@ -0,0 +1,308 @@
+body {
+ font-family: Minecraft, Avenir, Helvetica, Arial, sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ margin: 0;
+ overflow: hidden;
+}
+* {
+ touch-action: none;
+}
+
+@font-face {
+ font-family: Minecraft;
+ src: url(/src/static/mc-font.otf);
+ font-display: swap;
+}
+
+.start {
+ background-image: url(/src/static/menu.jpeg);
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+}
+
+.start #exit {
+ display: none;
+}
+
+.menu {
+ z-index: 1;
+ position: fixed;
+ left: 0%;
+ top: 0%;
+
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+
+ width: 100vw;
+ height: 75vh;
+ padding-top: 25vh;
+
+ text-align: center;
+ user-select: none;
+ background-color: hsla(0, 0%, 11%, 0.7);
+}
+
+.button {
+ width: 300px;
+ margin-bottom: 15px;
+ padding: 10px;
+ display: inline-block;
+
+ font-family: Minecraft, Avenir, Helvetica, Arial, sans-serif;
+ font-size: 1.2rem;
+ color: white;
+ background-color: #727272;
+ cursor: pointer;
+
+ border-left: 2px solid #a4a4a4;
+ border-top: 2px solid #a4a4a4;
+ border-bottom: 2px solid #545655;
+ border-right: 2px solid #545655;
+ box-shadow: 0 0 0 2px black;
+}
+
+.button:hover {
+ background-color: #218306;
+ border-left: 2px solid #17cd07;
+ border-top: 2px solid #17cd07;
+ border-bottom: 2px solid #004e00;
+ border-right: 2px solid #004e00;
+ box-shadow: 0 0 0 2px white;
+}
+
+.footer {
+ position: fixed;
+ color: white;
+ left: 50%;
+ top: 100%;
+ opacity: 75%;
+ transform: translate(-50%, -100%);
+ font-family: sans-serif;
+}
+
+.fps {
+ position: fixed;
+ color: white;
+ left: 0%;
+ top: 0%;
+ padding: 5px;
+ margin: 1px;
+ border: 2px solid rgb(141, 139, 139);
+ background-color: hsla(0, 0%, 11%, 0.5);
+}
+
+.bag {
+ position: fixed;
+ left: 50%;
+ top: 100%;
+ transform: translate(-50%, -100%);
+ width: fit-content;
+ background-color: hsla(0, 0%, 11%, 0.5);
+ height: 62px;
+}
+
+.item {
+ display: inline-block;
+ width: 56px;
+ height: 56px;
+ margin: 1px;
+ border: 2px solid rgb(141, 139, 139);
+}
+
+.selected {
+ border: 2px solid rgb(236, 234, 234);
+ outline: 1px solid rgb(236, 234, 234);
+}
+
+.icon {
+ display: block;
+ margin: auto;
+ transform: translate(0, 20%);
+ width: 40px;
+ height: 40px;
+}
+
+.cross-hair {
+ position: fixed;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
+
+ user-select: none;
+ font-size: 3rem;
+ color: white;
+}
+
+.hidden {
+ display: none;
+}
+
+.features {
+ z-index: 2;
+ position: fixed;
+ left: 50%;
+ top: 20%;
+ transform: translate(-50%, 0%);
+
+ width: 300px;
+ color: white;
+ background-color: #727272;
+ border-left: 2px solid #a4a4a4;
+ border-top: 2px solid #a4a4a4;
+ border-bottom: 2px solid #545655;
+ border-right: 2px solid #545655;
+ box-shadow: 0 0 0 2px black;
+
+ padding: 0px 30px 0px 30px;
+
+ text-align: center;
+ user-select: none;
+ text-align: left;
+ line-height: 1.8rem;
+}
+
+.save-modal,
+.load-modal {
+ z-index: 3;
+ position: fixed;
+ left: 50%;
+ transform: translate(-50%, 0%);
+
+ margin-top: calc(25vh + 62px);
+ padding: 12px 0;
+ width: 300px;
+
+ color: white;
+ background-color: #218306;
+ border-left: 2px solid #17cd07;
+ border-top: 2px solid #17cd07;
+ border-bottom: 2px solid #004e00;
+ border-right: 2px solid #004e00;
+ box-shadow: 0 0 0 2px white;
+
+ opacity: 0%;
+
+ transition: opacity 0.35s ease-in-out;
+
+ text-align: center;
+ user-select: none;
+}
+
+.load-modal {
+ background-color: #727272;
+ border-left: 2px solid #a4a4a4;
+ border-top: 2px solid #a4a4a4;
+ border-bottom: 2px solid #545655;
+ border-right: 2px solid #545655;
+ box-shadow: 0 0 0 2px black;
+}
+
+.show {
+ transition: opacity 0.5s ease-in-out;
+ opacity: 100%;
+}
+
+.github svg {
+ z-index: 3;
+ fill: #727272;
+ position: fixed;
+ left: 100%;
+ top: -1%;
+ transform: translate(-99%, 0%) rotate(-90deg) scale(1, -1);
+}
+
+.settings {
+ z-index: 2;
+ position: fixed;
+ left: 50%;
+ top: 20%;
+ transform: translate(-50%, 0%);
+
+ width: 300px;
+ height: 370px;
+ color: white;
+ background-color: #727272;
+ border-left: 2px solid #a4a4a4;
+ border-top: 2px solid #a4a4a4;
+ border-bottom: 2px solid #545655;
+ border-right: 2px solid #545655;
+ box-shadow: 0 0 0 2px black;
+
+ padding: 0px 30px 0px 30px;
+
+ text-align: center;
+ user-select: none;
+ text-align: left;
+ line-height: 1.8rem;
+}
+
+#distance-input,
+#fov-input {
+ appearance: none;
+ width: 100%;
+ height: 16px;
+ background-color: #dddddd;
+ box-shadow: 0 0 0 2px black;
+}
+#music-input {
+ appearance: none;
+ width: 14%;
+ height: 16px;
+ background-color: #dddddd;
+ box-shadow: 0 0 0 2px black;
+}
+
+#distance-input::-webkit-slider-thumb:hover,
+#fov-input::-webkit-slider-thumb:hover,
+#music-input::-webkit-slider-thumb:hover {
+ background-color: #218306;
+ border-left: 2px solid #17cd07;
+ border-top: 2px solid #17cd07;
+ border-bottom: 2px solid #004e00;
+ border-right: 2px solid #004e00;
+ box-shadow: 0 0 0 2px white;
+}
+
+#distance-input::-webkit-slider-thumb,
+#fov-input::-webkit-slider-thumb,
+#music-input::-webkit-slider-thumb {
+ appearance: none;
+ width: 20px;
+ height: 30px;
+
+ background-color: #727272;
+ border-left: 2px solid #a4a4a4;
+ border-top: 2px solid #a4a4a4;
+ border-bottom: 2px solid #545655;
+ border-right: 2px solid #545655;
+ box-shadow: 0 0 0 2px black;
+
+ cursor: pointer;
+}
+
+#distance-input::-moz-range-thumb,
+#fov-input::-moz-range-thumb,
+#music-input::-moz-range-thumb {
+ appearance: none;
+ width: 20px;
+ height: 30px;
+
+ background-color: #727272;
+ border-left: 2px solid #a4a4a4;
+ border-top: 2px solid #a4a4a4;
+ border-bottom: 2px solid #545655;
+ border-right: 2px solid #545655;
+ box-shadow: 0 0 0 2px black;
+
+ cursor: pointer;
+}
+
+* {
+ -webkit-touch-callout: none;
+ -moz-touch-callout: none;
+ -ms-touch-callout: none;
+ -webkit-user-select: none;
+ user-select: none;
+}
diff --git a/src/terrain/highlight/index.ts b/src/terrain/highlight/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d15351208723c3eaed40dd3759a0ba7acc1c313c
--- /dev/null
+++ b/src/terrain/highlight/index.ts
@@ -0,0 +1,173 @@
+import * as THREE from 'three'
+import Terrain from '..'
+
+/**
+ * Highlight block on crosshair
+ */
+export default class BlockHighlight {
+ constructor(
+ scene: THREE.Scene,
+ camera: THREE.PerspectiveCamera,
+ terrain: Terrain
+ ) {
+ this.camera = camera
+ this.scene = scene
+ this.terrain = terrain
+ this.raycaster = new THREE.Raycaster()
+ this.raycaster.far = 8
+ }
+
+ scene: THREE.Scene
+ camera: THREE.PerspectiveCamera
+ terrain: Terrain
+ raycaster: THREE.Raycaster
+ block: THREE.Intersection | null = null
+
+ // highlight block mesh
+ geometry = new THREE.BoxGeometry(1.01, 1.01, 1.01)
+ material = new THREE.MeshStandardMaterial({
+ transparent: true,
+ opacity: 0.25
+ // depthWrite: false
+ })
+ mesh = new THREE.Mesh(new THREE.BoxGeometry(), this.material)
+
+ // block simulation
+ index = 0
+ instanceMesh = new THREE.InstancedMesh(
+ new THREE.BoxGeometry(),
+ new THREE.MeshBasicMaterial(),
+ 1000
+ )
+
+ update() {
+ // remove last highlight and reset block simulation
+ this.scene.remove(this.mesh)
+ this.index = 0
+ this.instanceMesh.instanceMatrix = new THREE.InstancedBufferAttribute(
+ new Float32Array(1000 * 16),
+ 16
+ )
+
+ const position = this.camera.position
+ const matrix = new THREE.Matrix4()
+ const idMap = new Map()
+ const noise = this.terrain.noise
+
+ let xPos = Math.round(position.x)
+ let zPos = Math.round(position.z)
+
+ for (let i = -8; i < 8; i++) {
+ for (let j = -8; j < 8; j++) {
+ // check terrain
+ let x = xPos + i
+ let z = zPos + j
+ let y =
+ Math.floor(
+ noise.get(x / noise.gap, z / noise.gap, noise.seed) * noise.amp
+ ) + 30
+
+ idMap.set(`${x}_${y}_${z}`, this.index)
+ matrix.setPosition(x, y, z)
+ this.instanceMesh.setMatrixAt(this.index++, matrix)
+
+ let stoneOffset =
+ noise.get(x / noise.stoneGap, z / noise.stoneGap, noise.stoneSeed) *
+ noise.stoneAmp
+
+ let treeOffset =
+ noise.get(x / noise.treeGap, z / noise.treeGap, noise.treeSeed) *
+ noise.treeAmp
+
+ // check tree
+ if (
+ treeOffset > noise.treeThreshold &&
+ y - 30 >= -3 &&
+ stoneOffset < noise.stoneThreshold
+ ) {
+ for (let t = 1; t <= noise.treeHeight; t++) {
+ idMap.set(`${x}_${y + t}_${z}`, this.index)
+ matrix.setPosition(x, y + t, z)
+ this.instanceMesh.setMatrixAt(this.index++, matrix)
+ }
+
+ // leaf
+ // for (let i = -3; i < 3; i++) {
+ // for (let j = -3; j < 3; j++) {
+ // for (let k = -3; k < 3; k++) {
+ // if (i === 0 && k === 0) {
+ // continue
+ // }
+ // let leafOffset =
+ // noise.get(
+ // (x + i + j) / noise.leafGap,
+ // (z + k) / noise.leafGap,
+ // noise.leafSeed
+ // ) * noise.leafAmp
+
+ // if (leafOffset > noise.leafThreshold) {
+ // idMap.set(
+ // `${x + i}_${y + noise.treeHeight + j}_${z + k}`,
+ // this.index
+ // )
+ // matrix.setPosition(x + i, y + noise.treeHeight + j, z + k)
+ // this.instanceMesh.setMatrixAt(this.index++, matrix)
+ // }
+ // }
+ // }
+ // }
+ }
+ }
+ }
+
+ // check custom blocks
+ for (const block of this.terrain.customBlocks) {
+ if (block.placed) {
+ matrix.setPosition(block.x, block.y, block.z)
+ this.instanceMesh.setMatrixAt(this.index++, matrix)
+ } else {
+ if (idMap.has(`${block.x}_${block.y}_${block.z}`)) {
+ let id = idMap.get(`${block.x}_${block.y}_${block.z}`)
+ this.instanceMesh.setMatrixAt(
+ id!,
+ new THREE.Matrix4().set(
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ )
+ )
+ }
+ }
+ }
+
+ // highlight new block
+ this.raycaster.setFromCamera({ x: 0, y: 0 }, this.camera)
+ this.block = this.raycaster.intersectObject(this.instanceMesh)[0]
+ if (
+ this.block &&
+ this.block.object instanceof THREE.InstancedMesh &&
+ typeof this.block.instanceId === 'number'
+ ) {
+ this.mesh = new THREE.Mesh(this.geometry, this.material)
+ let matrix = new THREE.Matrix4()
+ this.block.object.getMatrixAt(this.block.instanceId, matrix)
+ const position = new THREE.Vector3().setFromMatrixPosition(matrix)
+
+ this.mesh.position.set(position.x, position.y, position.z)
+ this.scene.add(this.mesh)
+ }
+ }
+}
diff --git a/src/terrain/index.ts b/src/terrain/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f88162c2f8eb8f715d6fa89f3f9b80bcc7225afb
--- /dev/null
+++ b/src/terrain/index.ts
@@ -0,0 +1,299 @@
+import * as THREE from 'three'
+import Materials, { MaterialType } from './mesh/materials'
+import Block from './mesh/block'
+import Highlight from './highlight'
+import Noise from './noise'
+
+import Generate from './worker/generate?worker'
+
+export enum BlockType {
+ grass = 0,
+ sand = 1,
+ tree = 2,
+ leaf = 3,
+ dirt = 4,
+ stone = 5,
+ coal = 6,
+ wood = 7,
+ diamond = 8,
+ quartz = 9,
+ glass = 10,
+ bedrock = 11
+}
+export default class Terrain {
+ constructor(scene: THREE.Scene, camera: THREE.PerspectiveCamera) {
+ this.scene = scene
+ this.camera = camera
+ this.maxCount =
+ (this.distance * this.chunkSize * 2 + this.chunkSize) ** 2 + 500
+ this.highlight = new Highlight(scene, camera, this)
+ this.scene.add(this.cloud)
+
+ // generate worker callback handler
+ this.generateWorker.onmessage = (
+ msg: MessageEvent<{
+ idMap: Map
+ arrays: ArrayLike[]
+ blocksCount: number[]
+ }>
+ ) => {
+ this.resetBlocks()
+ this.idMap = msg.data.idMap
+ this.blocksCount = msg.data.blocksCount
+
+ for (let i = 0; i < msg.data.arrays.length; i++) {
+ this.blocks[i].instanceMatrix = new THREE.InstancedBufferAttribute(
+ (this.blocks[i].instanceMatrix.array = msg.data.arrays[i]),
+ 16
+ )
+ }
+
+ for (const block of this.blocks) {
+ block.instanceMatrix.needsUpdate = true
+ }
+ }
+ }
+ // core properties
+ scene: THREE.Scene
+ camera: THREE.PerspectiveCamera
+ distance = 3
+ chunkSize = 24
+
+ // terrain properties
+ maxCount: number
+ chunk = new THREE.Vector2(0, 0)
+ previousChunk = new THREE.Vector2(0, 0)
+ noise = new Noise()
+
+ // materials
+ materials = new Materials()
+ materialType = [
+ MaterialType.grass,
+ MaterialType.sand,
+ MaterialType.tree,
+ MaterialType.leaf,
+ MaterialType.dirt,
+ MaterialType.stone,
+ MaterialType.coal,
+ MaterialType.wood,
+ MaterialType.diamond,
+ MaterialType.quartz,
+ MaterialType.glass,
+ MaterialType.bedrock
+ ]
+
+ // other properties
+ blocks: THREE.InstancedMesh[] = []
+ blocksCount: number[] = []
+ blocksFactor = [1, 0.2, 0.1, 0.7, 0.1, 0.2, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]
+
+ customBlocks: Block[] = []
+ highlight: Highlight
+
+ idMap = new Map()
+ generateWorker = new Generate()
+
+ // cloud
+ cloud = new THREE.InstancedMesh(
+ new THREE.BoxGeometry(20, 5, 14),
+ new THREE.MeshStandardMaterial({
+ transparent: true,
+ color: 0xffffff,
+ opacity: 0.4
+ }),
+ 1000
+ )
+ cloudCount = 0
+ cloudGap = 5
+
+ getCount = (type: BlockType) => {
+ return this.blocksCount[type]
+ }
+
+ setCount = (type: BlockType) => {
+ this.blocksCount[type] = this.blocksCount[type] + 1
+ }
+
+ initBlocks = () => {
+ // reset
+ for (const block of this.blocks) {
+ this.scene.remove(block)
+ }
+ this.blocks = []
+
+ // create instance meshes
+ const geometry = new THREE.BoxGeometry()
+
+ for (let i = 0; i < this.materialType.length; i++) {
+ let block = new THREE.InstancedMesh(
+ geometry,
+ this.materials.get(this.materialType[i]),
+ this.maxCount * this.blocksFactor[i]
+ )
+ block.name = BlockType[i]
+ this.blocks.push(block)
+ this.scene.add(block)
+ }
+
+ this.blocksCount = new Array(this.materialType.length).fill(0)
+ }
+
+ resetBlocks = () => {
+ // reest count and instance matrix
+ for (let i = 0; i < this.blocks.length; i++) {
+ this.blocks[i].instanceMatrix = new THREE.InstancedBufferAttribute(
+ new Float32Array(this.maxCount * this.blocksFactor[i] * 16),
+ 16
+ )
+ }
+ }
+
+ generate = () => {
+ this.blocksCount = new Array(this.blocks.length).fill(0)
+ // post work to generate worker
+ this.generateWorker.postMessage({
+ distance: this.distance,
+ chunk: this.chunk,
+ noiseSeed: this.noise.seed,
+ treeSeed: this.noise.treeSeed,
+ stoneSeed: this.noise.stoneSeed,
+ coalSeed: this.noise.coalSeed,
+ idMap: new Map(),
+ blocksFactor: this.blocksFactor,
+ blocksCount: this.blocksCount,
+ customBlocks: this.customBlocks,
+ chunkSize: this.chunkSize
+ })
+
+ // cloud
+
+ if (this.cloudGap++ > 5) {
+ this.cloudGap = 0
+ this.cloud.instanceMatrix = new THREE.InstancedBufferAttribute(
+ new Float32Array(1000 * 16),
+ 16
+ )
+ this.cloudCount = 0
+ for (
+ let x =
+ -this.chunkSize * this.distance * 3 + this.chunkSize * this.chunk.x;
+ x <
+ this.chunkSize * this.distance * 3 +
+ this.chunkSize +
+ this.chunkSize * this.chunk.x;
+ x += 20
+ ) {
+ for (
+ let z =
+ -this.chunkSize * this.distance * 3 + this.chunkSize * this.chunk.y;
+ z <
+ this.chunkSize * this.distance * 3 +
+ this.chunkSize +
+ this.chunkSize * this.chunk.y;
+ z += 20
+ ) {
+ const matrix = new THREE.Matrix4()
+ matrix.setPosition(x, 80 + (Math.random() - 0.5) * 30, z)
+
+ if (Math.random() > 0.8) {
+ this.cloud.setMatrixAt(this.cloudCount++, matrix)
+ }
+ }
+ }
+ this.cloud.instanceMatrix.needsUpdate = true
+ }
+ }
+
+ // generate adjacent blocks after removing a block (vertical infinity world)
+ generateAdjacentBlocks = (position: THREE.Vector3) => {
+ const { x, y, z } = position
+ const noise = this.noise
+ const yOffset = Math.floor(
+ noise.get(x / noise.gap, z / noise.gap, noise.seed) * noise.amp
+ )
+
+ if (y > 30 + yOffset) {
+ return
+ }
+
+ const stoneOffset =
+ noise.get(x / noise.stoneGap, z / noise.stoneGap, noise.stoneSeed) *
+ noise.stoneAmp
+
+ let type: BlockType
+
+ if (stoneOffset > noise.stoneThreshold || y < 23) {
+ type = BlockType.stone
+ } else {
+ if (yOffset < -3) {
+ type = BlockType.sand
+ } else {
+ type = BlockType.dirt
+ }
+ }
+
+ this.buildBlock(new THREE.Vector3(x, y - 1, z), type)
+ this.buildBlock(new THREE.Vector3(x, y + 1, z), type)
+ this.buildBlock(new THREE.Vector3(x - 1, y, z), type)
+ this.buildBlock(new THREE.Vector3(x + 1, y, z), type)
+ this.buildBlock(new THREE.Vector3(x, y, z - 1), type)
+ this.buildBlock(new THREE.Vector3(x, y, z + 1), type)
+
+ this.blocks[type].instanceMatrix.needsUpdate = true
+ }
+
+ buildBlock = (position: THREE.Vector3, type: BlockType) => {
+ const noise = this.noise
+ // check if it's natural terrain
+ const yOffset = Math.floor(
+ noise.get(position.x / noise.gap, position.z / noise.gap, noise.seed) *
+ noise.amp
+ )
+ if (position.y >= 30 + yOffset || position.y < 0) {
+ return
+ }
+
+ position.y === 0 && (type = BlockType.bedrock)
+
+ // check custom blocks
+ for (const block of this.customBlocks) {
+ if (
+ block.x === position.x &&
+ block.y === position.y &&
+ block.z === position.z
+ ) {
+ return
+ }
+ }
+
+ // build block
+ this.customBlocks.push(
+ new Block(position.x, position.y, position.z, type, true)
+ )
+
+ const matrix = new THREE.Matrix4()
+ matrix.setPosition(position)
+ this.blocks[type].setMatrixAt(this.getCount(type), matrix)
+ this.blocks[type].instanceMatrix.needsUpdate = true
+ this.setCount(type)
+ }
+
+ update = () => {
+ this.chunk.set(
+ Math.floor(this.camera.position.x / this.chunkSize),
+ Math.floor(this.camera.position.z / this.chunkSize)
+ )
+
+ //generate terrain when getting into new chunk
+ if (
+ this.chunk.x !== this.previousChunk.x ||
+ this.chunk.y !== this.previousChunk.y
+ ) {
+ this.generate()
+ }
+
+ this.previousChunk.copy(this.chunk)
+
+ this.highlight.update()
+ }
+}
diff --git a/src/terrain/mesh/block.ts b/src/terrain/mesh/block.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c01c0b035fa47859627a6d4bc8ac15440a2129bd
--- /dev/null
+++ b/src/terrain/mesh/block.ts
@@ -0,0 +1,26 @@
+import { BlockType } from '../index'
+
+/**
+ * Custom block
+ */
+export default class Block {
+ object: any
+ constructor(
+ x: number,
+ y: number,
+ z: number,
+ type: BlockType,
+ placed: boolean
+ ) {
+ this.x = x
+ this.y = y
+ this.z = z
+ this.type = type
+ this.placed = placed
+ }
+ x: number
+ y: number
+ z: number
+ type: BlockType
+ placed: boolean
+}
diff --git a/src/terrain/mesh/materials.ts b/src/terrain/mesh/materials.ts
new file mode 100644
index 0000000000000000000000000000000000000000..45b930d7edcc648d9bcf6614c35e2e297c9ae52a
--- /dev/null
+++ b/src/terrain/mesh/materials.ts
@@ -0,0 +1,121 @@
+import * as THREE from 'three'
+import stone from '../../static/textures/block/stone.png'
+import coal_ore from '../../static/textures/block/coal_ore.png'
+import iron_ore from '../../static/textures/block/iron_ore.png'
+import grass_side from '../../static/textures/block/grass_block_side.png'
+import grass_top_green from '../../static/textures/block/grass_top_green.png'
+import dirt from '../../static/textures/block/dirt.png'
+import oak_log from '../../static/textures/block/oak_log.png'
+import oak_log_top from '../../static/textures/block/oak_log_top.png'
+import oak_leaves from '../../static/textures/block/oak_leaves.png'
+import sand from '../../static/textures/block/sand.png'
+// import water from '../../static/textures/block/water.png'
+import oak_wood from '../../static/textures/block/oak_planks.png'
+import diamond from '../../static/textures/block/diamond_block.png'
+import quartz from '../../static/textures/block/quartz_block_side.png'
+import glass from '../../static/textures/block/glass.png'
+import bedrock from '../../static/textures/block/bedrock.png'
+
+export enum MaterialType {
+ grass = 'grass',
+ dirt = 'dirt',
+ tree = 'tree',
+ leaf = 'leaf',
+ sand = 'sand',
+ // water = 'water',
+ stone = 'stone',
+ coal = 'coal',
+ wood = 'wood',
+ diamond = 'diamond',
+ quartz = 'quartz',
+ glass = 'glass',
+ bedrock = 'bedrock'
+}
+let loader = new THREE.TextureLoader()
+
+// load texture
+const grassTopMaterial = loader.load(grass_top_green)
+const grassMaterial = loader.load(grass_side)
+const treeMaterial = loader.load(oak_log)
+const treeTopMaterial = loader.load(oak_log_top)
+const dirtMaterial = loader.load(dirt)
+const stoneMaterial = loader.load(stone)
+const coalMaterial = loader.load(coal_ore)
+const ironMaterial = loader.load(iron_ore)
+const leafMaterial = loader.load(oak_leaves)
+const sandMaterial = loader.load(sand)
+// const waterMaterial = loader.load(water)
+const woodMaterial = loader.load(oak_wood)
+const diamondMaterial = loader.load(diamond)
+const quartzMaterial = loader.load(quartz)
+const glassMaterial = loader.load(glass)
+const bedrockMaterial = loader.load(bedrock)
+
+// pixelate texture
+grassTopMaterial.magFilter = THREE.NearestFilter
+grassMaterial.magFilter = THREE.NearestFilter
+treeMaterial.magFilter = THREE.NearestFilter
+treeTopMaterial.magFilter = THREE.NearestFilter
+dirtMaterial.magFilter = THREE.NearestFilter
+stoneMaterial.magFilter = THREE.NearestFilter
+coalMaterial.magFilter = THREE.NearestFilter
+ironMaterial.magFilter = THREE.NearestFilter
+leafMaterial.magFilter = THREE.NearestFilter
+sandMaterial.magFilter = THREE.NearestFilter
+// waterMaterial.magFilter = THREE.NearestFilter
+woodMaterial.magFilter = THREE.NearestFilter
+diamondMaterial.magFilter = THREE.NearestFilter
+quartzMaterial.magFilter = THREE.NearestFilter
+glassMaterial.magFilter = THREE.NearestFilter
+bedrockMaterial.magFilter = THREE.NearestFilter
+
+export default class Materials {
+ materials = {
+ grass: [
+ new THREE.MeshStandardMaterial({ map: grassMaterial }),
+ new THREE.MeshStandardMaterial({ map: grassMaterial }),
+ new THREE.MeshStandardMaterial({
+ map: grassTopMaterial
+ }),
+ new THREE.MeshStandardMaterial({ map: dirtMaterial }),
+ new THREE.MeshStandardMaterial({ map: grassMaterial }),
+ new THREE.MeshStandardMaterial({ map: grassMaterial })
+ ],
+ dirt: new THREE.MeshStandardMaterial({ map: dirtMaterial }),
+ sand: new THREE.MeshStandardMaterial({ map: sandMaterial }),
+ tree: [
+ new THREE.MeshStandardMaterial({ map: treeMaterial }),
+ new THREE.MeshStandardMaterial({ map: treeMaterial }),
+ new THREE.MeshStandardMaterial({ map: treeTopMaterial }),
+ new THREE.MeshStandardMaterial({ map: treeTopMaterial }),
+ new THREE.MeshStandardMaterial({ map: treeMaterial }),
+ new THREE.MeshStandardMaterial({ map: treeMaterial })
+ ],
+ leaf: new THREE.MeshStandardMaterial({
+ map: leafMaterial,
+ color: new THREE.Color(0, 1, 0),
+ transparent: true
+ }),
+ // water: new THREE.MeshStandardMaterial({
+ // map: waterMaterial,
+ // transparent: true,
+ // opacity: 0.7
+ // }),
+ stone: new THREE.MeshStandardMaterial({ map: stoneMaterial }),
+ coal: new THREE.MeshStandardMaterial({ map: coalMaterial }),
+ wood: new THREE.MeshStandardMaterial({ map: woodMaterial }),
+ diamond: new THREE.MeshStandardMaterial({ map: diamondMaterial }),
+ quartz: new THREE.MeshStandardMaterial({ map: quartzMaterial }),
+ glass: new THREE.MeshStandardMaterial({
+ map: glassMaterial,
+ transparent: true
+ }),
+ bedrock: new THREE.MeshStandardMaterial({ map: bedrockMaterial })
+ }
+
+ get = (
+ type: MaterialType
+ ): THREE.MeshStandardMaterial | THREE.MeshStandardMaterial[] => {
+ return this.materials[type]
+ }
+}
diff --git a/src/terrain/noise/index.ts b/src/terrain/noise/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5bd8e82891902fec4a162d12dfc8d53d517473c8
--- /dev/null
+++ b/src/terrain/noise/index.ts
@@ -0,0 +1,34 @@
+import { ImprovedNoise } from 'three/examples/jsm/math/ImprovedNoise'
+// import { SimplexNoise } from 'three/examples/jsm/math/SimplexNoise'
+
+export default class Noise {
+ noise = new ImprovedNoise()
+ seed = Math.random()
+ gap = 22
+ amp = 8
+
+ stoneSeed = this.seed * 0.4
+ stoneGap = 12
+ stoneAmp = 8
+ stoneThreshold = 3.5
+
+ coalSeed = this.seed * 0.5
+ coalGap = 3
+ coalAmp = 8
+ coalThreshold = 3
+
+ treeSeed = this.seed * 0.7
+ treeGap = 2
+ treeAmp = 6
+ treeHeight = 10
+ treeThreshold = 4
+
+ leafSeed = this.seed * 0.8
+ leafGap = 2
+ leafAmp = 5
+ leafThreshold = -0.03
+
+ get = (x: number, y: number, z: number) => {
+ return this.noise.noise(x, y, z)
+ }
+}
diff --git a/src/terrain/worker/generate.ts b/src/terrain/worker/generate.ts
new file mode 100644
index 0000000000000000000000000000000000000000..af18ca76f41d99e2336068ad980a1e0004f0bf03
--- /dev/null
+++ b/src/terrain/worker/generate.ts
@@ -0,0 +1,243 @@
+import * as THREE from 'three'
+import Block from '../mesh/block'
+import Noise from '../noise'
+
+enum BlockType {
+ grass = 0,
+ sand = 1,
+ tree = 2,
+ leaf = 3,
+ dirt = 4,
+ stone = 5,
+ coal = 6,
+ wood = 7,
+ diamond = 8,
+ quartz = 9,
+ glass = 10,
+ bedrock = 11
+}
+
+const matrix = new THREE.Matrix4()
+const noise = new Noise()
+const blocks: THREE.InstancedMesh[] = []
+
+const geometry = new THREE.BoxGeometry()
+
+let isFirstRun = true
+
+onmessage = (
+ msg: MessageEvent<{
+ distance: number
+ chunk: THREE.Vector2
+ noiseSeed: number
+ treeSeed: number
+ stoneSeed: number
+ coalSeed: number
+ idMap: Map
+ blocksFactor: number[]
+ blocksCount: number[]
+ customBlocks: Block[]
+ chunkSize: number
+ }>
+) => {
+ // let p1 = performance.now()
+ const {
+ distance,
+ chunk,
+ noiseSeed,
+ idMap,
+ blocksFactor,
+ treeSeed,
+ stoneSeed,
+ coalSeed,
+ customBlocks,
+ blocksCount,
+ chunkSize
+ } = msg.data
+
+ const maxCount = (distance * chunkSize * 2 + chunkSize) ** 2 + 500
+
+ if (isFirstRun) {
+ for (let i = 0; i < blocksCount.length; i++) {
+ let block = new THREE.InstancedMesh(
+ geometry,
+ new THREE.MeshBasicMaterial(),
+ maxCount * blocksFactor[i]
+ )
+ blocks.push(block)
+ }
+
+ isFirstRun = false
+ }
+
+ noise.seed = noiseSeed
+ noise.treeSeed = treeSeed
+ noise.stoneSeed = stoneSeed
+ noise.coalSeed = coalSeed
+
+ for (let i = 0; i < blocks.length; i++) {
+ blocks[i].instanceMatrix = new THREE.InstancedBufferAttribute(
+ new Float32Array(maxCount * blocksFactor[i] * 16),
+ 16
+ )
+ }
+
+ for (
+ let x = -chunkSize * distance + chunkSize * chunk.x;
+ x < chunkSize * distance + chunkSize + chunkSize * chunk.x;
+ x++
+ ) {
+ for (
+ let z = -chunkSize * distance + chunkSize * chunk.y;
+ z < chunkSize * distance + chunkSize + chunkSize * chunk.y;
+ z++
+ ) {
+ const y = 30
+ const yOffset = Math.floor(
+ noise.get(x / noise.gap, z / noise.gap, noise.seed) * noise.amp
+ )
+
+ matrix.setPosition(x, y + yOffset, z)
+
+ const stoneOffset =
+ noise.get(x / noise.stoneGap, z / noise.stoneGap, noise.stoneSeed) *
+ noise.stoneAmp
+
+ const coalOffset =
+ noise.get(x / noise.coalGap, z / noise.coalGap, noise.coalSeed) *
+ noise.coalAmp
+
+ if (stoneOffset > noise.stoneThreshold) {
+ if (coalOffset > noise.coalThreshold) {
+ // coal
+ idMap.set(`${x}_${y + yOffset}_${z}`, blocksCount[BlockType.coal])
+ blocks[BlockType.coal].setMatrixAt(
+ blocksCount[BlockType.coal]++,
+ matrix
+ )
+ } else {
+ // stone
+ idMap.set(`${x}_${y + yOffset}_${z}`, blocksCount[BlockType.stone])
+ blocks[BlockType.stone].setMatrixAt(
+ blocksCount[BlockType.stone]++,
+ matrix
+ )
+ }
+ } else {
+ if (yOffset < -3) {
+ // sand
+ idMap.set(`${x}_${y + yOffset}_${z}`, blocksCount[BlockType.sand])
+ blocks[BlockType.sand].setMatrixAt(
+ blocksCount[BlockType.sand]++,
+ matrix
+ )
+ } else {
+ // grass
+ idMap.set(`${x}_${y + yOffset}_${z}`, blocksCount[BlockType.grass])
+ blocks[BlockType.grass].setMatrixAt(
+ blocksCount[BlockType.grass]++,
+ matrix
+ )
+ }
+ }
+
+ // tree
+ const treeOffset =
+ noise.get(x / noise.treeGap, z / noise.treeGap, noise.treeSeed) *
+ noise.treeAmp
+
+ if (
+ treeOffset > noise.treeThreshold &&
+ yOffset >= -3 &&
+ stoneOffset < noise.stoneThreshold
+ ) {
+ for (let i = 1; i <= noise.treeHeight; i++) {
+ idMap.set(`${x}_${y + yOffset + i}_${z}`, blocksCount[BlockType.tree])
+
+ matrix.setPosition(x, y + yOffset + i, z)
+
+ blocks[BlockType.tree].setMatrixAt(
+ blocksCount[BlockType.tree]++,
+ matrix
+ )
+ }
+
+ // leaf
+ for (let i = -3; i < 3; i++) {
+ for (let j = -3; j < 3; j++) {
+ for (let k = -3; k < 3; k++) {
+ if (i === 0 && k === 0) {
+ continue
+ }
+ const leafOffset =
+ noise.get(
+ (x + i + j) / noise.leafGap,
+ (z + k) / noise.leafGap,
+ noise.leafSeed
+ ) * noise.leafAmp
+ if (leafOffset > noise.leafThreshold) {
+ idMap.set(
+ `${x + i}_${y + yOffset + noise.treeHeight + j}_${z + k}`,
+ blocksCount[BlockType.leaf]
+ )
+ matrix.setPosition(
+ x + i,
+ y + yOffset + noise.treeHeight + j,
+ z + k
+ )
+ blocks[BlockType.leaf].setMatrixAt(
+ blocksCount[BlockType.leaf]++,
+ matrix
+ )
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ for (const block of customBlocks) {
+ if (
+ block.x > -chunkSize * distance + chunkSize * chunk.x &&
+ block.x < chunkSize * distance + chunkSize + chunkSize * chunk.x &&
+ block.z > -chunkSize * distance + chunkSize * chunk.y &&
+ block.z < chunkSize * distance + chunkSize + chunkSize * chunk.y
+ ) {
+ if (block.placed) {
+ // placed blocks
+ matrix.setPosition(block.x, block.y, block.z)
+ blocks[block.type].setMatrixAt(blocksCount[block.type]++, matrix)
+ } else {
+ // removed blocks
+ const id = idMap.get(`${block.x}_${block.y}_${block.z}`)
+
+ blocks[block.type].setMatrixAt(
+ id!,
+ new THREE.Matrix4().set(
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ )
+ )
+ }
+ }
+ }
+
+ const arrays = blocks.map(block => block.instanceMatrix.array)
+ postMessage({ idMap, arrays, blocksCount })
+ // console.log(performance.now() - p1)
+}
diff --git a/src/ui/bag/index.ts b/src/ui/bag/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1f83e91fe372ad198dcda8f563d5662e57903d3d
--- /dev/null
+++ b/src/ui/bag/index.ts
@@ -0,0 +1,77 @@
+import grass from '../../static/block-icon/grass.png'
+import stone from '../../static/block-icon/stone.png'
+import tree from '../../static/block-icon/tree.png'
+import wood from '../../static/block-icon/wood.png'
+import diamond from '../../static/block-icon/diamond.png'
+import quartz from '../../static/block-icon/quartz.png'
+import glass from '../../static/block-icon/glass.png'
+import { isMobile } from '../../utils'
+
+export default class Bag {
+ constructor() {
+ if (isMobile) return
+
+ this.bag.className = 'bag'
+ this.items[0].classList.add('selected')
+
+ for (let i = 0; i < this.items.length; i++) {
+ this.bag.appendChild(this.items[i])
+ }
+ document.body.appendChild(this.bag)
+
+ document.body.addEventListener('keydown', (e: KeyboardEvent) => {
+ if (isNaN(parseInt(e.key)) || e.key === '0') {
+ return
+ }
+
+ for (let i = 0; i < this.items.length; i++) {
+ this.items[i].classList.remove('selected')
+ }
+
+ this.current = parseInt(e.key) - 1
+ this.items[this.current].classList.add('selected')
+ })
+
+ document.body.addEventListener('wheel', (e: WheelEvent) => {
+ if (!this.wheelGap) {
+ this.wheelGap = true
+ setTimeout(() => {
+ this.wheelGap = false
+ }, 100)
+ if (e.deltaY > 0) {
+ this.current++
+ this.current > 9 && (this.current = 0)
+ } else if (e.deltaY < 0) {
+ this.current--
+ this.current < 0 && (this.current = 9)
+ }
+ for (let i = 0; i < this.items.length; i++) {
+ this.items[i].classList.remove('selected')
+ }
+ this.items[this.current].classList.add('selected')
+ }
+ })
+ }
+ wheelGap = false
+ current = 0
+ icon = [grass, stone, tree, wood, diamond, quartz, glass]
+ iconIndex = 0
+ y = 0
+
+ bag = document.createElement('div')
+
+ items = new Array(10).fill(null).map(() => {
+ let item = document.createElement('div')
+ item.className = 'item'
+
+ let img = document.createElement('img')
+ if (this.icon[this.iconIndex]) {
+ img.className = 'icon'
+ img.alt = 'block'
+ img.src = this.icon[this.iconIndex++]
+ item.appendChild(img)
+ }
+
+ return item
+ })
+}
diff --git a/src/ui/fps/index.ts b/src/ui/fps/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..aa02f90d5eaf723e4fc5d69429a9c6d183993b38
--- /dev/null
+++ b/src/ui/fps/index.ts
@@ -0,0 +1,30 @@
+/**
+ * Display current FPS
+ */
+export default class FPS {
+ constructor() {
+ this.fps.className = 'fps'
+ this.fps.innerHTML = `FPS: 60`
+
+ document.body.appendChild(this.fps)
+ }
+
+ p1 = performance.now()
+ p2 = performance.now()
+ gap = performance.now()
+ fps = document.createElement('div')
+ count = 0
+
+ update = () => {
+ this.p1 = performance.now()
+ this.count++
+
+ if (performance.now() - this.gap > 1000) {
+ this.fps.innerHTML = `FPS: ${this.count}`
+ this.gap = performance.now()
+ this.count = 0
+ }
+
+ this.p2 = this.p1
+ }
+}
diff --git a/src/ui/index.ts b/src/ui/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..21a3283c14e7d6115f9a7ee409fa32ba33bde624
--- /dev/null
+++ b/src/ui/index.ts
@@ -0,0 +1,287 @@
+import FPS from './fps'
+import Bag from './bag'
+import Terrain from '../terrain'
+import Block from '../terrain/mesh/block'
+import Control from '../control'
+import { Mode } from '../player'
+import Joystick from './joystick'
+import { isMobile } from '../utils'
+import * as THREE from 'three'
+
+export default class UI {
+ constructor(terrain: Terrain, control: Control) {
+ this.fps = new FPS()
+ this.bag = new Bag()
+ this.joystick = new Joystick(control)
+
+ this.crossHair.className = 'cross-hair'
+ this.crossHair.innerHTML = '+'
+ document.body.appendChild(this.crossHair)
+
+ // play
+ this.play?.addEventListener('click', () => {
+ if (this.play?.innerHTML === 'Play') {
+ this.onPlay()
+
+ // reset game
+ terrain.noise.seed = Math.random()
+ terrain.noise.stoneSeed = Math.random()
+ terrain.noise.treeSeed = Math.random()
+ terrain.noise.coalSeed = Math.random()
+ terrain.noise.leafSeed = Math.random()
+ terrain.customBlocks = []
+ terrain.initBlocks()
+ terrain.generate()
+ terrain.camera.position.y = 40
+ control.player.setMode(Mode.walking)
+ }
+ !isMobile && control.control.lock()
+ })
+
+ // save load
+ this.save?.addEventListener('click', () => {
+ if (this.save?.innerHTML === 'Save and Exit') {
+ // save game
+ window.localStorage.setItem(
+ 'block',
+ JSON.stringify(terrain.customBlocks)
+ )
+ window.localStorage.setItem('seed', JSON.stringify(terrain.noise.seed))
+
+ window.localStorage.setItem(
+ 'position',
+ JSON.stringify({
+ x: terrain.camera.position.x,
+ y: terrain.camera.position.y,
+ z: terrain.camera.position.z
+ })
+ )
+
+ // ui update
+ this.onExit()
+ this.onSave()
+ } else {
+ // load game
+ terrain.noise.seed =
+ Number(window.localStorage.getItem('seed')) ?? Math.random()
+
+ const customBlocks =
+ (JSON.parse(
+ window.localStorage.getItem('block') || 'null'
+ ) as Block[]) ?? []
+
+ terrain.customBlocks = customBlocks
+ terrain.initBlocks()
+ terrain.generate()
+
+ const position =
+ (JSON.parse(window.localStorage.getItem('position') || 'null') as {
+ x: number
+ y: number
+ z: number
+ }) ?? null
+
+ position && (terrain.camera.position.x = position.x)
+ position && (terrain.camera.position.y = position.y)
+ position && (terrain.camera.position.z = position.z)
+
+ // ui update
+ this.onPlay()
+ this.onLoad()
+ !isMobile && control.control.lock()
+ }
+ })
+
+ // guide
+ this.feature?.addEventListener('click', () => {
+ this.features?.classList.remove('hidden')
+ })
+ this.back?.addEventListener('click', () => {
+ this.features?.classList.add('hidden')
+ })
+
+ // setting
+ this.setting?.addEventListener('click', () => {
+ this.settings?.classList.remove('hidden')
+ })
+ this.settingBack?.addEventListener('click', () => {
+ this.settings?.classList.add('hidden')
+ })
+
+ // render distance
+ this.distanceInput?.addEventListener('input', (e: Event) => {
+ if (this.distance && e.target instanceof HTMLInputElement) {
+ this.distance.innerHTML = `Render Distance: ${e.target.value}`
+ }
+ })
+
+ // fov
+ this.fovInput?.addEventListener('input', (e: Event) => {
+ if (this.fov && e.target instanceof HTMLInputElement) {
+ this.fov.innerHTML = `Field of View: ${e.target.value}`
+ control.camera.fov = parseInt(e.target.value)
+ control.camera.updateProjectionMatrix()
+ }
+ })
+
+ // music
+ this.musicInput?.addEventListener('input', (e: Event) => {
+ if (this.fov && e.target instanceof HTMLInputElement) {
+ const disabled = e.target.value === '0'
+ control.audio.disabled = disabled
+ this.music!.innerHTML = `Music: ${disabled ? 'Off' : 'On'}`
+ }
+ })
+
+ // apply settings
+ this.settingBack?.addEventListener('click', () => {
+ if (this.distanceInput instanceof HTMLInputElement) {
+ terrain.distance = parseInt(this.distanceInput.value)
+ terrain.maxCount =
+ (terrain.distance * terrain.chunkSize * 2 + terrain.chunkSize) ** 2 +
+ 500
+
+ terrain.initBlocks()
+ terrain.generate()
+ terrain.scene.fog = new THREE.Fog(
+ 0x87ceeb,
+ 1,
+ terrain.distance * 24 + 24
+ )
+ }
+ })
+
+ // menu and fullscreen
+ document.body.addEventListener('keydown', (e: KeyboardEvent) => {
+ // menu
+ if (e.key === 'e' && document.pointerLockElement) {
+ !isMobile && control.control.unlock()
+ }
+
+ // fullscreen
+ if (e.key === 'f') {
+ if (document.fullscreenElement) {
+ document.exitFullscreen()
+ } else {
+ document.body.requestFullscreen()
+ }
+ }
+ })
+
+ // exit
+ this.exit?.addEventListener('click', () => {
+ this.onExit()
+ })
+
+ // play / pause handler
+ document.addEventListener('pointerlockchange', () => {
+ if (document.pointerLockElement) {
+ this.onPlay()
+ } else {
+ this.onPause()
+ }
+ })
+
+ // disable context menu
+ document.addEventListener('contextmenu', e => {
+ e.preventDefault()
+ })
+
+ // fallback lock handler
+ document.querySelector('canvas')?.addEventListener('click', (e: Event) => {
+ e.preventDefault()
+ !isMobile && control.control.lock()
+ })
+ }
+
+ fps: FPS
+ bag: Bag
+ joystick: Joystick
+
+ menu = document.querySelector('.menu')
+ crossHair = document.createElement('div')
+
+ // buttons
+ play = document.querySelector('#play')
+ control = document.querySelector('#control')
+ setting = document.querySelector('#setting')
+ feature = document.querySelector('#feature')
+ back = document.querySelector('#back')
+ exit = document.querySelector('#exit')
+ save = document.querySelector('#save')
+
+ // modals
+ saveModal = document.querySelector('.save-modal')
+ loadModal = document.querySelector('.load-modal')
+ settings = document.querySelector('.settings')
+ features = document.querySelector('.features')
+ github = document.querySelector('.github')
+
+ // settings
+ distance = document.querySelector('#distance')
+ distanceInput = document.querySelector('#distance-input')
+
+ fov = document.querySelector('#fov')
+ fovInput = document.querySelector('#fov-input')
+
+ music = document.querySelector('#music')
+ musicInput = document.querySelector('#music-input')
+
+ settingBack = document.querySelector('#setting-back')
+
+ onPlay = () => {
+ isMobile && this.joystick.init()
+ this.menu?.classList.add('hidden')
+ this.menu?.classList.remove('start')
+ this.play && (this.play.innerHTML = 'Resume')
+ this.crossHair.classList.remove('hidden')
+ this.github && this.github.classList.add('hidden')
+ this.feature?.classList.add('hidden')
+ }
+
+ onPause = () => {
+ this.menu?.classList.remove('hidden')
+ this.crossHair.classList.add('hidden')
+ this.save && (this.save.innerHTML = 'Save and Exit')
+ this.github && this.github.classList.remove('hidden')
+ }
+
+ onExit = () => {
+ this.menu?.classList.add('start')
+ this.play && (this.play.innerHTML = 'Play')
+ this.save && (this.save.innerHTML = 'Load Game')
+ this.feature?.classList.remove('hidden')
+ }
+
+ onSave = () => {
+ this.saveModal?.classList.remove('hidden')
+ setTimeout(() => {
+ this.saveModal?.classList.add('show')
+ })
+ setTimeout(() => {
+ this.saveModal?.classList.remove('show')
+ }, 1000)
+
+ setTimeout(() => {
+ this.saveModal?.classList.add('hidden')
+ }, 1350)
+ }
+
+ onLoad = () => {
+ this.loadModal?.classList.remove('hidden')
+ setTimeout(() => {
+ this.loadModal?.classList.add('show')
+ })
+ setTimeout(() => {
+ this.loadModal?.classList.remove('show')
+ }, 1000)
+
+ setTimeout(() => {
+ this.loadModal?.classList.add('hidden')
+ }, 1350)
+ }
+
+ update = () => {
+ this.fps.update()
+ }
+}
diff --git a/src/ui/joystick/index.ts b/src/ui/joystick/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dc3475d576f48570fac29e4119c4fb136f8da413
--- /dev/null
+++ b/src/ui/joystick/index.ts
@@ -0,0 +1,140 @@
+import * as THREE from 'three'
+import Control from '../../control'
+import { Mode } from '../../player'
+import { htmlToDom } from '../../utils'
+import UI from './joystick.html?raw'
+
+enum ActionKey {
+ FRONT = 'front',
+ LEFT = 'left',
+ RIGHT = 'right',
+ BACK = 'back',
+ MODE = 'mode',
+ JUMP = 'jump',
+ UP = 'up',
+ DOWN = 'down'
+}
+
+export default class Joystick {
+ constructor(control: Control) {
+ this.control = control
+ this.euler = new THREE.Euler(0, 0, 0, 'YXZ')
+ }
+
+ control: Control
+ pageX = 0
+ pageY = 0
+ clickX = 0
+ clickY = 0
+ euler: THREE.Euler
+ clickTimeout?: ReturnType
+ clickInterval?: ReturnType
+ hold = false
+
+ // emit keyboard event
+ private emitKeyboardEvent = (key: string) => {
+ return {
+ key
+ } as KeyboardEvent
+ }
+
+ // emit click event
+ private emitClickEvent = (button: number) => {
+ return {
+ button,
+ preventDefault: () => { }
+ } as MouseEvent
+ }
+
+ // init joystick button
+ private initButton = ({
+ actionKey,
+ key
+ }: {
+ actionKey: ActionKey
+ key: string
+ }) => {
+ const button = document.querySelector(
+ `#action-${actionKey}`
+ ) as HTMLButtonElement
+ button.addEventListener('pointermove', e => {
+ e.stopPropagation()
+ })
+ button.addEventListener('pointerdown', e => {
+ this.control.setMovementHandler(this.emitKeyboardEvent(key))
+ e.stopPropagation()
+ })
+ button.addEventListener('pointerup', e => {
+ this.control.resetMovementHandler(this.emitKeyboardEvent(key))
+ e.stopPropagation()
+ })
+ // extra config for mode switch button
+ if (actionKey === ActionKey.MODE && key === 'q') {
+ this.initButton({ actionKey: ActionKey.MODE, key: ' ' })
+ button.addEventListener('pointerdown', () => {
+ if (this.control.player.mode === Mode.flying) {
+ document.querySelector('#action-down')?.classList.remove('hidden')
+ } else {
+ document.querySelector('#action-down')?.classList.add('hidden')
+ }
+ })
+ }
+ }
+
+ init = () => {
+ htmlToDom(UI)
+
+ this.initButton({ actionKey: ActionKey.FRONT, key: 'w' })
+ this.initButton({ actionKey: ActionKey.LEFT, key: 'a' })
+ this.initButton({ actionKey: ActionKey.RIGHT, key: 'd' })
+ this.initButton({ actionKey: ActionKey.BACK, key: 's' })
+ this.initButton({ actionKey: ActionKey.MODE, key: 'q' })
+ this.initButton({ actionKey: ActionKey.UP, key: ' ' })
+ this.initButton({ actionKey: ActionKey.DOWN, key: 'Shift' })
+
+ // camera control
+ document.addEventListener('pointermove', e => {
+ if (this.pageX !== 0 || this.pageY !== 0) {
+ this.euler.setFromQuaternion(this.control.camera.quaternion)
+ this.euler.y -= 0.01 * (e.pageX - this.pageX)
+ this.euler.x -= 0.01 * (e.pageY - this.pageY)
+ this.euler.x = Math.max(
+ -Math.PI / 2,
+ Math.min(Math.PI / 2, this.euler.x)
+ )
+ this.control.camera.quaternion.setFromEuler(this.euler)
+ }
+ this.pageX = e.pageX
+ this.pageY = e.pageY
+ this.clickTimeout && clearTimeout(this.clickTimeout)
+ })
+
+ // click control
+ document.addEventListener('pointerdown', e => {
+ this.clickX = e.pageX
+ this.clickY = e.pageY
+
+ this.clickTimeout = setTimeout(() => {
+ if (e.pageX === this.clickX && e.pageY === this.clickY) {
+ this.control.mousedownHandler(this.emitClickEvent(0))
+ this.clickInterval = setInterval(() => {
+ this.control.mousedownHandler(this.emitClickEvent(0))
+ }, 333)
+ this.hold = true
+ }
+ }, 500)
+ })
+
+ document.addEventListener('pointerup', e => {
+ this.clickTimeout && clearTimeout(this.clickTimeout)
+ this.clickInterval && clearInterval(this.clickInterval)
+
+ if (!this.hold && e.pageX === this.clickX && e.pageY === this.clickY) {
+ this.control.mousedownHandler(this.emitClickEvent(2))
+ }
+ this.hold = false
+ this.pageX = 0
+ this.pageY = 0
+ })
+ }
+}
diff --git a/src/ui/joystick/joystick.html b/src/ui/joystick/joystick.html
new file mode 100644
index 0000000000000000000000000000000000000000..1f81423c445f3e6ff786c1ab8651ee282cc9705b
--- /dev/null
+++ b/src/ui/joystick/joystick.html
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/utils/index.ts b/src/utils/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ca4d28871677c752ce626cf1d824456da7650465
--- /dev/null
+++ b/src/utils/index.ts
@@ -0,0 +1,9 @@
+export const htmlToDom = (html: string) => {
+ const templateDom = document.createElement('template')
+ templateDom.innerHTML = html
+ window.document.body.appendChild(templateDom.content)
+}
+
+export const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(
+ navigator.userAgent
+)
diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..11f02fe2a0061d6e6e1f271b21da95423b448b32
--- /dev/null
+++ b/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/tsconfig.json b/tsconfig.json
index 32f76b79c6f36e9bed32de3435d3dee31bcae30d..8cdbb2ac97c4b1eca886cadef397d68f309ddebf 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,66 +1,18 @@
{
- "compilerOptions": {
- /* Visit https://aka.ms/tsconfig.json to read more about this file */
- /* Basic Options */
- // "incremental": true, /* Enable incremental compilation */
- "target": "ESNEXT", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */
- "module": "ESNext", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
- // "lib": [], /* Specify library files to be included in the compilation. */
- // "allowJs": true, /* Allow javascript files to be compiled. */
- // "checkJs": true, /* Report errors in .js files. */
- // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */
- // "declaration": true, /* Generates corresponding '.d.ts' file. */
- // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
- // "sourceMap": true, /* Generates corresponding '.map' file. */
- // "outFile": "./", /* Concatenate and emit output to single file. */
- // "outDir": "./", /* Redirect output structure to the directory. */
- // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
- // "composite": true, /* Enable project compilation */
- // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
- // "removeComments": true, /* Do not emit comments to output. */
- "noEmit": true, /* Do not emit outputs. */
- // "importHelpers": true, /* Import emit helpers from 'tslib'. */
- // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
- // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
- /* Strict Type-Checking Options */
- "strict": true, /* Enable all strict type-checking options. */
- // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
- // "strictNullChecks": true, /* Enable strict null checks. */
- // "strictFunctionTypes": true, /* Enable strict checking of function types. */
- // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
- // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
- // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
- // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
- /* Additional Checks */
- // "noUnusedLocals": true, /* Report errors on unused locals. */
- // "noUnusedParameters": true, /* Report errors on unused parameters. */
- // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
- // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
- // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
- // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an 'override' modifier. */
- // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */
- /* Module Resolution Options */
- "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
- // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
- // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
- // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
- "typeRoots": [
- "./node_modules/@types",
- ], /* List of folders to include type definitions from. */
- // "types": [], /* Type declaration files to be included in compilation. */
- // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
- "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
- // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
- // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
- /* Experimental Options */
- // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
- // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
- /* Advanced Options */
- "skipLibCheck": true, /* Skip type checking of declaration files. */
- "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
- },
- "exclude": [
- "node_modules",
- ".build"
- ]
-}
\ No newline at end of file
+ "compilerOptions": {
+ "target": "ESNext",
+ "useDefineForClassFields": true,
+ "module": "ESNext",
+ "lib": ["ESNext", "DOM"],
+ "moduleResolution": "Node",
+ "strict": true,
+ "sourceMap": true,
+ "resolveJsonModule": true,
+ "esModuleInterop": true,
+ "noEmit": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noImplicitReturns": true
+ },
+ "include": ["./src"]
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ece4235e4be44158d87bd281382f1a049d3b1feb
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,7 @@
+export default {
+ build: {
+ chunkSizeWarningLimit: 2000,
+ assetsInlineLimit: 0,
+ sourcemap: true
+ }
+}
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000000000000000000000000000000000000..6e01f823de1ecbdee5f75e8e6f98caf0f95ef5fb
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,224 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@types/three@^0.137.0":
+ version "0.137.0"
+ resolved "https://registry.yarnpkg.com/@types/three/-/three-0.137.0.tgz#6047e0658262b4de7c464a40288f9071ddd9a6d5"
+ integrity sha512-Xc5EAlfYmgrCLI/VlSVqiRJAtzhWF0Rw2jSq48nqJy+Hcb5sfDOXyfZn1+RNcHyi9l8CeCAXCZygO8IyeOJVEA==
+
+esbuild-android-arm64@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.21.tgz#8842d0c3b7c81fbe2dc46ddb416ffd6eb822184b"
+ integrity sha512-Bqgld1TY0wZv8TqiQmVxQFgYzz8ZmyzT7clXBDZFkOOdRybzsnj8AZuK1pwcLVA7Ya6XncHgJqIao7NFd3s0RQ==
+
+esbuild-darwin-64@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.21.tgz#ec7df02ad88ecf7f8fc23a3ed7917e07dea0c9c9"
+ integrity sha512-j+Eg+e13djzyYINVvAbOo2/zvZ2DivuJJTaBrJnJHSD7kUNuGHRkHoSfFjbI80KHkn091w350wdmXDNSgRjfYQ==
+
+esbuild-darwin-arm64@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.21.tgz#0c2a977edec1ef54097ee56a911518c820d4e5e4"
+ integrity sha512-nDNTKWDPI0RuoPj5BhcSB2z5EmZJJAyRtZLIjyXSqSpAyoB8eyAKXl4lB8U2P78Fnh4Lh1le/fmpewXE04JhBQ==
+
+esbuild-freebsd-64@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.21.tgz#f5b5fc1d031286c3a0949d1bda7db774b7d0404e"
+ integrity sha512-zIurkCHXhxELiDZtLGiexi8t8onQc2LtuE+S7457H/pP0g0MLRKMrsn/IN4LDkNe6lvBjuoZZi2OfelOHn831g==
+
+esbuild-freebsd-arm64@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.21.tgz#a05cab908013e4992b31a675850b8c44eb468c0c"
+ integrity sha512-wdxMmkJfbwcN+q85MpeUEamVZ40FNsBa9mPq8tAszDn8TRT2HoJvVRADPIIBa9SWWwlDChIMjkDKAnS3KS/sPA==
+
+esbuild-linux-32@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.21.tgz#638d244cc58b951f447addb4bade628d126ef84b"
+ integrity sha512-fmxvyzOPPh2xiEHojpCeIQP6pXcoKsWbz3ryDDIKLOsk4xp3GbpHIEAWP0xTeuhEbendmvBDVKbAVv3PnODXLg==
+
+esbuild-linux-64@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.21.tgz#8eb634abee928be7e35b985fafbfef2f2e31397f"
+ integrity sha512-edZyNOv1ql+kpmlzdqzzDjRQYls+tSyi4QFi+PdBhATJFUqHsnNELWA9vMSzAaInPOEaVUTA5Ml28XFChcy4DA==
+
+esbuild-linux-arm64@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.21.tgz#e05599ea6253b58394157da162d856f3ead62f9e"
+ integrity sha512-t5qxRkq4zdQC0zXpzSB2bTtfLgOvR0C6BXYaRE/6/k8/4SrkZcTZBeNu+xGvwCU4b5dU9ST9pwIWkK6T1grS8g==
+
+esbuild-linux-arm@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.21.tgz#1ae1078231cf689d3ba894a32d3723c0be9b91fd"
+ integrity sha512-aSU5pUueK6afqmLQsbU+QcFBT62L+4G9hHMJDHWfxgid6hzhSmfRH9U/f+ymvxsSTr/HFRU4y7ox8ZyhlVl98w==
+
+esbuild-linux-mips64le@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.21.tgz#f05be62d126764e99b37edcac5bb49b78c7a8890"
+ integrity sha512-jLZLQGCNlUsmIHtGqNvBs3zN+7a4D9ckf0JZ+jQTwHdZJ1SgV9mAjbB980OFo66LoY+WeM7t3WEnq3FjI1zw4A==
+
+esbuild-linux-ppc64le@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.21.tgz#592c98d82dad7982268ef8deed858c4566f07ab1"
+ integrity sha512-4TWxpK391en2UBUw6GSrukToTDu6lL9vkm3Ll40HrI08WG3qcnJu7bl8e1+GzelDsiw1QmfAY/nNvJ6iaHRpCQ==
+
+esbuild-linux-riscv64@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.21.tgz#0db7bd6f10d8f9afea973a7d6bf87b449b864b7b"
+ integrity sha512-fElngqOaOfTsF+u+oetDLHsPG74vB2ZaGZUqmGefAJn3a5z9Z2pNa4WpVbbKgHpaAAy5tWM1m1sbGohj6Ki6+Q==
+
+esbuild-linux-s390x@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.21.tgz#254a9354d34c9d1b41a3e21d2ec9269cbbb2c5df"
+ integrity sha512-brleZ6R5fYv0qQ7ZBwenQmP6i9TdvJCB092c/3D3pTLQHBGHJb5zWgKxOeS7bdHzmLy6a6W7GbFk6QKpjyD6QA==
+
+esbuild-netbsd-64@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.21.tgz#4cb783d060b02bf3b897a9a12cce2b3b547726f8"
+ integrity sha512-nCEgsLCQ8RoFWVV8pVI+kX66ICwbPP/M9vEa0NJGIEB/Vs5sVGMqkf67oln90XNSkbc0bPBDuo4G6FxlF7PN8g==
+
+esbuild-openbsd-64@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.21.tgz#f886b93feefddbe573528fa4b421c9c6e2bc969b"
+ integrity sha512-h9zLMyVD0T73MDTVYIb/qUTokwI6EJH9O6wESuTNq6+XpMSr6C5aYZ4fvFKdNELW+Xsod+yDS2hV2JTUAbFrLA==
+
+esbuild-sunos-64@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.21.tgz#3829e4d57d4cb6950837fe90b0b67cdfb37cf13a"
+ integrity sha512-Kl+7Cot32qd9oqpLdB1tEGXEkjBlijrIxMJ0+vlDFaqsODutif25on0IZlFxEBtL2Gosd4p5WCV1U7UskNQfXA==
+
+esbuild-windows-32@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.21.tgz#b858a22d1a82e53cdc59310cd56294133f7a95e7"
+ integrity sha512-V7vnTq67xPBUCk/9UtlolmQ798Ecjdr1ZoI1vcSgw7M82aSSt0eZdP6bh5KAFZU8pxDcx3qoHyWQfHYr11f22A==
+
+esbuild-windows-64@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.21.tgz#7bb5a027d5720cf9caf18a4bedd11327208f1f12"
+ integrity sha512-kDgHjKOHwjfJDCyRGELzVxiP/RBJBTA+wyspf78MTTJQkyPuxH2vChReNdWc+dU2S4gIZFHMdP1Qrl/k22ZmaA==
+
+esbuild-windows-arm64@0.14.21:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.21.tgz#25df54521ad602c826b262ea2e7cc1fe80f5c2f5"
+ integrity sha512-8Sbo0zpzgwWrwjQYLmHF78f7E2xg5Ve63bjB2ng3V2aManilnnTGaliq2snYg+NOX60+hEvJHRdVnuIAHW0lVw==
+
+esbuild@^0.14.14:
+ version "0.14.21"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.21.tgz#b3e05f900f1c4394f596d60d63d9816468f0f671"
+ integrity sha512-7WEoNMBJdLN993dr9h0CpFHPRc3yFZD+EAVY9lg6syJJ12gc5fHq8d75QRExuhnMkT2DaRiIKFThRvDWP+fO+A==
+ optionalDependencies:
+ esbuild-android-arm64 "0.14.21"
+ esbuild-darwin-64 "0.14.21"
+ esbuild-darwin-arm64 "0.14.21"
+ esbuild-freebsd-64 "0.14.21"
+ esbuild-freebsd-arm64 "0.14.21"
+ esbuild-linux-32 "0.14.21"
+ esbuild-linux-64 "0.14.21"
+ esbuild-linux-arm "0.14.21"
+ esbuild-linux-arm64 "0.14.21"
+ esbuild-linux-mips64le "0.14.21"
+ esbuild-linux-ppc64le "0.14.21"
+ esbuild-linux-riscv64 "0.14.21"
+ esbuild-linux-s390x "0.14.21"
+ esbuild-netbsd-64 "0.14.21"
+ esbuild-openbsd-64 "0.14.21"
+ esbuild-sunos-64 "0.14.21"
+ esbuild-windows-32 "0.14.21"
+ esbuild-windows-64 "0.14.21"
+ esbuild-windows-arm64 "0.14.21"
+
+fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+is-core-module@^2.8.1:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
+ integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
+ dependencies:
+ has "^1.0.3"
+
+nanoid@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c"
+ integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+postcss@^8.4.5:
+ version "8.4.6"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.6.tgz#c5ff3c3c457a23864f32cb45ac9b741498a09ae1"
+ integrity sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==
+ dependencies:
+ nanoid "^3.2.0"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
+resolve@^1.22.0:
+ version "1.22.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
+ integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
+ dependencies:
+ is-core-module "^2.8.1"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+rollup@^2.59.0:
+ version "2.67.1"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.67.1.tgz#4402665706fa00f321d446ce45f880e02cf54f01"
+ integrity sha512-1Sbcs4OuW+aD+hhqpIRl+RqooIpF6uQcfzU/QSI7vGkwADY6cM4iLsBGRM2CGLXDTDN5y/yShohFmnKegSPWzg==
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+source-map-js@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+three@^0.137.0:
+ version "0.137.5"
+ resolved "https://registry.yarnpkg.com/three/-/three-0.137.5.tgz#a1e34bedd0412f2d8797112973dfadac78022ce6"
+ integrity sha512-rTyr+HDFxjnN8+N/guZjDgfVxgHptZQpf6xfL/Mo7a5JYIFwK6tAq3bzxYYB4Ae0RosDZlDuP+X5aXDXz+XnHQ==
+
+typescript@^4.5.5:
+ version "4.5.5"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3"
+ integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==
+
+vite@^2.8.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/vite/-/vite-2.8.0.tgz#0646ab9eee805fb24b667889644ac04bc516d0d3"
+ integrity sha512-ed5rjyeysttuPJX/aKSA0gTB/8ZKLM5xF6FtEuKy1B9DiQbDNFMVMQxnb9JesgBPUMMIJxC8w5KZ/KNWLKFXoA==
+ dependencies:
+ esbuild "^0.14.14"
+ postcss "^8.4.5"
+ resolve "^1.22.0"
+ rollup "^2.59.0"
+ optionalDependencies:
+ fsevents "~2.3.2"