起因
我上一次逆向了八按键音游,瞎几把写了个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分这个不需要
也算是傻人有傻福