diff --git a/instances/forge-1.20.1-survival/data/mods/Botania-1.20.1-454-FORGE.jar b/instances/forge-1.20.1-survival/data/mods/Botania-1.20.1-454-FORGE.jar new file mode 100644 index 0000000..2df5aca Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/Botania-1.20.1-454-FORGE.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/Clumps-forge-1.20.1-12.0.0.4.jar b/instances/forge-1.20.1-survival/data/mods/Clumps-forge-1.20.1-12.0.0.4.jar new file mode 100644 index 0000000..e6b20ad Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/Clumps-forge-1.20.1-12.0.0.4.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/DistantHorizons-2.1.2-a-1.20.1.jar b/instances/forge-1.20.1-survival/data/mods/DistantHorizons-2.1.2-a-1.20.1.jar new file mode 100644 index 0000000..fc2af0f Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/DistantHorizons-2.1.2-a-1.20.1.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/FarmersDelight-1.20.1-1.3.2.jar b/instances/forge-1.20.1-survival/data/mods/FarmersDelight-1.20.1-1.3.2.jar new file mode 100644 index 0000000..e42f331 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/FarmersDelight-1.20.1-1.3.2.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/ImmersiveEngineering-1.20.1-10.2.0-183.jar b/instances/forge-1.20.1-survival/data/mods/ImmersiveEngineering-1.20.1-10.2.0-183.jar new file mode 100644 index 0000000..9ee3f66 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/ImmersiveEngineering-1.20.1-10.2.0-183.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/Jade-1.20.1-Forge-11.13.3.jar b/instances/forge-1.20.1-survival/data/mods/Jade-1.20.1-Forge-11.13.3.jar new file mode 100644 index 0000000..9aaa94e Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/Jade-1.20.1-Forge-11.13.3.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/Krypton Reno-forge-1.20.1-26.1.1-1.20.1.jar b/instances/forge-1.20.1-survival/data/mods/Krypton Reno-forge-1.20.1-26.1.1-1.20.1.jar new file mode 100644 index 0000000..6101c52 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/Krypton Reno-forge-1.20.1-26.1.1-1.20.1.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/LuckPerms-Forge-5.4.102.jar b/instances/forge-1.20.1-survival/data/mods/LuckPerms-Forge-5.4.102.jar new file mode 100644 index 0000000..cab6893 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/LuckPerms-Forge-5.4.102.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/Nullscape_1.20.x_v1.2.8.jar b/instances/forge-1.20.1-survival/data/mods/Nullscape_1.20.x_v1.2.8.jar new file mode 100644 index 0000000..22fb2c2 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/Nullscape_1.20.x_v1.2.8.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/Patchouli-1.20.1-85-FORGE.jar b/instances/forge-1.20.1-survival/data/mods/Patchouli-1.20.1-85-FORGE.jar new file mode 100644 index 0000000..4a3cb15 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/Patchouli-1.20.1-85-FORGE.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/SimpleBackups-1.20.1-3.1.24.jar b/instances/forge-1.20.1-survival/data/mods/SimpleBackups-1.20.1-3.1.24.jar new file mode 100644 index 0000000..1b0c957 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/SimpleBackups-1.20.1-3.1.24.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/Terralith_1.20.x_v2.5.4.jar b/instances/forge-1.20.1-survival/data/mods/Terralith_1.20.x_v2.5.4.jar new file mode 100644 index 0000000..818a379 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/Terralith_1.20.x_v2.5.4.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/YungsApi-1.20-Forge-4.0.6.jar b/instances/forge-1.20.1-survival/data/mods/YungsApi-1.20-Forge-4.0.6.jar new file mode 100644 index 0000000..89eb9c1 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/YungsApi-1.20-Forge-4.0.6.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/YungsBetterDungeons-1.20-Forge-4.0.4.jar b/instances/forge-1.20.1-survival/data/mods/YungsBetterDungeons-1.20-Forge-4.0.4.jar new file mode 100644 index 0000000..eed722d Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/YungsBetterDungeons-1.20-Forge-4.0.4.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/YungsBetterMineshafts-1.20-Forge-4.0.4.jar b/instances/forge-1.20.1-survival/data/mods/YungsBetterMineshafts-1.20-Forge-4.0.4.jar new file mode 100644 index 0000000..4944292 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/YungsBetterMineshafts-1.20-Forge-4.0.4.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/YungsBetterStrongholds-1.20-Forge-4.0.3.jar b/instances/forge-1.20.1-survival/data/mods/YungsBetterStrongholds-1.20-Forge-4.0.3.jar new file mode 100644 index 0000000..cb93b96 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/YungsBetterStrongholds-1.20-Forge-4.0.3.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/[forge]ctov-3.4.14.jar b/instances/forge-1.20.1-survival/data/mods/[forge]ctov-3.4.14.jar new file mode 100644 index 0000000..6b8cae2 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/[forge]ctov-3.4.14.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/ad_astra-forge-1.20.1-1.15.20.jar b/instances/forge-1.20.1-survival/data/mods/ad_astra-forge-1.20.1-1.15.20.jar new file mode 100644 index 0000000..abbfea1 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/ad_astra-forge-1.20.1-1.15.20.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/ad_astra_extra_additions-1.20.1-1.1.1.jar b/instances/forge-1.20.1-survival/data/mods/ad_astra_extra_additions-1.20.1-1.1.1.jar new file mode 100644 index 0000000..cca1f74 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/ad_astra_extra_additions-1.20.1-1.1.1.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/ad_astra_more_structures-1.0.1-forge.jar b/instances/forge-1.20.1-survival/data/mods/ad_astra_more_structures-1.0.1-forge.jar new file mode 100644 index 0000000..e5a96ff Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/ad_astra_more_structures-1.0.1-forge.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/alexsmobs-1.22.9.jar b/instances/forge-1.20.1-survival/data/mods/alexsmobs-1.22.9.jar new file mode 100644 index 0000000..9fae911 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/alexsmobs-1.22.9.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/architectury-9.2.14-forge.jar b/instances/forge-1.20.1-survival/data/mods/architectury-9.2.14-forge.jar new file mode 100644 index 0000000..0ace96e Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/architectury-9.2.14-forge.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/bettercombat-forge-1.9.0+1.20.1.jar b/instances/forge-1.20.1-survival/data/mods/bettercombat-forge-1.9.0+1.20.1.jar new file mode 100644 index 0000000..71504f5 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/bettercombat-forge-1.9.0+1.20.1.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/botarium-forge-1.20.1-2.3.4.jar b/instances/forge-1.20.1-survival/data/mods/botarium-forge-1.20.1-2.3.4.jar new file mode 100644 index 0000000..5eb1f67 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/botarium-forge-1.20.1-2.3.4.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/citadel-2.6.3-1.20.1.jar b/instances/forge-1.20.1-survival/data/mods/citadel-2.6.3-1.20.1.jar new file mode 100644 index 0000000..6f245f2 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/citadel-2.6.3-1.20.1.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/cloth-config-11.1.136-forge.jar b/instances/forge-1.20.1-survival/data/mods/cloth-config-11.1.136-forge.jar new file mode 100644 index 0000000..0545ad2 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/cloth-config-11.1.136-forge.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/connectivity-1.20.1-7.6.jar b/instances/forge-1.20.1-survival/data/mods/connectivity-1.20.1-7.6.jar new file mode 100644 index 0000000..ab3d1f2 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/connectivity-1.20.1-7.6.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/corpse-forge-1.20.1-1.0.23.jar b/instances/forge-1.20.1-survival/data/mods/corpse-forge-1.20.1-1.0.23.jar new file mode 100644 index 0000000..1213e5f Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/corpse-forge-1.20.1-1.0.23.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/create-1.20.1-6.0.8.jar b/instances/forge-1.20.1-survival/data/mods/create-1.20.1-6.0.8.jar new file mode 100644 index 0000000..d91d16e Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/create-1.20.1-6.0.8.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/create_ad_astra_recipes-1.0.0-forge-1.20.1.jar b/instances/forge-1.20.1-survival/data/mods/create_ad_astra_recipes-1.0.0-forge-1.20.1.jar new file mode 100644 index 0000000..e7747f3 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/create_ad_astra_recipes-1.0.0-forge-1.20.1.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/createaddition-1.20.1-1.3.3.jar b/instances/forge-1.20.1-survival/data/mods/createaddition-1.20.1-1.3.3.jar new file mode 100644 index 0000000..9269202 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/createaddition-1.20.1-1.3.3.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/cupboard-1.20.1-3.7.jar b/instances/forge-1.20.1-survival/data/mods/cupboard-1.20.1-3.7.jar new file mode 100644 index 0000000..83d1fb7 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/cupboard-1.20.1-3.7.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/curios-forge-5.14.1+1.20.1.jar b/instances/forge-1.20.1-survival/data/mods/curios-forge-5.14.1+1.20.1.jar new file mode 100644 index 0000000..b899247 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/curios-forge-5.14.1+1.20.1.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/decocraft-3.0.4-1.20.1-slim.jar b/instances/forge-1.20.1-survival/data/mods/decocraft-3.0.4-1.20.1-slim.jar new file mode 100644 index 0000000..9fb55a0 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/decocraft-3.0.4-1.20.1-slim.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/ferritecore-6.0.1-forge.jar b/instances/forge-1.20.1-survival/data/mods/ferritecore-6.0.1-forge.jar new file mode 100644 index 0000000..824f8cb Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/ferritecore-6.0.1-forge.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/flan-1.20.1-1.11.16-forge.jar b/instances/forge-1.20.1-survival/data/mods/flan-1.20.1-1.11.16-forge.jar new file mode 100644 index 0000000..9668021 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/flan-1.20.1-1.11.16-forge.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/geckolib-forge-1.20.1-4.8.4.jar b/instances/forge-1.20.1-survival/data/mods/geckolib-forge-1.20.1-4.8.4.jar new file mode 100644 index 0000000..c0a190f Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/geckolib-forge-1.20.1-4.8.4.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/improvedmobs-1.20.1-1.13.7-forge.jar b/instances/forge-1.20.1-survival/data/mods/improvedmobs-1.20.1-1.13.7-forge.jar new file mode 100644 index 0000000..dacc6bf Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/improvedmobs-1.20.1-1.13.7-forge.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/irons_lib-1.20.1-2.1.0.jar b/instances/forge-1.20.1-survival/data/mods/irons_lib-1.20.1-2.1.0.jar new file mode 100644 index 0000000..42dab9d Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/irons_lib-1.20.1-2.1.0.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/irons_spellbooks-1.20.1-3.16.2.jar b/instances/forge-1.20.1-survival/data/mods/irons_spellbooks-1.20.1-3.16.2.jar new file mode 100644 index 0000000..bb17a83 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/irons_spellbooks-1.20.1-3.16.2.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/jei-1.20.1-forge-15.48.0.180.jar b/instances/forge-1.20.1-survival/data/mods/jei-1.20.1-forge-15.48.0.180.jar new file mode 100644 index 0000000..5f0126c Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/jei-1.20.1-forge-15.48.0.180.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/journeymap-forge-1.20.1-6.0.0.jar b/instances/forge-1.20.1-survival/data/mods/journeymap-forge-1.20.1-6.0.0.jar new file mode 100644 index 0000000..223d6af Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/journeymap-forge-1.20.1-6.0.0.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/lithostitched-forge-1.20.1-1.4.11.jar b/instances/forge-1.20.1-survival/data/mods/lithostitched-forge-1.20.1-1.4.11.jar new file mode 100644 index 0000000..710c33d Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/lithostitched-forge-1.20.1-1.4.11.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/locks_reforged-1.6.1.jar b/instances/forge-1.20.1-survival/data/mods/locks_reforged-1.6.1.jar new file mode 100644 index 0000000..b761765 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/locks_reforged-1.6.1.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/lts_auth-1.0.1+mc1.20.1.jar b/instances/forge-1.20.1-survival/data/mods/lts_auth-1.0.1+mc1.20.1.jar new file mode 100644 index 0000000..22fc180 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/lts_auth-1.0.1+mc1.20.1.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/majrusz-library-forge-1.20.1-7.0.8.jar b/instances/forge-1.20.1-survival/data/mods/majrusz-library-forge-1.20.1-7.0.8.jar new file mode 100644 index 0000000..18911c5 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/majrusz-library-forge-1.20.1-7.0.8.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/majruszs-difficulty-forge-1.20.1-1.9.10.jar b/instances/forge-1.20.1-survival/data/mods/majruszs-difficulty-forge-1.20.1-1.9.10.jar new file mode 100644 index 0000000..336e966 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/majruszs-difficulty-forge-1.20.1-1.9.10.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/mcda-5.0.2.jar b/instances/forge-1.20.1-survival/data/mods/mcda-5.0.2.jar new file mode 100644 index 0000000..a0bb320 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/mcda-5.0.2.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/mcdw-9.0.4.jar b/instances/forge-1.20.1-survival/data/mods/mcdw-9.0.4.jar new file mode 100644 index 0000000..a6c2fae Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/mcdw-9.0.4.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/minecraft-comes-alive-7.6.28-beta.10+1.20.1-universal.jar b/instances/forge-1.20.1-survival/data/mods/minecraft-comes-alive-7.6.28-beta.10+1.20.1-universal.jar new file mode 100644 index 0000000..a064350 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/minecraft-comes-alive-7.6.28-beta.10+1.20.1-universal.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/modernfix-forge-5.27.66+mc1.20.1.jar b/instances/forge-1.20.1-survival/data/mods/modernfix-forge-5.27.66+mc1.20.1.jar new file mode 100644 index 0000000..d44047c Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/modernfix-forge-5.27.66+mc1.20.1.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/perspatium-1.20.1-1.2.0.jar b/instances/forge-1.20.1-survival/data/mods/perspatium-1.20.1-1.2.0.jar new file mode 100644 index 0000000..0bcf2b9 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/perspatium-1.20.1-1.2.0.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/planets+-bv1.7.5-1.20x.jar b/instances/forge-1.20.1-survival/data/mods/planets+-bv1.7.5-1.20x.jar new file mode 100644 index 0000000..96c4550 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/planets+-bv1.7.5-1.20x.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/player-animation-lib-forge-1.0.2-rc1+1.20.jar b/instances/forge-1.20.1-survival/data/mods/player-animation-lib-forge-1.0.2-rc1+1.20.jar new file mode 100644 index 0000000..7f4f129 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/player-animation-lib-forge-1.0.2-rc1+1.20.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/resourcefulconfig-forge-1.20.1-2.1.3.jar b/instances/forge-1.20.1-survival/data/mods/resourcefulconfig-forge-1.20.1-2.1.3.jar new file mode 100644 index 0000000..7ba79a6 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/resourcefulconfig-forge-1.20.1-2.1.3.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/resourcefullib-forge-1.20.1-2.1.29.jar b/instances/forge-1.20.1-survival/data/mods/resourcefullib-forge-1.20.1-2.1.29.jar new file mode 100644 index 0000000..cc5d878 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/resourcefullib-forge-1.20.1-2.1.29.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/sophisticatedbackpacks-1.20.1-3.24.63.2049.jar b/instances/forge-1.20.1-survival/data/mods/sophisticatedbackpacks-1.20.1-3.24.63.2049.jar new file mode 100644 index 0000000..58f94a9 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/sophisticatedbackpacks-1.20.1-3.24.63.2049.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/sophisticatedcore-1.20.1-1.3.75.2231.jar b/instances/forge-1.20.1-survival/data/mods/sophisticatedcore-1.20.1-1.3.75.2231.jar new file mode 100644 index 0000000..e7f0868 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/sophisticatedcore-1.20.1-1.3.75.2231.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/spark-1.10.53-forge.jar b/instances/forge-1.20.1-survival/data/mods/spark-1.10.53-forge.jar new file mode 100644 index 0000000..0a40c99 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/spark-1.10.53-forge.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/tectonic-3.0.17-forge-1.20.1.jar b/instances/forge-1.20.1-survival/data/mods/tectonic-3.0.17-forge-1.20.1.jar new file mode 100644 index 0000000..b4d4c1b Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/tectonic-3.0.17-forge-1.20.1.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/tenshilib-1.20.1-1.7.6-forge.jar b/instances/forge-1.20.1-survival/data/mods/tenshilib-1.20.1-1.7.6-forge.jar new file mode 100644 index 0000000..4f25db8 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/tenshilib-1.20.1-1.7.6-forge.jar differ diff --git a/instances/forge-1.20.1-survival/data/mods/voicechat-forge-1.20.1-2.6.22.jar b/instances/forge-1.20.1-survival/data/mods/voicechat-forge-1.20.1-2.6.22.jar new file mode 100644 index 0000000..953c076 Binary files /dev/null and b/instances/forge-1.20.1-survival/data/mods/voicechat-forge-1.20.1-2.6.22.jar differ diff --git a/instances/forge-1.20.1-survival/download_mods.py b/instances/forge-1.20.1-survival/download_mods.py new file mode 100755 index 0000000..dbe3342 --- /dev/null +++ b/instances/forge-1.20.1-survival/download_mods.py @@ -0,0 +1,231 @@ +#!/usr/bin/env python3 +import json +import os +import re +import urllib.parse +import urllib.request +from concurrent.futures import ThreadPoolExecutor, as_completed + +# Configuration +TARGET_DIR = "./data/mods" +MC_VERSION = "1.20.1" +LOADER = "forge" +MAX_WORKERS = 8 +USER_AGENT = "MCServerModDownloader/2.0 (admin@server.local)" + +# Explicit Slug Overrides for Modrinth + +SLUG_OVERRIDES = { + "perspatium": "ad-astra-per-spatium-et-tempus", + "planets+": "ad-astra-planets", + "ad_astra_more_structures": "ad-astra-more-structures", + "alexsmobs": "alexs-mobs", + "architectury": "architectury-api", + "cloth-config": "cloth-config", + "create_ad_astra_recipes": "create-ad-astra-recipes", + "ferritecore": "ferrite-core", + "flan": "flan", + "improvedmobs": "improved-mobs", + "jei": "jei", + "patchouli": "patchouli", + "player-animation-lib": "playeranimator", + "resourcefulconfig": "resourceful-config", + "resourcefullib": "resourceful-lib", + "simplebackups": "simple-backups", + "sophisticatedcore": "sophisticated-core", + "tectonic": "tectonic", + "spark": "spark", + "tenshilib": "tenshilib", + "voicechat": "simple-voice-chat", + "yungsapi": "yungs-api", + "yungsbetterdungeons": "yungs-better-dungeons", + "yungsbettermineshafts": "yungs-better-mineshafts", + "yungsbetterstrongholds": "yungs-better-strongholds", +} + +SERVER_MODS = [ + "[forge]ctov-3.4.14.jar", + "ad_astra-forge-1.20.1-1.15.20.jar", + "ad_astra_extra_additions-1.20.1-1.1.1.jar", + "ad_astra_more_structures-1.0.1-forge.jar", + "alexsmobs-1.22.9.jar", + "architectury-9.2.14-forge.jar", + "bettercombat-forge-1.9.0+1.20.1.jar", + "Botania-1.20.1-454-FORGE.jar", + "botarium-forge-1.20.1-2.3.4.jar", + "citadel-2.6.3-1.20.1.jar", + "cloth-config-11.1.136-forge.jar", + "Clumps-forge-1.20.1-12.0.0.4.jar", + "connectivity-1.20.1-7.6.jar", + "corpse-forge-1.20.1-1.0.23.jar", + "create-1.20.1-6.0.8.jar", + "create_ad_astra_recipes-1.0.0-forge-1.20.1.jar", + "createaddition-1.20.1-1.3.3.jar", + "cupboard-1.20.1-3.7.jar", + "curios-forge-5.14.1+1.20.1.jar", + "decocraft-3.0.4-1.20.1-slim.jar", + "DistantHorizons-2.1.2-a-1.20.1.jar", + "FarmersDelight-1.20.1-1.3.2.jar", + "ferritecore-6.0.1-forge.jar", + "flan-1.20.1-1.11.16-forge.jar", + "geckolib-forge-1.20.1-4.8.4.jar", + "ImmersiveEngineering-1.20.1-10.2.0-183.jar", + "improvedmobs-1.20.1-1.13.7-forge.jar", + "irons_lib-1.20.1-2.1.0.jar", + "irons_spellbooks-1.20.1-3.16.2.jar", + "Jade-1.20.1-Forge-11.13.3.jar", + "jei-1.20.1-forge-15.48.0.180.jar", + "journeymap-forge-1.20.1-6.0.0.jar", + "Krypton Reno-forge-1.20.1-26.1.1-1.20.1.jar", + "lithostitched-forge-1.20.1-1.4.11.jar", + "locks_reforged-1.6.1.jar", + "lts_auth-1.0.1+mc1.20.1.jar", + "LuckPerms-Forge-5.4.102.jar", + "majrusz-library-forge-1.20.1-7.0.8.jar", + "majruszs-difficulty-forge-1.20.1-1.9.10.jar", + "mcda-5.0.2.jar", + "mcdw-9.0.4.jar", + "minecraft-comes-alive-7.6.28-beta.10+1.20.1-universal.jar", + "modernfix-forge-5.27.66+mc1.20.1.jar", + "Nullscape_1.20.x_v1.2.8.jar", + "Patchouli-1.20.1-85-FORGE.jar", + "perspatium-1.20.1-1.2.0.jar", + "planets+-bv1.7.5-1.20x.jar", + "player-animation-lib-forge-1.0.2-rc1+1.20.jar", + "resourcefulconfig-forge-1.20.1-2.1.3.jar", + "resourcefullib-forge-1.20.1-2.1.29.jar", + "SimpleBackups-1.20.1-3.1.24.jar", + "sophisticatedbackpacks-1.20.1-3.24.63.2049.jar", + "sophisticatedcore-1.20.1-1.3.75.2231.jar", + "spark-1.10.53-forge.jar", + "tectonic-3.0.17-forge-1.20.1.jar", + "tenshilib-1.20.1-1.7.6-forge.jar", + "Terralith_1.20.x_v2.5.4.jar", + "voicechat-forge-1.20.1-2.6.22.jar", + "YungsApi-1.20-Forge-4.0.6.jar", + "YungsBetterDungeons-1.20-Forge-4.0.4.jar", + "YungsBetterMineshafts-1.20-Forge-4.0.4.jar", + "YungsBetterStrongholds-1.20-Forge-4.0.3.jar", +] + +def clean_mod_name(filename): + """Strip prefixed metadata and digits to extract purely the mod identifier.""" + name = re.sub(r"^\[.*?\]", "", filename) + name = re.sub(r"\.jar$", "", name) + + # Split tokens by hyphen/underscore and keep tokens before version digits + tokens = re.split(r"[-_]", name) + clean_tokens = [] + for token in tokens: + if re.match(r"^(v?\d|bv?\d|forge|fabric|quilt|mc1|1\.20|universal|slim)", token, re.I): + break + clean_tokens.append(token) + + result = "-".join(clean_tokens).strip("-") + return result if result else name + +def http_get_json(url): + req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT}) + with urllib.request.urlopen(req, timeout=10) as resp: + return json.loads(resp.read().decode("utf-8")) + +def download_file(url, target_path): + req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT}) + with urllib.request.urlopen(req, timeout=30) as resp, open(target_path, "wb") as f: + f.write(resp.read()) + +def process_mod(jar_name): + target_path = os.path.join(TARGET_DIR, jar_name) + + if os.path.exists(target_path): + return ("EXISTS", jar_name, "File already in destination") + + raw_clean = clean_mod_name(jar_name) + slug = SLUG_OVERRIDES.get(raw_clean.lower(), raw_clean.lower()) + + project_id = None + + # Step 1: Try direct project lookup by slug + try: + proj_data = http_get_json(f"https://api.modrinth.com/v2/project/{slug}") + if proj_data and "id" in proj_data: + project_id = proj_data["id"] + except Exception: + pass + + # Step 2: Fallback search if direct slug lookup fails + if not project_id: + try: + search_q = slug.replace("-", " ") + facets = json.dumps([["categories:" + LOADER], ["versions:" + MC_VERSION]]) + query_url = f"https://api.modrinth.com/v2/search?query={urllib.parse.quote(search_q)}&facets={urllib.parse.quote(facets)}" + data = http_get_json(query_url) + hits = data.get("hits", []) + if hits: + project_id = hits[0]["project_id"] + except Exception: + pass + + if not project_id: + return ("NOT_FOUND", jar_name, f"Could not resolve Modrinth project for '{slug}'") + + # Step 3: Fetch versions and download + try: + ver_url = f"https://api.modrinth.com/v2/project/{project_id}/version?loaders=[%22{LOADER}%22]&game_versions=[%22{MC_VERSION}%22]" + versions = http_get_json(ver_url) + + if not versions: + return ("NOT_FOUND", jar_name, f"No {LOADER} {MC_VERSION} release on Modrinth") + + download_url = None + for ver in versions: + for f in ver.get("files", []): + if f.get("filename") == jar_name: + download_url = f.get("url") + break + if download_url: + break + + if not download_url and versions[0].get("files"): + download_url = versions[0]["files"][0].get("url") + + if download_url: + download_file(download_url, target_path) + return ("SUCCESS", jar_name, "Downloaded from Modrinth") + else: + return ("NOT_FOUND", jar_name, "No download URL available") + + except Exception as e: + return ("ERROR", jar_name, str(e)) + +def main(): + os.makedirs(TARGET_DIR, exist_ok=True) + print(f"šŸš€ Starting download for {len(SERVER_MODS)} mods into '{TARGET_DIR}'...") + print(f"āš™ļø Target: Minecraft {MC_VERSION} ({LOADER.upper()}) | Workers: {MAX_WORKERS}\n") + + results = {"SUCCESS": [], "EXISTS": [], "NOT_FOUND": [], "ERROR": []} + + with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: + futures = {executor.submit(process_mod, mod): mod for mod in SERVER_MODS} + for future in as_completed(futures): + status, jar_name, msg = future.result() + results[status].append((jar_name, msg)) + + symbol = "āœ…" if status == "SUCCESS" else "ā­ļø" if status == "EXISTS" else "āŒ" + print(f"{symbol} [{status}] {jar_name} -> {msg}") + + print("\n" + "=" * 60) + print("šŸ“Š DOWNLOAD SUMMARY") + print("=" * 60) + print(f" āœ… Downloaded: {len(results['SUCCESS'])}") + print(f" ā­ļø Skipped: {len(results['EXISTS'])}") + print(f" āŒ Not Found: {len(results['NOT_FOUND']) + len(results['ERROR'])}") + + missing = results['NOT_FOUND'] + results['ERROR'] + if missing: + print("\nāš ļø The following mods were not found automatically:") + for jar_name, msg in missing: + print(f" • {jar_name} ({msg})") + +if __name__ == "__main__": + main()