跳转至内容
  • 运行于云服务器的Mud客户端

    3 3
    3 主题
    3 帖子
    jarlyynJ
    更新内容为加入脚本shared数据功能和相关api shared为使用同一个脚本的游戏可以共享读取的数据。 相对于现有的数据: 脚本数据 只读,共享。 Mod数据 只读,共享,需要额外开启 用户数据 读写,独立。 共享数据 读写,共享。
  • 允许于Android/iOS/Windows/Linux/Mac的Hellclient管理软件

    4 4
    4 主题
    4 帖子
    jarlyynJ
    升级flutter版本 修正部分文字错误
  • 跨平台跨客户端的mud 地图信息维护及Mapper程序

    7 10
    7 主题
    10 帖子
    jarlyynJ
    HMM嵌入脚本Dll是将HMM程序本地编译为AOT版本,在dll里引用。 本质是将http api接口替换为c api,通过文本进行调用的接口。 优点: 跨客户端,跨语言。可以在mush/mudlet/ls等客户端,通过lua/python的方式使用,也可以独立的使用nodejs/lua/python进行调用 毫秒级别的路径查询(取决于地图大小/路径长度/CPU性能) 完全开源。基于Mit协议的宽松开源协议,你可以自由的扩展/改写/利用代码。 有Hell和红尘两款Mud的机器深度使用本库的算法 地图文件也可以通过 hmm.ts项目,在原生的javascript/lua中使用 有跨平台(windows/macos/linux)的编辑软件支持,编辑软件支持版本分差对比。 完善的文档/单元测试 支持多点对多点寻路(querypathany)规划路线 支持模拟移动逼近的方式动态生成便利路径(quarypathall)规划路线 支持按顺序进入房间的形式(querypathordered)规划路线 支持标签,支持带值的标签,以动态的决定某个出口只能被符合某个条件,或技能不低于某个值的情况下才启用/禁用。 支持房间黑/白名单,移动指令的黑/白名单来的形式动态规划路线 支持地图膨胀,一般配合模拟逼近的形式,遍历出生于目标区域会随机移动的NPC可以到达的房间 支持临时禁用出口,应对npc拦路/技能不符无法通行的情况 支持临时房间和路径,用以解决随机迷宫,自建房屋等问题 支持 直达捷径,用于实现flyto/rideto/miss等功能 支持对房间的可变信息保留多个版本的快照,并在快照内进行搜索 支持转码,可以支持utf-8以及gbk编码 限制: 作为作者,个人对用用只有以下三个希望 希望不要以Mud owner禁止的方式使用本库 希望不要在不欢迎本库的Mud宣传本库 希望不要在禁止或者不欢迎公开传播地图文件的mud 传播本库生成的地图文件 API: API文档 代码范例 预览版本下载链接: https://github.com/hellclient-scripts/hellmapmanager/releases/tag/embedding.2026.04.22
  • 一起来沟通Mud机器人脚本

    32 32
    32 主题
    32 帖子
    jarlyynJ
    延时响应是Mud解密中很常见的一个状态。 指当你发出指令后,游戏中的NPC或者场景会在一定时间后,或者断断续续的做出响应。 一般来说,延迟响应为了考虑到玩家的体验,服务器的响应需要进行特别复杂的处理,使用简单的匹配和Mode标记就可以处理。 之所以单独作为一个课题讨论,是因为延时响应的核心处理点是 失效管理。 普通解密,触发器一般是即用即关的,不需要考虑太多的意外状态,通过触发组就能很好的解决了。 而延时解密,因为要考虑到可能会有终止/意外/并行的情况,需要手动的对出发考虑失效和重复生效、计时器延时等状况,触发器组就很捉襟见肘了,一般需要更多的代码工具去进行管理。 我这里是通过自己的Task/Plan模块,将所有的触发/计时器/事件处理封装在一个Task对象内,并强制使用一个作用范围强制失效来解决这个问题的。 参考代码: let baohuwait = 28 * 1000 let matcherKill = /^你对(.+)的(黑衣人|邪派高手|绝世高手)喝道:大胆狂徒,竟敢在这撒野!!/ //等待NPC出现的计划 let PlanProtect = new App.Plan( App.Positions["Quest"], (task) => { task.AddTrigger(matcherKill, (tri, result) => { if (result[1] != App.Data.Player.Score.名字) { return true; } App.Send("halt") let id switch (result[2]) { case "黑衣人": id = "heiyi ren" break case "邪派高手": id = "xiepai gaoshou" break case "绝世高手": id = "jueshi gaoshou" break } Baohu.Data.ID = id Baohu.Data.Type = result[2] }).WithName("ok") let wait = Baohu.Data.Start + baohuwait - $.Now() if (wait > 0) { task.AddTimer(wait, (timer) => { Note("准备迎敌") App.Send("halt") App.Core.Heal.TryTouch() $.RaiseStage("prepare") $.RaiseStage("baohu-ready") return true }).WithNoRepeat(true) } task.AddTimer(1100, () => { if (App.Core.Weapon.Touch) { if (($.Now() - Baohu.Data.Start) < baohuwait) { App.Send("halt") App.Core.Heal.TryTouch() $.RaiseStage("pause") $.RaiseStage("wait") } } return true }) task.AddTimer(3000, () => { let d = (($.Now() - Baohu.Data.Start) / 1000).toFixed(0) Note(`保护开始${d}秒`) return true }) task.AddTimer(60000, () => { App.Log("保护等待超时") return false }).WithName("timeout") $.RaiseStage("wait") }, (result) => { if (result.Name == "ok") { $.PushCommands( $.CounterAttack(`${GetVariable("id")}'s ${Baohu.Data.ID}`, App.NewCombat("baohu").WithTags(`baohu-${Baohu.Data.Type}`).WithPlan(PlanCombat)), $.Function(Baohu.Finish), ) $.Next() return } App.Send("halt") App.Log(`保护NPC${Baohu.Data.NPC.ID}失败`) Baohu.Fail() } ) 代码地址 可以看到,我使用了一个叫做PlanProtect的计划(task工厂),创建了一个基于Quest的封装,所有的触发和计时器都绑定在这个Task封装上,并在Quest发生变化时强制失效。 预期管理工具Plan/Task的详细介绍 由于我一直认为Mud机器人是一个工程问题,难点在于可维护性和代码失控。所以,我认为,选用或者开发一个触发失效工具,是十分重要的,也应该是整个机器人的核心驱动逻辑之一。
  • 欢迎自己倒腾mud客户端的一起沟通

    1 1
    1 主题
    1 帖子
    jarlyynJ
    大部分Mud玩家,在有能力制作一个可用的机器人后,都会起自己制作客户端的念头。让自己的机器人在自己的客户端里刷刷的跑,能给一个Mud爱好者带来极大的满足感。 在科技发展到现在,各种语言和框架层出不穷,电脑的硬件也极度丰富,外加AI技术的发展,写一个Mud客户端对普通爱好者已经不是一个遥不可及的事情了。 这系列文章,就是集合我在制作Hellclient时的一些心得体会,希望能给其他同好带来帮助。 而本文,个人希望,类似于武侠小说中的武功总纲,体现出大体框架,然后通过一篇篇细节文章,把整个自建客户端的关键点串起来。 首先,我们要明确,一个Mud客户端要解决几个问题。 我归纳下来,主要是以下几个方面 与Mud服务器的信息交互(telnet/ansi) 用户的快速工具(触发,别名,计时器) 合适的机器配置格式(比如变量) 脚本引擎 用户界面 扩展性 Telnet/ANSI库 telnet可以说是一个老旧的成熟的协议了。大部分的语言都有telnet库,没有telnet库的小众语言利用AI照着现成语言的库抄一个也不算难事。 对于Mud来说,主要是处理一些指令,和subnegotiation协议拓展出来的指令就行。 而ANSI的话,也是定义了另一套显示控制的指令。 从我个人经验来看,telnet和ansi的原始数据在客户端能应该需要一个中间模型(model),能快速的供界面渲染和引擎调用。有些客户端直接渲染,再从渲染完的结果倒过来取数据。个人觉得这样不好,会极大的增加脚本制作的复杂度。 触发/别名/计时器 这三个东西代表了一起机器主要要处理的问题: 服务器返回的响应 用户的输入 时间的流逝 对这个核心,我的思路也有过很多变化。就目前的思路来说: 客户端的触发/别名/计时器,应该从好用,易用的角度出发,让用户能很方便的添加临时功能。 脚本引擎应该抽象出 服务器交互/用户输入/时间层出来,不受客户端限制,不利用客户端的特殊功能。 当然,这只是建议,和一个状态下的想法。整体还是要根据你做客户端的目的来开发。 机器配置 在很多客户端里,变量是和触发/别名/计时器评级的概念。 从我的理解来说,并不是这样。 变量(机器配置)应该是和脚本直接绑定的。 按现代开发的概念,变量至少是 一个Config文件,决定了机器的启动设置。 如果是变量名对应变量值的形式,它更接近于环境变量 这个概念。 同时,个人建议,也是我Hellclient的做法,变量要有备注或注释的空间,可以让用户理解变量怎么使用。 脚本引擎 在真实世界中,嵌入式脚本引擎其实只有两个玩家,javascript和lua。 Lua是老牌玩家,各个语言都有lua的实现或者Binding,语法简单速度快。有可能的话建议使用luajit库,性能还是很不错的。 Javascript又是另一个话题。Javascript是目前使用最广泛的脚本语言,npm上有大量的js库。但嵌入js库不是很容易的一件事情。本质来说,js生态就是v8生态。但不是每个语言都能很容易的嵌入v8引擎。hellclient嵌入v8也是将一个半废弃状态的库进行了一定的魔改。还遇到了Windows下的msys和vc编译器兼容的问题。 所以,个人意见,能方便的用v8的(比如C#有微软官方ClearScript支持,建议一定要支持javascript,lua的话,建议都可以支持一下。 用户界面 就目前的现状来说,除非你使用特殊的技术栈或者技术,不然大部分情况下的软件开发都是跨平台,Windows/Linux/Mac全支持的。 具体到用户界面的形式,其实是3种 浏览器 浏览器形式的(主要是electron,少数如tarui会使用系统自带浏览器) 最大的优势是界面多样话,自定义方便,美观迅速。 缺点是非nodejs方案会多引入与浏览器的交互,性能有上限。而nodejs本身的单线程模型要改造的话工程量很大,强如微软也在vscode里堆了一堆C代码。 客户端 客户端的方案的话,其实主要是qt和skia 两个图形库的方案。qt基本绑定c++,不是那么容易上手(pyqt选手另论)。skia的话,有flutter/dart和avalonia/c# 两员大将,都是不错的方案。 客户端型界面最大的优势是性能有保证。缺点是实现美观/华丽的界面麻烦 无头模式 无头模式就是指提供接口,供网页/其他客户端显示。 理论上说,无头模式一般都会实现一个网页界面。 但他和网页界面的区别是,无头模式由于要支持多种终端,无法充分利用网页界面的华丽/可制定性强,在界面上有很大的妥协。 无头模式的特点是: 1.轻量级,可扩展性高,适合云端运行,通过网页/客户端/app等多种形式连接。 2.界面受限,需要维护多个程序。 Hellclient就是无头模式的客户端。 扩展性 扩展性其实主要就是3个方案 动态链接库(so/dll) 通过lua加载动态链接库可以很容易的对lua进行扩展。性能和功能都是最强大的。但同样的对开发人员的要求也是最高的,安全性上也容易出问题。 Com技术 如果你把自己局限在Windows平台,使用C++/C#开发,activex/com技术是极为强大的。mush本身除了lua的语言也都是通过activex来实现的。但com技术已经是一个事实上逐渐被非主流化的技术,不是很建议绑定的Com技术上 http/websocket技术 通过基于http的api 接口或者websocket实时调用。这个方案在性能上会有所损失,但同时有能够云化集群化的优点。Hellclient就是基于这种方案来提供扩展性。 我的建议 Hellclient是使用go写,采用无头模式,通过http/websocket进行扩展的。 如果让我从头来过,我可能会换成c#,因为go在windows平台下嵌入v8有点蛋疼。 我推荐的语言选型为 c# 综合的王者 flutter/dart 桌面/app全能 electorn/nodejs electorn也是目前桌面端很主流的选择 python web/pyqt方案 这个只适合自用,发布打包都太麻烦了
  • 关于论坛本身的意见与反馈

    1 1
    1 主题
    1 帖子
    jarlyynJ
    欢迎您访问Hellclient社区。 这里是Hellclient客户端及相关mud软件和脚本的沟通社区。欢迎在这里对Hellclient软件,和Mud相关的软件开发和脚本制作进行沟通。 在这里,我们会以下讨论的规范要求每一个用户 仅讨论软件的使用问题和Mud的技术问题。 不要对别的用户,Mud,和机器人进行评论。Mud本身已经是一个粉丝向的小圈子了,大家都是非专业的玩家,请互相保持友好。 由于 Mud 圈本身的互相借鉴和借用的现象很严重,所以本社区不支持任何资料的上传。有代码或程序分享的需要,请上传至github/coding/gitee等平台。 请不要分享破解或者攻击软件/服务器/游戏的经验。 尊重您玩的Mud的规矩,不要讨论和分享针对某个Mud使用,又不被Mud Owner允许的功能。 不建议使用您在游戏里的常用ID,把您在游戏的恩怨情仇蔓延于此。 热爱国家,遵纪守法,不违背公序良俗。 说的有点多,希望我们的社区能能给每一个访问者带来快乐和收获。