## G变量的本质与存储位置
G变量是传奇服务端里的**全局整数型变量**,它的特点是全服务器唯一,不属于任何玩家,所有玩家都可以读写这个变量,而且修改后会影响到整个服务器的逻辑。
G变量的值保存在 `Mir200/GlobalVal.ini` 文件里。服务器关闭或重启后,G变量的值不会自动清空,而是继续保留在这个文件里。这就是为什么你开新区或者重启服务器后,G变量还带着上次的值——它被写在硬盘上了,引擎启动时会重新读进去。
## G变量为什么需要清理
G变量用在很多地方:记录全服活动状态、记录当天攻沙次数、记录世界BOSS是否被击杀、记录某个开关是否打开等等。如果不清理,会出现这些问题:
- **开新区时**:上一区的活动数据还在,新区的玩家可能领不到奖励,或者活动无法正常开启。
- **脚本逻辑错乱**:比如某个活动脚本依赖G10变量判断是否开启,如果G10一直等于1,活动就永远关不掉。
- **变量用尽**:G0-G999总共1000个,如果长期不清理,后面脚本想用新变量都没地方用。
## 自动清除G变量的实现方法
### 方法一:使用ClearVar脚本命令(GOB引擎)
如果你的引擎是GOB引擎,可以用专门的变量清理命令,这是最彻底的自动清除方式。
在需要清理的脚本位置(比如开区触发、每日凌晨重置)添加以下代码:
```text
[@清理所有G变量]
#IF
#ACT
ClearVar G0 99
SENDMSG 5 全局G变量G0-G99已全部清空!
break
```
`ClearVar G0 99` 的意思是从G0开始,连续清理100个变量(G0到G99)。如果你想清理G0到G999,就把99改成999。
这个命令放在哪里生效:
- 放在 `QManage.txt` 的 `[@Startup]` 段里,服务器每次启动时自动执行
- 放在机器人脚本里,每天凌晨4点自动执行
- 放在开区触发脚本里,新区开服时执行
### 方法二:通过MOV命令逐个清零
如果你的引擎不支持ClearVar,只能用最原始的办法——MOV命令把每个G变量赋值为0。
```text
[@清理G变量]
#IF
#ACT
MOV G0 0
MOV G1 0
MOV G2 0
;一直写到G999
SENDMSG 5 全局G变量清理完成!
```
这种方法笨但通用,所有引擎都认。缺点是你得写1000行代码,而且执行效率低。可以只清理你脚本里实际用到的G变量,不用全清。
### 方法三:机器人脚本定时自动清理
在 `Mir200\Envir\Robot_def\` 里设置机器人,让服务器每天固定时间自动清理G变量。
**第一步**:在 `Robot.txt` 里定义机器人
```
;Robot.txt
清理变量 Robot 清理变量 00 01 * * *
```
这表示每天凌晨1点执行"清理变量"这个脚本。
**第二步**:在 `Robot_def\清理变量.txt` 里写执行脚本
```text
[@清理变量]
#IF
#ACT
MOV G0 0
MOV G1 0
;......这里写上你要清理的G变量
SENDMSG 0 系统提示:全服G变量已重置!
```
### 方法四:利用M2内置功能手动触发
如果你不想写脚本,或者只在开新区时手动清一次,可以直接用M2控制台。
**GOM/GEE引擎操作路径**:
1. 打开M2Server.exe
2. 点击菜单栏的 **查看** → **内核数据**
3. 找到 **清除变量G** 按钮,点击即可清除所有G变量
**HERO引擎操作路径**:
1. 打开M2Server.exe
2. 点击 **管理** → **文件管理**
3. 点击 **清除全局G,A变量**
这种方法适合开区前手动操作,不适合自动运行。
## 不同引擎的自动清除方案对比
| 引擎类型 | 自动清除命令 | 手动清除位置 | 保存文件 |
|----------|--------------|--------------|----------|
| GOM/GEE | 无专用ClearVar,需用MOV | M2→查看→内核数据 | GlobalVal.ini |
| GOB引擎 | ClearVar G0 999 | M2控制台 | GlobalVal.ini |
| HERO引擎 | 无专用命令 | M2→管理→文件管理 | 未知 |
| 3K引擎 | 控制器自带清理工具 | GameCenter→清理数据 | 未知 |
## 脚本中自动清除的触发时机
根据你的需求选择把清除脚本放在哪里:
**服务器每次启动时自动清除**:
在 `QManage.txt` 的 `[@Startup]` 段里添加清理代码。这样每次重启M2,G变量都会归零。
```text
[@Startup]
#IF
#ACT
ClearVar G0 99 ;支持的话
;或者
MOV G0 0
MOV G1 0
;...
```
**每天固定时间自动清除**:
用上面的机器人脚本方法,设置每天凌晨执行。
**每个玩家登录时触发清除**(不推荐):
G变量是全局的,一个玩家登录时清掉会影响所有玩家,不要这样做。
**开新区前手动清除**:
用M2控制台的内核数据清理功能,最快最省事。
## 清理G变量前的注意事项
**备份GlobalVal.ini**:
G变量文件在 `Mir200\GlobalVal.ini`。清理前最好备份一份,万一清错了还能恢复。
**确认哪些变量在用**:
如果不知道G0-G999哪些被用了,可以先导出一份清理前的值,或者用文本搜索功能在脚本文件夹里搜 `G` 开头的变量,看看哪些真的在用。
**区分G变量和A变量**:
G是整数型,A是字符型。清除G变量不影响A变量,如果需要清A变量,用同样的方法处理A0-A999。
**重启M2生效**:
不管是手动清还是脚本清,清理后最好重启M2,或者重新加载变量文件,确保内存里的值和硬盘上的文件同步。
## 完整示例:开区全自动清理脚本
把下面这段代码放进你的开区触发脚本里,新区开服时所有G变量自动归零:
```text
[@Startup]
#IF
#ACT
ClearVar G0 999 ;清G0-G999
SENDMSG 0 服务器启动完成,所有全局G变量已重置!
#ELSEACT
MOV G0 0 ;如果不支持ClearVar,手动清
MOV G1 0
MOV G2 0
MOV G3 0
;......一直写到G999
SENDMSG 0 服务器启动完成,所有全局G变量已重置!
```
保存后重启M2,进游戏用GM命令查看G变量值,确认已经归零。

