From 65ef35f1b422d15ff9d7d3553afe08d8d946adc9 Mon Sep 17 00:00:00 2001 From: Duck <31627079+duckboycool@users.noreply.github.com> Date: Tue, 27 Jan 2026 14:48:50 -0700 Subject: [PATCH] Core: Give clearer error message for invalid .apworld zip (#5871) * Update messages and check * Make "official" error message show up for 3.14 * Add zip error handling * Small cleanups --- worlds/__init__.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/worlds/__init__.py b/worlds/__init__.py index 4c6054e5a9..dd2d83a27e 100644 --- a/worlds/__init__.py +++ b/worlds/__init__.py @@ -1,7 +1,6 @@ import importlib import importlib.abc import importlib.machinery -import importlib.util import logging import os import sys @@ -12,9 +11,10 @@ import json from pathlib import Path from types import ModuleType from typing import List, Sequence +from zipfile import BadZipFile from NetUtils import DataPackage -from Utils import local_path, user_path, Version, version_tuple, tuplize_version +from Utils import local_path, user_path, Version, version_tuple, tuplize_version, messagebox local_folder = os.path.dirname(__file__) user_folder = user_path("worlds") if user_path() != local_path() else user_path("custom_worlds") @@ -23,14 +23,14 @@ try: except OSError: # can't access/write? user_folder = None -__all__ = { +__all__ = [ "network_data_package", "AutoWorldRegister", "world_sources", "local_folder", "user_folder", "failed_world_loads", -} +] failed_world_loads: List[str] = [] @@ -145,6 +145,15 @@ if apworlds: logging.error(e) else: raise e + except BadZipFile as e: + err_message = (f"The world source {apworld_source.resolved_path} is not a valid zip. " + "It is likely either corrupted, or was packaged incorrectly.") + + if sys.stdout: + raise RuntimeError(err_message) from e + else: + messagebox("Couldn't load worlds", err_message, error=True) + sys.exit(1) if apworld.minimum_ap_version and apworld.minimum_ap_version > version_tuple: fail_world(apworld.game,