From 507659b679432bfe1977e2f60f1df228b38d6581 Mon Sep 17 00:00:00 2001 From: Donovan Daniels Date: Fri, 31 May 2024 08:54:48 -0500 Subject: [PATCH] Dynamically build paintings & kz --- .gitignore | 1 + README.md | 23 +- .../paintings_kristoffer_zetterstrand.png | 3 - .../minecraft/textures/painting/alban.png | 3 - .../minecraft/textures/painting/aztec.png | 3 - .../minecraft/textures/painting/aztec2.png | 3 - .../minecraft/textures/painting/bomb.png | 3 - .../textures/painting/burning_skull.png | 3 - .../painting/burning_skull.png.mcmeta | 3 - .../minecraft/textures/painting/bust.png | 3 - .../minecraft/textures/painting/courbet.png | 3 - .../minecraft/textures/painting/creebet.png | 3 - .../textures/painting/donkey_kong.png | 3 - .../minecraft/textures/painting/fighters.png | 3 - .../minecraft/textures/painting/graham.png | 3 - .../textures/painting/graham.png.mcmeta | 3 - .../minecraft/textures/painting/kebab.png | 3 - .../textures/painting/kebab.png.mcmeta | 5 - .../minecraft/textures/painting/match.png | 3 - .../minecraft/textures/painting/pigscene.png | 3 - .../minecraft/textures/painting/plant.png | 3 - .../textures/painting/plant.png.mcmeta | 3 - .../minecraft/textures/painting/pointer.png | 3 - .../textures/painting/pointer.png.mcmeta | 5 - .../minecraft/textures/painting/pool.png | 3 - .../minecraft/textures/painting/sea.png | 3 - .../minecraft/textures/painting/skeleton.png | 3 - .../textures/painting/skull_and_roses.png | 3 - .../minecraft/textures/painting/stage.png | 3 - .../minecraft/textures/painting/sunset.png | 3 - .../minecraft/textures/painting/void.png | 3 - .../minecraft/textures/painting/wanderer.png | 3 - .../textures/painting/wanderer.png.mcmeta | 5 - .../minecraft/textures/painting/wasteland.png | 3 - .../minecraft/textures/painting/wither.png | 3 - .../paintings_kristoffer_zetterstrand.png | 3 + {common-kz => data-kz}/pack.png | 0 .../minecraft/textures/painting/alban.png | 3 + .../minecraft/textures/painting/aztec.png | 3 + .../minecraft/textures/painting/aztec2.png | 3 + .../minecraft/textures/painting/bomb.png | 3 + .../textures/painting/burning_skull.png | 3 + .../painting/burning_skull.png.mcmeta | 1 + .../minecraft/textures/painting/bust.png | 3 + .../minecraft/textures/painting/courbet.png | 3 + .../minecraft/textures/painting/creebet.png | 3 + .../textures/painting/donkey_kong.png | 3 + .../minecraft/textures/painting/fighters.png | 3 + .../minecraft/textures/painting/graham.png | 3 + .../textures/painting/graham.png.mcmeta | 1 + .../minecraft/textures/painting/kebab.png | 3 + .../textures/painting/kebab.png.mcmeta | 1 + .../minecraft/textures/painting/match.png | 3 + .../minecraft/textures/painting/pigscene.png | 3 + .../minecraft/textures/painting/plant.png | 3 + .../textures/painting/plant.png.mcmeta | 1 + .../minecraft/textures/painting/pointer.png | 3 + .../textures/painting/pointer.png.mcmeta | 1 + .../minecraft/textures/painting/pool.png | 3 + .../minecraft/textures/painting/sea.png | 3 + .../minecraft/textures/painting/skeleton.png | 3 + .../textures/painting/skull_and_roses.png | 3 + .../minecraft/textures/painting/stage.png | 3 + .../minecraft/textures/painting/sunset.png | 3 + .../minecraft/textures/painting/void.png | 3 + .../minecraft/textures/painting/wanderer.png | 3 + .../textures/painting/wanderer.png.mcmeta | 1 + .../minecraft/textures/painting/wasteland.png | 3 + .../minecraft/textures/painting/wither.png | 3 + {common => data}/pack.png | 0 frame.png | 3 - images/alban.png | 3 + images/aztec.png | 3 + images/aztec2.jpg | 3 + images/bomb.png | 3 + images/burning_skull.webm | 3 + images/bust.jpg | 3 + images/courbet.png | 3 + images/creebet.png | 3 + images/donkey_kong.png | 3 + images/fighters.png | 3 + images/graham.gif | 3 + images/images.json | 276 ++++++++++++++++++ images/kebab.webm | 3 + images/match.png | 3 + images/pigscene.png | 3 + images/plant.gif | 3 + images/pointer/0001.png | 3 + images/pointer/0002.png | 3 + images/pointer/0003.png | 3 + images/pointer/0004.png | 3 + images/pointer/0005.png | 3 + images/pointer/0006.png | 3 + images/pointer/0007.png | 3 + images/pointer/0008.png | 3 + images/pointer/0009.png | 3 + images/pointer/0010.png | 3 + images/pointer/0011.png | 3 + images/pointer/0012.png | 3 + images/pointer/0013.png | 3 + images/pointer/0014.png | 3 + images/pointer/0015.png | 3 + images/pointer/0016.png | 3 + images/pointer/0017.png | 3 + images/pointer/0018.png | 3 + images/pointer/0019.png | 3 + images/pointer/0020.png | 3 + images/pointer/0021.png | 3 + images/pointer/0022.png | 3 + images/pointer/0023.png | 3 + images/pool.jpg | 3 + images/sea.png | 3 + images/skeleton.png | 3 + images/skull_and_roses.png | 3 + images/stage.png | 3 + images/sunset.png | 3 + images/test.json | 22 ++ images/void.jpg | 3 + images/wanderer.gif | 3 + images/wasteland.png | 3 + images/wither.png | 3 + info.json | 12 +- kz.png | 3 + scripts/.eslintrc.json | 8 + scripts/bun.lockb | Bin 0 -> 112106 bytes scripts/common.ts | 194 ++++++++++++ scripts/images.ts | 136 +++++++++ scripts/package.json | 26 ++ scripts/tsconfig.json | 22 ++ 129 files changed, 937 insertions(+), 125 deletions(-) delete mode 100644 common-kz/assets/minecraft/textures/painting/paintings_kristoffer_zetterstrand.png delete mode 100644 common/assets/minecraft/textures/painting/alban.png delete mode 100644 common/assets/minecraft/textures/painting/aztec.png delete mode 100644 common/assets/minecraft/textures/painting/aztec2.png delete mode 100644 common/assets/minecraft/textures/painting/bomb.png delete mode 100755 common/assets/minecraft/textures/painting/burning_skull.png delete mode 100755 common/assets/minecraft/textures/painting/burning_skull.png.mcmeta delete mode 100644 common/assets/minecraft/textures/painting/bust.png delete mode 100644 common/assets/minecraft/textures/painting/courbet.png delete mode 100644 common/assets/minecraft/textures/painting/creebet.png delete mode 100644 common/assets/minecraft/textures/painting/donkey_kong.png delete mode 100644 common/assets/minecraft/textures/painting/fighters.png delete mode 100644 common/assets/minecraft/textures/painting/graham.png delete mode 100755 common/assets/minecraft/textures/painting/graham.png.mcmeta delete mode 100644 common/assets/minecraft/textures/painting/kebab.png delete mode 100755 common/assets/minecraft/textures/painting/kebab.png.mcmeta delete mode 100644 common/assets/minecraft/textures/painting/match.png delete mode 100644 common/assets/minecraft/textures/painting/pigscene.png delete mode 100644 common/assets/minecraft/textures/painting/plant.png delete mode 100755 common/assets/minecraft/textures/painting/plant.png.mcmeta delete mode 100644 common/assets/minecraft/textures/painting/pointer.png delete mode 100755 common/assets/minecraft/textures/painting/pointer.png.mcmeta delete mode 100644 common/assets/minecraft/textures/painting/pool.png delete mode 100644 common/assets/minecraft/textures/painting/sea.png delete mode 100644 common/assets/minecraft/textures/painting/skeleton.png delete mode 100644 common/assets/minecraft/textures/painting/skull_and_roses.png delete mode 100644 common/assets/minecraft/textures/painting/stage.png delete mode 100644 common/assets/minecraft/textures/painting/sunset.png delete mode 100644 common/assets/minecraft/textures/painting/void.png delete mode 100644 common/assets/minecraft/textures/painting/wanderer.png delete mode 100755 common/assets/minecraft/textures/painting/wanderer.png.mcmeta delete mode 100644 common/assets/minecraft/textures/painting/wasteland.png delete mode 100644 common/assets/minecraft/textures/painting/wither.png create mode 100644 data-kz/assets/minecraft/textures/painting/paintings_kristoffer_zetterstrand.png rename {common-kz => data-kz}/pack.png (100%) create mode 100644 data/assets/minecraft/textures/painting/alban.png create mode 100644 data/assets/minecraft/textures/painting/aztec.png create mode 100644 data/assets/minecraft/textures/painting/aztec2.png create mode 100644 data/assets/minecraft/textures/painting/bomb.png create mode 100644 data/assets/minecraft/textures/painting/burning_skull.png create mode 100644 data/assets/minecraft/textures/painting/burning_skull.png.mcmeta create mode 100644 data/assets/minecraft/textures/painting/bust.png create mode 100644 data/assets/minecraft/textures/painting/courbet.png create mode 100644 data/assets/minecraft/textures/painting/creebet.png create mode 100644 data/assets/minecraft/textures/painting/donkey_kong.png create mode 100644 data/assets/minecraft/textures/painting/fighters.png create mode 100644 data/assets/minecraft/textures/painting/graham.png create mode 100644 data/assets/minecraft/textures/painting/graham.png.mcmeta create mode 100644 data/assets/minecraft/textures/painting/kebab.png create mode 100644 data/assets/minecraft/textures/painting/kebab.png.mcmeta create mode 100644 data/assets/minecraft/textures/painting/match.png create mode 100644 data/assets/minecraft/textures/painting/pigscene.png create mode 100644 data/assets/minecraft/textures/painting/plant.png create mode 100644 data/assets/minecraft/textures/painting/plant.png.mcmeta create mode 100644 data/assets/minecraft/textures/painting/pointer.png create mode 100644 data/assets/minecraft/textures/painting/pointer.png.mcmeta create mode 100644 data/assets/minecraft/textures/painting/pool.png create mode 100644 data/assets/minecraft/textures/painting/sea.png create mode 100644 data/assets/minecraft/textures/painting/skeleton.png create mode 100644 data/assets/minecraft/textures/painting/skull_and_roses.png create mode 100644 data/assets/minecraft/textures/painting/stage.png create mode 100644 data/assets/minecraft/textures/painting/sunset.png create mode 100644 data/assets/minecraft/textures/painting/void.png create mode 100644 data/assets/minecraft/textures/painting/wanderer.png create mode 100644 data/assets/minecraft/textures/painting/wanderer.png.mcmeta create mode 100644 data/assets/minecraft/textures/painting/wasteland.png create mode 100644 data/assets/minecraft/textures/painting/wither.png rename {common => data}/pack.png (100%) delete mode 100644 frame.png create mode 100644 images/alban.png create mode 100644 images/aztec.png create mode 100644 images/aztec2.jpg create mode 100644 images/bomb.png create mode 100644 images/burning_skull.webm create mode 100644 images/bust.jpg create mode 100644 images/courbet.png create mode 100644 images/creebet.png create mode 100644 images/donkey_kong.png create mode 100644 images/fighters.png create mode 100644 images/graham.gif create mode 100644 images/images.json create mode 100644 images/kebab.webm create mode 100644 images/match.png create mode 100644 images/pigscene.png create mode 100644 images/plant.gif create mode 100644 images/pointer/0001.png create mode 100644 images/pointer/0002.png create mode 100644 images/pointer/0003.png create mode 100644 images/pointer/0004.png create mode 100644 images/pointer/0005.png create mode 100644 images/pointer/0006.png create mode 100644 images/pointer/0007.png create mode 100644 images/pointer/0008.png create mode 100644 images/pointer/0009.png create mode 100644 images/pointer/0010.png create mode 100644 images/pointer/0011.png create mode 100644 images/pointer/0012.png create mode 100644 images/pointer/0013.png create mode 100644 images/pointer/0014.png create mode 100644 images/pointer/0015.png create mode 100644 images/pointer/0016.png create mode 100644 images/pointer/0017.png create mode 100644 images/pointer/0018.png create mode 100644 images/pointer/0019.png create mode 100644 images/pointer/0020.png create mode 100644 images/pointer/0021.png create mode 100644 images/pointer/0022.png create mode 100644 images/pointer/0023.png create mode 100644 images/pool.jpg create mode 100644 images/sea.png create mode 100644 images/skeleton.png create mode 100644 images/skull_and_roses.png create mode 100644 images/stage.png create mode 100644 images/sunset.png create mode 100644 images/test.json create mode 100644 images/void.jpg create mode 100644 images/wanderer.gif create mode 100644 images/wasteland.png create mode 100644 images/wither.png create mode 100644 kz.png create mode 100644 scripts/.eslintrc.json create mode 100755 scripts/bun.lockb create mode 100644 scripts/common.ts create mode 100755 scripts/images.ts create mode 100644 scripts/package.json create mode 100644 scripts/tsconfig.json diff --git a/.gitignore b/.gitignore index 9b1c8b1..63ee02e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /dist +/scripts/node_modules diff --git a/README.md b/README.md index ad855ae..3f5a43e 100644 --- a/README.md +++ b/README.md @@ -4,25 +4,26 @@ Replaces the default paintings with yiff. Supports 1.6+ ### Sources * [alban](https://e621.net/posts/1101130) * [aztec](https://e621.net/posts/537087) -* [aztec2](https://e621.net/post/show/426790) +* [aztec2](https://e621.net/posts/426790) * [bomb](https://e621.net/posts/1680202) * [burning_skull](https://e621.net/posts/773268) -* [bust](https://e621.net/post/show/2008022) -* [courbet](https://e621.net/post/show/1746859) +* [bust](https://e621.net/posts/2008022) +* [courbet](https://e621.net/posts/1746859) * [creebet](https://e621.net/posts/406661) -* [donkey_kong](https://e621.net/post/show/1375064) +* [donkey_kong](https://e621.net/posts/1375064) * [fighters](https://e621.net/posts/1881510) * [graham](https://e621.net/posts/1533304) * [kebab](https://e621.net/posts/1571695) -* [match](https://e621.net/post/show/1352699) +* [match](https://e621.net/posts/1352699) +* [pigscene](https://e621.net/posts/1518055) * [plant](https://e621.net/posts/1194572) * [pointer](https://e621.net/pools/8368) -* [pool](https://e621.net/post/show/854139) -* [sea left](https://e621.net/posts/405498) [sea right](https://e621.net/posts/156127) -* [skeleton](https://e621.net/post/show/979894) -* [skulls\_and\_roses](https://e621.net/post/show/1599707) -* [stage](https://e621.net/post/show/314664) -* [sunset left](https://e621.net/posts/549834) [sunset right](https://e621.net/posts/784020) +* [pool](https://e621.net/posts/854139) +* [sea](https://e621.net/posts/2939687) +* [skeleton](https://e621.net/posts/979894) +* [skulls\_and\_roses](https://e621.net/posts/1599707) +* [stage](https://e621.net/posts/314664) +* [sunset](https://e621.net/posts/2333033) * [void](https://e621.net/posts/704825) * [wanderer](https://e621.net/posts/956366) * [wasteland](https://e621.net/posts/464478) diff --git a/common-kz/assets/minecraft/textures/painting/paintings_kristoffer_zetterstrand.png b/common-kz/assets/minecraft/textures/painting/paintings_kristoffer_zetterstrand.png deleted file mode 100644 index 01ab950..0000000 --- a/common-kz/assets/minecraft/textures/painting/paintings_kristoffer_zetterstrand.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2aff2cd5d6b08fa139c197d365f778aac7e5884790e1fd1f4f78633d6b8466e9 -size 19521386 diff --git a/common/assets/minecraft/textures/painting/alban.png b/common/assets/minecraft/textures/painting/alban.png deleted file mode 100644 index c4dba60..0000000 --- a/common/assets/minecraft/textures/painting/alban.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2ff2e6e7268fd6dd26a290b0739711a899460185651e3faa3646fc58121736b -size 131553 diff --git a/common/assets/minecraft/textures/painting/aztec.png b/common/assets/minecraft/textures/painting/aztec.png deleted file mode 100644 index f082e0f..0000000 --- a/common/assets/minecraft/textures/painting/aztec.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59dd80ba969a922a152ec27b88e82da1194c1574ac7aa30db1048dcbf9e13976 -size 151493 diff --git a/common/assets/minecraft/textures/painting/aztec2.png b/common/assets/minecraft/textures/painting/aztec2.png deleted file mode 100644 index eebd22e..0000000 --- a/common/assets/minecraft/textures/painting/aztec2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1814f40b126f1b7c6b4ebb293e556d87857ae760b70f77368aa698cddea2739a -size 220707 diff --git a/common/assets/minecraft/textures/painting/bomb.png b/common/assets/minecraft/textures/painting/bomb.png deleted file mode 100644 index 1500454..0000000 --- a/common/assets/minecraft/textures/painting/bomb.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:16752917dc8f5522408b0238dfbf3914148e465f120704db0081edbc17b1121e -size 271735 diff --git a/common/assets/minecraft/textures/painting/burning_skull.png b/common/assets/minecraft/textures/painting/burning_skull.png deleted file mode 100755 index 0bc28b8..0000000 --- a/common/assets/minecraft/textures/painting/burning_skull.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e87c31e3a308cd1677257de189c84e195fae8cf0914f4c17c0eab3922deb9c21 -size 23569830 diff --git a/common/assets/minecraft/textures/painting/burning_skull.png.mcmeta b/common/assets/minecraft/textures/painting/burning_skull.png.mcmeta deleted file mode 100755 index 4f0718a..0000000 --- a/common/assets/minecraft/textures/painting/burning_skull.png.mcmeta +++ /dev/null @@ -1,3 +0,0 @@ -{ - "animation": {} -} \ No newline at end of file diff --git a/common/assets/minecraft/textures/painting/bust.png b/common/assets/minecraft/textures/painting/bust.png deleted file mode 100644 index 9187530..0000000 --- a/common/assets/minecraft/textures/painting/bust.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea470daf4d8a8c2e8ae4b3a493cd7394db5f0d9f1adf4be207b79a48a26eca8b -size 1372472 diff --git a/common/assets/minecraft/textures/painting/courbet.png b/common/assets/minecraft/textures/painting/courbet.png deleted file mode 100644 index f138c70..0000000 --- a/common/assets/minecraft/textures/painting/courbet.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c010cb106a1848480fa5df37232234e5be146f22cea633cae2be7819b81622bf -size 672853 diff --git a/common/assets/minecraft/textures/painting/creebet.png b/common/assets/minecraft/textures/painting/creebet.png deleted file mode 100644 index ca19f7e..0000000 --- a/common/assets/minecraft/textures/painting/creebet.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eee71f98fbcea17c05bae6263b653d09d3473fcd28ed6bda0d57354e2ed34215 -size 230437 diff --git a/common/assets/minecraft/textures/painting/donkey_kong.png b/common/assets/minecraft/textures/painting/donkey_kong.png deleted file mode 100644 index 63eb773..0000000 --- a/common/assets/minecraft/textures/painting/donkey_kong.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93421f68dc3cc1ccaeb504eeb2a5a7f67d993073b91ef97e34f9b3d7e5710abc -size 1033258 diff --git a/common/assets/minecraft/textures/painting/fighters.png b/common/assets/minecraft/textures/painting/fighters.png deleted file mode 100644 index 3622ac4..0000000 --- a/common/assets/minecraft/textures/painting/fighters.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae40f9f0717741597acd6d842ec40dc75f398460cee9b86c8a0b3aa0158a3674 -size 643803 diff --git a/common/assets/minecraft/textures/painting/graham.png b/common/assets/minecraft/textures/painting/graham.png deleted file mode 100644 index 1709e4c..0000000 --- a/common/assets/minecraft/textures/painting/graham.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0720911ecf1169233370399ca753a8f21b6cbbeb9b99794bf6400ede26e683ac -size 38009035 diff --git a/common/assets/minecraft/textures/painting/graham.png.mcmeta b/common/assets/minecraft/textures/painting/graham.png.mcmeta deleted file mode 100755 index 4f0718a..0000000 --- a/common/assets/minecraft/textures/painting/graham.png.mcmeta +++ /dev/null @@ -1,3 +0,0 @@ -{ - "animation": {} -} \ No newline at end of file diff --git a/common/assets/minecraft/textures/painting/kebab.png b/common/assets/minecraft/textures/painting/kebab.png deleted file mode 100644 index 9b90702..0000000 --- a/common/assets/minecraft/textures/painting/kebab.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2823d9a583522fcd2df1c86b12eedfa34972b45400c64856dd27daa7a19166a -size 1920280 diff --git a/common/assets/minecraft/textures/painting/kebab.png.mcmeta b/common/assets/minecraft/textures/painting/kebab.png.mcmeta deleted file mode 100755 index 7e77c64..0000000 --- a/common/assets/minecraft/textures/painting/kebab.png.mcmeta +++ /dev/null @@ -1,5 +0,0 @@ -{ - "animation": { - "frametime": 2 - } -} \ No newline at end of file diff --git a/common/assets/minecraft/textures/painting/match.png b/common/assets/minecraft/textures/painting/match.png deleted file mode 100644 index 8e3757d..0000000 --- a/common/assets/minecraft/textures/painting/match.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a43da43957d4ef96a25e898285dd46e2adba8f3d7dcb664c5fa8b8aa5b32cd8 -size 559766 diff --git a/common/assets/minecraft/textures/painting/pigscene.png b/common/assets/minecraft/textures/painting/pigscene.png deleted file mode 100644 index 461f400..0000000 --- a/common/assets/minecraft/textures/painting/pigscene.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1bf489b5605864385372a3647d3b23f834324819f40c5f1e92ddfe067cf3f3e6 -size 1234898 diff --git a/common/assets/minecraft/textures/painting/plant.png b/common/assets/minecraft/textures/painting/plant.png deleted file mode 100644 index 2e72eb6..0000000 --- a/common/assets/minecraft/textures/painting/plant.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d14d4335e4d65daff1bc6a91116f97855e4235026a806e37a2a56d75a65a915 -size 13711901 diff --git a/common/assets/minecraft/textures/painting/plant.png.mcmeta b/common/assets/minecraft/textures/painting/plant.png.mcmeta deleted file mode 100755 index 4f0718a..0000000 --- a/common/assets/minecraft/textures/painting/plant.png.mcmeta +++ /dev/null @@ -1,3 +0,0 @@ -{ - "animation": {} -} \ No newline at end of file diff --git a/common/assets/minecraft/textures/painting/pointer.png b/common/assets/minecraft/textures/painting/pointer.png deleted file mode 100644 index 1003309..0000000 --- a/common/assets/minecraft/textures/painting/pointer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b25846c468d1ee5fce738efb91db9bf08f018b624edbdd2bc3a9ac8c27ea6cd -size 9196758 diff --git a/common/assets/minecraft/textures/painting/pointer.png.mcmeta b/common/assets/minecraft/textures/painting/pointer.png.mcmeta deleted file mode 100755 index 2e22c04..0000000 --- a/common/assets/minecraft/textures/painting/pointer.png.mcmeta +++ /dev/null @@ -1,5 +0,0 @@ -{ - "animation": { - "frametime": 100 - } -} \ No newline at end of file diff --git a/common/assets/minecraft/textures/painting/pool.png b/common/assets/minecraft/textures/painting/pool.png deleted file mode 100644 index a0bde1d..0000000 --- a/common/assets/minecraft/textures/painting/pool.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa2388de7a193e9bd480870473b69eea7aeb90244db05bbc8d306015e1212094 -size 703294 diff --git a/common/assets/minecraft/textures/painting/sea.png b/common/assets/minecraft/textures/painting/sea.png deleted file mode 100644 index 173ef75..0000000 --- a/common/assets/minecraft/textures/painting/sea.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09864310b1386b4069dafc535ad2bf73bebb418b4477b0e7a24000b457524ffa -size 483854 diff --git a/common/assets/minecraft/textures/painting/skeleton.png b/common/assets/minecraft/textures/painting/skeleton.png deleted file mode 100644 index f3055dc..0000000 --- a/common/assets/minecraft/textures/painting/skeleton.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bee098b4dc853545dc4020c69908dd84d34e9d9c60fd2ab5e9bad37c7ccfa33e -size 875684 diff --git a/common/assets/minecraft/textures/painting/skull_and_roses.png b/common/assets/minecraft/textures/painting/skull_and_roses.png deleted file mode 100644 index 1b66bab..0000000 --- a/common/assets/minecraft/textures/painting/skull_and_roses.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42fc008e100dce0f85d4c81c2246fc99b2c91d1802fd8eec90772c032024c569 -size 896188 diff --git a/common/assets/minecraft/textures/painting/stage.png b/common/assets/minecraft/textures/painting/stage.png deleted file mode 100644 index 3217026..0000000 --- a/common/assets/minecraft/textures/painting/stage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:208a8a0892ee65c836b620116322ac0e1263df9c2f6e91ea7c704b3e67176194 -size 1037810 diff --git a/common/assets/minecraft/textures/painting/sunset.png b/common/assets/minecraft/textures/painting/sunset.png deleted file mode 100644 index da352b1..0000000 --- a/common/assets/minecraft/textures/painting/sunset.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a287eaab7e88567297cce618d6623eb730e3abac8e6a4c7cea01abcddf5e5f40 -size 578024 diff --git a/common/assets/minecraft/textures/painting/void.png b/common/assets/minecraft/textures/painting/void.png deleted file mode 100644 index 79e9db8..0000000 --- a/common/assets/minecraft/textures/painting/void.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:567720b652f9033de04263b4b988793192ae0ce8571079b54e9c5ad9b968c353 -size 1017700 diff --git a/common/assets/minecraft/textures/painting/wanderer.png b/common/assets/minecraft/textures/painting/wanderer.png deleted file mode 100644 index ab184d1..0000000 --- a/common/assets/minecraft/textures/painting/wanderer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:990cfe5d702824df1117a3e1dbfb4b35058fc39355e1c2b95091cacc666edfea -size 5006817 diff --git a/common/assets/minecraft/textures/painting/wanderer.png.mcmeta b/common/assets/minecraft/textures/painting/wanderer.png.mcmeta deleted file mode 100755 index e551bc6..0000000 --- a/common/assets/minecraft/textures/painting/wanderer.png.mcmeta +++ /dev/null @@ -1,5 +0,0 @@ -{ - "animation": { - "frametime": 2 - } -} \ No newline at end of file diff --git a/common/assets/minecraft/textures/painting/wasteland.png b/common/assets/minecraft/textures/painting/wasteland.png deleted file mode 100644 index cf8cceb..0000000 --- a/common/assets/minecraft/textures/painting/wasteland.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e5367b995ee66124be923b244b04784bcf2145417cff9bc1f20dabac3ea6888 -size 353354 diff --git a/common/assets/minecraft/textures/painting/wither.png b/common/assets/minecraft/textures/painting/wither.png deleted file mode 100644 index bc034e5..0000000 --- a/common/assets/minecraft/textures/painting/wither.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ace7780b6fc1793eedb2101434f2f5535d27cb573a6f9d4cd56381178f8a66d -size 3175233 diff --git a/data-kz/assets/minecraft/textures/painting/paintings_kristoffer_zetterstrand.png b/data-kz/assets/minecraft/textures/painting/paintings_kristoffer_zetterstrand.png new file mode 100644 index 0000000..864c920 --- /dev/null +++ b/data-kz/assets/minecraft/textures/painting/paintings_kristoffer_zetterstrand.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7054b9a50f691970ffcc165d3c52ebedfbb53f9f0076e7469990b3eb9f55fb1 +size 79983851 diff --git a/common-kz/pack.png b/data-kz/pack.png similarity index 100% rename from common-kz/pack.png rename to data-kz/pack.png diff --git a/data/assets/minecraft/textures/painting/alban.png b/data/assets/minecraft/textures/painting/alban.png new file mode 100644 index 0000000..ae79a8a --- /dev/null +++ b/data/assets/minecraft/textures/painting/alban.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f7d455b63f8aa50867f3ada42005f49720302c00b40125dfaa231e4018d0585 +size 625775 diff --git a/data/assets/minecraft/textures/painting/aztec.png b/data/assets/minecraft/textures/painting/aztec.png new file mode 100644 index 0000000..95974b7 --- /dev/null +++ b/data/assets/minecraft/textures/painting/aztec.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5eb0ddcb56f059a5e6988c800532aaa71b5cf1c324ea8f992326b2c3af212db +size 633998 diff --git a/data/assets/minecraft/textures/painting/aztec2.png b/data/assets/minecraft/textures/painting/aztec2.png new file mode 100644 index 0000000..07e5056 --- /dev/null +++ b/data/assets/minecraft/textures/painting/aztec2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d3b993daba01e382a533e5943498d8f1edaed63f479b01d989d140cda3f5ed2b +size 602566 diff --git a/data/assets/minecraft/textures/painting/bomb.png b/data/assets/minecraft/textures/painting/bomb.png new file mode 100644 index 0000000..3fcb96e --- /dev/null +++ b/data/assets/minecraft/textures/painting/bomb.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd8e48c37de5727efaeb8b2e5c632b98bce35424ce6efe77fcd8d5fcaa672648 +size 684837 diff --git a/data/assets/minecraft/textures/painting/burning_skull.png b/data/assets/minecraft/textures/painting/burning_skull.png new file mode 100644 index 0000000..e54a47c --- /dev/null +++ b/data/assets/minecraft/textures/painting/burning_skull.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eac63e4d4ceaef01c21a4d798a4e7ad31e9ed8430f8d64994064fe2eb87a415a +size 5646431 diff --git a/data/assets/minecraft/textures/painting/burning_skull.png.mcmeta b/data/assets/minecraft/textures/painting/burning_skull.png.mcmeta new file mode 100644 index 0000000..728d0aa --- /dev/null +++ b/data/assets/minecraft/textures/painting/burning_skull.png.mcmeta @@ -0,0 +1 @@ +{"animation":{}} \ No newline at end of file diff --git a/data/assets/minecraft/textures/painting/bust.png b/data/assets/minecraft/textures/painting/bust.png new file mode 100644 index 0000000..3649b8b --- /dev/null +++ b/data/assets/minecraft/textures/painting/bust.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12ba7beac4b839f2bc287c01a7d8e89dc0a4b8b43ab19dbdfbad7f949faaa67c +size 2354754 diff --git a/data/assets/minecraft/textures/painting/courbet.png b/data/assets/minecraft/textures/painting/courbet.png new file mode 100644 index 0000000..c314e31 --- /dev/null +++ b/data/assets/minecraft/textures/painting/courbet.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3c0be3fbe1224ecf2fa2c6d5694967723e6742417425d7f69c884d381fa4c71 +size 1280164 diff --git a/data/assets/minecraft/textures/painting/creebet.png b/data/assets/minecraft/textures/painting/creebet.png new file mode 100644 index 0000000..ea7ea26 --- /dev/null +++ b/data/assets/minecraft/textures/painting/creebet.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71a7ddc3ad3939176b46ab1af49f6db5c094e2013440eba67df102488f1e463a +size 490313 diff --git a/data/assets/minecraft/textures/painting/donkey_kong.png b/data/assets/minecraft/textures/painting/donkey_kong.png new file mode 100644 index 0000000..2bf3681 --- /dev/null +++ b/data/assets/minecraft/textures/painting/donkey_kong.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c36c642e2abc8d6141cae327fc9396778f3186fd068e915151b5b148657ec204 +size 4023613 diff --git a/data/assets/minecraft/textures/painting/fighters.png b/data/assets/minecraft/textures/painting/fighters.png new file mode 100644 index 0000000..c0bc6a0 --- /dev/null +++ b/data/assets/minecraft/textures/painting/fighters.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:187ab87660fd17c82d0eb8de29e615c98222c00ac17e9e8f855d4aba465acf7a +size 4770578 diff --git a/data/assets/minecraft/textures/painting/graham.png b/data/assets/minecraft/textures/painting/graham.png new file mode 100644 index 0000000..0ab6ee5 --- /dev/null +++ b/data/assets/minecraft/textures/painting/graham.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db5444059580abdd7aa804fab79469018e0b7a82e933c76011bdb984c1ac39b4 +size 41714611 diff --git a/data/assets/minecraft/textures/painting/graham.png.mcmeta b/data/assets/minecraft/textures/painting/graham.png.mcmeta new file mode 100644 index 0000000..728d0aa --- /dev/null +++ b/data/assets/minecraft/textures/painting/graham.png.mcmeta @@ -0,0 +1 @@ +{"animation":{}} \ No newline at end of file diff --git a/data/assets/minecraft/textures/painting/kebab.png b/data/assets/minecraft/textures/painting/kebab.png new file mode 100644 index 0000000..efa1b51 --- /dev/null +++ b/data/assets/minecraft/textures/painting/kebab.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8dd9e8b7ba50ff005f869fd650e2a3893cd9e7797bfae00640affc5270f336a9 +size 2907543 diff --git a/data/assets/minecraft/textures/painting/kebab.png.mcmeta b/data/assets/minecraft/textures/painting/kebab.png.mcmeta new file mode 100644 index 0000000..cc0cf14 --- /dev/null +++ b/data/assets/minecraft/textures/painting/kebab.png.mcmeta @@ -0,0 +1 @@ +{"animation":{"frametime":2}} \ No newline at end of file diff --git a/data/assets/minecraft/textures/painting/match.png b/data/assets/minecraft/textures/painting/match.png new file mode 100644 index 0000000..0f93ca9 --- /dev/null +++ b/data/assets/minecraft/textures/painting/match.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:577a8fc982eb600e68c680dd142162156b1df936c7bf86f2e4ec01f33890a628 +size 982865 diff --git a/data/assets/minecraft/textures/painting/pigscene.png b/data/assets/minecraft/textures/painting/pigscene.png new file mode 100644 index 0000000..9bb6e99 --- /dev/null +++ b/data/assets/minecraft/textures/painting/pigscene.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efeb43d9ccb1db70c1150fcc2c18c6f33e7263a470784a4fcbdfdd28443515ea +size 8014537 diff --git a/data/assets/minecraft/textures/painting/plant.png b/data/assets/minecraft/textures/painting/plant.png new file mode 100644 index 0000000..c4be507 --- /dev/null +++ b/data/assets/minecraft/textures/painting/plant.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ab6ac18131f820a9aaee8e6460c4dd01d477446358add386d4cee4aedcafeba +size 12693439 diff --git a/data/assets/minecraft/textures/painting/plant.png.mcmeta b/data/assets/minecraft/textures/painting/plant.png.mcmeta new file mode 100644 index 0000000..728d0aa --- /dev/null +++ b/data/assets/minecraft/textures/painting/plant.png.mcmeta @@ -0,0 +1 @@ +{"animation":{}} \ No newline at end of file diff --git a/data/assets/minecraft/textures/painting/pointer.png b/data/assets/minecraft/textures/painting/pointer.png new file mode 100644 index 0000000..f4c42fb --- /dev/null +++ b/data/assets/minecraft/textures/painting/pointer.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f8e06761514b3787933477294cc9fa83ce7f8eeff9be10b61ef8ad28c510986 +size 12673520 diff --git a/data/assets/minecraft/textures/painting/pointer.png.mcmeta b/data/assets/minecraft/textures/painting/pointer.png.mcmeta new file mode 100644 index 0000000..b86159c --- /dev/null +++ b/data/assets/minecraft/textures/painting/pointer.png.mcmeta @@ -0,0 +1 @@ +{"animation":{"frametime":100}} \ No newline at end of file diff --git a/data/assets/minecraft/textures/painting/pool.png b/data/assets/minecraft/textures/painting/pool.png new file mode 100644 index 0000000..70f8fde --- /dev/null +++ b/data/assets/minecraft/textures/painting/pool.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7baf4bba73bb9eeb7cab93eea154a75736788e3a11b232e84a70804510793c14 +size 1582275 diff --git a/data/assets/minecraft/textures/painting/sea.png b/data/assets/minecraft/textures/painting/sea.png new file mode 100644 index 0000000..c1bb450 --- /dev/null +++ b/data/assets/minecraft/textures/painting/sea.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abf1539ee008c0bf01c54e95cbd5b5c22b7df11952cbc86a93bc2b67a91b7fea +size 502069 diff --git a/data/assets/minecraft/textures/painting/skeleton.png b/data/assets/minecraft/textures/painting/skeleton.png new file mode 100644 index 0000000..c54dada --- /dev/null +++ b/data/assets/minecraft/textures/painting/skeleton.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eadf17271527339cb1a95f59a7c3226cf5aa1f4a9d3bd160078ce72e5e7c9a4f +size 11704860 diff --git a/data/assets/minecraft/textures/painting/skull_and_roses.png b/data/assets/minecraft/textures/painting/skull_and_roses.png new file mode 100644 index 0000000..32ac161 --- /dev/null +++ b/data/assets/minecraft/textures/painting/skull_and_roses.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1c5432b733faa52e8e99ffcb40d99f6083729e62efd0974c4d092d5c2848efe +size 2624214 diff --git a/data/assets/minecraft/textures/painting/stage.png b/data/assets/minecraft/textures/painting/stage.png new file mode 100644 index 0000000..34fbf95 --- /dev/null +++ b/data/assets/minecraft/textures/painting/stage.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65d319b504fbf8397587521cedf54a821e064d3099f697820e711d46bf3abf51 +size 1698284 diff --git a/data/assets/minecraft/textures/painting/sunset.png b/data/assets/minecraft/textures/painting/sunset.png new file mode 100644 index 0000000..25d61e3 --- /dev/null +++ b/data/assets/minecraft/textures/painting/sunset.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64640ab5375b87729518c031f42d6a8968387a3ff4e396a70beaed0763b4717a +size 392818 diff --git a/data/assets/minecraft/textures/painting/void.png b/data/assets/minecraft/textures/painting/void.png new file mode 100644 index 0000000..3853b88 --- /dev/null +++ b/data/assets/minecraft/textures/painting/void.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a08910678e2757cb319d108dc8ad07dda7c3bd9fb87d7824408f19e031f9a74 +size 1619111 diff --git a/data/assets/minecraft/textures/painting/wanderer.png b/data/assets/minecraft/textures/painting/wanderer.png new file mode 100644 index 0000000..c4db402 --- /dev/null +++ b/data/assets/minecraft/textures/painting/wanderer.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba4b85927ec44dcf241e8b139b313cf5f8a27967d44d0d54312ca69804293607 +size 6147615 diff --git a/data/assets/minecraft/textures/painting/wanderer.png.mcmeta b/data/assets/minecraft/textures/painting/wanderer.png.mcmeta new file mode 100644 index 0000000..728d0aa --- /dev/null +++ b/data/assets/minecraft/textures/painting/wanderer.png.mcmeta @@ -0,0 +1 @@ +{"animation":{}} \ No newline at end of file diff --git a/data/assets/minecraft/textures/painting/wasteland.png b/data/assets/minecraft/textures/painting/wasteland.png new file mode 100644 index 0000000..83b750c --- /dev/null +++ b/data/assets/minecraft/textures/painting/wasteland.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a8b39c9769f401c34b2a610c37fefd80da76d0c4402baff1a2eef74ee58b222 +size 707663 diff --git a/data/assets/minecraft/textures/painting/wither.png b/data/assets/minecraft/textures/painting/wither.png new file mode 100644 index 0000000..d906072 --- /dev/null +++ b/data/assets/minecraft/textures/painting/wither.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:092151179b3217254b5c4b6eed7b73c36f55710114e634cae9cf89160e46f219 +size 1087332 diff --git a/common/pack.png b/data/pack.png similarity index 100% rename from common/pack.png rename to data/pack.png diff --git a/frame.png b/frame.png deleted file mode 100644 index 2e21e51..0000000 --- a/frame.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ace76421f8eb815bf72594f33157028502cb119400da118d54018e04dbb9b485 -size 28724 diff --git a/images/alban.png b/images/alban.png new file mode 100644 index 0000000..d3ca707 --- /dev/null +++ b/images/alban.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:706f7becedeb394653659fccab4f4b7e56e1f1ce59ea3b8e00d3543c9590158d +size 950944 diff --git a/images/aztec.png b/images/aztec.png new file mode 100644 index 0000000..1dc70f3 --- /dev/null +++ b/images/aztec.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b86a180e4e22c84502a20845262c18c62dcbd38201dfb5e7ac260b537f46914c +size 607365 diff --git a/images/aztec2.jpg b/images/aztec2.jpg new file mode 100644 index 0000000..2626112 --- /dev/null +++ b/images/aztec2.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abf1fa8f54abae69ea552338ad8fe5e9ef4f9d686f5b2ac4b40828cc5bfe4c7f +size 147755 diff --git a/images/bomb.png b/images/bomb.png new file mode 100644 index 0000000..e7d649c --- /dev/null +++ b/images/bomb.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94cca0ddef5952b6911c4cc5486e8ad3308b16431c552bd2c3bc80be678fb5e8 +size 955902 diff --git a/images/burning_skull.webm b/images/burning_skull.webm new file mode 100644 index 0000000..6f222ce --- /dev/null +++ b/images/burning_skull.webm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f779b4f42ea7bf3e70e327045ad00cfb2deeda09d098405b164cbcbc64e17908 +size 102681596 diff --git a/images/bust.jpg b/images/bust.jpg new file mode 100644 index 0000000..2ed2d7e --- /dev/null +++ b/images/bust.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d322861af4b28efd48979edb240c1fb55c7ed57803961bcbf25a4d58210774f3 +size 1669904 diff --git a/images/courbet.png b/images/courbet.png new file mode 100644 index 0000000..e9f5c53 --- /dev/null +++ b/images/courbet.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d47aa696b901b46a3563336210d0cdf3bb75b4ea935235afe81fea9a7d6d14a +size 1480426 diff --git a/images/creebet.png b/images/creebet.png new file mode 100644 index 0000000..dc8de38 --- /dev/null +++ b/images/creebet.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:790eee0edbae45e8c71478af6ca36a49dbdae54f81c18f1e22e4e181bbbb8e96 +size 739174 diff --git a/images/donkey_kong.png b/images/donkey_kong.png new file mode 100644 index 0000000..e9fa9b4 --- /dev/null +++ b/images/donkey_kong.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d0cb75b399001afad27ad0a67b4373313d64a1e572c703e703914ebef06d3e9 +size 1187771 diff --git a/images/fighters.png b/images/fighters.png new file mode 100644 index 0000000..c597771 --- /dev/null +++ b/images/fighters.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be0ee8983a2a94489b763abdbcb64a204a3b5b0f2e06022ed49439ecfbb0d1a0 +size 2129310 diff --git a/images/graham.gif b/images/graham.gif new file mode 100644 index 0000000..a68b756 --- /dev/null +++ b/images/graham.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c965e5b6a400ac806d12f1393e1c4418929b0e2cd9988a0d582446d867ff288e +size 6120331 diff --git a/images/images.json b/images/images.json new file mode 100644 index 0000000..d5c2d68 --- /dev/null +++ b/images/images.json @@ -0,0 +1,276 @@ +{ + "sizes": { + "1x1": [640, 640], + "1x2": [640, 1280], + "2x1": [1280, 640], + "2x2": [1280, 1280], + "3x3": [1920, 1920], + "3x4": [1920, 2560], + "4x2": [2560, 1280], + "4x3": [2560, 1920], + "4x4": [2560, 2560] + }, + "images": [ + { + "name": "kebab", + "size": "1x1", + "kz": [0, 0], + "animation": { "frametime": 2 } + }, + { + "name": "aztec", + "size": "1x1", + "kz": [1, 0] + }, + { + "name": "alban", + "size": "1x1", + "kz": [2, 0] + }, + { + "name": "aztec2", + "size": "1x1", + "kz": [3, 0] + }, + { + "name": "bomb", + "size": "1x1", + "kz": [4, 0] + }, + { + "name": "plant", + "size": "1x1", + "kz": [5, 0] + }, + { + "name": "wasteland", + "size": "1x1", + "kz": [6, 0] + }, + { + "name": "meditation", + "size": "1x1", + "kz": null + }, + { + "name": "pool", + "size": "2x1", + "kz": [0, 2] + }, + { + "name": "courbet", + "size": "2x1", + "kz": [2, 2] + }, + { + "name": "sunset", + "size": "2x1", + "kz": [4, 2] + }, + { + "name": "sea", + "size": "2x1", + "kz": [6, 2] + }, + { + "name": "creebet", + "size": "2x1", + "kz": [8, 2] + }, + { + "name": "wanderer", + "size": "1x2", + "kz": [0, 4], + "resize": [640, 640], + "_comment": "For some reason this needs to be 1:1" + }, + { + "name": "graham", + "size": "1x2", + "kz": [1, 4], + "resize": [640, 640], + "_comment": "For some reason this needs to be 1:1" + }, + { + "name": "prairie_ride", + "size": "1x2", + "kz": null, + "resize": [640, 640], + "_comment": "For some reason this needs to be 1:1" + }, + { + "name": "fighters", + "size": "4x2", + "kz": [0, 6] + }, + { + "name": "changing", + "size": "4x2", + "kz": null + }, + { + "name": "finding", + "size": "4x2", + "kz": null + }, + { + "name": "lowmist", + "size": "4x2", + "kz": null + }, + { + "name": "passage", + "size": "4x2", + "kz": null + }, + { + "name": "match", + "size": "2x2", + "kz": [0, 8] + }, + { + "name": "bust", + "size": "2x2", + "kz": [2, 8] + }, + { + "name": "stage", + "size": "2x2", + "kz": [4, 8] + }, + { + "name": "void", + "size": "2x2", + "kz": [6, 8] + }, + { + "name": "skull_and_roses", + "size": "2x2", + "kz": [8, 8] + }, + { + "name": "wither", + "size": "2x2", + "kz": [10, 8] + }, + { + "name": "baroque", + "size": "2x2", + "kz": null + }, + { + "name": "humble", + "size": "2x2", + "kz": null + }, + { + "name": "earth", + "size": "2x2", + "kz": null + }, + { + "name": "wind", + "size": "2x2", + "kz": null + }, + { + "name": "fire", + "size": "2x2", + "kz": null + }, + { + "name": "water", + "size": "2x2", + "kz": null + }, + { + "name": "pointer", + "size": "4x4", + "kz": [0, 12], + "resize": [640, 640], + "animation": { "frametime": 100 } + }, + { + "name": "pigscene", + "size": "4x4", + "kz": [4, 12] + }, + { + "name": "burning_skull", + "size": "4x4", + "kz": [8, 12], + "resize": [640, 640], + "frames": [2805, 2826] + }, + { + "name": "unpacked", + "size": "4x4", + "kz": null + }, + { + "name": "orb", + "size": "4x4", + "kz": null + }, + { + "name": "skeleton", + "size": "4x3", + "kz": [12, 4] + }, + { + "name": "donkey_kong", + "size": "4x3", + "kz": [12, 7] + }, + { + "name": "bouquet", + "size": "3x3", + "kz": null + }, + { + "name": "cavebird", + "size": "3x3", + "kz": null + }, + { + "name": "cotan", + "size": "3x3", + "kz": null + }, + { + "name": "endboss", + "size": "3x3", + "kz": null + }, + { + "name": "fern", + "size": "3x3", + "kz": null + }, + { + "name": "owlemons", + "size": "3x3", + "kz": null + }, + { + "name": "sunflowers", + "size": "3x3", + "kz": null + }, + { + "name": "tides", + "size": "3x3", + "kz": null + }, + { + "name": "backyard", + "size": "3x4", + "kz": null + }, + { + "name": "pond", + "size": "3x4", + "kz": null + } + ] +} diff --git a/images/kebab.webm b/images/kebab.webm new file mode 100644 index 0000000..84a974a --- /dev/null +++ b/images/kebab.webm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb9fd58bec266db3e8673171c41e77713b235c876e7bb8cfa94b5f645e0b96e9 +size 236011 diff --git a/images/match.png b/images/match.png new file mode 100644 index 0000000..b9408a8 --- /dev/null +++ b/images/match.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92d59b0963b3cc0fd4663deaf0b457ec64ec89fa477f31ec042b7d2024eb17fd +size 459584 diff --git a/images/pigscene.png b/images/pigscene.png new file mode 100644 index 0000000..d9c2d40 --- /dev/null +++ b/images/pigscene.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0418e5f15f8eeb8d02572313b436a26a571350807f14b0ef90d189110482d70 +size 1456200 diff --git a/images/plant.gif b/images/plant.gif new file mode 100644 index 0000000..e0f8ee8 --- /dev/null +++ b/images/plant.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c48b069bc9de242b0325af188ed204ad6947ecc1f1c8768da05a9cc672cd3e46 +size 2784340 diff --git a/images/pointer/0001.png b/images/pointer/0001.png new file mode 100644 index 0000000..a5826df --- /dev/null +++ b/images/pointer/0001.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67a01f6b3b9d35d79d3c420f6c79b7bc44abd9f68ed7a6705314c0866ab0c39a +size 594808 diff --git a/images/pointer/0002.png b/images/pointer/0002.png new file mode 100644 index 0000000..c97d5b4 --- /dev/null +++ b/images/pointer/0002.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7837f04da7f5d8ab0a4798be1aa55f1d7ff406e6b93ede31d90ffd42c116b6f7 +size 600923 diff --git a/images/pointer/0003.png b/images/pointer/0003.png new file mode 100644 index 0000000..366ff34 --- /dev/null +++ b/images/pointer/0003.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:755494f5bb14f574335067b3caa396c74d535c1399773a807f71c013d80df054 +size 854608 diff --git a/images/pointer/0004.png b/images/pointer/0004.png new file mode 100644 index 0000000..32d3c9d --- /dev/null +++ b/images/pointer/0004.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6bd80e40782e7426a3707a8a3f2bc0eb6e0fc4929bc3aabe74b41f9d024ca0c +size 682606 diff --git a/images/pointer/0005.png b/images/pointer/0005.png new file mode 100644 index 0000000..ec0c234 --- /dev/null +++ b/images/pointer/0005.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d80feae7553be8c471e5be872720692919167f855352fcbebe270ed7eafb404 +size 673299 diff --git a/images/pointer/0006.png b/images/pointer/0006.png new file mode 100644 index 0000000..183f6fe --- /dev/null +++ b/images/pointer/0006.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ab365c01445914a7bb0e643a4b48510d768d9eb6cc4dc7dd6ea2d483373f14d +size 796613 diff --git a/images/pointer/0007.png b/images/pointer/0007.png new file mode 100644 index 0000000..3e0bceb --- /dev/null +++ b/images/pointer/0007.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ddc5b6f65c575321ecf59dfc6d70ebfe33a87ea1ba06a860054a647a2f3ab040 +size 635699 diff --git a/images/pointer/0008.png b/images/pointer/0008.png new file mode 100644 index 0000000..7f89a34 --- /dev/null +++ b/images/pointer/0008.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d0e4e6fcf2ed9bb3590c5329cd2c965361f3baa5541e963f35f9d03815725b2 +size 661944 diff --git a/images/pointer/0009.png b/images/pointer/0009.png new file mode 100644 index 0000000..66f2a89 --- /dev/null +++ b/images/pointer/0009.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3055a73d0c793de9dc3dcab0da34fa7fe97e85f8bcb257d14cc293966fe4b2cd +size 556615 diff --git a/images/pointer/0010.png b/images/pointer/0010.png new file mode 100644 index 0000000..1c397dd --- /dev/null +++ b/images/pointer/0010.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2fbe0a8dce2d47f776229e5423b8254fa9070c81a34c2e0348281fa4d712367 +size 647659 diff --git a/images/pointer/0011.png b/images/pointer/0011.png new file mode 100644 index 0000000..fb2b25d --- /dev/null +++ b/images/pointer/0011.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1944e08132f20e72a6f45a811422f3fd08fcc7e7c245873d164af2de7d413819 +size 548986 diff --git a/images/pointer/0012.png b/images/pointer/0012.png new file mode 100644 index 0000000..ed9308e --- /dev/null +++ b/images/pointer/0012.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc66e9364507a9ef18dcaacda4fb509fe162e8e50e25e3a3d563b930a21b7ecb +size 623930 diff --git a/images/pointer/0013.png b/images/pointer/0013.png new file mode 100644 index 0000000..e1e8b52 --- /dev/null +++ b/images/pointer/0013.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c440e3ba24382966c96b450e1cfe58d859724abd641fc2f481af2eab34474041 +size 879738 diff --git a/images/pointer/0014.png b/images/pointer/0014.png new file mode 100644 index 0000000..38fa57c --- /dev/null +++ b/images/pointer/0014.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7738f6833c5ecefe8c2dd709e5fb5f9995b48d886f7095a8d47d2a58cd146c01 +size 732928 diff --git a/images/pointer/0015.png b/images/pointer/0015.png new file mode 100644 index 0000000..8004dc2 --- /dev/null +++ b/images/pointer/0015.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:274bfa40eaa74bee084f69d4cf38360b3a8c59649dd362aed9a64fa5ecff11ee +size 766585 diff --git a/images/pointer/0016.png b/images/pointer/0016.png new file mode 100644 index 0000000..f75e28c --- /dev/null +++ b/images/pointer/0016.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c1b59edb46ce2fffc787d28dac40679ede0d9098a6e012859f67a513d2a4e06 +size 614038 diff --git a/images/pointer/0017.png b/images/pointer/0017.png new file mode 100644 index 0000000..2741a5e --- /dev/null +++ b/images/pointer/0017.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92ff9d600ac5efe90f40872700a22c8481651ad6e367cc5d878134eb278b70c2 +size 653554 diff --git a/images/pointer/0018.png b/images/pointer/0018.png new file mode 100644 index 0000000..09b670c --- /dev/null +++ b/images/pointer/0018.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37b7879a9eae275313b47ac812e224eb00e279b082574be5e7ec6f3d2e53c5e8 +size 740819 diff --git a/images/pointer/0019.png b/images/pointer/0019.png new file mode 100644 index 0000000..9bdc2f0 --- /dev/null +++ b/images/pointer/0019.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c09b70de9dad16c1e4dd074b3900272beff3bd979914d13def0da0771cea46cb +size 828576 diff --git a/images/pointer/0020.png b/images/pointer/0020.png new file mode 100644 index 0000000..513b4c2 --- /dev/null +++ b/images/pointer/0020.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bbb4220a6bf0e51643715310b878aaa20ebde6fc12a3b34d9b8bde3bc0013f1d +size 700375 diff --git a/images/pointer/0021.png b/images/pointer/0021.png new file mode 100644 index 0000000..9ae34c1 --- /dev/null +++ b/images/pointer/0021.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16c9505afa14a0ee4eed5ab82af0ee93b8c0da345faeed0922423c09bf1a5e74 +size 644792 diff --git a/images/pointer/0022.png b/images/pointer/0022.png new file mode 100644 index 0000000..c60a65f --- /dev/null +++ b/images/pointer/0022.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b62f681fc2d617b800e8c858491610ce88f039e249552b989c380f4b226c749f +size 668280 diff --git a/images/pointer/0023.png b/images/pointer/0023.png new file mode 100644 index 0000000..3722332 --- /dev/null +++ b/images/pointer/0023.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa154c18bc849d358d3e23544dd9a5e9c013598dd31a95750bdc5527dc9a30a4 +size 784915 diff --git a/images/pool.jpg b/images/pool.jpg new file mode 100644 index 0000000..0478e38 --- /dev/null +++ b/images/pool.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03b3d6b4ef3dfcb64e7ed476e6a543c3b7eb5aed60016fc1e555954364c3e035 +size 179887 diff --git a/images/sea.png b/images/sea.png new file mode 100644 index 0000000..7b5ed2c --- /dev/null +++ b/images/sea.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:218b4be66b9c34ebbc81d3f186ce95fd09ce5392f482be6fc1c99792826ac700 +size 2514576 diff --git a/images/skeleton.png b/images/skeleton.png new file mode 100644 index 0000000..297a46e --- /dev/null +++ b/images/skeleton.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9852ad149a2560d9e0572d06fcc61778a7a215c49bdfdf235e5620741b147d41 +size 4648427 diff --git a/images/skull_and_roses.png b/images/skull_and_roses.png new file mode 100644 index 0000000..e90ae33 --- /dev/null +++ b/images/skull_and_roses.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71a794ba04a0390315b700e5a09d0dce35c4053b976cf08138d2d1fa782de8e9 +size 8107766 diff --git a/images/stage.png b/images/stage.png new file mode 100644 index 0000000..4d38b56 --- /dev/null +++ b/images/stage.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3fc7c6bf63d7602d77224a3c16acad0ee57b786f01abc2d795089832a420f360 +size 608743 diff --git a/images/sunset.png b/images/sunset.png new file mode 100644 index 0000000..73c8e30 --- /dev/null +++ b/images/sunset.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f51ba00e284f860cf1af6263336380701ab9625557e9e31e506b7290888d66a +size 1184314 diff --git a/images/test.json b/images/test.json new file mode 100644 index 0000000..3873c03 --- /dev/null +++ b/images/test.json @@ -0,0 +1,22 @@ +{ + "sizes": { + "1x1": [640, 640], + "1x2": [640, 1280], + "2x1": [1280, 640], + "2x2": [1280, 1280], + "3x3": [1920, 1920], + "3x4": [1920, 2560], + "4x2": [2560, 1280], + "4x3": [2560, 1920], + "4x4": [2560, 2560] + }, + "images": [ + { + "name": "burning_skull", + "size": "4x4", + "kz": [8, 12], + "resize": [620, 620], + "frames": [2805, 2826] + } + ] +} diff --git a/images/void.jpg b/images/void.jpg new file mode 100644 index 0000000..d8f1c2a --- /dev/null +++ b/images/void.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f292e001df9ecc9f4d1683d41d00b386c7cb8627752c1af9d523df638cfd12a7 +size 3165868 diff --git a/images/wanderer.gif b/images/wanderer.gif new file mode 100644 index 0000000..a548222 --- /dev/null +++ b/images/wanderer.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90ce40eca9081738f175d659d9e40980fedd697a7f4e9767cd80dfb18746c5e8 +size 4859142 diff --git a/images/wasteland.png b/images/wasteland.png new file mode 100644 index 0000000..4ccedd2 --- /dev/null +++ b/images/wasteland.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2dd9352bdae221145aae675084421265d48ceac92cc6d95dd4c84d014e18becd +size 1084826 diff --git a/images/wither.png b/images/wither.png new file mode 100644 index 0000000..edd3548 --- /dev/null +++ b/images/wither.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b13bfdbb93ebb8df052a7c50248c1413850e4cd2c7491a982f9ee742d4a95f11 +size 3542660 diff --git a/info.json b/info.json index 82f207f..f73c04f 100644 --- a/info.json +++ b/info.json @@ -3,8 +3,8 @@ "description": "Replaces the ingame paintings with furry porn.", "url": "https://git.furry.cool/MCFurryPacks/YiffyPaintings", "versions": [ - ["1.6", 1], - ["1.9", 2], + ["1.06", 1], + ["1.09", 2], ["1.11", 3], ["1.13", 4], ["1.14", 4], @@ -22,9 +22,9 @@ ], "exports": [], "overrides": { - "1.6": { "common": "common-kz" }, - "1.9": { "common": "common-kz" }, - "1.11": { "common": "common-kz" }, - "1.13": { "common": "common-kz" } + "1.06": { "data": "data-kz" }, + "1.09": { "data": "data-kz" }, + "1.11": { "data": "data-kz" }, + "1.13": { "data": "data-kz" } } } diff --git a/kz.png b/kz.png new file mode 100644 index 0000000..637ef5a --- /dev/null +++ b/kz.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:607c53d41ebbc3f0383d3d8c84c7c3b6d87a3eb14413ba9aa09266e48d5bbd63 +size 441707 diff --git a/scripts/.eslintrc.json b/scripts/.eslintrc.json new file mode 100644 index 0000000..a78a956 --- /dev/null +++ b/scripts/.eslintrc.json @@ -0,0 +1,8 @@ +{ + "extends": ["@uwu-codes/eslint-config/esm"], + "rules": { + "unicorn/prevent-abbreviations": "off", + "unicorn/no-process-exit": "off", + "unicorn/import-style": "off" + } +} diff --git a/scripts/bun.lockb b/scripts/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..f967a068569d9d64ea3a640a5985393cab17dfbd GIT binary patch literal 112106 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

