diff --git a/launch.bat b/launch.bat new file mode 100644 index 0000000..20c464f --- /dev/null +++ b/launch.bat @@ -0,0 +1,8 @@ +@echo off +title P7MC Launcher +cd /d "%~dp0" +echo [*] Checking for missing libraries... +pip install minecraft-launcher-lib --quiet +echo [*] Starting P7MC Launcher... +python p7mc.py +pause \ No newline at end of file diff --git a/p7mc.py b/p7mc.py new file mode 100644 index 0000000..4b6014a --- /dev/null +++ b/p7mc.py @@ -0,0 +1,109 @@ +import minecraft_launcher_lib +import subprocess +import os + +# --- PROGRESS BAR CALLBACKS --- +current_max = 0 + +def set_status(status: str): + if status: print(f"{status}") + +def set_progress(progress: int): + if current_max != 0: + percentage = int((progress / current_max) * 100) + print(f"- Progress: [{percentage}%] {progress}/{current_max} files", end="\r") + +def set_max(new_max: int): + global current_max + current_max = new_max + +def list_local_versions(dir): + print("\nExisting Versions") + if not os.path.exists(dir): + print("[None]") + return + local = minecraft_launcher_lib.utils.get_installed_versions(dir) + if not local: + print("[None]") + else: + for v in local: + print(f" - {v['id']}") + +# --- FIXED DIRECTORY LOGIC --- +# This forces the folder to be in your 'P7MC' folder on the Desktop +script_dir = os.path.dirname(os.path.abspath(__file__)) +minecraft_directory = os.path.join(script_dir, "minecraft") + +# Create the folder immediately so you can see it in VSCode +os.makedirs(minecraft_directory, exist_ok=True) + +while True: + try: + print("\n" + "=" * 40) + print("P7MC - P7MJ's MC Launcher") + print(f"Path: {minecraft_directory}") # Debug line to show you the location + print("=" * 40) + choice = input("[1] Launch\n[2] Install\n[f] Open Folder\n[h] Help (For common errors)\n[e] Exit\n > ").strip().lower() + + if choice == "e": + break + + # Opens the folder in File Explorer for you + if choice == "f": + os.startfile(minecraft_directory) + continue + + # --- INSTALLATION FLOW --- + if choice == "2": + list_local_versions(minecraft_directory) + print("Type a version, or \"latest\" for the latest release.") + version = input("Version > ").strip() + + if version.lower() == "latest": + version = minecraft_launcher_lib.utils.get_latest_version()["release"] + + callback = {"setStatus": set_status, "setProgress": set_progress, "setMax": set_max} + print(f"[*] Downloading and installing {version}...") + minecraft_launcher_lib.install.install_minecraft_version(version, minecraft_directory, callback=callback) + print("\nInstall complete!") + + # --- LAUNCH FLOW --- + elif choice == "1": + list_local_versions(minecraft_directory) + version = input("Version > ").strip() + + # GET THE LOCAL VERSIONS LIST + local_versions = minecraft_launcher_lib.utils.get_installed_versions(minecraft_directory) + # CHECK IF THE TYPED VERSION IS IN THAT LIST + is_installed = any(v['id'] == version for v in local_versions) + + if not is_installed: + print(f"[!] Error: {version} not found in local folder. Please install it first.") + continue + + username = input("Username > ").strip() + + options = { + "username": username, + "uuid": "00000000-0000-0000-0000-000000000000", + "token": "offline", + } + + print(f"Launching {version}...") + minecraft_command = minecraft_launcher_lib.command.get_minecraft_command(version, minecraft_directory, options) + subprocess.run(minecraft_command) + print("\nGame closed.") + + elif choice == "h": + print("\nHELP") + print("1. To delete versions, open the folder and manually delete it.") + print("2. Use the open folder function to find your installs.") + print("3. If in any case the download terminates prematurely, just install the same version again! It will automatically check what files are already there, do an integrity check, and finish it for you.") + + else: + print("Invalid choice. Please type \"1\", \"2\", \"f\", \"h\", or \"e\".") + + except Exception as e: + print(f"\n[!] Error: {e}") + +print("Launcher closed.") \ No newline at end of file