import os import shutil import requests import zipfile from io import BytesIO from pathlib import Path # Minecraft installation folder. minecraft_dir = os.path.join(os.getenv('APPDATA'), ".minecraft") # Forge variables. default_forge_version = "1.12.2-forge-14.23.5.2859" forge_version = input(f"Enter Forge version (default: {default_forge_version}), leave empty to choose default: ") or default_forge_version forge_dir = os.path.join(minecraft_dir, f"versions/{forge_version}") forge_url = f"https://git.jisoonet.com/publicprojects/{forge_version}/-/archive/main/{forge_version}-main.zip" # Forge libraries variables. forge_libraries_version = forge_version.replace("forge-", "") forge_libraries_dir = os.path.join(minecraft_dir, f"libraries/net/minecraftforge/forge/{forge_libraries_version}") forge_libraries_url = f"https://git.jisoonet.com/publicprojects/{forge_libraries_version}/-/archive/main/{forge_libraries_version}-main.zip" # Backup folder for mods. mods_backup_dir = os.path.join(minecraft_dir, "mods_backup") # Modpack variables. default_modpack_name = "apocaz-modpack" modpack_name = input(f"Enter Modpack name (default: {default_modpack_name}), leave empty to choose default: ") or default_modpack_name modpack_dir = os.path.join(minecraft_dir, "mods") modpack_url = f"https://git.jisoonet.com/publicprojects/{modpack_name}/-/archive/main/{modpack_name}-main.zip" # Function to check for the prescence of Minecraft installation folder. def check_minecraft_installation(minecraft_dir): print("Checking for existing Minecraft installation...") if not Path(minecraft_dir).exists(): print("Error: Minecraft not found. Please install Minecraft first.") else: print("Minecraft is already installed.") # Installs forge files and places them in the correct version folder. def install_forge(forge_dir, forge_url): print("Checking for existing Forge installation...") if not Path(forge_dir).exists(): print("Forge not found, beginning installation...") os.makedirs(forge_dir) try: print("Downloading Forge...") response = requests.get(forge_url) if response.status_code == 200: with zipfile.ZipFile(BytesIO(response.content)) as z: print("Extracting Forge...") common_prefix = os.path.commonprefix(z.namelist()) for file_info in z.infolist(): target_path = os.path.join(forge_dir, file_info.filename[len(common_prefix):]) if file_info.filename.endswith('/'): os.makedirs(target_path, exist_ok=True) else: with z.open(file_info) as source, open(target_path, 'wb') as target: shutil.copyfileobj(source, target) print("Forge installed successfully.") else: print("Error downloading Forge. Please check the URL or your internet connection.") except Exception as e: print(f"An error occurred during Forge installation: {e}") else: print("Forge is already installed.") # Backups the mods from the mods folder to the backup folder. def backup_mods(modpack_dir, mods_backup_dir): print("Backing up existing mods...") if Path(modpack_dir).exists(): if not Path(mods_backup_dir).exists(): os.makedirs(mods_backup_dir) for item in os.listdir(modpack_dir): shutil.move(os.path.join(modpack_dir, item), mods_backup_dir) print(f"Existing mods backed up to {mods_backup_dir}") else: print("No mods directory found. No backup required.") # Entry point of the script. def main(): try: check_minecraft_installation(minecraft_dir) install_forge(forge_dir, forge_url) backup_mods(modpack_dir, mods_backup_dir) except KeyboardInterrupt: print("\033[91m\nSession ended by user.\033[0m") except Exception as e: print(f"\033[91m\nAn unexpected error occurred: {e}\033[0m") finally: input("\033[94mPress Enter to exit...\033[0m") if __name__ == "__main__": main()