是否已组队 · 判断子程序(2026-09-28) 依据:今天(0928)仍在用的队员基址 0x03BF7E18(62881304),偏移取自 队员偏移全表_0927 定稿。 ══════════════════════════════════════════ 一、判定原理 ══════════════════════════════════════════ 队员表 8 个槽,每个槽 4 字节,指向一条"其他队员"记录(不含自己)。 · 槽值 = 队员对象指针;指针 ≤ 65536 视为空槽 · 队员对象 +816(0x330)= 有效标志:1=真实队员 / 0=空槽预分配 · 队员对象 +864(0x360)= 队长标志:1=队长 · 队员对象 +824(0x338)= 名字(Big5,0 结尾) · 队员对象 +820(0x334)= 队员ID(2字节,&65535) 关键:表中只存"其他队员",不含自己。 → 有效数 ≥ 1 = 你身上有队友 = 已组队 → 有效数 = 0 = 孤身一人 = 未组队 (队伍总人数 = 有效数 + 1,因为算上自己) ══════════════════════════════════════════ 二、依赖常量(填进工程常量表;已存在不必重复加) ══════════════════════════════════════════ .常量 队员基址, "62881304" ' 0x03BF7E18,静态模块数据区(队员表基址,0927定稿 / 0928仍有效) .常量 队员有效标志, "816" ' +0x330,1=真实队员 .常量 队长标志值, "864" ' +0x360,1=队长 .常量 队员序号值, "820" ' +0x334,队员ID(2字节) .常量 队员名称值, "824" ' +0x338,Big5 名字 ══════════════════════════════════════════ 三、核心子程序 ══════════════════════════════════════════ .版本 2 .子程序 是否已组队, 逻辑型, , 队员表只存“其他队员”不含自己;任一有效队员即视为已组队 .局部变量 队员对象, 整数型 .局部变量 i, 整数型 .局部变量 有效数, 整数型 .如果真 (全局_进程句柄 ≤ 0) 返回 (假) .如果真结束 .计次循环首 (8, i) 队员对象 = 内存_读整数型 (全局_进程句柄, #队员基址 + 4 × (i - 1)) .如果真 (队员对象 ≤ 65536) 到循环尾 () .如果真结束 .如果真 (内存_读整数型 (全局_进程句柄, 队员对象 + #队员有效标志) = 1) 有效数 = 有效数 + 1 .如果真结束 .计次循环尾 () 写日志 (自定义时间 () + "有效数" + 到文本 (有效数) + #换行符) 返回 (有效数 ≥ 1) .版本 2 .子程序 取队伍人数, 整数型, , 含自己;未组队返回 0 .局部变量 队员对象, 整数型 .局部变量 i, 整数型 .局部变量 有效数, 整数型 .如果真 (全局_进程句柄 ≤ 0) 返回 (0) .如果真结束 .计次循环首 (8, i) 队员对象 = 内存_读整数型 (全局_进程句柄, #队员基址 + 4 × (i - 1)) .如果真 (队员对象 ≤ 65536) 到循环尾 () .如果真结束 .如果真 (内存_读整数型 (全局_进程句柄, 队员对象 + #队员有效标志) = 1) 有效数 = 有效数 + 1 .如果真结束 .计次循环尾 () .如果 (有效数 = 0) 返回 (0) .否则 返回 (有效数 + 1) .如果结束 ══════════════════════════════════════════ 四、队员基址体检(版本更新后防静默错位) ══════════════════════════════════════════ #队员基址 属"绝对地址"类,EXE 大更新可能平移(0928 报告已验证大量绝对地址失效)。 下面体检:只要任一有效槽能读出非空 Big5 名字,就说明基址仍准。 读全 0 或指针全 ≤65536 = 基址已失效,需重新定位。 .版本 2 .子程序 队员表体检, 逻辑型, , 返回真=队员基址仍有效;假=可能已平移需重定位 .局部变量 队员对象, 整数型 .局部变量 i, 整数型 .局部变量 名字, 文本型 .如果真 (全局_进程句柄 ≤ 0) 返回 (假) .如果真结束 .计次循环首 (8, i) 队员对象 = 内存_读整数型 (全局_进程句柄, #队员基址 + 4 × (i - 1)) .如果真 (队员对象 ≤ 65536) 到循环尾 () .如果真结束 .如果真 (内存_读整数型 (全局_进程句柄, 队员对象 + #队员有效标志) = 1) 名字 = 编码_BIG5到简体 (内存_读文本型 (全局_进程句柄, 队员对象 + #队员名称值)) .如果真 (名字 ≠ “”) 返回 (真) .如果真结束 .如果真结束 .计次循环尾 () 返回 (假) ══════════════════════════════════════════ 五、用法示例 ══════════════════════════════════════════ ' 用法一:接组队邀请前先判断,已组队就不再接(避免重复/队伍已满) .如果 (是否已组队 () = 假) 自动处理组队 () .否则 写日志 (自定义时间 () + “已在队伍中,忽略本次邀请” + #换行符) .如果结束 ' 用法二:挂在时钟/主循环里做状态机——不在队就尝试自动组队,在队且是队长就开自动组队 .如果 (是否已组队 () = 假) ' 未组队:去组队/喊人/接受邀请 .否则 .如果 (自己是队长 () = 真) 自动组队.选中 = 真 .如果结束 .如果结束 ' 用法三:开局体检一次,确认基址没被版本更新打废 .如果 (队员表体检 () = 假) 写日志 (“【警告】队员基址可能已平移,是否已组队 判定不可信” + #换行符) .如果结束 ══════════════════════════════════════════ 六、注意事项 ══════════════════════════════════════════ ⚠ 1. CE 桥位数坑:0x03BF7E18 在 64 位 CE 下 readInteger 会返回 nil,必须挂在 32 位 CE (D:\登录源码数据存储账号\CE+调试V7.6\csrss.exe)上读,否则 是否已组队 永远返回假。 ⚠ 2. 基址平移风险:#队员基址 是绝对地址,版本大改可能失效。判定异常时跑 队员表体检 确认。 ⚠ 3. 802 单人房:热血江湖队伍至少 2 人,所以"有效数=0 → 未组队"是成立的;不存在 1 人队的边界。 ⚠ 4. 与"自己名字"区分:本判断只看"其他队员"槽,不依赖自己的角色名,因此自己离线/未登录时 全局_进程句柄≤0 直接返回假,不会误判。