北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 78|回复: 2

Mud 技术原理概述与脚本入门介绍

[复制链接]
发表于 昨天 05:00 PM | 显示全部楼层 |阅读模式

不少新玩家对 Mud 技术原理不太了解,对程序也了解不多,就很难坚持玩下去,特别是想到要自己编写脚本就很头疼。

下面我对 Mud 的技术原理和一些概念做一些分享,让大家能快速理解和上手。



一、Mud 架构简述



Mud 总体上分为客户端和服务端:




      
  • 服务端 就是 mud.pkuxkx.net 所在的服务器(端口号如8080暂不展开)

  •   
  • 客户端 有很多种,从最早的 zmud 到现在各种现代客户端,其本质都一样



一旦客户端和服务器建立连接后,就开始数据交互,主要有以下几种情况:




      
  1. 客户端发指令 → 服务器返回文本 → 客户端显示




客户端发送:look
服务端返回:
这是一家价钱低廉的客栈,生意非常兴隆……你可以看看(look):paizi。


玩家看到后,可能输入新的指令,比如买东西、移动等。




      
  1. 服务器主动推送文本(无需客户端发送)




慕容龘往西离开。
【求助】蛮嗨江湖高举双手,大声叫道:我是新手!!! (mhjh||new)


比如有人路过、发言、频道聊天,服务器会主动推送。




      
  1. 服务器推送隐藏数据:GMCP



GMCP 是一类隐藏的结构化数据,包含:




      
  • 角色信息

  •   
  • 当前房间数据

  •   
  • 战斗状态信息



这些数据不显示出来,但对脚本非常重要,后面我们会详细讲。



二、为什么要写脚本?



完全手动玩 Mud 很难坚持下去,游戏的很多乐趣和效率都依赖“机器人”或脚本支持。


而编写脚本的核心,其实就两个目标:




      
  1. 辅助自己输入指令

  2.   
  3. 根据服务器返回的文本自动触发操作



三、辅助输入指令:别名



示例 1:快速补血


原指令 exert recover 太长,我设置别名 e1,如下:



sys.send('exert recover')


战斗时只需输入 e1 即可。







示例 2:疗伤 + 补血 组合


每场战斗之后,会受伤,一般需要先治伤,exert heal,一次还不行,经常需要多次,但是几次不确定,看受伤的程度,受伤治愈后,还得再补血一次 exert recover才算完成

async function(){
  //尝试疗伤最多10次,如果提示了'你现在气血充盈,没有受伤。'就马上结束,说明不到10次就痊愈了,每2次治疗之间间隔0.2秒,因为连续治疗是不允许的
  await sys.retry('exert heal', '你现在气血充盈,没有受伤。', 0.2, 10)
  sys.send('e1')
}


设置别名为 ee,一键完成整个流程。







示例 3:带参数的别名


比如买干粮,指令为:



buy gan liang 10


设置别名 b1,代码如下:




function(arg){
  //arg是多个参数的集合,arg[0] 表示第1个参数,比如 b1 2 3 ,那么arg[0]就是2,arg[1]就是3,但是第二个参数用不上,只需要arg[0]
  sys.send('buy gan liang ' + arg[0])
}


执行 b1 2 表示买 2 包干粮。







北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 昨天 05:05 PM | 显示全部楼层

四、根据服务器文本触发指令:触发器



示例 1:自动捡银子



服务器返回的文本中只要包含 “两白银(Silver)” 就执行:



get silver







示例 2:识图 fullme 成功后执行逻辑


我们执行fullme之后,会自动弹出图片,根据图片输入正确的fullme后,服务器会返回‘你突然感到精神一振,浑身似乎又充满了力`,这个时候,会自动触发关闭图片窗口,同时计时器加上倒计时900秒,提醒我们及时下一次fullme,

脚本如下:




function () {
  //在第一个倒计时位置,加上提示 FULLME 及 倒计时900秒
  sys.timer(1, "FULLME", 15 * 60, true, 'ss')
//自动关闭图片窗口
  sys.closeFullme()
}







示例 3:用正则提取地址


正则表达式就是用一套符号,在文本中快速找到符合特定规则的子文本。不用正则可行吗?基本不可行
/和周围的人打听之后,你判断应该是在(.*)。/  这个是一个js的正则表达式,但是其它所有语言的正则表达式是基本相同的,有很小的差异也可以通过AI来帮忙,如果不想用正则,那这里就得用无数个触发器才能解决问题,
比如:
和周围的人打听之后,你判断应该是在北京。
和周围的人打听之后,你判断应该是在扬州。
和周围的人打听之后,你判断应该是在苏州。
......
其他我们想获取的就是那个地址,但是这个地址是变化的,所以就用正则

/和周围的人打听之后,你判断应该是在(.*)。/


触发器代码如下:




function(arg){
// arg[1] 就是上面正则表达式里的(.*),可能是北京,可能是苏州等等
  com.vars.lmm = arg[1]// 把这个地址存下来,后续能用上
  sys.note('找人:'+arg[1])//把地址显示在客户端的记事界面上,我们可以随时查看
}




正则可以很复杂,就算是程序员也不能轻松写出复杂的正则,一般可以通过AI来帮忙,可以这样提问,给AI一个文本,然后告诉它文本里那些字符是不变的,那几个字符是变化的,我想通过正则来扣出这几个字符,AI就会详细告诉你,如何写



五、GMCP 数据说明(预告)



GMCP 是看不到的隐藏数据,不走文本通道,因此触发器无法匹配,但它包含的信息更完整可靠。


后续我们会讲解:



      
  • 如何监听 GMCP

  •   
  • 如何使用 GMCP 做状态判断、战斗自动化



六、总结



Mud 游戏的魅力不仅仅是游戏内容本身,更在于通过脚本打造“专属机器人”的过程。



你不需要掌握复杂的编程技术,只要理解基本的逻辑,逐步入门别名和触发器,配合 AI 工具,你就可以轻松玩转整个江湖。



后续我们将继续介绍:



      
  • GMCP 数据的使用

  •   
  • 自动战斗脚本的构建

  •   
  • 任务机器人、跑图系统的实现



欢迎持续关注,也欢迎大家分享自己的脚本经验和心得。



北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
回复 支持 1 反对 0

使用道具 举报

发表于 昨天 05:13 PM | 显示全部楼层
持续关注, mark
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2025-7-18 04:59 PM , Processed in 0.011232 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表