LOADING

加载过慢请开启缓存 浏览器默认开启

记一次MelonLoader的使用和开发还有踩坑

2025/6/22 开发

起因

我上一次逆向了八按键音游,瞎几把写了个mod丢到了Github

事实上那时候我手上并没有能测试的郊狼,写出来的玩意除了Miss判定是对的别的东西基本都用不了

那时候我没搞清楚郊狼的ws通信到底是咋样的 随便找个文档就写上去了

现在研究了一下大概就是:

很显然我们需要3.0的郊狼才可可以

郊狼App的ws功能是连接一个ws后端(在他的演示文稿里有)

这个很好跑,解决依赖用node跑起来就好

实际上App连接的也是这个后端,相当于一个中转服务器

是为了一对多或者多对一玩法

玩的真花

但我们的需求仅仅是一对一而已

但我懒得去写个后端了,我的史山水平真的不敢恭维

所以这次我们主要是对那个mod的websocket逻辑进行更改,并且还是用官方的后端

实际上这后端因为uuid强绑定 随便一个人的都可以

以后可能会考虑把这个后端集成到mod里?

开始

JSON解析的坑

事实上我上次那个代码是手拆json,手动解析配置文件里的json内容发送出去

然后我就被ChatGPT坑了

他给我推荐了个Newtonsoft.Json去解析

结果这玩意我死活导不进去依赖 游戏加载不出来

我猜可能是版本问题?毕竟maimai用的net3版本了 melonloader也是0.6.4的老版本

但他确实用不了

System.TypeLoadException: Failure has occurred while loading a type.
  at Newtonsoft.Json.Linq.JValue..ctor (System.Object value) [0x00000] in <f74995119334484fb6db6825be2eac0d>:0
  at Newtonsoft.Json.Linq.JContainer.ReadContentFrom (Newtonsoft.Json.JsonReader r, Newtonsoft.Json.Linq.JsonLoadSettings settings) [0x0012e] in <f74995119334484fb6db6825be2eac0d>:0
  at Newtonsoft.Json.Linq.JContainer.ReadTokenFrom (Newtonsoft.Json.JsonReader reader, Newtonsoft.Json.Linq.JsonLoadSettings options) [0x00030] in <f74995119334484fb6db6825be2eac0d>:0
  at Newtonsoft.Json.Linq.JObject.Load (Newtonsoft.Json.JsonReader reader, Newtonsoft.Json.Linq.JsonLoadSettings settings) [0x0006a] in <f74995119334484fb6db6825be2eac0d>:0
  at Newtonsoft.Json.Linq.JObject.Parse (System.String json, Newtonsoft.Json.Linq.JsonLoadSettings settings) [0x0000c] in <f74995119334484fb6db6825be2eac0d>:0
  at Newtonsoft.Json.Linq.JObject.Parse (System.String json) [0x00000] in <f74995119334484fb6db6825be2eac0d>:0
  at dg_sinmai_shcoker.WebsocketHandler.<Connect>g__gencode|1_5 (System.String msg, System.String ws_url) [0x00002] in <5a67bc8a7654442583205147e4a8ecb9>:0

我是真的不会.NET开发,完全是现学的

后面试了System自带的JSON解析

用不了()那个要.NET6

你猜怎么的,我又开了一个对话问GPT,这次他不推荐这个库给我了

纯左右脑互博

这次他给我推荐了MiniJSON

又相信了()

用了一下还是可以的,没啥兼容性问题而且适配Unity

唯一需要注意的就是反序列化之后记得加个.ToString()方法 不然会报错

var dict = Json.Deserialize(msg) as Dictionary<string, object>;
string targetId = dict["targetId"].ToString()

至此JSON解析就解决了

至少不用手拆JSON

WebSocket的坑

我一开始用的是websocket-sharp.dll这个库

当然是没问题的 很好用啊

我被Csharp的event订阅吸引到了,+=去订阅event来调用回调函数是哪个天才想出来的

后来我的猪头脑袋就发现:欸System里不是有Websocket吗

Melonloader的文件夹里也有WebsocketDotNet这个库

为什么不用呢?

写了半天代码试了半天之后发现真几把是史

首先是System里的ws库非常的底层,心跳处理消息解析全部都没有

WebsocketDotNet则是没有发消息的功能??而且一链接就断开

那我玩个蛋

兜兜转转还是用的websocket-sharp.dll

最后

该说不说事后我想了下用DX分=0来判定是一个

怎么说呢

很巧妙很神奇的思路

因为如果你是通过hook miss的数字之类的去判定Miss的话,你需要处理跳关啊 FreedomMode重开的情况

假如你用hook combo数字为0来判定miss的话那你得处理空的情况(也就是游戏没开始)

或者游戏刚开始没出tap那不被电死了

但DX分这个不需要

也算是傻人有傻福