# skybox_test —— 40250 ClientVS22 texture-mode SkyBox -> Godot sky shader。 # 验证真实 texture-mode SkyBox:CapeDragonHead 的五个非空面回退渐变, # DawnMistWood 的六面天空与云层同时接入并保留参考 UV / 速度参数。 extends SceneTree var _fail := 0 func _ck(ok: bool, message: String) -> void: if not ok: _fail += 1 printerr("FAIL: " + message) func _make_world(map_path: String) -> Node: var world: Node = ClassDB.instantiate("Metin2World") world.set("auto_load", false) world.set("assets_root", AssetRoot.path()) world.set("map_path", map_path) world.set("focus_tile", Vector2i(0, 0)) world.set("load_radius_tiles", 0) world.set("objects_enabled", false) world.set("splat_enabled", false) world.set("water_enabled", false) get_root().add_child(world) return world func _init() -> void: if not ClassDB.class_exists("Metin2World"): printerr("FAIL: Metin2World extension is not registered") quit(1) return var world := _make_world("metin2_patch_dragon_rock/metin2_map_capedragonhead") _ck(bool(world.call("load_map")), "CapeDragonHead map loads") var report: Dictionary = world.call("get_load_report") _ck(bool(report.get("env_ok", false)), "texture-mode .msenv env_ok") var env_node := world.get_node_or_null("WorldEnv") as WorldEnvironment _ck(env_node != null and env_node.environment != null, "WorldEnv has Environment") if env_node != null: _ck(int(env_node.get_meta("msenv_sky_face_count", 0)) == 5, "five non-empty SkyBox faces resolve") _ck(bool(env_node.get_meta("msenv_sky_texture_mode_applied", false)), "texture render mode uses six-face shader") var sky := env_node.environment.sky _ck(sky != null, "WorldEnv has sky") if sky != null: var mat := sky.get_material() as ShaderMaterial _ck(mat != null, "texture-mode sky uses ShaderMaterial") if mat != null: _ck(mat.shader != null and mat.shader.code.find("shader_type sky;") >= 0, "six-face sky shader is installed") _ck(bool(mat.get_shader_parameter("has_front")), "front face is present") _ck(bool(mat.get_shader_parameter("has_back")), "back face is present") _ck(bool(mat.get_shader_parameter("has_left")), "left face is present") _ck(bool(mat.get_shader_parameter("has_right")), "right face is present") _ck(bool(mat.get_shader_parameter("has_top")), "top face is present") _ck(not bool(mat.get_shader_parameter("has_bottom")), "empty bottom face falls back to gradient") world.queue_free() await process_frame var cloud_world := _make_world("metin2_patch_dragon_rock/metin2_map_dawnmistwood") _ck(bool(cloud_world.call("load_map")), "DawnMistWood map loads") var cloud_report: Dictionary = cloud_world.call("get_load_report") _ck(bool(cloud_report.get("env_ok", false)), "texture-mode + cloud .msenv env_ok") var cloud_env := cloud_world.get_node_or_null("WorldEnv") as WorldEnvironment _ck(cloud_env != null and cloud_env.environment != null, "cloud WorldEnv has Environment") if cloud_env != null: _ck(int(cloud_env.get_meta("msenv_sky_face_count", 0)) == 5, "cloud map five non-empty SkyBox faces resolve") _ck(bool(cloud_env.get_meta("msenv_sky_texture_mode_applied", false)), "texture render mode remains active when CloudTexture exists") _ck(bool(cloud_env.get_meta("msenv_sky_cloud_applied", false)), "cloud texture is attached to texture-mode sky shader") var cloud_sky := cloud_env.environment.sky var cloud_mat := cloud_sky.get_material() as ShaderMaterial if cloud_sky != null else null _ck(cloud_mat != null, "cloud map uses ShaderMaterial") if cloud_mat != null: _ck(bool(cloud_mat.get_shader_parameter("has_cloud")), "sky shader enables cloud plane") _ck(cloud_mat.shader != null and cloud_mat.shader.code.find("TIME * cloud_speed") >= 0, "cloud shader preserves reference UV scroll") if cloud_mat != null: var scale := cloud_mat.get_shader_parameter("cloud_scale") as Vector2 _ck(scale != null and is_equal_approx(scale.x, 2000.0) and is_equal_approx(scale.y, 2000.0), "cloud scale converts reference centimetres to Godot metres") var speed := cloud_mat.get_shader_parameter("cloud_speed") as Vector2 _ck(speed != null and is_equal_approx(speed.x, 0.001) and is_equal_approx(speed.y, 0.001), "cloud speed preserves reference seconds parameter") cloud_world.queue_free() await process_frame if _fail == 0: print("PASS: skybox_test (.msenv six-face texture sky)") quit(0) else: printerr("%d check(s) failed" % _fail) quit(1)