Mud 技术原理概述与脚本入门介绍
<p>不少新玩家对 Mud 技术原理不太了解,对程序也了解不多,就很难坚持玩下去,特别是想到要自己编写脚本就很头疼。<br>下面我对 Mud 的技术原理和一些概念做一些分享,让大家能快速理解和上手。</p>
<h3>一、Mud 架构简述</h3>
<p>Mud 总体上分为客户端和服务端:</p>
<ul>
<li><strong>服务端</strong> 就是 <code>mud.pkuxkx.net</code> 所在的服务器(端口号如8080暂不展开)</li>
<li><strong>客户端</strong> 有很多种,从最早的 zmud 到现在各种现代客户端,其本质都一样</li>
</ul>
<p>一旦客户端和服务器建立连接后,就开始数据交互,主要有以下几种情况:</p>
<ol>
<li><strong>客户端发指令 → 服务器返回文本 → 客户端显示</strong></li>
</ol>
<pre>
客户端发送:look
服务端返回:
这是一家价钱低廉的客栈,生意非常兴隆……你可以看看(look):paizi。
</pre>
<p>玩家看到后,可能输入新的指令,比如买东西、移动等。</p>
<ol start="2">
<li><strong>服务器主动推送文本(无需客户端发送)</strong></li>
</ol>
<pre>
慕容龘往西离开。
【求助】蛮嗨江湖高举双手,大声叫道:我是新手!!! (mhjh||new)
</pre>
<p>比如有人路过、发言、频道聊天,服务器会主动推送。</p>
<ol start="3">
<li><strong>服务器推送隐藏数据:GMCP</strong></li>
</ol>
<p>GMCP 是一类隐藏的结构化数据,包含:</p>
<ul>
<li>角色信息</li>
<li>当前房间数据</li>
<li>战斗状态信息</li>
</ul>
<p>这些数据不显示出来,但对脚本非常重要,后面我们会详细讲。</p>
<h3>二、为什么要写脚本?</h3>
<p>完全手动玩 Mud 很难坚持下去,游戏的很多乐趣和效率都依赖“机器人”或脚本支持。</p>
<p>而编写脚本的核心,其实就两个目标:</p>
<ol>
<li>辅助自己输入指令</li>
<li>根据服务器返回的文本自动触发操作</li>
</ol>
<h3>三、辅助输入指令:别名</h3>
<p><strong>示例 1:快速补血</strong></p>
<p>原指令 <code>exert recover</code> 太长,我设置别名 <code>e1</code>,如下:</p>
<pre><code>sys.send('exert recover')</code></pre>
<p>战斗时只需输入 <code>e1</code> 即可。</p>
<p><em>data/attachment/forum/d9afbcba17853a0b5d2d15efe3fa7b82.png</em></p>
<hr>
<p><strong>示例 2:疗伤 + 补血 组合</strong></p>
每场战斗之后,会受伤,一般需要先治伤,exert heal,一次还不行,经常需要多次,但是几次不确定,看受伤的程度,受伤治愈后,还得再补血一次 exert recover才算完成
<pre><code>
async function(){
//尝试疗伤最多10次,如果提示了'你现在气血充盈,没有受伤。'就马上结束,说明不到10次就痊愈了,每2次治疗之间间隔0.2秒,因为连续治疗是不允许的
await sys.retry('exert heal', '你现在气血充盈,没有受伤。', 0.2, 10)
sys.send('e1')
}
</code></pre>
<p>设置别名为 <code>ee</code>,一键完成整个流程。</p>
<p><em>data/attachment/forum/eb34f5c6209416b63649b5cb2859ce7f.png</em></p>
<hr>
<p><strong>示例 3:带参数的别名</strong></p>
<p>比如买干粮,指令为:</p>
<pre><code>buy gan liang 10</code></pre>
<p>设置别名 <code>b1</code>,代码如下:</p>
<pre><code>
function(arg){
//arg是多个参数的集合,arg 表示第1个参数,比如 b1 2 3 ,那么arg就是2,arg就是3,但是第二个参数用不上,只需要arg
sys.send('buy gan liang ' + arg)
}
</code></pre>
<p>执行 <code>b1 2</code> 表示买 2 包干粮。</p>
<p><em>data/attachment/forum/34ec43e077fb282bbb4425711b50e86b.png</em></p>
<h3>四、根据服务器文本触发指令:触发器</h3>
<p><strong>示例 1:自动捡银子</strong></p>
<p>服务器返回的文本中只要包含 “两白银(Silver)” 就执行:</p>
<pre><code>get silver</code></pre>
<p><em>data/attachment/forum/8c4ef82d27c0f66aed3aa2394df08dad.png</em></p>
<hr>
<p><strong>示例 2:识图 fullme 成功后执行逻辑</strong></p>
我们执行fullme之后,会自动弹出图片,根据图片输入正确的fullme后,服务器会返回‘你突然感到精神一振,浑身似乎又充满了力`,这个时候,会自动触发关闭图片窗口,同时计时器加上倒计时900秒,提醒我们及时下一次fullme,
<p>脚本如下:</p>
<pre><code>
function () {
//在第一个倒计时位置,加上提示 FULLME 及 倒计时900秒
sys.timer(1, "FULLME", 15 * 60, true, 'ss')
//自动关闭图片窗口
sys.closeFullme()
}
</code></pre>
<p><em>data/attachment/forum/50786cedfb1254cc6cc5218722e226de.png</em></p>
<hr>
<p><strong>示例 3:用正则提取地址</strong></p>
正则表达式就是用一套符号,在文本中快速找到符合特定规则的子文本。不用正则可行吗?基本不可行
/和周围的人打听之后,你判断应该是在(.*)。/这个是一个js的正则表达式,但是其它所有语言的正则表达式是基本相同的,有很小的差异也可以通过AI来帮忙,如果不想用正则,那这里就得用无数个触发器才能解决问题,
比如:
和周围的人打听之后,你判断应该是在北京。
和周围的人打听之后,你判断应该是在扬州。
和周围的人打听之后,你判断应该是在苏州。
......
其他我们想获取的就是那个地址,但是这个地址是变化的,所以就用正则
<pre><code>/和周围的人打听之后,你判断应该是在(.*)。/</code></pre>
<p>触发器代码如下:</p>
<pre><code>
function(arg){
// arg 就是上面正则表达式里的(.*),可能是北京,可能是苏州等等
com.vars.lmm = arg// 把这个地址存下来,后续能用上
sys.note('找人:'+arg)//把地址显示在客户端的记事界面上,我们可以随时查看
}
</code></pre>
<p><em>data/attachment/forum/accda86b1b25d0886015fbfab4e80cac.png</em></p>
<p>正则可以很复杂,就算是程序员也不能轻松写出复杂的正则,一般可以通过AI来帮忙,可以这样提问,给AI一个文本,然后告诉它文本里那些字符是不变的,那几个字符是变化的,我想通过正则来扣出这几个字符,AI就会详细告诉你,如何写</p>
<h3>五、GMCP 数据说明(预告)</h3>
<p>GMCP 是看不到的隐藏数据,不走文本通道,因此触发器无法匹配,但它包含的信息更完整可靠。</p>
<p>后续我们会讲解:</p>
<ul>
<li>如何监听 GMCP</li>
<li>如何使用 GMCP 做状态判断、战斗自动化</li>
</ul>
<h3>六、总结</h3>
<p>Mud 游戏的魅力不仅仅是游戏内容本身,更在于通过脚本打造“专属机器人”的过程。</p>
<p>你不需要掌握复杂的编程技术,只要理解基本的逻辑,逐步入门别名和触发器,配合 AI 工具,你就可以轻松玩转整个江湖。</p>
<p>后续我们将继续介绍:</p>
<ul>
<li>GMCP 数据的使用</li>
<li>自动战斗脚本的构建</li>
<li>任务机器人、跑图系统的实现</li>
</ul>
<p>欢迎持续关注,也欢迎大家分享自己的脚本经验和心得。</p>
持续关注, mark
页:
[1]