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
+13 -5
View File
@@ -73,7 +73,7 @@ func _test_m2client_surface() -> void:
return
var c: Object = ClassDB.instantiate("M2Client")
get_root().add_child(c)
for m in ["move", "character_position", "sync_positions", "request_warp", "fishing", "request_dungeon", "attack", "set_target", "say", "shoot", "add_fly_targeting", "change_name", "select_empire", "download_guild_symbol", "get_guild_symbol", "script_select_item", "quest_cancel", "party_use_skill", "get_skill_group", "get_entity", "get_entities",
for m in ["move", "character_position", "sync_positions", "request_warp", "fishing", "request_dungeon", "attack", "set_target", "say", "shoot", "fly_targeting", "add_fly_targeting", "change_name", "select_empire", "download_guild_symbol", "get_guild_symbol", "script_select_item", "quest_cancel", "party_use_skill", "get_skill_group", "get_entity", "get_entities",
"get_main_vid", "get_main_pid", "get_points", "get_target", "select_character", "enter_game", "reconnect", "send_emoticon",
"suspend", "resume", "move_item", "use_item", "drop_item", "drop_item_count", "use_item_to_item", "give_item", "pickup_item",
"get_inventory", "get_equipment", "get_belt_inventory", "get_view_equipment", "get_item", "get_ground_items", "get_pvp_relations", "get_duel", "get_lover", "get_land_areas", "get_observers", "is_observer_mode", "get_observer_count", "has_mobile_flag", "combo_skill_enabled", "get_stamina_state", "whisper",
@@ -90,7 +90,7 @@ func _test_m2client_surface() -> void:
_ck(c.has_method(m), "M2Client.%s bound" % m)
for s in ["entity_spawned", "entity_despawned", "entity_moved", "entity_main_set", "empire_changed",
"chat", "emoticon_requested", "suspended", "resumed", "vitals_changed", "entity_dead", "damage",
"motion", "points_changed", "target_info", "inventory_changed",
"motion", "point_changed", "points_changed", "target_info", "inventory_changed",
"ground_item_added", "ground_item_removed", "item_picked_up", "item_used", "whisper_received",
"entity_info", "warp", "time_changed", "channel_changed", "npc_marks_changed",
"land_areas_changed", "observer_event", "observer_mode_changed", "observer_count_changed", "stone_detected", "stamina_changed", "mobile_flag_changed", "mobile_auth_required", "combo_changed", "world_markers_changed", "mount_changed", "pvp_changed", "duel_changed", "duel_started", "view_equipment", "lover_changed",
@@ -98,7 +98,7 @@ func _test_m2client_surface() -> void:
"party_changed", "party_invite_ask", "party_request_denied", "friends_changed", "friend_invite_ask", "shop_opened", "shop_closed", "shop_error",
"exchange_changed", "safebox_changed", "safebox_password_required", "safebox_wrong_password", "mall_opened", "mall_changed", "mall_password_required", "private_shop_open_requested", "my_shop_price_list", "block_mode_changed", "gift_available", "cube_opened", "cube_closed", "cube_changed", "cube_result",
"guild_changed", "guild_skill_changed", "guild_war_changed", "guild_comments_changed", "guild_invite_ask", "guild_war_event", "guild_war_point",
"guild_marks_ready", "guild_mark_uploaded", "guild_mark_updated", "refine_ask", "refine_result", "ds_window_open", "ds_refine_result"]:
"guild_marks_ready", "guild_mark_uploaded", "guild_mark_updated", "refine_ask", "refine_result", "ds_window_open", "ds_refine_result", "weather_changed"]:
_ck(c.has_signal(s), "M2Client.%s signal" % s)
# not in game -> intents refused, snapshot empty
_ck(c.call("move", 1, 0, 90.0, 1000, 2000) == false, "move refused pre-game")
@@ -108,6 +108,7 @@ func _test_m2client_surface() -> void:
_ck(c.call("fishing", 90.0) == false, "fishing refused pre-game")
_ck(c.call("request_dungeon") == false, "request_dungeon refused pre-game")
_ck(c.call("shoot", 1) == false, "shoot refused pre-game")
_ck(c.call("fly_targeting", 1, 10, 20) == false, "fly_targeting refused pre-game")
_ck(c.call("script_select_item", 1) == false, "script_select_item refused pre-game")
_ck(c.call("quest_cancel") == false, "quest_cancel refused pre-game")
_ck(c.call("party_use_skill", 1, 1) == false, "party_use_skill refused pre-game")
@@ -120,7 +121,7 @@ func _test_m2client_surface() -> void:
_ck(c.call("get_target").is_empty(), "no target pre-game")
_ck(c.call("get_inventory").is_empty(), "no inventory pre-game")
_ck(c.call("move_item", 1, 0, 2, 1, 1) == false, "move_item refused pre-game")
c.queue_free()
c.free()
_test_proto()
func _test_proto() -> void:
@@ -167,9 +168,12 @@ func _test_netbridge() -> void:
_ck(int(nw.node_for(2000).get_meta("fly_target_vid", 0)) == 1000,
"fly_targeting -> shooter target metadata")
var projectile_children := mount.get_child_count()
var projectiles_before: int = nw._fly_mgr.active_count()
fc.fly_cue.emit(1, 2000, 0) # coordinate/queued target fallback
_ck(mount.get_child_count() == projectile_children + 1,
_ck(nw._fly_mgr.active_count() == projectiles_before + 1,
"create_fly -> consumes queued target when end VID is absent")
_ck(mount.get_child_count() > projectile_children,
"create_fly -> resource visual/tail is mounted")
fc.fishing_event.emit(0, 2000, 18)
await process_frame
_ck(int(nw.node_for(2000).get_meta("fishing_subheader", -1)) == 0
@@ -257,3 +261,7 @@ func _test_netbridge() -> void:
await process_frame
await process_frame
_ck(removed[0] == 1 and nw.node_for(2000) == null, "despawn frees node")
nw.clear_for_map_change()
nw.free()
fc.free()
mount.free()