Merge 'multiversion work'

This commit is contained in:
creepereater201
2026-07-23 23:54:50 +01:00
parent d19433856b
commit 97c2763153
8 changed files with 1469 additions and 94 deletions

View File

@@ -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:

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View 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()

View File

@@ -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

View File

@@ -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"
}
}
}

View File

@@ -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",