|9fV_)J#b#(#BgO|ao^Cee41qrly)cQS8p>-Ap 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 literal 0 HcmV?d00001 diff --git a/scripts/common.ts b/scripts/common.ts new file mode 100644 index 0000000..acbd26c --- /dev/null +++ b/scripts/common.ts @@ -0,0 +1,194 @@ +import { randomBytes } from "crypto"; +import { fileTypeFromBuffer } from "file-type"; +import Ffmpeg from "fluent-ffmpeg"; +import { rm } from "fs/promises"; +import { readdir } from "fs/promises"; +import { mkdtemp } from "fs/promises"; +import { tmpdir } from "os"; +import { basename } from "path"; +import sharp, { type OverlayOptions, type Sharp } from "sharp"; + +export async function formatImage(name: string, image: string | string[], frameColors: number[], framePercent: number, width: number, height: number, resizeWidth?: number, resizeHeight?: number, frames?: [start: number, end: number], saveKz?: boolean) { + saveKz ??= false; + const originalWidth = width, originalHeight = height; + const originalFrameVH = Math.floor(Math.min(originalWidth, originalHeight) * framePercent); + const originalInputWidth = originalWidth - (originalFrameVH * 2), originalInputHeight = originalHeight - (originalFrameVH * 2); + if (resizeWidth && resizeHeight) { + width = resizeWidth; + height = resizeHeight; + } + const frameVH = Math.floor(Math.min(width, height) * framePercent); + const inputWidth = width - (frameVH * 2), inputHeight = height - (frameVH * 2); + const isImage = !Array.isArray(image) && ["image/png", "image/jpeg"].includes((await fileTypeFromBuffer(Buffer.isBuffer(image) ? image : await Bun.file(image).arrayBuffer()))!.mime); + let result: Sharp, kzFile: string | null | true = null; + const frame = await createFrame(frameColors, framePercent, width, height); + if (isImage) { + result = await sharp(frame) + .composite([{ + input: await sharp(image).resize(inputWidth, inputHeight, { fit: "fill" }).toBuffer(), + top: frameVH, + left: frameVH + }]) + .resize(width, height, { fit: "fill" }); + kzFile = true as const; + } else { + let tmpDir: string | undefined; + + let files: string[] = []; + tmpDir = await mkdtemp(`${tmpdir()}/split-frames-`); + if (!Array.isArray(image)) { + const [start = 0, end = null] = frames ?? []; + console.debug("Input file %s is not an image, assuming we need to extract frames.", name); + await new Promise((resolve) => { + Ffmpeg(image) + .videoFilter(`scale=${inputWidth}:${inputHeight}${end !== null ? `,select='gte(n\\, ${start})*lte(n\\,${end})'` : ""}`) + .addOption("-vsync vfr") + .output(`${tmpDir}/frame%04d.png`) + .on("end", async() => { + files = (await readdir(tmpDir!)).filter(f => /frame\d+\.png/.test(f)).sort().map(f => `${tmpDir}/${f}`); + if (files.length === 0) { + console.error("No frames extracted for %s.", name); + if (tmpDir) { + await rm(tmpDir, { recursive: true }); + } + process.exit(1); + } + console.log("Frames extracted to %s, %d total for %s", tmpDir, files.length, name); + resolve(); + }) + .on("error", async() => { + if (tmpDir) { + await rm(tmpDir, { recursive: true }); + } + console.error("Failed to extract frames for %s.", name); + process.exit(1); + }) + .run() + }); + } else { + for (const img of image) { + await sharp(img).resize(inputWidth, inputHeight, { fit: "fill" }).toFile(`${tmpDir}/${basename(img)}`); + } + files = image.map(f => `${tmpDir}/${basename(f)}`).sort(); + } + + const parts: OverlayOptions[] = []; + for (const img of files) { + const i = files.indexOf(img); + console.log("Processing %s (%d/%d) for %s", img, i + 1, files.length, name); + const imgFile = await sharp(img).resize(inputWidth, inputHeight, { fit: "fill" }).toBuffer(); + if (saveKz && !kzFile && (files.length < 5 || i >= 5)) { + const ogFile = await sharp(img).resize(originalInputWidth, originalInputHeight, { fit: "fill" }).toBuffer(); + kzFile = `${tmpdir()}/${randomBytes(8).toString("hex")}-kz.png`; + await sharp(await sharp(frame).resize(originalWidth, originalHeight, { fit: "fill" }).toBuffer()).composite([{ input: ogFile, top: originalFrameVH, left: originalFrameVH }]).resize(originalWidth, originalHeight, { fit: "fill" }).toFile(kzFile); + } + parts.push( + { input: frame, top: i * height, left: 0 }, + { input: imgFile, top: (i * height) + frameVH, left: frameVH } + ); + } + + result = await sharp({ + create: { + width, + height: height * files.length, + channels: 4, + background: { r: 0, g: 0, b: 0, alpha: 0 } + }, + limitInputPixels: false + }) + .composite(parts) + if (tmpDir) { + await rm(tmpDir, { recursive: true }); + } + } + return { isImage, result, kzFile }; +} + +const frameSizePercent = 0.1; +async function createFrame(colors: number[], percent: number, width: number, height: number) { + let frameW = width, frameH = height, i = 0; + const parts: OverlayOptions[] = []; + const frameVH = Math.floor(Math.min(width, height) * percent); + while (frameW > 0) { + if (i > colors.length - 1) { + i = 0; + } + const color = colors[i], r = (color >> 16) & 0xFF, g = (color >> 8) & 0xFF, b = color & 0xFF, + w = width * frameSizePercent, h = frameVH; + parts.push({ + input: { + create: { + width: w, + height: h, + channels: 4, + background: { r, g, b, alpha: 255 } + } + }, + top: 0, + // left to right + left: i * w + }, + { + input: { + create: { + width: w, + height: h, + channels: 4, + background: { r, g, b, alpha: 255 } + } + }, + top: frameH - h, + // right to left + left: width - (i + 1) * w + }); + frameW -= w; + i += 1; + } + i = 0; + colors = colors.toReversed(); + while (frameH > 0) { + if (i > colors.length - 1) { + i = 0; + } + const color = colors[i], r = (color >> 16) & 0xFF, g = (color >> 8) & 0xFF, b = color & 0xFF, + w = frameVH, h = height * frameSizePercent; + parts.push({ + input: { + create: { + width: w, + height: h, + channels: 4, + background: { r, g, b, alpha: 255 } + } + }, + top: i * h, + // top to bottom + left: 0 + }, + { + input: { + create: { + width: w, + height: h, + channels: 4, + background: { r, g, b, alpha: 255 } + } + }, + top: height - (i + 1) * h, + // bottom to top + left: width - w + }); + frameH -= h; + i += 1; + } + return sharp({ + create: { + width, + height, + channels: 4, + background: { r: 0, g: 0, b: 0, alpha: 0 } + }, + limitInputPixels: false + }).composite(parts).png().toBuffer(); +} diff --git a/scripts/images.ts b/scripts/images.ts new file mode 100755 index 0000000..29e0807 --- /dev/null +++ b/scripts/images.ts @@ -0,0 +1,136 @@ +import type { PathLike } from "fs"; +import { access } from "fs/promises"; +import { dirname, resolve } from "path"; +import sharp from "sharp"; +import { parseArgs } from "util"; +import { formatImage } from "./common"; +import { readFile } from "fs/promises"; +import { writeFile } from "fs/promises"; +import { rm } from "fs/promises"; +import { mkdir } from "fs/promises"; +import { stat } from "fs/promises"; +import { readdir } from "fs/promises"; + +const { values: args } = parseArgs({ + args: Bun.argv, + options: { + images: { + type: "string", + short: "i", + default: "images/images.json" + }, + imagedir: { + type: "string", + short: "d", + default: "images" + }, + outdir: { + type: "string", + short: "o", + default: "data" + }, + kzoutdir: { + type: "string", + short: "k", + default: "data-kz" + }, + kzfile: { + type: "string", + default: "kz.png" + }, + throw: { + type: "boolean", + short: "t", + default: false + } + }, + strict: true, + allowPositionals: true +}); + +const dirExists = async(path: PathLike) => access(path).then(() => true, () => false); +const imagesPath = resolve(args.images ?? "images.json"); +const imageDir = resolve(args.imagedir ?? dirname(imagesPath)); +const outDir = resolve(args.outdir ?? "data"); +const kzFile = resolve(args.kzfile ?? "frames/kz.png"); +const kzOutDir = resolve(args.kzoutdir ?? "data-kz"); +const framePercent = 0.03125; +const frameColors = [0xA47627, 0xA45226, 0x944421, 0xAC581D, 0x8C341C, 0xAC641D, 0xAB6C25, 0xA44424, 0xAC572C, 0xAC4C24, 0xA87824]; +const throwOnMissing = !!args.throw; +if (!await dirExists(imageDir)) { + console.error("Image directory %s does not exist.", imageDir); + process.exit(1); +} + +if (!await Bun.file(kzFile).exists()) { + console.error("Kz file %s does not exist.", kzFile); + process.exit(1); +} + +const ap = (p: string) => resolve(p, "assets/minecraft/textures/painting"); +await rm(`${outDir}/assets`, { recursive: true, force: true }); +await rm(`${kzOutDir}/assets`, { recursive: true, force: true }); +await mkdir(ap(outDir), { recursive: true }); +await mkdir(ap(kzOutDir), { recursive: true }); + +interface Image { + animation?: { frametime?: number; }; + frames?: [start: number, end: number]; + kz: [x: number, y: number] | null; + name: string; + resize?: [width: number, height: number]; + size: string; +} + +interface Images { + images: Array; + sizes: Record; +} + +const images = await Bun.file(imagesPath).json() as Images; +const [baseWidth, baseHeight] = images.sizes["1x1"]; + +const kzCleanup: string[] = []; +let kz = await sharp(kzFile, { limitInputPixels: false }).toBuffer(); +for (const image of images.images) { + let img: string | string[]; + if (await stat(`${imageDir}/${image.name}`).then(s => s.isDirectory(), () => false)) { + img = await readdir(`${imageDir}/${image.name}`).then(files => files.map(f => `${imageDir}/${image.name}/${f}`).sort()); + } else { + const [file] = await Array.fromAsync(new Bun.Glob(`${image.name}.*`).scan({ onlyFiles: true, cwd: imageDir })); + if (!file) { + console.error("Image %s does not exist.", image.name); + if (throwOnMissing) { + process.exit(1); + } + continue; + } + img = `${imageDir}/${file}` + } + console.log("Processing %s", image.name); + + const [resizeWidth, resizeHeight] = image.resize ?? []; + const { isImage, result, kzFile } = await formatImage(image.name, img, frameColors, framePercent, ...images.sizes[image.size], resizeWidth, resizeHeight, image.frames, image.kz !== null); + await result.toFile(`${ap(outDir)}/${image.name}.png`); + if (!isImage) { + await writeFile(`${ap(outDir)}/${image.name}.png.mcmeta`, JSON.stringify({ animation: image.animation ?? {} })); + } + + if (image.kz && kzFile !== null) { + kz = await sharp(kz) + .composite([{ + input: await sharp(kzFile === true ? `${ap(outDir)}/${image.name}.png` : kzFile).resize(images.sizes[image.size][0], images.sizes[image.size][1]).toBuffer(), + top: baseHeight * image.kz[1], + left: baseWidth * image.kz[0] + }]) + .toBuffer(); + if (kzFile !== true) { + kzCleanup.push(kzFile); + } + } +} + +await sharp(kz).toFile(`${ap(kzOutDir)}/paintings_kristoffer_zetterstrand.png`); +for (const file of kzCleanup) { + await rm(file); +} diff --git a/scripts/package.json b/scripts/package.json new file mode 100644 index 0000000..0e55735 --- /dev/null +++ b/scripts/package.json @@ -0,0 +1,26 @@ +{ + "name": "image-maker", + "module": "index.ts", + "type": "module", + "devDependencies": { + "@types/bun": "latest", + "@types/fluent-ffmpeg": "^2.1.24", + "@types/node": "^20.12.13", + "@uwu-codes/eslint-config": "^1.1.28", + "eslint": "^9.3.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": { + "file-type": "^19.0.0", + "fluent-ffmpeg": "^2.1.3", + "sharp": "^0.33.4" + }, + "scripts": { + "compile": "bun build ./images.ts --compile --outfile bin/make-images" + }, + "bin": { + "make-images": "./images.ts" + } +} diff --git a/scripts/tsconfig.json b/scripts/tsconfig.json new file mode 100644 index 0000000..dcd8fc5 --- /dev/null +++ b/scripts/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "lib": ["ESNext"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + /* Linting */ + "skipLibCheck": true, + "strict": true, + "noFallthroughCasesInSwitch": true, + "forceConsistentCasingInFileNames": true + } +}