写在一切之前

写在一切之前:从第一次玩Minecraft到现在大概有十年的光景了,那时候常见的版本号还是1.2.5,不禁令人感慨。而Minecraft本身的经久不衰,也离不开源源不断的UGC产出供玩家不断游玩、探索和讨论,其中及其重要的一环,就是mods(Modifications 的缩写,也叫模组,是指任何基于 Minecraft 原本游戏内容所作出的任何修改或在原本游戏内容中增加新的内容)。看了一些教程之后,觉得有必要了解一下Minecraft独特的mod文化背后,支撑mod本身的编写/运作方式了。

一、上下文

先简单介绍一下本次分析的主角,直播弹幕模组BakaDanmaku,开门见山地说,因为与我的工作内容有关联,所以挑选了他作为本次分析的主角。
下面是mcmod.cn给出的介绍:

用于在游戏内聊天栏显示哔哩哔哩直播间弹幕的模组。只需要丢进模组文件夹、启动游戏、设定房间号即可连接直播弹幕服务器,实现在游戏内输出直播弹幕功能。
具体效果如下图所示:

该mod的GitHub地址:https://github.com/TartaricAcid/BakaDanmaku

二、分析前的一些假设 / 猜测

由于我工作涉及直播,对直播弹幕系统稍有了解,有以下的猜测/待验证

  1. 猜测1:使用长链与弹幕服务器连接
  2. 猜测2:制作者自行解析了websocket中包含的弹幕内容(协议)
  3. 疑问3:作者对协议的解析是否形成了接口定义,以供后续二次开发?
  4. 疑问4:相较于市面上成熟的第三方弹幕姬,它对于弹幕的解析有什么区别?
  5. 疑问5:对于与mc本身的交互,仅限于在左下角聊天框显示吗?

三、分析

1. 依赖/构建:

使用标准的forge开发规范forge gradle。同时可以看到,该mod是并没有前置依赖的。
.

2. 总体项目结构


看完代码结构,对于疑问3我们心里大概是有个底了:该mod并没有打算作为api将弹幕解析能力提供给二次开发或其他mod使用的想法,而是只服务于mod内部的弹幕展示。
这里不再给大家打哑谜,直接放出整体的时序图:

3. mod入口


好家伙,入口类只做对象管理,说明不需要在此初始化很多变量。

4. 事件总线


作者也比较开门见山,把事件总线的消费和生产都放在了一处代码里。

  • 事件生产:
    SendDanmakuEvent类可以理解为一个消息类,描述了这个消息类应该在构造时含有一条只读的String信息。它在是实际向该mod的事件总线发送时被构造调用的。
    需要特别说明的是,这里的@Mod.EventBusSubscriber注解即定义了该事件总线是该mod专属的。
    实际用例:

    SendDanmakuEvent类构造为对象,然后被发送进入mod的事件总线。

事件消费:
消费者的逻辑即为onSendDanmaku(SendDanmakuEvent event)这一个消费方法。

5. websocket / 弹幕协议解析

