From 75aa525cb872b414fdcba2581a5e9f1a00eeb283 Mon Sep 17 00:00:00 2001 From: aibrash Date: Tue, 27 Oct 2026 16:33:44 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B7=D0=B0=D0=B3?= =?UTF-8?q?=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20=D0=BA=D0=B0=D1=80=D1=82=D1=8B?= =?UTF-8?q?=20=D0=B2=20=D0=B2=D0=B5=D0=B1=D0=B5:=20gzip=20=D0=B8=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BF=D0=B8=D1=81=D1=8C=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit HTTPRequest в браузере пытался второй раз распаковать уже распакованный gzip (код 8), а download_file в вебе не создаёт файл. Теперь accept_gzip=false, тело берём в память и пишем в user:// сами; в сообщении об ошибке показываем причину. Co-Authored-By: Claude Sonnet 5.5 --- World/map_loader.gd | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/World/map_loader.gd b/World/map_loader.gd index a732067..5917d86 100644 --- a/World/map_loader.gd +++ b/World/map_loader.gd @@ -34,35 +34,59 @@ func _download_and_mount(pack_name: String, title: String) -> bool: var http := HTTPRequest.new() http.process_mode = Node.PROCESS_MODE_ALWAYS - http.download_file = "user://" + pack_name + # Если сервер сжимает пакет gzip, браузер распаковывает его сам; вторая распаковка в движке ломает загрузку + http.accept_gzip = false add_child(http) - var state := {"done": false, "result": -1, "code": 0} - http.request_completed.connect(func(result: int, code: int, _h, _b): + # Тело берём в память и пишем в user:// сами: в вебе download_file файл не создаёт + var state := {"done": false, "result": -1, "code": 0, "body": PackedByteArray()} + http.request_completed.connect(func(result: int, code: int, _h, body: PackedByteArray): state.result = result state.code = code + state.body = body state.done = true) var ok := false + var detail := "запрос не отправлен" # no-cache: браузер сверяет файл с сервером (после обновления пакета не подсунет старый из кэша) if http.request(_pack_url(pack_name), ["Cache-Control: no-cache"]) == OK: while not state.done: _update_progress(http, title) await get_tree().process_frame if state.result == HTTPRequest.RESULT_SUCCESS and state.code == 200: - ok = ProjectSettings.load_resource_pack("user://" + pack_name, false) # false: файлы основной игры в приоритете + var path := "user://" + pack_name + var file := FileAccess.open(path, FileAccess.WRITE) + if file == null: + detail = "не удалось сохранить пакет, код %d" % FileAccess.get_open_error() + else: + file.store_buffer(state.body) + file.close() + state.body = PackedByteArray() # Освобождаем память: пакет уже на диске + ok = ProjectSettings.load_resource_pack(path, false) # false: файлы основной игры в приоритете + detail = "пакет скачан, но не подключился (%s)" % _describe_file(path) + else: + detail = "HTTP %d, код загрузки %d" % [state.code, state.result] http.queue_free() if ok: _loaded[pack_name] = true _hide() else: - _label.text = "Не удалось загрузить карту" + printerr("MapLoader: не удалось загрузить %s: %s" % [pack_name, detail]) + _label.text = "Не удалось загрузить карту\n%s" % detail _bar.visible = false await get_tree().create_timer(2.5).timeout _hide() get_tree().paused = false return ok +# Для сообщения об ошибке: размер и первые байты скачанного файла +func _describe_file(path: String) -> String: + var f := FileAccess.open(path, FileAccess.READ) + if f == null: + return "файл не открывается, код %d" % FileAccess.get_open_error() + var head := f.get_buffer(4) + return "%d байт, начало %s" % [f.get_length(), head.hex_encode()] + func _pack_url(pack_name: String) -> String: for arg in OS.get_cmdline_user_args(): if arg.begins_with(PACK_URL_ARG):