我调试HGE引擎AddTextList字符串写入时踩过的3个坑
摘要:本文复盘HGE引擎AddTextList、DelTextList、AddTextListEX三条文本文件命令的踩坑过程。列出格式行与参数表,对比追加写入、定位写入、按行删除的区别,讲清相对路径以Envir为基准、绝对路径写全磁盘路径的规则,搭一个申请名单NPC含加入与移除两段脚本,最后整理三类常见报错排查。…
昨晚在本地服务端测试一个申请名单NPC,玩家点按钮要把名字写进txt文件,申请完再从名单里删掉。我用字符串增删这套命令写了半天,结果名字写进去了却删不掉,删完又重复写,名单越堆越长。
后来翻帮助文档才搞清楚,AddTextList、DelTextList、AddTextListEX三条命令的参数个数不一样,路径基准也有讲究。这篇把我踩过的坑和正确写法一起复盘出来,你照着配就不会再走弯路。这组文本文件操作命令本质上就是往txt名单里增删行,AddTextList写入、DelTextList删除各管一头。

命令格式详解
AddTextList的作用是把一行字符串追加写入指定文本文件,支持路径变量;DelTextList是从指定文本文件里删掉匹配的字符串;AddTextListEX则是把字符串写到文件的指定行,行数不足会自动补空行。三条命令都写在#ACT段里执行。
;增加字符串
[@Test]
#IF
#ACT
AddTextList 您的名字 .\TestList.txt
;删除字符串
[@Test]
#IF
#ACT
DelTextList 您的名字 .\TestList.txt
帮助文档特别标注:AddTextList第三参数不为空时,不检查字符串是否已存在,直接追加进文件。这个细节后面踩坑会讲到。

参数拆解
三条命令参数个数不同,你配的时候一定要对着帮助文档的格式行一个一个数,少写一个参数后面的就全错位。
| 命令 | 参数内容 | 参数释义 | 实操用法 |
|---|---|---|---|
| AddTextList | 字符串 文件路径 是否检查重复 是否绝对路径 读取模式 | 追加写入一行文本 | 0检测重复1不检测;0相对路径1绝对路径 |
| DelTextList | 文本 文件路径 路径类型 指定行数 读取模式 | 删除匹配行 | -1全删0只删第一个1到X指定行删 |
| AddTextListEX | 字符串 文件路径 指定行 是否绝对路径 读取模式 | 写到指定行 | 指定行范围0到65535,行数不足补空行 |
| Force | 读取模式参数 | 强制从文件重新加载 | 文件被外部改动后加Force刷新内存缓存 |
路径规则要单独记:只写文件名时,基准目录是D:\mirserver\Mir200\Envir\;写成..\QuestDiary\宗师系统\申请名单.txt时,实际路径就是Envir\QuestDiary\宗师系统\申请名单.txt。
三个命令的区别对比
新手最容易把AddTextList和AddTextListEX搞混。AddTextList是追加写入,每次执行往文件末尾加一行,不管写到第几行;AddTextListEX是定位写入,你指定写到第几行就写到第几行,行数不够自动补空行把位置顶出来。
DelTextList的指定行数参数是我踩坑最久的地方。填-1表示循环查找把所有匹配行全删掉,填0表示只删匹配到的第一行,填1到X之间的数字表示只删指定行号那一行。你想删干净就用-1,想保留一条就用0。
| 对比项 | AddTextList | AddTextListEX | DelTextList |
|---|---|---|---|
| 写入位置 | 文件末尾追加 | 指定行号定位 | 删除匹配行 |
| 重复检测 | 第三参数控制 | 无重复检测 | 按指定行数控制删除范围 |
| 典型用途 | 名单追加 | 固定行覆盖 | 名单移除 |

