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
+39 -1
View File
@@ -35,6 +35,8 @@ const SILENT_CODES := [
"", "OK", "PASSIVE", "BAD_SLOT", "NO_SKILL_DATA", "GUILD_ROUTED",
"TOGGLE_OFF", "SPECIAL_SKILL", "PRIVATE_SHOP", "RESERVED", "NO_RIDING_SKILL",
"CANNOT_ACT", "ALREADY_CASTING",
"POLYMORPHED", "WEARING_DRESS", "HOLDING_PICKAXE",
"HORSE_CANNOT_USE", "GRAPHIC_CANNOT_USE",
]
var client: Object # M2Client
@@ -47,6 +49,12 @@ var in_safe := false # CInstanceBase::IsInSafe()
var is_fishing := false # CInstanceBase::IsFishingMode()
var is_using_skill := false # CInstanceBase::IsUsingSkill()
var can_act := true # CanProcessNetworkStatePacket(死亡/晕眩/击退 → false
var polymorphed := false # CInstanceBase::IsPoly()
var wearing_dress := false # CInstanceBase::IsWearingDress() shape 201
var holding_pickaxe := false # CInstanceBase::IsHoldingPickAxe() weapon 29101..29110
var horse_can_use := true # CInstanceBase::SHORSE::CanUseSkill()
var graphic_can_use := true # CGraphicThingInstance::CanUseSkill()
var guild_war_active := false # CPythonGuild::IsDoingGuildWar()
var private_shop_open := false # IsOpenPrivateShop()
var level_limit := true # m_sysIsLevelLimit
var cooltime_check := true # m_sysIsCoolTime
@@ -254,7 +262,21 @@ func can_use_skill() -> Dictionary:
and _skill_level(RIDING_SKILL_INDEX) < RIDING_SKILL_MASTER_LEVEL:
return _no("NO_RIDING_SKILL")
# return pkInstMain->CanUseSkill(); —— 死亡 / 晕眩 / 击退 / 施法中
# CInstanceBase::CanUseSkill():这些是动作/模型层的硬门,发生在
# __CheckSkillUsable(安全区、武器、箭矢、HP/SP、冷却)之前。
if polymorphed:
return _no("POLYMORPHED")
if wearing_dress:
return _no("WEARING_DRESS")
if holding_pickaxe:
return _no("HOLDING_PICKAXE")
if not horse_can_use:
return _no("HORSE_CANNOT_USE")
if not graphic_can_use:
return _no("GRAPHIC_CANNOT_USE")
# m_GraphicThingInstance::CanUseSkill() 之外的本地网络状态门——死亡 /
# 晕眩 / 击退 / 施法中。
if not can_act:
return _no("CANNOT_ACT")
@@ -386,6 +408,22 @@ func use_skill(skill_id: int, is_active := false) -> Dictionary:
return _resolve_target(skill_id)
# CPythonPlayer::UseGuildSkill —— 公会技走独立的 CG_GUILD_USE_SKILL 入口,不经过
# 普通目标解析;但仍受主角动作门、槽位、冷却和 ONLY_FOR_GUILD_WAR 限制。
func use_guild_skill(skill_id: int) -> Dictionary:
var b := can_use_skill()
if not b.ok:
return b
if skill_id < 0 or skill_id >= SKILL_MAX_NUM:
return _no("BAD_SLOT")
if table == null or not table.has(skill_id):
return _no("NO_SKILL_DATA")
if _check_rest_skill_cooltime():
return _no("WAIT_COOLTIME")
if table.is_only_for_guild_war(skill_id) and not guild_war_active:
return _no("ONLY_FOR_GUILD_WAR")
return {"ok": true, "code": "OK", "target_vid": 0, "guild": true}
# __UseSkill 里的目标分支(PythonPlayerSkill.cpp:520-650)。
# 判目标「类型」是否合法并回传解析到的 vid;射程外回 RESERVED(带 range_cm / charge),
# 由调用方 __ReserveUseSkill。扇形·圆形多目标 SendAddFlyTargetingPacket 归 §3.4/§3.9。