# weapon_trace_endpoint_parity_test —— 40250 CWeaponTrace::SetWeaponInstance/Update。 # # 参考端先按武器包围盒到骨骼原点的最大距离计算 m_fLength,Update 再沿 # 武器局部 Z 轴追加 m_fLength * __GetReachScale();不是取某个 AABB 角点 # 作为任意方向的刀尖。 extends SceneTree const WeaponTrace = preload("res://ui/weapon_trace.gd") var _fail := 0 func _ck(condition: bool, message: String) -> void: if not condition: _fail += 1 printerr("FAIL: " + message) func _init() -> void: call_deferred("_run") func _run() -> void: var host := Node3D.new() root.add_child(host) var weapon := MeshInstance3D.new() var box := BoxMesh.new() box.size = Vector3(0.2, 0.2, 1.6) weapon.mesh = box host.add_child(weapon) var trace: Node = WeaponTrace.new() host.add_child(trace) await process_frame _ck(trace.attach_to_weapon(weapon), "weapon geometry resolves") var expected := sqrt(0.1 * 0.1 + 0.1 * 0.1 + 0.8 * 0.8) _ck(is_zero_approx(float(trace._tip_local.x)), "reference trace endpoint stays on the local Z axis") _ck(is_zero_approx(float(trace._tip_local.y)), "reference trace endpoint does not use an arbitrary AABB corner direction") _ck(is_equal_approx(float(trace._tip_local.z), expected), "reference endpoint uses max bound distance as m_fLength") trace.set_reach_scale(1.5) var scaled_expected := expected * 1.5 _ck(is_equal_approx(float(trace._tip_local.z), scaled_expected), "__GetReachScale scales the local endpoint length") if _fail == 0: print("PASS: weapon_trace_endpoint_parity_test (bone-axis length + reach scale)") quit(0) else: printerr("%d check(s) failed" % _fail) quit(1)