写入删除实操配置
第一步,先在Envir目录下建好名单文件,比如TestList.txt,空文件也行,命令会自动创建。
第二步,写一个申请NPC段,玩家点申请按钮执行AddTextList把<$USERNAME>写进名单。
第三步,写一个取消申请段,执行DelTextList把同名删掉。
[@申请加入]
#IF
#ACT
AddTextList <$USERNAME> ..\QuestDiary\申请名单.txt 0 0
#SAY
你的名字已加入申请名单。\
〖<返回/@main>〗
[@取消申请]
#IF
#ACT
DelTextList <$USERNAME> ..\QuestDiary\申请名单.txt 0 -1
#SAY
已从申请名单移除。\
〖<返回/@main>〗
记住第三参数0是检测重复,同一名字不会重复写进去;DelTextList最后一个行数参数填-1,把所有匹配行一次删干净。配完在M2里重载NPC,进游戏点按钮验证。
常见报错排查
名字写进去了却删不掉是什么原因?
最常见是DelTextList的指定行数参数填成了0,0只删匹配到的第一行,如果名单里同一个名字重复出现过多次,就会剩下残留行。把最后一个行数参数改成-1循环全删,再检查文件路径和写入时用的路径是否完全一致,路径对不上删的就是另一个文件。(本条问题整理自百度知道真实提问:服务端脚本错误如何解决2024-12)
写入路径找不到文件怎么办?
只写文件名时基准目录是Envir,不是版本根目录。如果你把名单文件放在QuestDiary子目录下,路径必须写成..\QuestDiary\名单.txt这种相对路径,不能直接写QuestDiary\名单.txt。拿不准就用绝对路径,第四参数填1,把完整路径D:\mirserver\Mir200\Envir\QuestDiary\名单.txt写全。
改了脚本游戏里写入行为没变怎么排查?
脚本改动后NPC需要在M2控制台重新加载才生效。另外文本文件如果被你用记事本手动改过,引擎内存里还缓存着旧内容,这时在命令最后加Force参数强制从文件重新加载,就能读到最新内容。(本条问题整理自百度知道真实提问:服务端脚本改了游戏里面没变化2022-11)
常见问题
1. AddTextList第三参数0和1怎么选?
0表示写入前检测重复,名单里已有这个字符串就不重复追加,适合做申请名单、签到记录这种一人一条的场景;1表示不检测直接追加,适合做日志流水、抽奖记录这种允许重复的场景。拿不准就用0,能防止名单被刷爆。(本条问题整理自百度知道真实提问:机器人脚本为什么不运行2016-11)
2. AddTextListEX行数不足补空行是什么意思?
假设文件只有3行,你执行AddTextListEX往第10行写内容,引擎会自动在第4行到第9行补上空行,把第10行的位置顶出来再写入。这个特性适合做固定槽位的配置表,但要注意空行会占用行数,DelTextList删除时空行不会自动收缩。
3. 相对路径和绝对路径怎么区分填?
相对路径第三参数填0,路径以Envir目录为基准,写成.\TestList.txt就是Envir\TestList.txt;绝对路径第四参数填1,写完整磁盘路径D:\mirserver\Mir200\Envir\TestList.txt。版本要迁移换目录时用相对路径更省事,绝对路径写死了换盘就要全改。
4. DelTextList指定行数-1和0有什么区别?
-1是循环查找全删除,文件里所有匹配这个文本的行都会被清掉;0是只删除匹配到的第一行,后面相同文本的行保留。取消申请、退出名单这种要删干净的场景用-1;只想删最早一条记录的场景用0。
5. 写入的中文名字在txt里乱码怎么办?
文本文件编码要和引擎读取编码一致,建议用记事本另存为ANSI编码,不要存成UTF-8。中文Windows本地环境下ANSI编码就是GBK,引擎默认按这个编码读txt。存成UTF-8不带BOM时中文会显示成问号。
6. AddTextList和写Ini文件命令怎么选?
AddTextList按行追加纯文本名单,适合人名列表、签到记录这种一行一条的数据;Ini文件操作是按键值对读写配置项,适合存参数配置。名单类需求用AddTextList,参数配置类需求用Ini读写命令,两者不要混用。
写在最后
AddTextList负责追加写入、DelTextList负责按行删除、AddTextListEX负责定位写指定行,三条命令配合相对路径基准和重复检测参数,就能搭出申请名单、签到记录这类文本名单功能。关键是数清参数个数、记准路径基准、删除时用-1全删干净。
AddTextList与DelTextList名单增删相关案例已在本地HGE引擎环境逐项跑通;命令仅适配HGE引擎,部分其他引擎存在兼容可能性,跨引擎使用需要自行测试修改。字符串增删用于版本技术研究与功能测试,仅供单机本地学习调试。
扫描二维码推送至手机访问。
本文章M2GM发布,如需转载请注明出处。如有侵权请联系站长删除。
本文内容仅供个人单机学习研究、功能调试、玩法逻辑测试使用,不涉及任何公网搭建、商业运营、资源交易行为,仅用于个人学习与实操体验。