弹幕长链需要主动请求连接,连接后的规则是发起长链后,30s发送一次心跳包,以证明弹幕长链的客户端是存活的。

  • 发起长链&维持

    总体来说,长链的发起是通过发送了请求包发起的,而维持则是通过定时任务进行了定时的心跳包发送实现的。
    BakaDanmaku.HEART_BEAT_TASK = SERVICE.scheduleAtFixedRate(() -> sendMessage(site.getHeartBeat()),site.getHeartBeatInterval(), site.getHeartBeatInterval(), TimeUnit.MILLISECONDS);
    这一行代码即为维持心跳的逻辑。

  • 长链的消息结构:(摘自https://github.com/lovelyyoshino/Bilibili-Live-API/blob/master/API.WebSocket.md)

    作者按照弹幕的类型进行了下发数据包内包含json的解析:

    最终返回的是String,然后通过事件总线,传递给GUI层。

7. GUI交互

最后的工作也就非常简单了,发送到聊天框

    @SubscribeEventpublic static void onSendDanmaku(SendDanmakuEvent event) {Minecraft minecraft = Minecraft.getInstance();if (minecraft.gui != null) {minecraft.gui.handleChat(ChatType.CHAT, new TextComponent(event.getMessage()), Util.NIL_UUID);}}

四、回到问题上来

  1. 猜测1:使用长链与弹幕服务器连接
    正确的,按照长链Websocket协议
  2. 猜测2:制作者自行解析了websocket中包含的弹幕内容(协议)
    正确的,自行实现了一套解析逻辑
  3. 疑问3:作者对协议的解析是否形成了接口定义,以供后续二次开发?
    形成了一些interface,但是并不是对外开放的能力,不具备二次开发的能力,只考虑了兼容其他直播网站的情况(并且未实现,仍然只支持b站直播)
  4. 疑问4:相较于市面上成熟的第三方弹幕姬,它对于弹幕的解析有什么区别?
    编码层次感不足,没有规范化接口,性能上未测试
  5. 疑问5:对于与mc本身的交互,仅限于在左下角聊天框显示吗?
    还真是仅聊天框

五、Better?

  1. 实现一套更加OO的代码,暴露出对外的事件总线/interface定义。
  2. 更多交互?
  3. 目前仅支持单个房间的弹幕读取,可以考虑跨房间(多主播互动场景or多房间看板)。
  4. 需要手动配置json文件,老实说比较不方便,考虑其他配置模式。

浅析Minecraft直播弹幕模组BakaDanmaku源码相关推荐

  1. 《OV4689摄像头模组驱动源码解析》

    <OV4689摄像头模组驱动源码解析> OV4689是一款广泛应用于工业.安防等领域的高清图像传感器.在这篇文章中,我们将介绍如何在单片机上使用OV4689模组,并提供相应的驱动源码. O ...

  2. 我的世界服务器显示弹幕,我的世界直播弹幕模组

    模组简介 这是一个辅助直播弹幕显示的 Minecraft 模组.只需要丢进模组文件夹.启动游戏.设定房间号即可连接直播弹幕服务器,实现在游戏内输出直播弹幕功能. 具体效果如下图所示: 目前支持 Bil ...

  3. 商品详情页html代码获取,直播带货小程序源码中,商品详情页是如何获取html图片的...

    在搭建直播带货小程序源码过程中,需要为商品构建详情页,而商品页中的图片是要通过html获取并展示到本地的,那么这个过程是如何实现的?接下来小编将通过代码演示一下: 1.配置webView mWebVi ...

  4. openedge-hub模块请求处理源码浅析——百度BIE边缘侧openedge项目源码阅读(2)

    前言 在openedge-hub模块启动源码浅析--百度BIE边缘侧openedge项目源码阅读(1)一文中浅析了openedge-hub模块的启动过程,openedge-hub为每一个连接的请求创建 ...

  5. 抖音最近很火的游戏直播:挤地铁教程+源码+软件下载

    抖音最近很火的游戏直播:挤地铁教程+源码+软件 先上车先吃肉,卡好后带货,卖号,引私域,接星途广告,接小程序广告,带小游戏赚收益均可 源码下载:抖音最近很火的游戏直播:挤地铁教程+源码+软件下载-小程 ...

  6. java毕业生设计弹幕视频网站计算机源码+系统+mysql+调试部署+lw

    java毕业生设计弹幕视频网站计算机源码+系统+mysql+调试部署+lw java毕业生设计弹幕视频网站计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B/S架构 开发语言: ...

  7. ASP社群直播/聊天室/分销/系统源码

    简介: ASP社群直播/聊天室/分销/系统源码,群规等级升级的条件有3点:推广下级的人数.自身消费.直接缴费购买! 源码搭建流程: 1配置Inc.asp 2接微信公众账号 /a_Inc/Inc.asp ...

  8. 基于JAVA直播购物平台计算机毕业设计源码+系统+lw文档+部署

    基于JAVA直播购物平台计算机毕业设计源码+系统+lw文档+部署 基于JAVA直播购物平台计算机毕业设计源码+系统+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开发软 ...

  9. 炫酷滚动弹幕生成小程序源码+支持多样化模板

    正文: 这是一款滚动弹幕生成小程序源码,让弹幕文字在手机屏幕上跑起来,LED弹幕,手机弹幕,告白神奇等,支持多种模板,每一种模板都支持自定义颜色等等,字体跳动,字体表白等等,另外也可以支持自定义文字, ...

  10. HTML5期末大作业:直播网站设计——仿在线媒体歪秀直播官网模板html源码(11个页面) HTML+CSS+JavaScript 期末作业HTML代码

    HTML5期末大作业:直播网站设计--仿在线媒体歪秀直播官网模板html源码(11个页面) HTML+CSS+JavaScript 期末作业HTML代码 临近期末, 你还在为HTML网页设计结课作业, ...

最新文章

  1. 北斗定位2.0版来了!普通人手机可用,全免费!
  2. OSI参考模型——网络层的主要功能
  3. python中什么是匿名函数_python中的匿名函数
  4. Linux sftp用法
  5. 路灯智能控制系统_在plc的智能路灯控制系统设计,你必须清楚
  6. WdOS源码编译安装MySQL 5.5.25a
  7. 封装不同类模板的随机数生成器
  8. 定制jQuery File Upload为微博式单文件上传
  9. SQLServer 的存储过程与java交互
  10. CWP中的排序算法:C语言
  11. 公钥 私钥_公钥 私钥 签名 验签 说的啥?
  12. Android:学习路线总结,绝对干货
  13. [转载] 如何使用Python 实现秒表功能?
  14. C# 在服务器生成文件/文件夹并压缩下载到本地
  15. h3 经典地图 第3辑(混战+RPG)
  16. 【将列表中的每个数据转换成倒数 np.reciprocal()】
  17. 如何正确使用短信验证码
  18. matlab计算轮廓曲率半径,matlab求曲率半径
  19. 一位500强高管的忠告:怕你胸有鸿鹄之志,手无缚鸡之力
  20. 算法学习 - 模拟滤波器(巴特沃斯、贝塞尔、切比雪夫、椭圆)及IIR滤波器设计

热门文章

  1. Java + OpenCV 实现更换背景色 (以 证件照 蓝色幕布替换成红色背景 为例)(JavaCV)
  2. Hook Android q 剪贴板限制,AndroidQ(10)获取剪切板内容适配
  3. Android剪切板标签,教你使用剪切板——Android中的复制粘贴
  4. 人工智能发展月报(2022年6月)
  5. SAP中成本核算结构及构成组件分析
  6. 【工控老马】欧姆龙PLC FINS指令模板整理
  7. 超级计算机每秒几兆次,这台超级计算机能在1秒内计算出你需要60亿年的时间
  8. 如何快速制作脚本,不用插件也能用按键精灵后台发送消息
  9. error: passing ‘const xxx’ as ‘this’ argument discards qualifiers [-fpermissive]的解决方案
  10. python怎么打开cmd-python中调用cmd