在传奇服务端的脚本制作中,数据的持久化存储是核心环节。很多GM在制作功能时,习惯利用G变量(全局数字型)或A变量(全局字符型)来记录全服数据,但往往忽略了服务器重启会导致内存数据丢失的问题。要实现M2全局变量的自动保存,以及处理玩家通过双击物品触发输入框并将内容写入本地文本文件,我们需要深入理解引擎的底层读写机制,利用AddList和M2的自动保存特性来实现。
全局变量的持久化机制与自动保存
首先,你需要明确一个概念:G变量和A变量虽然被称为“全局变量”,但在大多数引擎(如GOM、GEE、996等)中,它们默认是驻留在内存中的。虽然部分引擎会在关闭时尝试保存,但为了防止数据丢失,必须强制引擎进行写入操作。
在M2Server的控制端,通常有一个“全局变量”的管理界面。在这里,你可以看到G0-G499(或更高)以及A0-A499的实时数值。引擎通常会在后台每隔一段时间,或者在检测到变量值变化时,将这些数据写入到Mir200EnvirGlobalVal.ini(文件名可能因引擎而异)文件中。
要实现“自动保存”,最稳妥的方法是在脚本的关键节点(如玩家下线、物品使用后、任务完成时)强制触发保存。虽然脚本中很少有直接的“SaveAllVar”命令,但你可以通过修改一个无关紧要的变量或者利用引擎的列表管理功能来“欺骗”引擎进行写入。更高级的做法是利用定时脚本,每隔几分钟对关键变量进行一次读写操作,确保内存数据与硬盘同步。
双击物品触发与输入框逻辑
要实现双击物品触发输入,首先需要在物品数据库(StdItems.db)中进行设置。找到你想要制作成触发器的物品,将其“StdMode”字段修改为31(或引擎定义的“双击触发类”代码),“Shape”或“Func”字段通常对应脚本的执行段落或参数。
当玩家双击该物品时,引擎会调用QFunction-0.txt中的[@StdModeFunc]或自定义的触发标签。在此处,我们需要调用输入框命令。
对于字符型输入,命令格式通常为:
[@InputMain]
IF
ACT
INPUTSTRING 100
这里的INPUTSTRING 100就是触发输入框的关键。数字100对应的是变量索引。在大多数引擎中,@@InPutString100实际上是将玩家输入的内容暂存在S100变量中(S变量为私人字符型变量)。需要注意的是,S变量通常不随下线保存,因此必须立即将其转移或写入文件。
将变量内容写入本地文本文件
这是本教程的核心难点。如何将S100中的内容保存到服务器的硬盘上?我们需要用到列表管理命令,主要是ADDLIST和CHECKLIST。
首先,你需要在服务端Mir200EnvirMarket_Def目录下创建一个文本文件,例如UserData.txt。
接着,编写接收输入的脚本段落。当玩家在输入框输入内容并点击确定后,脚本会跳转到对应的标签,通常格式为[@InPutString100]。
脚本逻辑如下:
[@InPutString100]
IF
ACT
ADDLIST UserData.txt
SENDMSG 6 您的信息已成功保存到服务器记录中。
BREAK
ADDLIST命令的作用是将指定的字符串追加到文本文件的末尾。是读取S100变量内容的标准格式。通过这行代码,玩家输入的任何字符都会被一行行地记录在UserData.txt中。
如果你希望覆盖写入而不是追加,或者需要更复杂的操作,部分引擎支持DELLIST(删除行)或CHANGEList(修改行),但ADDLIST是最基础且最常用的保存方式。
变量调用与回读
保存只是第一步,如何在游戏里再次调出这些数据?这就涉及到了列表检测命令CHECKLIST。
你可以编写一个NPC对话脚本,当玩家点击“查询记录”时,系统遍历UserData.txt。
[@CheckData]
IF
CHECKLIST UserData.txt
ACT
SENDMSG 6 查询成功,该信息存在于记录中。
BREAK
ELSESAY
系统未找到您的输入记录。
这里利用了S100作为临时的查询条件。如果你需要将文件里的内容读出来显示给玩家看,部分新引擎支持GETLIST命令,可以将文本文件的某一行内容赋值给变量,从而实现双向的数据交互。
数据同步与防刷机制
在实际应用中,必须考虑并发问题。如果两个玩家同时双击物品并写入,ADDLIST通常能很好地处理队列,不会导致文件损坏。但为了防止恶意玩家通过脚本反复提交垃圾信息,建议在脚本中加入延时判断或变量标记。
例如,利用个人标识([001]-[499])来标记玩家是否已经提交过信息。
IF
CHECK [001] 1
ACT
SENDMSG 6 您已经提交过信息,无法重复操作。
BREAK
ELSEACT
INPUTSTRING 100
在[@InPutString100]段落执行完ADDLIST后,记得设置标识:SET [001] 1。这样可以有效防止数据库膨胀,同时保证了逻辑的严密性。
通过上述步骤,你不仅实现了变量的自动保存逻辑,还打通了游戏内交互与服务器本地文件的数据通道。这种技术广泛应用于排行榜记录、自定义称号录入、工会战报统计等高级功能中,是传奇脚本制作进阶的必修课。

