fix: 装备属性面板避让逻辑 + 多项功能更新

- item_tooltip_view.gd: 新增 avoid_rect 属性,tooltip 与装备窗口重叠时自动推到左侧
- inventory_ui.gd: 悬停装备时传入窗口矩形作为避让区域
- 包含其他累积的功能开发和测试文件
This commit is contained in:
shen
2026-09-21 16:38:59 -07:00
parent 1522a8a1a1
commit c93894313a
5498 changed files with 4558004 additions and 1442 deletions
+54 -7
View File
@@ -1,8 +1,8 @@
# test_ground_pickup_parity.gd —— 40250 地面拾取与掉落物 1:1 纯净无头自检套件
# 验证:
# 1. 3.0m 拾取有效距离判定
# 2. 骑马状态下 5.0m 拾取距离拓展
# 3. 就近优先拾取 (按直线距离排序)
# 1. 40250 GetCloseItem 的 300cm 近似距离判定
# 2. GetCloseItem 同距时按最高 VID 取胜
# 3. 40250 SendClickItemPacket 的队伍成员 / anti-flag 所有权判定
# 4. 500ms 发包冷却节流 (s_dwNextTCPTime)
# 5. 所有权校验 (c_szOwnerName != GetName() 拦截 + cannot_pick_item 信号)
# 6. 稀有道具与高强装备垂直光柱 (Drop Light Beam)
@@ -18,6 +18,7 @@ class FakeClient extends Node:
var calls: Array = []
var main_vid := 1001
var char_name := "HeroPlayer"
var party: Array = []
func is_in_game() -> bool: return true
func get_main_vid() -> int: return main_vid
@@ -25,6 +26,7 @@ class FakeClient extends Node:
if vid == main_vid:
return {"name": char_name}
return {}
func get_party() -> Array: return party
func pickup_item(vid: int) -> bool:
calls.append(["pickup", vid])
return true
@@ -114,20 +116,21 @@ func _run() -> void:
# 清理已拾取的 vid 1
gi._on_removed(1)
# --- 3. 步行 3m 边界与骑马 5m 判定 ---
# --- 3. GetCloseItem 的固定 300cm 边界(包括骑马状态) ---
# 此时场上只剩 vid 3 (距离 4.5m)
gi._next_tcp_time_ms = 0
picked = gi.try_pickup()
_ck(picked == 0, "7. 步行时 4.5m 超出 3.0m 拾取半径")
_ck(fc.calls.is_empty(), "8. 未发包")
# 主角上马
# PythonPlayerInput 的 __GetPickableDistance 虽然骑马返回 500,
# 但 CPythonItem::GetCloseItem 实际硬编码 dwCloseItemDistance > 300。
player_node.set_meta("mounted", true)
_ck(gi.get_pickable_distance() == 5.0, "9. 骑马时拾取半径扩展为 5.0m")
gi._next_tcp_time_ms = 0
picked = gi.try_pickup()
_ck(picked == 3, "10. 骑马状态成功拾取 4.5m 外物品 (vid 3)")
_ck(fc.calls == [["pickup", 3]], "11. 发出 pickup_item(3)")
_ck(picked == 0, "10. 骑马时仍遵守 GetCloseItem 的 300cm 固定边界")
_ck(fc.calls.is_empty(), "11. 骑马超出 300cm 时不发 pickup_item")
fc.calls.clear()
gi._on_removed(3)
player_node.set_meta("mounted", false)
@@ -152,6 +155,50 @@ func _run() -> void:
gi._on_removed(4)
gi._on_removed(5)
# --- 4b. 40250 队伍成员所有权:无 DROP/GIVE anti-flag 时允许拾取 ---
fc.party = [{"name": "PartyMate"}]
gi._on_added({"vid": 9, "vnum": 10, "pos": Vector3(0.2, 0.0, 0.2), "owner": "PartyMate"})
gi._next_tcp_time_ms = 0
picked = gi.try_pickup()
_ck(picked == 9, "15a. 队伍成员且无 DROP/GIVE anti-flag 的物品允许拾取")
_ck(fc.calls == [["pickup", 9]], "15b. 队伍成员物品正常发包")
fc.calls.clear()
gi._on_removed(9)
# 队伍成员如果设置 DROP anti-flag,参考端仍然拒绝。
gi._on_added({"vid": 10, "vnum": 20, "pos": Vector3(0.2, 0.0, 0.2), "owner": "PartyMate", "anti_flags": 1 << 7})
gi._next_tcp_time_ms = 0
picked = gi.try_pickup()
_ck(picked == 0, "15c. 队伍成员带 DROP anti-flag 时拒绝拾取")
_ck(fc.calls.is_empty(), "15d. anti-flag 拦截时不发包")
gi._on_removed(10)
fc.party.clear()
# --- 4c. GetCloseItem:近似距离允许欧氏距离略超 3m 的对角点 ---
gi._on_added({"vid": 11, "vnum": 10, "pos": Vector3(2.19, 0.0, 2.19), "owner": "HeroPlayer"})
gi._next_tcp_time_ms = 0
picked = gi.try_pickup()
_ck(picked == 11, "15e. 40250 DISTANCE_APPROX <= 300cm 的对角物品可拾取")
fc.calls.clear()
gi._on_removed(11)
# --- 4d. GetCloseItem:相同近似距离时最终选择最高 VID ---
gi._on_added({"vid": 20, "vnum": 10, "pos": Vector3(1.0, 0.0, 0.0), "owner": "HeroPlayer"})
gi._on_added({"vid": 21, "vnum": 10, "pos": Vector3(-1.0, 0.0, 0.0), "owner": "HeroPlayer"})
gi._next_tcp_time_ms = 0
picked = gi.try_pickup()
_ck(picked == 21, "15f. 相同距离按最高 VID 选择")
fc.calls.clear()
gi._on_removed(20)
gi._on_removed(21)
# --- 4e. 点击拾取链路使用 __OnPressItem 的 150cm 阈值 ---
gi._on_added({"vid": 22, "vnum": 10, "pos": Vector3(2.0, 0.0, 0.0), "owner": "HeroPlayer"})
gi._next_tcp_time_ms = 0
_ck(not gi.try_pickup_vid(22), "15g. 直接点击入口超过 150cm 时不应直接发拾取包")
_ck(fc.calls.is_empty(), "15h. 点击超出 150cm 时不发包")
gi._on_removed(22)
# --- 5. 稀有掉落物光柱 (Drop Light Beam) ---
# 普通物品 (vnum 10 = Sword+0)
gi._on_added({"vid": 6, "vnum": 10, "pos": Vector3(1.0, 0.0, 1.0), "owner": ""})