装备校验链/快捷栏/公会/好友情侣/交易仓库五项差距修复(增量 129)

- 装备校验:can_equip 按 CanEquipNow→FindEquipCell→EquipItem 精确重排,
  新增 find_equip_cell() 1:1 复刻(RING/UNIQUE 占用翻转、COSTUME/BELT/DS),
  帝国 antiflag 降级为 tooltip 提示,LIMIT_PCBANG/REAL_TIME* 语义与倒计时文案
- 快捷栏:死亡全槽禁用+激活守卫、变身(affect 220)技能置灰、
  物品槽失配置灰(服务器回收/换武器后刷新)
- 公会:GUILD_AUTH_* 权限位门控踢人/公告/技能升级,/gskillup、
  被宣战应答弹窗(/war·/nowar)、资金存取行(40250 服务端已禁用仍保留 1:1)
- 好友/情侣:messenger 三固定组(好友/公会/情侣),lover_login/logout/
  near/far/divorce 命令事件→在线/在身边状态与离婚隐藏
- 交易/仓库:ExchangeState.last_notice(ALREADY/LESS_GOLD)结束浮层提示;
  仓库改密 /safebox_change_password 三段输入;关窗补 /safebox_close·/mall_close;
  仓库金钱经核实 40250 无 wire 协议,UI 定界只读
- app_flow:重连时 guild_marks_ready 重复连接加 is_connected 守卫
- 相机 look_at 零向量守卫(首帧/传送落点)
- 测试:equip/love/guild 断言更新,79 项中 78 绿(game_camera_test 为
  HEAD 既有失败);真服冒烟 LIVE_SMOKE PASS(192.168.21.203 全链路)
- docs/CLIENT-GAP.md 同步增量 129

Co-Authored-By: Claude Code <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018kUFvQGYusuY3dkfGitmAe
This commit is contained in:
shenlei
2026-09-07 21:43:30 +09:00
co-authored by Claude Code
parent 61272b75e9
commit 8092ff44e2
25 changed files with 1067 additions and 134 deletions
+50 -1
View File
@@ -40,6 +40,15 @@ var _accept_pending := false
var _anchor := Vector2.ZERO
var _anchor_valid := false
# EXCHANGE_GC_ALREADY / LESS_GOLD 的线上的子头值(服务器 exchange.cpp)。
# GC_END 在成功与取消两种结局都会发,成败文案只走 CHAT_TYPE_INFO 聊天通道。
const NOTICE_ALREADY := 6
const NOTICE_LESS_GOLD := 7
var _was_active := false
var _notice_shown := false
var _end_note: Label
var _end_note_timer: Timer
func setup(m2client: Node, parent: Node, proto_node: Node = null) -> void:
client = m2client
proto = proto_node
@@ -123,6 +132,11 @@ func refresh() -> void:
return
var x: Dictionary = client.get_exchange()
if not x.get("active", false):
if _was_active:
# 窗口开着时服务器关掉了交易(成功或取消,二者同发 GC_END)。
_show_end_note(int(x.get("notice", 0)))
_was_active = false
_notice_shown = false
_root.visible = false
_next_display = 0
_offered_cells.clear()
@@ -131,6 +145,7 @@ func refresh() -> void:
_gold_input.text = ""
_status.text = ""
return
_was_active = true
_root.visible = true
_capture_anchor()
_render_self_grid(x.get("self_items", []))
@@ -147,9 +162,43 @@ func refresh() -> void:
_accept_btn.disabled = me
_accept_btn.modulate = Color(0.5, 1, 0.5) if me else Color(1, 1, 1)
_root.get_node("PeerAccept").text = "对方: 已接受" if peer else "对方: 未接受"
_status.text = ""
var notice := int(x.get("notice", 0))
if notice != 0 and not _notice_shown:
_notice_shown = true
_status.text = _notice_text(notice)
else:
_status.text = ""
_refresh_mobile_inventory()
func _notice_text(code: int) -> String:
match code:
NOTICE_ALREADY:
return "对方已经在交易中"
NOTICE_LESS_GOLD:
return "金币不足"
return ""
# 交易被服务器关闭时的一条短暂浮动提示(成败详情以 CHAT_TYPE_INFO 聊天为准)。
func _show_end_note(code: int) -> void:
if _root == null or _root.get_parent() == null:
return
if _end_note == null:
_end_note = Label.new()
_end_note.add_theme_font_size_override("font_size", 15)
_end_note.set_anchors_preset(Control.PRESET_CENTER_TOP)
_end_note.position = Vector2(-110, 130)
_end_note.size = Vector2(220, 24)
_end_note.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
_root.get_parent().add_child(_end_note)
_end_note_timer = Timer.new()
_end_note_timer.one_shot = true
_end_note_timer.timeout.connect(func(): if _end_note: _end_note.visible = false)
add_child(_end_note_timer)
var extra := _notice_text(code)
_end_note.text = ("交易结束(%s" % extra) if extra != "" else "交易结束,结果见聊天提示"
_end_note.visible = true
_end_note_timer.start(5.0)
func _apply_mobile_layout() -> void:
if _root == null:
return