日期:2026-10-06<br>主本:D:\AI空间\rxjh\旧版本更新.代码<br>编译源:D:\AI空间\rxjh\旧版本更新_修复后.e
界面上新增一个按钮 「一键队友入名单」:点一下,把当前队伍里除自己以外的所有队友,<br>一次性加入「组队名单」(已在名单里的先跳过,只写日志)。
| 文件 | 说明 |
|---|---|
旧版本更新_修复后.e | ✅ 就用这个编译(2,732,802 字节,含本次全部改动) |
旧版本更新.e | ❌ 过期副本,不含新按钮,编译它当然看不到 |
在易语言里打开的是哪个,标题栏/最近文件里能看出来。认准 _修复后。
原始工程的窗口数据里,补给_分组框_死亡处理 这个分组框的 Children 列表第一个元素是 379<br>—— 而当时整个窗口只有 379 个控件(下标 0~378),所以它是个指向不存在控件的空槽,<br>从原始 .e 就存在,一直无害。
上一轮把新按钮追加到控件数组末尾,下标恰好也是 379,这个空槽就「复活」了 ——<br>按钮被 分组框4(组队名单)和 补给_分组框_死亡处理 同时认领。<br>易语言只认一个,按钮被挂到了后者下面。而那个分组框只有 44px 高,<br>按钮的 Top=252 直接跑到框外 → 界面上完全看不到(控件确实写进了 .e,就是看不见)。
修复方式:删掉 补给_分组框_死亡处理 里那个无效的 379 引用,让按钮唯一归属 分组框4。<br>删掉的是个空槽,不会丢任何真实控件。
修复后已用「t2e 生成 → e2t 反查」双向确认:
分组框4 一个 ✅补给_分组框_死亡处理 的子控件:[82, 83, 84, 85, 183, 184](去掉了幽灵 379)✅分组框4,窗口坐标 220,368)Left=3, Top=252, Width=105, Height=32┌─ 组队名单 ─────────────────────┐
│ ┌────────────┐ │
│ │ 组队列表框1 │ [添加][刷新] │
│ └────────────┘ │
│ [一键队友入名单] [循环邀请按钮] │ ← 新增按钮在这
└────────────────────────────────┘
如果显示位置不满意,直接在易语言设计器里拖动即可(不影响功能)。
读队伍内存 8 个队员格
→ 逐格判断:对象指针有效?有效标志 = 1?
→ 读名字(BIG5 转简体)
→ 跳过空名字、跳过自己
→ 与「组队名单」逐项精确比较
已有 → 只写日志「名字已经在名单中存在」
没有 → 加入列表框 + 写日志「已加入组队名单」
→ 有新增才保存到 角色配置文件路径\组队名单.ini
→ 末尾写一行汇总:「新增 X 人,已存在 Y 人」
日志形如:
15:52:03 队友【张三】已加入组队名单
15:52:03 队友【李四】名字已经在名单中存在
15:52:03 一键队友入名单完成:新增 1 人,已存在 1 人
位置:代码/窗口程序集_MainDialogWnd.form.e.txt,插在 _组队名单添加_被单击 之前。
.子程序 _一键队友入名单_被单击
.局部变量 队员对象, 整数型
.局部变量 队员位置, 整数型
.局部变量 队员名称, 文本型
.局部变量 自己名字, 文本型
.局部变量 已有名单, 文本型
.局部变量 已有数组, 文本型, , "0"
.局部变量 n, 整数型
.局部变量 已存在, 逻辑型
.局部变量 新增数, 整数型
.局部变量 跳过数, 整数型
已有名单 = 组队列表框1返回组队名单 ()
已有数组 = 分割文本 (已有名单, “/”, )
自己名字 = 编码_BIG5到简体 (内存_读文本型 (全局_进程句柄, #当前血量值 - 128))
.计次循环首 (8, 队员位置)
队员对象 = 内存_读整数型 (全局_进程句柄, #队员基址 + 4 × (队员位置 - 1))
.如果真 (队员对象 ≤ 0)
到循环尾 ()
.如果真结束
.如果真 (内存_读整数型 (全局_进程句柄, 队员对象 + #队员有效标志) ≠ 1)
到循环尾 ()
.如果真结束
队员名称 = 编码_BIG5到简体 (内存_读文本型 (全局_进程句柄, 队员对象 + #队员名称值))
.如果真 (队员名称 = “” 或 队员名称 = 自己名字)
到循环尾 ()
.如果真结束
' 去重:与已有名单逐项精确比较(不用 寻找文本,避免「张三」被「李张三」误判)
已存在 = 假
.计次循环首 (取数组成员数 (已有数组), n)
.如果真 (已有数组 [n] = 队员名称)
已存在 = 真
跳出循环 ()
.如果真结束
.计次循环尾 ()
.如果 (已存在 = 真)
跳过数 = 跳过数 + 1
写日志 (自定义时间 () + “队友【” + 队员名称 + “】名字已经在名单中存在” + #换行符)
.否则
组队列表框1.加入项目 (队员名称, )
已有名单 = 已有名单 + 队员名称 + “/”
已有数组 = 分割文本 (已有名单, “/”, )
新增数 = 新增数 + 1
写日志 (自定义时间 () + “队友【” + 队员名称 + “】已加入组队名单” + #换行符)
.如果结束
.计次循环尾 ()
.如果真 (新增数 > 0)
组队列表框1保存配置到文件 ()
.如果真结束
写日志 (自定义时间 () + “一键队友入名单完成:新增 ” + 到文本 (新增数) + “ 人,已存在 ” + 到文本 (跳过数) + “ 人” + #换行符)
没有新增任何子程序、常量或全局变量,只用工程内已有的东西:
| 用到的东西 | 来源 |
|---|---|
#队员基址(62881304) / #队员有效标志(816) / #队员名称值(824) | 常量表,遍历队员(1788 行) 已在用 |
#当前血量值 - 128 读自己名字 | 同 遍历队员 1817 行 |
组队列表框1返回组队名单 () / 组队列表框1保存配置到文件 () | 工程现有子程序 |
分割文本 / 取数组成员数 / 到循环尾 / 跳出循环 | 逐项比对过工程内有先例 |
① 去重不用 寻找文本,改成逐项精确比较。<br>工程里原有的「列表框2 加入名单」用的是 寻找文本 (名单文本, 名字 + "/", , 假) = -1。<br>这个写法有隐患:名单里若有「李张三」,查队友「张三」时 张三/ 会在 李张三/ 里命中 → 误判为已存在、漏加。<br>本功能按 / 分割成数组逐项 = 比较,不受名字互为后缀影响。
② 排除自己,但做成"读不到就不排除"。<br>队伍 8 格按常理不含自己(遍历队员 是把「自己」单独读出来追加的),这里仍加了一道<br>队员名称 = 自己名字 的判断兜底;如果 自己名字 读成空串(未进游戏),该判断自然不成立,<br>不会因为读不到自己名字就把队友全部误杀。
窗口定义在 窗口/MainDialogWnd.form.json(UTF-8 BOM + CRLF),控件是扁平数组 Controls,<br>父子关系靠容器控件里的 Children 索引列表表达(这里 分组框4.Children = [47,48,50,57,58,51,379])。
新增控件需要同时改两处:
Controls 数组末尾追加控件对象(本次成为索引 379)379 追加进目标容器的 Children按钮标题不在 JSON 明文字段里,而是编码在 ExtensionData:
010000000000000001000000010000000000000000000000 固定 24 字节前缀
0E000000 标题字节数(小端) = 14
D2BBBCFCB6D3D3D1C8EBC3FBB5A5 GBK 字节(「一键队友入名单」)
另有一个 UnknownBeforeLeft 字段是控件唯一 ID(380 个控件各不相同),新增时取了个未占用的值 50820000。
| 项 | 结果 |
|---|---|
| 字节级写入 | UTF-8 BOM ✓ / CRLF 12647 / 裸 LF 0 ✓ |
| 块结构配平 | ✓(.如果真/.如果/.计次循环 全闭合) |
| JSON 结构 | 控件数 379 → 380 ✓ / 索引未错乱 ✓ / 分组框4.Children 已含 379 ✓ |
| t2e 回转 | SUCC,18473 条日志全 [信息],0 错误 0 警告 ✓ |
| 新子程序解析 | _一键队友入名单_被单击 ✓ 解析成功 |
| e2t 反查窗口定义 | 新按钮完整保留:名字/坐标/尺寸/标题/唯一ID/父容器全部 1:1 ✓ |
| e2t 反查代码 | _一键队友入名单_被单击 50 行,唯一差异是 e2t 把 , , "0" 归一为 , "0"(同样作用于原有代码,语义等价)✓ |
| 窗口 JSON 往返 | 8389 行 → 8389 行,diff 只有顶层 Id(每次生成都会变)✓ |
| 历次修复回归 | 组队名单路径 / 正邪判断 / 防杀坐标判据 / 3轮重试 / 凝神珠名单 / 集魂珠 / DLL 撞名 全部在位 ✓ |
F7 编译未代跑:本次检测到游戏 YGOnline.exe 有 1 个实例在跑(你在挂机),<br>自动化编译探针要抢前台焦点约 1 分钟,按键可能落到游戏窗口、让挂机角色站着挨打,不划算。<br>你用易语言打开 旧版本更新_修复后.e 按一下 F7 即可。
打开 .e 后请顺手确认一件事:新按钮是否出现在「组队名单」框里、与「循环邀请按钮」并排。<br>位置不合适可直接在设计器里拖动(只需拖,不用改代码)。
D:\AI空间\rxjh\旧版本更新.代码.bak_一键队友入名单_20261006_1545旧版本更新.代码(代码 12596 → 12648 行;窗口 360936 → 361786 字节)旧版本更新_修复后.e(2,732,806 字节,魔数 CNWTEPRG)_patch/fix_一键队友入名单.py注意:如果你 IDE 里开着的是 旧版本更新.e,本次改动不在那个文件里,请用 旧版本更新_修复后.e。