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
+24
View File
@@ -292,6 +292,12 @@ private:
m_warp_seen = true;
GCWarp w{GC_WARP, sizeof(GCWarp), 4321, 8765, 0, 0};
send_raw(&w, sizeof(w));
GCCharacterAdd stale_tail{};
stale_tail.header = GC_CHARACTER_ADD;
stale_tail.length = sizeof(stale_tail);
stale_tail.vid = 9902;
stale_tail.race = 101;
send_raw(&stale_tail, sizeof(stale_tail));
break;
}
case CG_FISHING: {
@@ -714,11 +720,27 @@ int main() {
CHECK(auth.done(), "auth reached a result");
CHECK(auth.handshaked(), "auth: cipher activated");
CHECK(auth.sent_login(), "auth: CG_LOGIN3 sent at PHASE_AUTH");
CHECK(auth.login_secret_cleared(), "auth: password cleared after CG_LOGIN3");
CHECK(auth.success(), "auth: GC_AUTH_SUCCESS");
CHECK(auth.login_key() == 0x0BADF00D, "auth: login_key");
login_key = auth.login_key();
}
// A pending auth connection must leave Connecting on the reference
// deadline instead of waiting forever for a phase packet.
{
AuthClient pending("admin", "123456789");
if (pending.connect("192.0.2.1", 9, 0) &&
pending.state() == NetStream::State::Connecting) {
pending.process();
CHECK(pending.state() == NetStream::State::Offline,
"pending auth connect times out before Online");
CHECK(pending.last_error() == "connect timeout", "pending auth connect reports timeout");
} else {
std::puts("auth connect timeout probe skipped (connect was synchronous)");
}
}
// --- game server: connect -> KX -> CG_LOGIN2 -> char list -> select -> GAME ---
{
MockServer srv(MockServer::Mode::Game);
@@ -841,6 +863,8 @@ int main() {
auto warps = game.world().drain_warps();
CHECK(!warps.empty() && warps.back().x == 4321 && warps.back().y == 8765,
"game: GC_WARP destination surfaced");
CHECK(game.world().get(9902) == nullptr,
"game: GC_WARP drops pipelined old-socket tail");
}
CHECK(game.send_fishing(36), "game: CG_FISHING sent");
run(srv, game, 200, [] { return false; });