是否是队长 · 判断子程序(2026-09-28) 依据:队员基址 0x03BF7E18(62881304),队长标志 +864(0x360)取自 队员偏移全表_0927 定稿 / 队长标志_0927。 注:你工程里已有等价版本 `自己是队长`(在 队长自动组队_0928.txt),本份是其规范修正版,可直接替换。 ══════════════════════════════════════════ 一、判定原理 ══════════════════════════════════════════ 队员表 8 个槽,每个槽 4 字节,指向一条"其他队员"记录(不含自己)。 · 槽值 = 队员对象指针;指针 ≤ 65536 视为空槽 · 队员对象 +816(0x330)= 有效标志:1=真实队员 / 0=空槽预分配 · 队员对象 +864(0x360)= 队长标志:1=队长 判定:遍历 8 槽,若发现【有效队员 且 队长标志=1】→ 说明队里有别人是队长 → 自己不是 → 返回 假。 遍历完没有任何"有效且是队长"的槽 → 自己就是队长 → 返回 真。 注意语义:单人(8 槽全空/全无效)也返回 真,即"单人即队长"。 这是热血江湖的设定——队伍里总得有个队长,没人时自然就是你自己。 (所以"是否是队长"=真 不能等同于"我在带一支队伍",想区分要配合 是否已组队,见第四节。) ══════════════════════════════════════════ 二、依赖常量(你工程里已有,不必重复加) ══════════════════════════════════════════ .常量 队员基址, "62881304" ' 0x03BF7E18,队员表基址(0927定稿 / 0928仍有效) .常量 队员有效标志, "816" ' +0x330,1=真实队员 .常量 队长标志值, "864" ' +0x360,1=队长 ══════════════════════════════════════════ 三、核心子程序 ══════════════════════════════════════════ .版本 2 .子程序 是否是队长, 逻辑型, , 遍历队员表,任一有效队员带队长标志=1→别人是队长→假;否则自己即队长→真(含单人) .局部变量 队员对象, 整数型 .局部变量 i, 整数型 .如果真 (全局_进程句柄 ≤ 0) 返回 (假) .如果真结束 .计次循环首 (8, i) 队员对象 = 内存_读整数型 (全局_进程句柄, #队员基址 + 4 × (i - 1)) .如果真 (队员对象 ≤ 65536) 到循环尾 () .如果真结束 .如果真 (内存_读整数型 (全局_进程句柄, 队员对象 + #队员有效标志) = 1 且 内存_读整数型 (全局_进程句柄, 队员对象 + #队长标志值) = 1) 返回 (假) .如果真结束 .计次循环尾 () 返回 (真) ══════════════════════════════════════════ 四、辅助:区分"单人"与"真队长" ══════════════════════════════════════════ ' 是否是队长 在单人时也返回真。若你要的是"我确实在带一支队伍",用下面这个: ' 真队长 = 已组队 且 是队长(排除单人状态) .版本 2 .子程序 真队长, 逻辑型, , 已组队 且 是队长;单人状态不计入 .如果真 (是否已组队 () = 假) 返回 (假) .如果真结束 返回 (是否是队长 ()) ══════════════════════════════════════════ 五、与你现有 自己是队长 的关系 ══════════════════════════════════════════ 你 队长自动组队_0928.txt 里的 自己是队长 逻辑等价(找到有效+队长标志的槽即返回假)。 本版两处改进,建议整体替换: ① 空槽阈值 0 → 65536:原版用 队员对象 ≤ 0 判空槽,低位野指针(1~65536)会漏判; 本版 ≤ 65536 与 是否已组队 统一,更稳。 ② 守卫改 全局_进程句柄 ≤ 0:原版额外读 #人物基址值 做守卫, 本版去掉对人物基址的依赖,与 是否已组队 的守卫方式一致,未连接进程直接返回假。 名字上 自己是队长 / 是否是队长 等价,选一个用即可,别两个都留以免混淆。 ══════════════════════════════════════════ 六、用法示例 ══════════════════════════════════════════ ' 用法一:接进队长自动组队调度(你原版逻辑,名字换一下) .如果 (是否是队长 ()) .如果真 (取列表名单文本 () = “”) 返回 () .如果真结束 .如果真 (自动组队.选中 = 假) 自动组队.选中 = 真 接受组队.选中 = 假 写日志 (自定义时间 () + “自己是队长,自动开启自动组队” + #换行符) .如果真结束 .否则 .如果真 (自动组队.选中 = 真) 自动组队.选中 = 假 自动组队停止 = 真 写日志 (自定义时间 () + “自己已不是队长,关闭自动组队” + #换行符) .如果真结束 .如果结束 ' 用法二:队长掉线后重开招人 ' 队长掉线→整队解散→8槽清空→自己即队长(单人也算)→下面判定成立→开自动组队再招 .如果 (是否是队长 () 且 是否已组队 () = 假) 自动组队.选中 = 真 写日志 (自定义时间 () + “检测到单人/掉线后,自动重新开队招人” + #换行符) .如果结束 ' 用法三:只想处理"真在带队的队长"(排除刚掉线单人瞬间) .如果 (真队长 ()) ' 正常带队逻辑 .如果结束 ══════════════════════════════════════════ 七、注意事项 ══════════════════════════════════════════ ⚠ 1. CE 桥位数坑:0x03BF7E18 在 64 位 CE 下 readInteger 返回 nil,必须挂在 32 位 CE (D:\登录源码数据存储账号\CE+调试V7.6\csrss.exe)上读,否则 是否是队长 永远返回真(读不到槽=全空=判为自己是队长)。 ⚠ 2. 基址平移风险:#队员基址 属"绝对地址"类,EXE 大版本更新可能平移。判定异常时跑 是否已组队_0928.txt 里的 队员表体检 确认。 ⚠ 3. 单人即队长的语义坑:用法二里"自己即队长(单人)"正是"掉线后重开招人"想要的; 但若你只想在"真带人"时做事,务必用 真队长() 这个带 是否已组队 前置的版本。