mirror of
https://github.com/creeper2eletricboogaloo/L4JDownloadableContent.git
synced 2026-09-14 03:14:42 +02:00
Merge 'multiversion work'
This commit is contained in:
1
.github/workflows/update-links.yml
vendored
1
.github/workflows/update-links.yml
vendored
@@ -17,6 +17,7 @@ jobs:
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.x"
|
||||
- run: python -m unittest scripts.test_update_links
|
||||
- run: python scripts/update_links.py --write
|
||||
- uses: peter-evans/create-pull-request@v6
|
||||
with:
|
||||
|
||||
@@ -475,6 +475,36 @@
|
||||
"description": "Make your worlds simple, colorful, and vibrant with bright plastic-themed textures for blocks, items, entities, and the UI.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/meEXwbr9/versions/zT0YGbvp/Plastic%20Texture%20Pack.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/meEXwbr9/versions/UHhFQk6m/Plastic%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/meEXwbr9/versions/UHhFQk6m/Plastic%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/meEXwbr9/versions/UHhFQk6m/Plastic%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/meEXwbr9/versions/UHhFQk6m/Plastic%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/meEXwbr9/versions/UHhFQk6m/Plastic%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/meEXwbr9/versions/UHhFQk6m/Plastic%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -494,6 +524,36 @@
|
||||
"description": "Indulge your sweet tooth with sugar-coated textures for blocks, items, entities, and the UI.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/NGIRqFgR/versions/R2Sp0xlI/Candy%20Texture%20Pack.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/NGIRqFgR/versions/bxHfHkig/Candy%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/NGIRqFgR/versions/bxHfHkig/Candy%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/NGIRqFgR/versions/bxHfHkig/Candy%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/NGIRqFgR/versions/bxHfHkig/Candy%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/NGIRqFgR/versions/bxHfHkig/Candy%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/NGIRqFgR/versions/bxHfHkig/Candy%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -513,6 +573,36 @@
|
||||
"description": "Decorate your world with bright patterns, knitted animals, and themed textures for blocks, items, entities, and the UI.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/2F04lb0o/versions/nTsNQYft/Pattern%20Texture%20Pack.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/2F04lb0o/versions/DH4NyLyx/Pattern%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/2F04lb0o/versions/DH4NyLyx/Pattern%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/2F04lb0o/versions/DH4NyLyx/Pattern%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/2F04lb0o/versions/DH4NyLyx/Pattern%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/2F04lb0o/versions/DH4NyLyx/Pattern%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/2F04lb0o/versions/DH4NyLyx/Pattern%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -532,6 +622,36 @@
|
||||
"description": "Build a pantheon fit for the gods, trap the Minotaur in an elaborate maze, and set sail across the sea in this mythology-themed mash-up.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/WtfCCeNe/versions/X3RfZgU8/Greek%20Mythology%20Mash-up.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/WtfCCeNe/versions/1KzVMhiP/Greek%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/WtfCCeNe/versions/1KzVMhiP/Greek%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/WtfCCeNe/versions/1KzVMhiP/Greek%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/WtfCCeNe/versions/1KzVMhiP/Greek%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/WtfCCeNe/versions/1KzVMhiP/Greek%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/WtfCCeNe/versions/1KzVMhiP/Greek%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -560,6 +680,36 @@
|
||||
"description": "Googly eyes, goofy grins, and a full toon-style makeover for blocks, items, entities, and the UI.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/I8Wm3eT9/versions/3jwtSKEQ/Cartoon%20Texture%20Pack.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/I8Wm3eT9/versions/KHKFUGdZ/Cartoon%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/I8Wm3eT9/versions/KHKFUGdZ/Cartoon%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/I8Wm3eT9/versions/KHKFUGdZ/Cartoon%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/I8Wm3eT9/versions/KHKFUGdZ/Cartoon%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/I8Wm3eT9/versions/KHKFUGdZ/Cartoon%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/I8Wm3eT9/versions/KHKFUGdZ/Cartoon%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -579,6 +729,36 @@
|
||||
"description": "Journey through epic terrain and find enlightenment in a land of dragons inspired by the myths and legends of China.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kRsZVu69/versions/KSdastsm/Chinese%20Mythology%20Mash-up.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kRsZVu69/versions/s9kVY3d7/Chinese%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kRsZVu69/versions/s9kVY3d7/Chinese%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kRsZVu69/versions/s9kVY3d7/Chinese%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kRsZVu69/versions/s9kVY3d7/Chinese%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kRsZVu69/versions/s9kVY3d7/Chinese%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kRsZVu69/versions/s9kVY3d7/Chinese%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -615,6 +795,36 @@
|
||||
"description": "Celebrate the Festive period with this wintery Mash-up Pack containing a Festive style Texture Pack, Skin Pack, new music and a Festive world!",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pE8Ji9UH/versions/D5bB70i8/Festive%20Mash-up.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pE8Ji9UH/versions/xg5RzqC5/Festive%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pE8Ji9UH/versions/xg5RzqC5/Festive%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pE8Ji9UH/versions/xg5RzqC5/Festive%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pE8Ji9UH/versions/xg5RzqC5/Festive%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pE8Ji9UH/versions/xg5RzqC5/Festive%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pE8Ji9UH/versions/xg5RzqC5/Festive%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -674,6 +884,36 @@
|
||||
"description": "Happy Halloween! Dress suitably spookily and prepare for the ultimate Minecraft Halloween thrill ride! This mash-up pack includes spooky textures for blocks, items, entities, UI, new music and an epic new world to explore!",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/mXZavX3c/versions/ZW2YDeII/Halloween%20Mash-up.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/mXZavX3c/versions/YVztuEK9/Halloween%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/mXZavX3c/versions/YVztuEK9/Halloween%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/mXZavX3c/versions/YVztuEK9/Halloween%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/mXZavX3c/versions/YVztuEK9/Halloween%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/mXZavX3c/versions/YVztuEK9/Halloween%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/mXZavX3c/versions/YVztuEK9/Halloween%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
|
||||
@@ -6,6 +6,41 @@
|
||||
"description": "Legacy4J support for Faithful 32x, bringing Faithful-style UI textures to the Legacy4J interface.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/PbrKfOSH/versions/vFwN1BQC/faithful_legacy.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_1",
|
||||
"minVersion": "1.20",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/PbrKfOSH/versions/vFwN1BQC/faithful_legacy.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/PbrKfOSH/versions/vFwN1BQC/faithful_legacy.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/PbrKfOSH/versions/LaRBCmRN/faithful-legacy.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/PbrKfOSH/versions/LaRBCmRN/faithful-legacy.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/PbrKfOSH/versions/LaRBCmRN/faithful-legacy.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/PbrKfOSH/versions/LaRBCmRN/faithful-legacy.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/PbrKfOSH/versions/LaRBCmRN/faithful-legacy.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -29,6 +64,41 @@
|
||||
"description": "Brings the style of Minecraft: Bedrock Edition's Ore UI into Legacy4J.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pEZP92gi/versions/cbeycLW6/ore4j-O4J-3.3.0.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_1",
|
||||
"minVersion": "1.20",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pEZP92gi/versions/rYtyzyzk/ore4j.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pEZP92gi/versions/rYtyzyzk/ore4j.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pEZP92gi/versions/rYtyzyzk/ore4j.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pEZP92gi/versions/rYtyzyzk/ore4j.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pEZP92gi/versions/rYtyzyzk/ore4j.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pEZP92gi/versions/rYtyzyzk/ore4j.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pEZP92gi/versions/rYtyzyzk/ore4j.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -43,6 +113,38 @@
|
||||
"name": "Tutorial World Add-on",
|
||||
"description": "This is a small add-on that was originally a part of Re-Console Resources, which was now seperated into this resource pack to allow people to use the Tutorial Worlds without the Resources pack being required.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/If3YYTYV/versions/UwXUb7sq/TutorialWorldAddon.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_1",
|
||||
"minVersion": "1.20",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/If3YYTYV/versions/UwXUb7sq/TutorialWorldAddon.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/If3YYTYV/versions/UwXUb7sq/TutorialWorldAddon.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/If3YYTYV/versions/UwXUb7sq/TutorialWorldAddon.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/If3YYTYV/versions/UwXUb7sq/TutorialWorldAddon.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/If3YYTYV/versions/UwXUb7sq/TutorialWorldAddon.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/If3YYTYV/versions/UwXUb7sq/TutorialWorldAddon.zip"
|
||||
}
|
||||
],
|
||||
"imageUrl": "https://raw.githubusercontent.com/creeper2eletricboogaloo/L4JDownloadableContent/main/Legacy4J/preview_images/legacy_tutorial_worlds_preview.png?checksum=049782e1e127c3714ac12cc877670d5d",
|
||||
"tags": ["auto_apply_resource_pack"]
|
||||
},
|
||||
@@ -51,6 +153,38 @@
|
||||
"name": "Legacy Titles",
|
||||
"description": "Legacy Titles is a resource pack made specifically for Legacy4J, adding the different \"Edition\" titles from Minecraft: Legacy Console Edition, while also adding fitting, custom titles to complete the Legacy experience for your preferred platform.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/o8MTMlkh/versions/xxREu2B5/Legacy%20Titles.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_1",
|
||||
"minVersion": "1.20",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/o8MTMlkh/versions/xxREu2B5/Legacy%20Titles.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/o8MTMlkh/versions/xxREu2B5/Legacy%20Titles.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/o8MTMlkh/versions/xxREu2B5/Legacy%20Titles.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/o8MTMlkh/versions/xxREu2B5/Legacy%20Titles.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/o8MTMlkh/versions/xxREu2B5/Legacy%20Titles.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/o8MTMlkh/versions/xxREu2B5/Legacy%20Titles.zip"
|
||||
}
|
||||
],
|
||||
"imageUrl": "https://raw.githubusercontent.com/creeper2eletricboogaloo/L4JDownloadableContent/main/Legacy4J/preview_images/legacy_titles_preview.png?checksum=1d296644dbb7c221b7147ac7c41b181d",
|
||||
"tags": ["auto_apply_resource_pack"]
|
||||
},
|
||||
@@ -67,6 +201,38 @@
|
||||
"name": "TU5 Panorama",
|
||||
"description": "LCE Panorama Collection add-on for Legacy4J, adding the TU5 panorama from Legacy Console Edition.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/YlAndT79/tu5.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_1",
|
||||
"minVersion": "1.20",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/YlAndT79/tu5.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/YlAndT79/tu5.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/YlAndT79/tu5.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/YlAndT79/tu5.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/YlAndT79/tu5.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/YlAndT79/tu5.zip"
|
||||
}
|
||||
],
|
||||
"imageUrl": "https://raw.githubusercontent.com/creeper2eletricboogaloo/L4JDownloadableContent/main/Legacy4J/preview_images/legacy_panorama_tu5_preview.png?checksum=3c86a73549280a1539d8e5f4f93df332",
|
||||
"tags": ["auto_apply_resource_pack"]
|
||||
},
|
||||
@@ -75,6 +241,38 @@
|
||||
"name": "TU7 Panorama",
|
||||
"description": "LCE Panorama Collection add-on for Legacy4J, adding the TU7 panorama from Legacy Console Edition.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/LFPMQ4Dq/tu7.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_1",
|
||||
"minVersion": "1.20",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/LFPMQ4Dq/tu7.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/LFPMQ4Dq/tu7.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/LFPMQ4Dq/tu7.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/LFPMQ4Dq/tu7.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/LFPMQ4Dq/tu7.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/LFPMQ4Dq/tu7.zip"
|
||||
}
|
||||
],
|
||||
"imageUrl": "https://raw.githubusercontent.com/creeper2eletricboogaloo/L4JDownloadableContent/main/Legacy4J/preview_images/legacy_panorama_tu7_preview.png?checksum=6724d0be11e813777f42860e5be56598",
|
||||
"tags": ["auto_apply_resource_pack"]
|
||||
},
|
||||
@@ -83,6 +281,38 @@
|
||||
"name": "TU12 Panorama",
|
||||
"description": "LCE Panorama Collection add-on for Legacy4J, adding the TU12 panorama from Legacy Console Edition.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/1BF0T8Dn/tu12.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_1",
|
||||
"minVersion": "1.20",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/1BF0T8Dn/tu12.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/1BF0T8Dn/tu12.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/1BF0T8Dn/tu12.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/1BF0T8Dn/tu12.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/1BF0T8Dn/tu12.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/1BF0T8Dn/tu12.zip"
|
||||
}
|
||||
],
|
||||
"imageUrl": "https://raw.githubusercontent.com/creeper2eletricboogaloo/L4JDownloadableContent/main/Legacy4J/preview_images/legacy_panorama_tu12_preview.png?checksum=d812244181fd187da94619179873dfba",
|
||||
"tags": ["auto_apply_resource_pack"]
|
||||
},
|
||||
@@ -91,6 +321,38 @@
|
||||
"name": "TU20 Panorama",
|
||||
"description": "LCE Panorama Collection add-on for Legacy4J, adding the TU20 panorama from Legacy Console Edition.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/ZC58Zj8f/tu20.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_1",
|
||||
"minVersion": "1.20",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/ZC58Zj8f/tu20.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/ZC58Zj8f/tu20.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/ZC58Zj8f/tu20.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/ZC58Zj8f/tu20.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/ZC58Zj8f/tu20.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/ZC58Zj8f/tu20.zip"
|
||||
}
|
||||
],
|
||||
"imageUrl": "https://raw.githubusercontent.com/creeper2eletricboogaloo/L4JDownloadableContent/main/Legacy4J/preview_images/legacy_panorama_tu20_preview.png?checksum=2790862c057f1a06a3acd333e967df09",
|
||||
"tags": ["auto_apply_resource_pack"]
|
||||
},
|
||||
@@ -99,6 +361,38 @@
|
||||
"name": "TU31 Panorama",
|
||||
"description": "LCE Panorama Collection add-on for Legacy4J, adding the TU31 panorama from Legacy Console Edition.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/TRYIy4nZ/tu31.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_1",
|
||||
"minVersion": "1.20",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/TRYIy4nZ/tu31.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/TRYIy4nZ/tu31.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/TRYIy4nZ/tu31.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/TRYIy4nZ/tu31.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/TRYIy4nZ/tu31.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/TRYIy4nZ/tu31.zip"
|
||||
}
|
||||
],
|
||||
"imageUrl": "https://raw.githubusercontent.com/creeper2eletricboogaloo/L4JDownloadableContent/main/Legacy4J/preview_images/legacy_panorama_tu31_preview.png?checksum=670966f2c0554eeaeff452f1358f4807",
|
||||
"tags": ["auto_apply_resource_pack"]
|
||||
},
|
||||
@@ -107,6 +401,38 @@
|
||||
"name": "TU46 Panorama",
|
||||
"description": "LCE Panorama Collection add-on for Legacy4J, adding the TU46 panorama from Legacy Console Edition.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/CG6yqXOJ/tu46.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_1",
|
||||
"minVersion": "1.20",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/CG6yqXOJ/tu46.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/CG6yqXOJ/tu46.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/CG6yqXOJ/tu46.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/CG6yqXOJ/tu46.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/CG6yqXOJ/tu46.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/gHHngSJG/versions/CG6yqXOJ/tu46.zip"
|
||||
}
|
||||
],
|
||||
"imageUrl": "https://raw.githubusercontent.com/creeper2eletricboogaloo/L4JDownloadableContent/main/Legacy4J/preview_images/legacy_panorama_tu46_preview.png?checksum=df2d28f43815b4f5cabac462f9edac9a",
|
||||
"tags": ["auto_apply_resource_pack"]
|
||||
},
|
||||
@@ -132,6 +458,41 @@
|
||||
"description": "This resource pack is a stand-alone version of DDM: EXPANSION that only contains the Legacy4J-related assets and some of the essential minecraft assets!",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/8xdgUCRk/versions/z2hqXmR6/Default-Dark-Mode-Legacy4J-1.20%2B-1.1.2-alt.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_1",
|
||||
"minVersion": "1.20",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/8xdgUCRk/versions/iARsV6G1/Default-Dark-Mode-Legacy4J-1.20%2B-1.2.0-alt.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/8xdgUCRk/versions/iARsV6G1/Default-Dark-Mode-Legacy4J-1.20%2B-1.2.0-alt.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/8xdgUCRk/versions/iARsV6G1/Default-Dark-Mode-Legacy4J-1.20%2B-1.2.0-alt.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/8xdgUCRk/versions/iARsV6G1/Default-Dark-Mode-Legacy4J-1.20%2B-1.2.0-alt.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/8xdgUCRk/versions/iARsV6G1/Default-Dark-Mode-Legacy4J-1.20%2B-1.2.0-alt.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/8xdgUCRk/versions/iARsV6G1/Default-Dark-Mode-Legacy4J-1.20%2B-1.2.0-alt.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/8xdgUCRk/versions/Ykaasrzg/Default-Dark-Mode-Legacy4J-1.21.9%2B-1.3.0.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
|
||||
@@ -6,6 +6,36 @@
|
||||
"description": "Take what you can. Give nothing back! Join Jack and his crew in the Pirates of the Caribbean Mash-up, featuring all of your favorite rogues and rascals. Plot a course from Tortuga to Shipwreck Cove and all the way down to Davy Jones' Locker. This is the day you will always remember as the day you sailed with Captain Jack Sparrow.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/bkDlbAtL/versions/ov7cVEHe/Pirates%20Of%20The%20Caribbean.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/bkDlbAtL/versions/fc8rkb3X/Pirates%20of%20the%20Caribbean%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/bkDlbAtL/versions/fc8rkb3X/Pirates%20of%20the%20Caribbean%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/bkDlbAtL/versions/fc8rkb3X/Pirates%20of%20the%20Caribbean%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/bkDlbAtL/versions/fc8rkb3X/Pirates%20of%20the%20Caribbean%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/bkDlbAtL/versions/fc8rkb3X/Pirates%20of%20the%20Caribbean%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/bkDlbAtL/versions/fc8rkb3X/Pirates%20of%20the%20Caribbean%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -44,6 +74,36 @@
|
||||
"description": "Will you survive the perils of the Pyramids? Journey through the Valley of the Kings, dodge deadly traps and explore the ancient tombs below! The fourth pack in the Mythology series, this Egyptian-themed Mash-up comes with textures fit for a Pharaoh, legendary mobs, and an epic soundtrack!",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/1Ee44YG5/versions/xhUR5AEF/Egyptian%20Mythology%20Mash-up.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/1Ee44YG5/versions/Dnd8sB9r/Egyptian%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/1Ee44YG5/versions/Dnd8sB9r/Egyptian%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/1Ee44YG5/versions/Dnd8sB9r/Egyptian%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/1Ee44YG5/versions/Dnd8sB9r/Egyptian%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/1Ee44YG5/versions/Dnd8sB9r/Egyptian%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/1Ee44YG5/versions/Dnd8sB9r/Egyptian%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -77,6 +137,36 @@
|
||||
"description": "Are you heroic enough to enter the Great Hall, Valhalla? Find out in the Norse Mythology Mash-up! Compose your own grand saga as you voyage through the 9 realms, from the treetops of Yggdrasil, down into the mines of Svartalfheim and the depths of Hel! The third episode in the mythology series, this pack has hand carved textures, a thunderous soundtrack and a horde of skins. Skal!",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/1COPjvze/versions/Zi7yz6pF/Norse%20Mythology%20Mash-up.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/1COPjvze/versions/PNh1C95v/Norse%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/1COPjvze/versions/PNh1C95v/Norse%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/1COPjvze/versions/PNh1C95v/Norse%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/1COPjvze/versions/PNh1C95v/Norse%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/1COPjvze/versions/PNh1C95v/Norse%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/1COPjvze/versions/PNh1C95v/Norse%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -115,6 +205,36 @@
|
||||
"description": "Celebrate the Festive period with this wintery Mash-up Pack containing a Festive style Texture Pack, Skin Pack, new music and a Festive world!",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pE8Ji9UH/versions/D5bB70i8/Festive%20Mash-up.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pE8Ji9UH/versions/xg5RzqC5/Festive%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pE8Ji9UH/versions/xg5RzqC5/Festive%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pE8Ji9UH/versions/xg5RzqC5/Festive%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pE8Ji9UH/versions/xg5RzqC5/Festive%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pE8Ji9UH/versions/xg5RzqC5/Festive%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/pE8Ji9UH/versions/xg5RzqC5/Festive%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -153,6 +273,36 @@
|
||||
"description": "Journey through epic terrain and find enlightenment in the land of dragons with this Mash-up Pack inspired by the myths and legends of China.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kRsZVu69/versions/KSdastsm/Chinese%20Mythology%20Mash-up.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kRsZVu69/versions/s9kVY3d7/Chinese%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kRsZVu69/versions/s9kVY3d7/Chinese%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kRsZVu69/versions/s9kVY3d7/Chinese%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kRsZVu69/versions/s9kVY3d7/Chinese%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kRsZVu69/versions/s9kVY3d7/Chinese%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kRsZVu69/versions/s9kVY3d7/Chinese%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -191,6 +341,36 @@
|
||||
"description": "Build a pantheon fit for the gods, trap the Minotaur in an elaborate maze, or set sail for adventures across the sea - the world is your square oyster!",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/WtfCCeNe/versions/X3RfZgU8/Greek%20Mythology%20Mash-up.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/WtfCCeNe/versions/1KzVMhiP/Greek%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/WtfCCeNe/versions/1KzVMhiP/Greek%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/WtfCCeNe/versions/1KzVMhiP/Greek%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/WtfCCeNe/versions/1KzVMhiP/Greek%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/WtfCCeNe/versions/1KzVMhiP/Greek%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/WtfCCeNe/versions/1KzVMhiP/Greek%20Mythology%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -228,6 +408,13 @@
|
||||
"name": "Minecraft Vault-Tec Mash-Up",
|
||||
"description": "Welcome to the wasteland! Crack open the Vault containing 44 unique skins, custom textures, re-skinned mobs, a special post-apocalyptic map, original soundtrack compilation and a Pip-Boy inspired UI.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/YyQcuyAN/versions/UZEBNeOe/FalloutMash-upPack.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/YyQcuyAN/versions/UZEBNeOe/FalloutMash-upPack.zip"
|
||||
}
|
||||
],
|
||||
"imageUrl": "https://raw.githubusercontent.com/creeper2eletricboogaloo/L4JDownloadableContent/main/mashup_packs/preview_images/fallout_preview.png?checksum=2b5067f88f49764528a265d44d463a31",
|
||||
"resourceAlbumIconUrl": "resource_album_icons/vault-tect.png?checksum=cea2ee1a56f366201d0d404a546e92b4",
|
||||
"worldTemplateIconUrl": "https://raw.githubusercontent.com/creeper2eletricboogaloo/L4JDownloadableContent/main/mashup_packs/world_icons/vault-tect.png?checksum=cea2ee1a56f366201d0d404a546e92b4",
|
||||
@@ -254,6 +441,28 @@
|
||||
"name": "Minecraft N7 Mash-Up",
|
||||
"description": "Shape the fate of your Minecraft galaxy with this amazing Mash-up.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/27e5KETs/versions/u0aJfMeM/Mass%20Effect.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/27e5KETs/versions/8Ya2o6nd/Mass%20Effect.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/27e5KETs/versions/u0aJfMeM/Mass%20Effect.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/27e5KETs/versions/u0aJfMeM/Mass%20Effect.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/27e5KETs/versions/u0aJfMeM/Mass%20Effect.zip"
|
||||
}
|
||||
],
|
||||
"imageUrl": "https://raw.githubusercontent.com/creeper2eletricboogaloo/L4JDownloadableContent/main/mashup_packs/preview_images/masseffect_preview.png?checksum=a73d81b41d6ba7b0d7bdfdfcac8362c2",
|
||||
"resourceAlbumIconUrl": "resource_album_icons/mass_effect.png?checksum=049a84a89ebef82b93b170d5696fe196",
|
||||
"worldTemplateIconUrl": "https://raw.githubusercontent.com/creeper2eletricboogaloo/L4JDownloadableContent/main/mashup_packs/world_icons/mass_effect.png?checksum=a6b81707478492879bb72738f776ccae",
|
||||
@@ -307,6 +516,36 @@
|
||||
"description": "Happy Halloween! Dress suitably spookily and prepare for the ultimate Minecraft Halloween thrill ride! This mash up pack includes spooky textures for blocks, items, entities, UI, new music and an epic new world to explore!",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/mXZavX3c/versions/ZW2YDeII/Halloween%20Mash-up.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/mXZavX3c/versions/YVztuEK9/Halloween%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/mXZavX3c/versions/YVztuEK9/Halloween%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/mXZavX3c/versions/YVztuEK9/Halloween%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/mXZavX3c/versions/YVztuEK9/Halloween%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/mXZavX3c/versions/YVztuEK9/Halloween%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/mXZavX3c/versions/YVztuEK9/Halloween%20Mash-up.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -345,6 +584,36 @@
|
||||
"description": "The Super Mario Mash-Up Pack is a free mash-up pack exclusively available for the Nintendo console versions of Minecraft.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/ArxJTTKm/versions/liceZcLU/Super%20Mario%20Mash-Up.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/ArxJTTKm/versions/A3rOYdwT/Super%20Mario%20Mash-Up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/ArxJTTKm/versions/A3rOYdwT/Super%20Mario%20Mash-Up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/ArxJTTKm/versions/A3rOYdwT/Super%20Mario%20Mash-Up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/ArxJTTKm/versions/A3rOYdwT/Super%20Mario%20Mash-Up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/ArxJTTKm/versions/A3rOYdwT/Super%20Mario%20Mash-Up.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/ArxJTTKm/versions/A3rOYdwT/Super%20Mario%20Mash-Up.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
|
||||
160
scripts/test_update_links.py
Normal file
160
scripts/test_update_links.py
Normal file
@@ -0,0 +1,160 @@
|
||||
import json
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
from scripts import update_links
|
||||
|
||||
|
||||
class VersionRailTests(unittest.TestCase):
|
||||
def test_multiversion_rails(self) -> None:
|
||||
config = update_links.load_config(update_links.repo_root())
|
||||
rails = update_links.configured_version_rails(config)
|
||||
actual = {rail.id: (rail.min_version, rail.match_version) for rail in rails}
|
||||
self.assertEqual([
|
||||
"1_20_1",
|
||||
"1_20_4",
|
||||
"1_21_1",
|
||||
"1_21_3",
|
||||
"1_21_4",
|
||||
"1_21_5",
|
||||
], [rail.id for rail in rails[:6]])
|
||||
self.assertEqual(("1.20", "1.20.1"), actual["1_20_1"])
|
||||
self.assertEqual(("1.20.3", "1.20.4"), actual["1_20_4"])
|
||||
self.assertEqual(("1.21", "1.21.1"), actual["1_21_1"])
|
||||
self.assertEqual(("1.21.2", "1.21.3"), actual["1_21_3"])
|
||||
self.assertEqual(("1.21.4", "1.21.4"), actual["1_21_4"])
|
||||
self.assertEqual(("1.21.5", "1.21.5"), actual["1_21_5"])
|
||||
self.assertEqual(("1.21.11", "1.21.11"), actual["1_21_11"])
|
||||
|
||||
def test_variants_are_sorted_by_lower_bound(self) -> None:
|
||||
existing = [
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
"downloadURI": "https://example.com/current.zip",
|
||||
}
|
||||
]
|
||||
additions = [
|
||||
update_links.VariantAddition("index.json", "packs[0]", "https://example.com/base.zip", "1_21_1", "1.21", "https://example.com/old.zip", 0)
|
||||
]
|
||||
variants = update_links.merge_variants(existing, additions)
|
||||
self.assertEqual(["1_21_1", "26_1_2"], [variant["id"] for variant in variants])
|
||||
|
||||
def test_match_version_is_independent_from_lower_bound(self) -> None:
|
||||
config = {
|
||||
"modrinth": {
|
||||
"loader": "minecraft",
|
||||
"versionTypes": ["release"],
|
||||
}
|
||||
}
|
||||
cache = {
|
||||
"project": [
|
||||
{
|
||||
"version_type": "release",
|
||||
"loaders": ["minecraft"],
|
||||
"game_versions": ["1.20.4"],
|
||||
"files": [
|
||||
{
|
||||
"primary": True,
|
||||
"filename": "pack.zip",
|
||||
"url": "https://example.com/pack.zip",
|
||||
}
|
||||
],
|
||||
}
|
||||
]
|
||||
}
|
||||
url = update_links.choose_modrinth_url("project", config, cache, [], "1.20.4", False, None, ())
|
||||
self.assertEqual("https://example.com/pack.zip", url)
|
||||
|
||||
def test_auto_discovery_backfills_matching_rails(self) -> None:
|
||||
config = {
|
||||
"modrinth": {
|
||||
"loader": "minecraft",
|
||||
"versionTypes": ["release"],
|
||||
"rails": [
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"matchVersion": "1.21.5",
|
||||
},
|
||||
{
|
||||
"id": "26_2",
|
||||
"minVersion": "26.2",
|
||||
"matchVersion": "26.2",
|
||||
},
|
||||
],
|
||||
"autoDiscoverRails": {
|
||||
"enabled": True,
|
||||
"gameVersionPattern": r"^26\.[0-9]+(\.[0-9]+)?$",
|
||||
"minimumProjects": 1,
|
||||
"minimumVersion": "26.1.2",
|
||||
},
|
||||
}
|
||||
}
|
||||
ref = update_links.UrlRef(
|
||||
Path("index.json"),
|
||||
"index.json",
|
||||
"packs[0].downloadURI",
|
||||
"downloadURI",
|
||||
"https://cdn.modrinth.com/data/project/versions/old/pack.zip",
|
||||
"category",
|
||||
"pack",
|
||||
"packs[0]",
|
||||
None,
|
||||
None,
|
||||
)
|
||||
cache = {
|
||||
"project": [
|
||||
{
|
||||
"version_type": "release",
|
||||
"loaders": ["minecraft"],
|
||||
"game_versions": ["26.1.3"],
|
||||
"files": [
|
||||
{
|
||||
"primary": True,
|
||||
"filename": "pack.zip",
|
||||
"url": "https://example.com/pack.zip",
|
||||
}
|
||||
],
|
||||
}
|
||||
]
|
||||
}
|
||||
configured = update_links.configured_version_rails(config)
|
||||
rails, additions = update_links.discover_version_rails([ref], config, cache, [], {}, configured, ())
|
||||
self.assertIn("26_1_3", {rail.id for rail in rails})
|
||||
self.assertEqual("26.1.3", additions[0].match_version)
|
||||
|
||||
def test_variant_rails_are_ordered(self) -> None:
|
||||
root = update_links.repo_root()
|
||||
config = update_links.load_config(root)
|
||||
rails = {rail.id: rail for rail in update_links.configured_version_rails(config)}
|
||||
for path in update_links.index_files(root):
|
||||
data = json.loads(path.read_text(encoding="utf-8"))
|
||||
self.assert_ordered(data, path, rails)
|
||||
|
||||
def assert_ordered(self, value: object, path: Path, rails: dict[str, update_links.VersionRail]) -> None:
|
||||
if isinstance(value, list):
|
||||
for item in value:
|
||||
self.assert_ordered(item, path, rails)
|
||||
return
|
||||
if not isinstance(value, dict):
|
||||
return
|
||||
for property_name in ("downloadVariants", "worldTemplateVariants"):
|
||||
variants = value.get(property_name)
|
||||
if not isinstance(variants, list):
|
||||
continue
|
||||
versions = []
|
||||
for item in variants:
|
||||
if not isinstance(item, dict) or not isinstance(item.get("id"), str) or not isinstance(item.get("minVersion"), str):
|
||||
continue
|
||||
rail_id = item["id"]
|
||||
self.assertIn(rail_id, rails, f"{path}: {rail_id}")
|
||||
self.assertEqual(rails[rail_id].min_version, item["minVersion"], f"{path}: {rail_id}")
|
||||
versions.append(item["minVersion"])
|
||||
self.assertEqual(sorted(versions, key=update_links.version_sort_key), versions, f"{path}: {property_name}")
|
||||
for item in value.values():
|
||||
self.assert_ordered(item, path, rails)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -53,16 +53,18 @@ class VariantAddition:
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class VariantTrack:
|
||||
class VersionRail:
|
||||
id: str
|
||||
min_version: str
|
||||
match_version: str
|
||||
order: int
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class ConfigTrackAddition:
|
||||
variant_id: str
|
||||
class ConfigRailAddition:
|
||||
id: str
|
||||
min_version: str
|
||||
match_version: str
|
||||
project_count: int
|
||||
|
||||
|
||||
@@ -179,28 +181,59 @@ def pack_key(ref: UrlRef) -> str | None:
|
||||
return f"{ref.category}:{ref.pack_id}"
|
||||
|
||||
|
||||
def configured_variant_tracks(config: dict) -> list[VariantTrack]:
|
||||
variants = config.get("modrinth", {}).get("variants", [])
|
||||
if isinstance(variants, dict):
|
||||
items = [{"id": variant_id, "minVersion": item.get("minVersion")} for variant_id, item in variants.items() if isinstance(item, dict)]
|
||||
elif isinstance(variants, list):
|
||||
items = variants
|
||||
def configured_version_rails(config: dict) -> list[VersionRail]:
|
||||
modrinth = config.get("modrinth", {})
|
||||
rails = modrinth.get("rails")
|
||||
if not isinstance(rails, (list, dict)):
|
||||
rails = modrinth.get("variants", [])
|
||||
if isinstance(rails, dict):
|
||||
items = [{**rail, "id": rail_id} for rail_id, rail in rails.items() if isinstance(rail, dict)]
|
||||
elif isinstance(rails, list):
|
||||
items = rails
|
||||
else:
|
||||
items = []
|
||||
tracks: list[VariantTrack] = []
|
||||
seen: set[str] = set()
|
||||
for index, item in enumerate(items):
|
||||
if not isinstance(item, dict):
|
||||
result: list[VersionRail] = []
|
||||
seen_ids: set[str] = set()
|
||||
seen_versions: set[str] = set()
|
||||
for index, rail in enumerate(items):
|
||||
if not isinstance(rail, dict):
|
||||
continue
|
||||
variant_id = item.get("id")
|
||||
min_version = item.get("minVersion")
|
||||
if not isinstance(variant_id, str) or not isinstance(min_version, str) or not variant_id or not min_version:
|
||||
rail_id = rail.get("id")
|
||||
min_version = rail.get("minVersion")
|
||||
match_version = rail.get("matchVersion", min_version)
|
||||
if not isinstance(rail_id, str) or not isinstance(min_version, str) or not isinstance(match_version, str) or not rail_id or not min_version or not match_version:
|
||||
continue
|
||||
if variant_id in seen:
|
||||
if rail_id in seen_ids or min_version in seen_versions:
|
||||
continue
|
||||
seen.add(variant_id)
|
||||
tracks.append(VariantTrack(variant_id, min_version, index))
|
||||
return tracks
|
||||
seen_ids.add(rail_id)
|
||||
seen_versions.add(min_version)
|
||||
result.append(VersionRail(rail_id, min_version, match_version, index))
|
||||
result.sort(key=lambda rail: (version_sort_key(rail.min_version), rail.order))
|
||||
return [VersionRail(rail.id, rail.min_version, rail.match_version, order) for order, rail in enumerate(result)]
|
||||
|
||||
|
||||
def discovery_settings(config: dict) -> tuple[bool, re.Pattern[str], int, str | None]:
|
||||
modrinth = config.get("modrinth", {})
|
||||
settings = modrinth.get("autoDiscoverRails", modrinth.get("autoDiscoverVariants", {}))
|
||||
if not isinstance(settings, dict):
|
||||
settings = {}
|
||||
enabled = settings.get("enabled") is True
|
||||
pattern = str(settings.get("gameVersionPattern", r"^26\.[0-9]+(\.[0-9]+)?$"))
|
||||
minimum_projects = settings.get("minimumProjects", 3)
|
||||
if not isinstance(minimum_projects, int) or minimum_projects < 1:
|
||||
minimum_projects = 3
|
||||
minimum_version = settings.get("minimumVersion")
|
||||
if not isinstance(minimum_version, str) or not minimum_version:
|
||||
minimum_version = None
|
||||
return enabled, re.compile(pattern), minimum_projects, minimum_version
|
||||
|
||||
|
||||
def base_exclusion_patterns(config: dict) -> tuple[re.Pattern[str], ...]:
|
||||
modrinth = config.get("modrinth", {})
|
||||
patterns = modrinth.get("baseExcludedGameVersionPatterns")
|
||||
if not isinstance(patterns, list):
|
||||
patterns = [discovery_settings(config)[1].pattern]
|
||||
return tuple(re.compile(str(pattern)) for pattern in patterns if pattern)
|
||||
|
||||
|
||||
def version_sort_key(value: str) -> tuple:
|
||||
@@ -218,18 +251,6 @@ def variant_id_for_game_version(value: str) -> str:
|
||||
return re.sub(r"[^0-9A-Za-z]+", "_", value).strip("_").lower()
|
||||
|
||||
|
||||
def discovery_settings(config: dict) -> tuple[bool, re.Pattern[str], int]:
|
||||
settings = config.get("modrinth", {}).get("autoDiscoverVariants", {})
|
||||
if not isinstance(settings, dict):
|
||||
settings = {}
|
||||
enabled = settings.get("enabled") is True
|
||||
pattern = str(settings.get("gameVersionPattern", r"^26\.[0-9]+(\.[0-9]+)?$"))
|
||||
minimum_projects = settings.get("minimumProjects", 3)
|
||||
if not isinstance(minimum_projects, int) or minimum_projects < 1:
|
||||
minimum_projects = 3
|
||||
return enabled, re.compile(pattern), minimum_projects
|
||||
|
||||
|
||||
def load_json_files(root: Path) -> tuple[dict[Path, str], dict[Path, object], list[UrlRef]]:
|
||||
texts: dict[Path, str] = {}
|
||||
data_by_file: dict[Path, object] = {}
|
||||
@@ -266,7 +287,7 @@ def selected_file(version: dict, required_filename: str | None) -> dict | None:
|
||||
return zip_files[0] if zip_files else None
|
||||
|
||||
|
||||
def version_matches(version: dict, config: dict, required_game_version: str | None, require_base: bool, required_filename: str | None) -> bool:
|
||||
def version_matches(version: dict, config: dict, required_game_version: str | None, require_base: bool, required_filename: str | None, excluded_base_versions: tuple[re.Pattern[str], ...]) -> bool:
|
||||
modrinth = config.get("modrinth", {})
|
||||
if version.get("version_type") not in set(modrinth.get("versionTypes", ["release"])):
|
||||
return False
|
||||
@@ -275,14 +296,14 @@ def version_matches(version: dict, config: dict, required_game_version: str | No
|
||||
game_versions = version.get("game_versions") or []
|
||||
if required_game_version is not None and required_game_version not in game_versions:
|
||||
return False
|
||||
if require_base and any(re.match(r"^26\.", item) for item in game_versions):
|
||||
if require_base and any(pattern.match(item) for pattern in excluded_base_versions for item in game_versions):
|
||||
return False
|
||||
return selected_file(version, required_filename) is not None
|
||||
|
||||
|
||||
def choose_modrinth_url(project: str, config: dict, cache: dict[str, list[dict]], warnings: list[str], required_game_version: str | None, require_base: bool, required_filename: str | None) -> str | None:
|
||||
def choose_modrinth_url(project: str, config: dict, cache: dict[str, list[dict]], warnings: list[str], required_game_version: str | None, require_base: bool, required_filename: str | None, excluded_base_versions: tuple[re.Pattern[str], ...]) -> str | None:
|
||||
for version in fetch_modrinth_versions(project, cache, warnings):
|
||||
if version_matches(version, config, required_game_version, require_base, required_filename):
|
||||
if version_matches(version, config, required_game_version, require_base, required_filename, excluded_base_versions):
|
||||
file_item = selected_file(version, required_filename)
|
||||
if file_item and file_item.get("url"):
|
||||
return file_item["url"]
|
||||
@@ -304,13 +325,14 @@ def project_filename_rules(refs: list[UrlRef]) -> dict[str, bool]:
|
||||
return {project: len(projects.get(project, set())) > 1 and len(filenames.get(project, set())) > 1 for project in set(projects) | set(filenames)}
|
||||
|
||||
|
||||
def discover_variant_tracks(refs: list[UrlRef], config: dict, cache: dict[str, list[dict]], warnings: list[str], exact_filename: dict[str, bool], configured_tracks: list[VariantTrack]) -> tuple[list[VariantTrack], list[ConfigTrackAddition]]:
|
||||
enabled, pattern, minimum_projects = discovery_settings(config)
|
||||
def discover_version_rails(refs: list[UrlRef], config: dict, cache: dict[str, list[dict]], warnings: list[str], exact_filename: dict[str, bool], configured_rails: list[VersionRail], excluded_base_versions: tuple[re.Pattern[str], ...]) -> tuple[list[VersionRail], list[ConfigRailAddition]]:
|
||||
enabled, pattern, minimum_projects, minimum_version = discovery_settings(config)
|
||||
if not enabled:
|
||||
return configured_tracks, []
|
||||
configured_versions = {track.min_version for track in configured_tracks}
|
||||
configured_ids = {track.id for track in configured_tracks}
|
||||
newest_configured = max((track.min_version for track in configured_tracks), key=version_sort_key, default="")
|
||||
return configured_rails, []
|
||||
configured_match_versions = {rail.match_version for rail in configured_rails}
|
||||
configured_ids = {rail.id for rail in configured_rails}
|
||||
if minimum_version is None:
|
||||
minimum_version = max((rail.match_version for rail in configured_rails if pattern.match(rail.match_version)), key=version_sort_key, default=None)
|
||||
candidates: dict[str, set[str]] = {}
|
||||
for ref in refs:
|
||||
if ref.prop != "downloadURI" or ref.variant_id:
|
||||
@@ -320,43 +342,45 @@ def discover_variant_tracks(refs: list[UrlRef], config: dict, cache: dict[str, l
|
||||
continue
|
||||
required_filename = info["filename"] if exact_filename.get(info["project"]) else None
|
||||
for version in fetch_modrinth_versions(info["project"], cache, warnings):
|
||||
if not version_matches(version, config, None, False, required_filename):
|
||||
if not version_matches(version, config, None, False, required_filename, excluded_base_versions):
|
||||
continue
|
||||
for game_version in version.get("game_versions") or []:
|
||||
if not isinstance(game_version, str) or not pattern.match(game_version):
|
||||
continue
|
||||
if newest_configured and version_sort_key(game_version) <= version_sort_key(newest_configured):
|
||||
if minimum_version is not None and version_sort_key(game_version) < version_sort_key(minimum_version):
|
||||
continue
|
||||
if game_version in configured_versions:
|
||||
if game_version in configured_match_versions:
|
||||
continue
|
||||
candidates.setdefault(game_version, set()).add(info["project"])
|
||||
additions: list[ConfigTrackAddition] = []
|
||||
tracks = list(configured_tracks)
|
||||
order = max((track.order for track in tracks), default=-1) + 1
|
||||
for min_version in sorted(candidates, key=version_sort_key):
|
||||
project_count = len(candidates[min_version])
|
||||
additions: list[ConfigRailAddition] = []
|
||||
rails = list(configured_rails)
|
||||
for match_version in sorted(candidates, key=version_sort_key):
|
||||
project_count = len(candidates[match_version])
|
||||
if project_count < minimum_projects:
|
||||
continue
|
||||
variant_id = variant_id_for_game_version(min_version)
|
||||
if variant_id in configured_ids:
|
||||
warnings.append(f"Discovered variant {min_version} maps to configured id {variant_id}")
|
||||
rail_id = variant_id_for_game_version(match_version)
|
||||
if rail_id in configured_ids:
|
||||
warnings.append(f"Discovered rail {match_version} maps to configured id {rail_id}")
|
||||
continue
|
||||
additions.append(ConfigTrackAddition(variant_id, min_version, project_count))
|
||||
tracks.append(VariantTrack(variant_id, min_version, order))
|
||||
configured_ids.add(variant_id)
|
||||
configured_versions.add(min_version)
|
||||
order += 1
|
||||
return tracks, additions
|
||||
additions.append(ConfigRailAddition(rail_id, match_version, match_version, project_count))
|
||||
rails.append(VersionRail(rail_id, match_version, match_version, len(rails)))
|
||||
configured_ids.add(rail_id)
|
||||
configured_match_versions.add(match_version)
|
||||
rails.sort(key=lambda rail: (version_sort_key(rail.min_version), rail.order))
|
||||
rails = [VersionRail(rail.id, rail.min_version, rail.match_version, order) for order, rail in enumerate(rails)]
|
||||
return rails, additions
|
||||
|
||||
|
||||
def build_changes(root: Path, refs: list[UrlRef], config: dict) -> tuple[list[Change], list[VariantAddition], list[ConfigTrackAddition], list[str]]:
|
||||
def build_changes(root: Path, refs: list[UrlRef], config: dict) -> tuple[list[Change], list[VariantAddition], list[ConfigRailAddition], list[str]]:
|
||||
changes: list[Change] = []
|
||||
additions: list[VariantAddition] = []
|
||||
warnings: list[str] = []
|
||||
cache: dict[str, list[dict]] = {}
|
||||
exact_filename = project_filename_rules(refs)
|
||||
variant_tracks, config_additions = discover_variant_tracks(refs, config, cache, warnings, exact_filename, configured_variant_tracks(config))
|
||||
variant_by_id = {track.id: track for track in variant_tracks}
|
||||
configured_rails = configured_version_rails(config)
|
||||
excluded_base_versions = base_exclusion_patterns(config)
|
||||
rails, config_additions = discover_version_rails(refs, config, cache, warnings, exact_filename, configured_rails, excluded_base_versions)
|
||||
rail_by_id = {rail.id: rail for rail in rails}
|
||||
existing_variants = {(ref.rel_file, ref.pack_path, ref.variant_id) for ref in refs if ref.prop == "downloadURI" and ref.variant_id and ".downloadVariants[" in ref.path}
|
||||
variant_urls: dict[tuple[str, str | None], set[str]] = {}
|
||||
for ref in refs:
|
||||
@@ -385,18 +409,18 @@ def build_changes(root: Path, refs: list[UrlRef], config: dict) -> tuple[list[Ch
|
||||
continue
|
||||
required_filename = info["filename"] if exact_filename.get(info["project"]) else None
|
||||
if ref.variant_id:
|
||||
variant_track = variant_by_id.get(ref.variant_id)
|
||||
if not variant_track:
|
||||
warnings.append(f"Unconfigured variant {ref.variant_id} for {key} at {ref.rel_file} {ref.path}")
|
||||
rail = rail_by_id.get(ref.variant_id)
|
||||
if not rail:
|
||||
warnings.append(f"Unconfigured rail {ref.variant_id} for {key} at {ref.rel_file} {ref.path}")
|
||||
continue
|
||||
new_url = choose_modrinth_url(info["project"], config, cache, warnings, variant_track.min_version, False, required_filename)
|
||||
new_url = choose_modrinth_url(info["project"], config, cache, warnings, rail.match_version, False, required_filename, excluded_base_versions)
|
||||
if new_url is None:
|
||||
warnings.append(f"No Modrinth match for {key} variant {ref.variant_id} at {ref.rel_file} {ref.path}")
|
||||
warnings.append(f"No Modrinth match for {key} rail {ref.variant_id} at {ref.rel_file} {ref.path}")
|
||||
continue
|
||||
if new_url != ref.value:
|
||||
changes.append(Change("modrinth", ref.rel_file, ref.path, ref.value, new_url))
|
||||
continue
|
||||
new_url = choose_modrinth_url(info["project"], config, cache, warnings, None, True, required_filename)
|
||||
new_url = choose_modrinth_url(info["project"], config, cache, warnings, None, True, required_filename, excluded_base_versions)
|
||||
if new_url is None:
|
||||
warnings.append(f"No Modrinth base match for {key} at {ref.rel_file} {ref.path}")
|
||||
elif new_url in variant_urls.get((ref.rel_file, ref.pack_path), set()):
|
||||
@@ -404,12 +428,12 @@ def build_changes(root: Path, refs: list[UrlRef], config: dict) -> tuple[list[Ch
|
||||
elif new_url != ref.value:
|
||||
changes.append(Change("modrinth", ref.rel_file, ref.path, ref.value, new_url))
|
||||
anchor_url = new_url if new_url is not None and new_url != ref.value and new_url not in variant_urls.get((ref.rel_file, ref.pack_path), set()) else ref.value
|
||||
for track in variant_tracks:
|
||||
if (ref.rel_file, ref.pack_path, track.id) in existing_variants:
|
||||
for rail in rails:
|
||||
if (ref.rel_file, ref.pack_path, rail.id) in existing_variants:
|
||||
continue
|
||||
candidate = choose_modrinth_url(info["project"], config, cache, warnings, track.min_version, False, required_filename)
|
||||
candidate = choose_modrinth_url(info["project"], config, cache, warnings, rail.match_version, False, required_filename, excluded_base_versions)
|
||||
if candidate is not None:
|
||||
additions.append(VariantAddition(ref.rel_file, ref.pack_path or ref.path, anchor_url, track.id, track.min_version, candidate, track.order))
|
||||
additions.append(VariantAddition(ref.rel_file, ref.pack_path or ref.path, anchor_url, rail.id, rail.min_version, candidate, rail.order))
|
||||
return changes, sorted(set(additions), key=lambda item: (item.rel_file, item.path, item.order, item.variant_id)), config_additions, sorted(set(warnings))
|
||||
|
||||
|
||||
@@ -651,6 +675,7 @@ def merge_variants(existing: object, additions: list[VariantAddition]) -> list[d
|
||||
"downloadURI": addition.url,
|
||||
})
|
||||
seen.add(addition.variant_id)
|
||||
variants.sort(key=lambda item: version_sort_key(str(item.get("minVersion", ""))) if isinstance(item, dict) else ())
|
||||
return variants
|
||||
|
||||
|
||||
@@ -708,25 +733,33 @@ def apply_variant_additions(text: str, additions: list[VariantAddition]) -> tupl
|
||||
return text[:line_end] + comma + text[line_end:line_end + 1] + block + text[line_end + 1:], None
|
||||
|
||||
|
||||
def write_config_tracks(root: Path, config: dict, additions: list[ConfigTrackAddition]) -> None:
|
||||
def write_config_rails(root: Path, config: dict, additions: list[ConfigRailAddition]) -> None:
|
||||
modrinth = config.setdefault("modrinth", {})
|
||||
variants = modrinth.get("variants", [])
|
||||
if isinstance(variants, dict):
|
||||
variants = [{"id": variant_id, "minVersion": item.get("minVersion")} for variant_id, item in variants.items() if isinstance(item, dict)]
|
||||
elif not isinstance(variants, list):
|
||||
variants = []
|
||||
existing_ids = {item.get("id") for item in variants if isinstance(item, dict)}
|
||||
existing_versions = {item.get("minVersion") for item in variants if isinstance(item, dict)}
|
||||
rails = modrinth.get("rails")
|
||||
if not isinstance(rails, list):
|
||||
rails = [
|
||||
{
|
||||
"id": rail.id,
|
||||
"minVersion": rail.min_version,
|
||||
"matchVersion": rail.match_version,
|
||||
}
|
||||
for rail in configured_version_rails(config)
|
||||
]
|
||||
modrinth.pop("variants", None)
|
||||
existing_ids = {item.get("id") for item in rails if isinstance(item, dict)}
|
||||
existing_versions = {item.get("minVersion") for item in rails if isinstance(item, dict)}
|
||||
for addition in additions:
|
||||
if addition.variant_id in existing_ids or addition.min_version in existing_versions:
|
||||
if addition.id in existing_ids or addition.min_version in existing_versions:
|
||||
continue
|
||||
variants.append({
|
||||
"id": addition.variant_id,
|
||||
rails.append({
|
||||
"id": addition.id,
|
||||
"minVersion": addition.min_version,
|
||||
"matchVersion": addition.match_version,
|
||||
})
|
||||
existing_ids.add(addition.variant_id)
|
||||
existing_ids.add(addition.id)
|
||||
existing_versions.add(addition.min_version)
|
||||
modrinth["variants"] = variants
|
||||
rails.sort(key=lambda item: version_sort_key(str(item.get("minVersion", ""))) if isinstance(item, dict) else ())
|
||||
modrinth["rails"] = rails
|
||||
path = root / "scripts" / "update_links_config.json"
|
||||
path.write_text(json.dumps(config, indent=2) + "\n", encoding="utf-8")
|
||||
|
||||
@@ -770,7 +803,7 @@ def write_changes(root: Path, texts: dict[Path, str], changes: list[Change], add
|
||||
return errors
|
||||
|
||||
|
||||
def print_report(changes: list[Change], additions: list[VariantAddition], config_additions: list[ConfigTrackAddition], warnings: list[str], wrote: bool) -> None:
|
||||
def print_report(changes: list[Change], additions: list[VariantAddition], config_additions: list[ConfigRailAddition], warnings: list[str], wrote: bool) -> None:
|
||||
action = "Updated" if wrote else "Would update"
|
||||
total = len(changes) + len(additions) + len(config_additions)
|
||||
if total:
|
||||
@@ -788,7 +821,7 @@ def print_report(changes: list[Change], additions: list[VariantAddition], config
|
||||
print(f"{change.kind} {change.rel_file} {change.path}")
|
||||
shown = min(len(changes), 50)
|
||||
for config_addition in config_additions[: max(0, 50 - shown)]:
|
||||
print(f"config variant {config_addition.variant_id} minVersion {config_addition.min_version} projects {config_addition.project_count}")
|
||||
print(f"config rail {config_addition.id} minVersion {config_addition.min_version} matchVersion {config_addition.match_version} projects {config_addition.project_count}")
|
||||
shown += min(len(config_additions), max(0, 50 - shown))
|
||||
for addition in additions[: max(0, 50 - shown)]:
|
||||
print(f"variant {addition.rel_file} {addition.path}")
|
||||
@@ -816,7 +849,7 @@ def main() -> int:
|
||||
if args.local_only:
|
||||
changes, warnings = build_local_changes(root, refs)
|
||||
additions: list[VariantAddition] = []
|
||||
config_additions: list[ConfigTrackAddition] = []
|
||||
config_additions: list[ConfigRailAddition] = []
|
||||
else:
|
||||
config = load_config(root)
|
||||
changes, additions, config_additions, warnings = build_changes(root, refs, config)
|
||||
@@ -827,7 +860,7 @@ def main() -> int:
|
||||
print(error, file=sys.stderr)
|
||||
return 2
|
||||
if not args.local_only and config_additions:
|
||||
write_config_tracks(root, config, config_additions)
|
||||
write_config_rails(root, config, config_additions)
|
||||
print_report(changes, additions, config_additions, warnings, args.write and bool(changes or additions or config_additions))
|
||||
return 0
|
||||
|
||||
|
||||
@@ -4,20 +4,61 @@
|
||||
"versionTypes": [
|
||||
"release"
|
||||
],
|
||||
"variants": [
|
||||
"rails": [
|
||||
{
|
||||
"id": "1_20_1",
|
||||
"minVersion": "1.20",
|
||||
"matchVersion": "1.20.1"
|
||||
},
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"matchVersion": "1.20.4"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"matchVersion": "1.21.1"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"matchVersion": "1.21.3"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"matchVersion": "1.21.4"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"matchVersion": "1.21.5"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"matchVersion": "1.21.11"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2"
|
||||
"minVersion": "26.1.2",
|
||||
"matchVersion": "26.1.2"
|
||||
},
|
||||
{
|
||||
"id": "26_2",
|
||||
"minVersion": "26.2"
|
||||
"minVersion": "26.2",
|
||||
"matchVersion": "26.2"
|
||||
}
|
||||
],
|
||||
"autoDiscoverVariants": {
|
||||
"baseExcludedGameVersionPatterns": [
|
||||
"^26\\."
|
||||
],
|
||||
"autoDiscoverRails": {
|
||||
"enabled": true,
|
||||
"gameVersionPattern": "^26\\.[0-9]+(\\.[0-9]+)?$",
|
||||
"minimumProjects": 3
|
||||
"minimumProjects": 3,
|
||||
"minimumVersion": "26.1.2"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,36 @@
|
||||
"description": "The Super Cute Texture Pack lets you create a cheerful world full of the cutest and cuddliest mobs! Bouncing bunnies, ultra-adorable unicorns, brilliant bumblebees and, er, burgers? Yes, burgers! Even the squid will make you Squeee! This pack adds super cute textures for blocks, items, entities, and UI.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/ohS9Jkb7/versions/nrtOJiLM/Super%20Cute%20Texture%20Pack.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/ohS9Jkb7/versions/IAZjuEQF/Super%20Cute%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/ohS9Jkb7/versions/IAZjuEQF/Super%20Cute%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/ohS9Jkb7/versions/IAZjuEQF/Super%20Cute%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/ohS9Jkb7/versions/IAZjuEQF/Super%20Cute%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/ohS9Jkb7/versions/IAZjuEQF/Super%20Cute%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/ohS9Jkb7/versions/IAZjuEQF/Super%20Cute%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -26,6 +56,36 @@
|
||||
"description": "Free your inner architect and shape the world around you.This pack adds a creative texture set, ideal for building structures. Includes unique textures for blocks, items, entities, and UI.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/IcRlkcNt/versions/I1UhD6DR/City%20Texture%20Pack.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/IcRlkcNt/versions/nPKe1P1i/City%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/IcRlkcNt/versions/nPKe1P1i/City%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/IcRlkcNt/versions/nPKe1P1i/City%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/IcRlkcNt/versions/nPKe1P1i/City%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/IcRlkcNt/versions/nPKe1P1i/City%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/IcRlkcNt/versions/nPKe1P1i/City%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -46,6 +106,36 @@
|
||||
"description": "Make your worlds simple, colorful and vibrant! This brightly colored and simple pack adds plastic-themed textures for blocks, items, and entities, along with a completely transformed UI.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/meEXwbr9/versions/zT0YGbvp/Plastic%20Texture%20Pack.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/meEXwbr9/versions/UHhFQk6m/Plastic%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/meEXwbr9/versions/UHhFQk6m/Plastic%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/meEXwbr9/versions/UHhFQk6m/Plastic%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/meEXwbr9/versions/UHhFQk6m/Plastic%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/meEXwbr9/versions/UHhFQk6m/Plastic%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/meEXwbr9/versions/UHhFQk6m/Plastic%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -66,6 +156,36 @@
|
||||
"description": "Give your worlds a more natural look. A texture pack based on soft colors and lines.This pack includes detailed textures for blocks, items, entities, and UI that give a refined feel without straying too far from the vanilla game.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/wl6YG9AY/versions/oR14vI1u/Natural%20Texture%20Pack.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/wl6YG9AY/versions/4NJA1Hi8/Natural%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/wl6YG9AY/versions/4NJA1Hi8/Natural%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/wl6YG9AY/versions/4NJA1Hi8/Natural%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/wl6YG9AY/versions/4NJA1Hi8/Natural%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/wl6YG9AY/versions/4NJA1Hi8/Natural%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/wl6YG9AY/versions/4NJA1Hi8/Natural%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -86,6 +206,36 @@
|
||||
"description": "Transport yourselves to a time where knights were heroes. This pack adds a medieval, fantasy look for blocks, items, entities, and UI.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kFbEIMmd/versions/kVfBtnvh/Fantasy%20Texture%20Pack.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kFbEIMmd/versions/z6ctmmBE/Fantasy%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kFbEIMmd/versions/z6ctmmBE/Fantasy%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kFbEIMmd/versions/z6ctmmBE/Fantasy%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kFbEIMmd/versions/z6ctmmBE/Fantasy%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kFbEIMmd/versions/z6ctmmBE/Fantasy%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/kFbEIMmd/versions/z6ctmmBE/Fantasy%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -106,6 +256,36 @@
|
||||
"description": "Indulge your sweet tooth with this sugar-coated texture pack! This sweet pack adds tantalizing textures for blocks, items, entities, and UI",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/NGIRqFgR/versions/R2Sp0xlI/Candy%20Texture%20Pack.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/NGIRqFgR/versions/bxHfHkig/Candy%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/NGIRqFgR/versions/bxHfHkig/Candy%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/NGIRqFgR/versions/bxHfHkig/Candy%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/NGIRqFgR/versions/bxHfHkig/Candy%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/NGIRqFgR/versions/bxHfHkig/Candy%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/NGIRqFgR/versions/bxHfHkig/Candy%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -126,6 +306,36 @@
|
||||
"description": "Googly eyes! Goofy grins! Turn your world into a toon with this pack. This pack adds themed textures for blocks, items, entities, and UI.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/I8Wm3eT9/versions/3jwtSKEQ/Cartoon%20Texture%20Pack.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/I8Wm3eT9/versions/KHKFUGdZ/Cartoon%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/I8Wm3eT9/versions/KHKFUGdZ/Cartoon%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/I8Wm3eT9/versions/KHKFUGdZ/Cartoon%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/I8Wm3eT9/versions/KHKFUGdZ/Cartoon%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/I8Wm3eT9/versions/KHKFUGdZ/Cartoon%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/I8Wm3eT9/versions/KHKFUGdZ/Cartoon%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -146,6 +356,36 @@
|
||||
"description": "Create your own Industrial Revolution with this Victorian inspired Steampunk texture pack! This pack adds steampunk-themed textures for blocks, items, entities, and UI.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/iWaY0S0z/versions/aIVZEkA1/Steampunk%20Texture%20Pack.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/iWaY0S0z/versions/krfgutvs/Steampunk%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/iWaY0S0z/versions/krfgutvs/Steampunk%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/iWaY0S0z/versions/krfgutvs/Steampunk%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/iWaY0S0z/versions/krfgutvs/Steampunk%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/iWaY0S0z/versions/krfgutvs/Steampunk%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/iWaY0S0z/versions/krfgutvs/Steampunk%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
@@ -166,6 +406,36 @@
|
||||
"description": "Decorate your world with this bright and colorful texture pack filled with beautiful patterns and knitted animals! This pack adds themed textures for blocks, items, entities, and UI.",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/2F04lb0o/versions/nTsNQYft/Pattern%20Texture%20Pack.zip",
|
||||
"downloadVariants": [
|
||||
{
|
||||
"id": "1_20_4",
|
||||
"minVersion": "1.20.3",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/2F04lb0o/versions/DH4NyLyx/Pattern%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_1",
|
||||
"minVersion": "1.21",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/2F04lb0o/versions/DH4NyLyx/Pattern%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_3",
|
||||
"minVersion": "1.21.2",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/2F04lb0o/versions/DH4NyLyx/Pattern%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_4",
|
||||
"minVersion": "1.21.4",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/2F04lb0o/versions/DH4NyLyx/Pattern%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_5",
|
||||
"minVersion": "1.21.5",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/2F04lb0o/versions/DH4NyLyx/Pattern%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "1_21_11",
|
||||
"minVersion": "1.21.11",
|
||||
"downloadURI": "https://cdn.modrinth.com/data/2F04lb0o/versions/DH4NyLyx/Pattern%20Texture%20Pack.zip"
|
||||
},
|
||||
{
|
||||
"id": "26_1_2",
|
||||
"minVersion": "26.1.2",
|
||||
|
||||
Reference in New Issue
Block a user