spigot以其轻量化著称,带来好处的同时,一个直接后果就是不提供像forge那样成熟的开发、调试、构建环境。笔者近日想学习一下MC spigot插件开发,遇到了不少坑,甚是令人烦躁。

配置开发环境时,笔者本打算直接使用Minecraft Development插件,结果搞了几遍都是一个接近空白的文件夹。所幸找到了一篇高质量教程,顺利解决了问题:【Minecraft】Bukkit/Spigot插件开发教程---搭建一个开发环境_WYH2004的博客-CSDN博客_spigot插件开发

(顺带一提,这篇教程的作者在B站发布了一些不错的spigot插件开发视频教程。衷心建议感兴趣的小伙伴去看看(我没收钱!))

对于调试,笔者认识的几个开发者都是把插件构建出来,放到服务器上直接看运行效果,等于没有实时调试,对萌新小白极其不友好。在中文互联网检索如何配置断点调试,答案寥寥;spigot wiki上的方案也解决不了,最后结合stackoverflow上一个回答才搞定。此外,我没有找到解决断点时间过长导致客户端断开连接问题的方案。

笔者总结自己的摸坑教训,感觉不如针对这些问题写一篇中文教程,供各位想要入坑spigot插件开发的MC爱好者参考。

笔者教程使用的JAVA版本为jdk1.8.0_181(JAVA16及以下均可),API使用Spigot 1.16.5(bukkit也行,paper不提供API,不能用),IDEA版本为Community 2021.3,调试服务端使用paper 1.16.5(可以兼容bukkit/spigot,同时加载速度快几倍)。

教程包含以下部分:

        1、如何建立spigot服务端实时调试环境 

        2、一个避免断点调试时间过长导致客户端断开连接的方案

1、建立spigot服务端实时调试环境  

(此处假设你已搭建好了开发环境:构建工件(artifact)可以将插件本体与plugins.yml编译为.jar。不知道怎么做的,可参考上文引用教程)

一共需要做三件事:(1)配置一个调试服务端(2)配置一个新工件(3)设置调试选项

(1)配置调试服务端

这一步的服务端之后将用于调试插件,并不一定与开发的API依赖库相同,可以跑Bukkit/Spigot插件即可。笔者此处选择了加载速度较快的paper。

我选择在本地部署调试服务端,这样操作完全与开服相同。知道如何开服的小伙伴可以直接跳下一节。想在远程部署调试服务端的,请参考spigot wiki 的相关教程。

首先,我们去paper官网整一个服务端下来。

Legacy Downloads – PaperMC

paper目前只支持1.17+,如果与笔者一样需要下载1.16.5及更早的版本,需要回答问题以表明自己理解paper将不会提供技术支持、论坛讨论;分别选择No 和 It will be closed即可。

之后,把下载的.jar服务端(例如paper-1.16.5.jar)放在一个固定路径、纯英文路径的文件夹里,启动。笔者使用Win 10系统,就直接用批处理脚本启动了(新建文本文档-输入以下内容-另存为:保存类型:所有文件,文件名:随便写.bat)

java -Xms1G -Xmx1G -jar paper-1.16.5.jar -nogui
pause 

双击运行一次,文件夹里会出现一个eula.txt。打开,将最后一行的false改成true,保存。

再双击运行一次,服务端会自动下载运行环境,下载完成后自动运行。当显示开头为 > 的空行时,运行成功,如下图所示。

运行成功后还需最后一步。关闭服务器,打开server.properties文件,将online-mode=true改为false;否则必须正版账号登陆的客户端才能进入调试服务器。

(2)配置一个新工件

这一步的目的是,将插件构建到上一步配置好的调试服务器插件目录下。

点击文件(Files)-项目结构(project structure)-工件(artifacts),点击对话框左上角的加号,新建一个JAR工件。

工件名称任意(例如TestPluginDebug),输出布局与构建插件的要求一样:编译输出、plugin.yml(不知道是在说什么的,请继续参阅此篇教程)。

唯一不同的是,输出目录为调试服务器的插件文件夹:例如,我将调试服务器放在Z:\SpigotPlugins\paper-1.16.5-runtime下;那这一步我的输出目录必须为Z:\SpigotPlugins\paper-1.16.5-runtime\plugins。

点击确定,这一步就成功了;也可以构建此工件检查:构建(Build)-构建工件(Build Artifacts)-选择刚才的工件,如果在输出目录找到 TestPluginDebug.jar,则无误。

(3)配置调试环境

这一步在IDEA中新建一个调试环境,用以在调试模式下运行(1)中的服务器与(2)中的插件。

首先,点击右上角 添加配置(Add Configurations...),会跳出一个叫运行/调试配置的对话框。点击左上角+号,新建一个JAR应用程序配置。

之后,填入调试环境的属性:

名称:自己取

JAR路径:(1)中服务端路径

虚拟机选项:服务端运行选项,只要两个参数即可:-Xmx2G -Xms2G。如果实际调试中内存不足导致服务端崩溃,可以适当增大这些数字。

程序实参:一般只填一个 nogui

工作目录:与第一行JAR路径相同,但只填到.jar文件父目录。没听懂的看图。

最后,看到界面最下面,有一个“执行前”标签。点击+号-编译Artifacts,选择(2)中配置的工件,一路确定。这一步会自动在启动调试环境前,将插件更新同步到(1)的调试服务器中。

现在万事俱备了!你可以在调试配置选项卡中看到刚设置好的调试环境。选择它,给自己的插件打一个断点,点击右边的小虫子,试一试程序是否如约暂停了。

大功告成!

二、避免断点暂停时间过长导致掉线

MC原版服务端、客户端代码中,都有这样的逻辑:如果连续x秒没有收到任何数据包,则认为连接已断开。这意味着我们断点调试超过x秒,客户端就会被强制踢出世界;对于不能接受这一点的小伙伴,此处笔者提供一种解决方法及其思路。

2.1 避免服务端掉线

对spigot系列的服务端,默认x=60。spigot很文明地将这个参数暴露在服务端配置文件spigot.yml中:

timeout-time: 60

将其改为6000即可。

对paper服务端,操作一样;毕竟paper是spigot的儿子(狗头)。

2.2 避免客户端掉线

客户端x=30。修改这个就比较麻烦,因为原版并没有提供相应接口。笔者转而使用Forge学习背后的机制(使用Forge MDK版本1.16.5-36.2.29):

MC通信通过Netty进行。连接到服务器时,客户端建立一条ChannelPipeline负责处理数据包,其中第一个Pipeline名称为timeout、类型为ReadTimeOutHandler,正负责着30秒无流量时断开连接的工作。

(关于netty.channel.ChannelPipeline的工作机制,请参阅此文。MC相关代码位于net.minecraft.network.NetworkManager.connectToserver方法中,如下:)

@OnlyIn(Dist.CLIENT)
public static NetworkManager connectToServer(InetAddress p_181124_0_, int p_181124_1_, boolean p_181124_2_) {......(new Bootstrap()).group(lazyvalue.get()).handler(new ChannelInitializer<Channel>() {protected void initChannel(Channel p_initChannel_1_) throws Exception {try {p_initChannel_1_.config().setOption(ChannelOption.TCP_NODELAY, true);} catch (ChannelException channelexception) {}
//以下是生成pipeline的关键代码,注意第一个addLastp_initChannel_1_.pipeline().addLast("timeout", new ReadTimeoutHandler(30)).addLast("splitter", new NettyVarint21FrameDecoder()).addLast("decoder", new NettyPacketDecoder(PacketDirection.CLIENTBOUND)).addLast("prepender", new NettyVarint21FrameEncoder()).addLast("encoder", new NettyPacketEncoder(PacketDirection.SERVERBOUND)).addLast("packet_handler", networkmanager);}}).channel(oclass).connect(p_181124_0_, p_181124_1_).syncUninterruptibly();return networkmanager;
}

怎么办呢?我们只需要把30秒的ReadTimeOutHandler替换成超级延时版即可。

笔者直接使用Forge,Forge Mod的开发环境配置教程网上有很多,大家可以百度学习一下。如果大家不能使用Forge客户端也没关系,最终替换掉旧的ReadTimeOutHandler即可,实现方式都无所谓啦~

Forge很贴心的在客户端连接到服务端时,注入了一个事件:

ClientPlayerNetworkEvent.LoggedInEvent

直接新建一个Forge Mod订阅这一事件,利用其返回的NetworkManager访问channel、替换pipeline。五行代码即可实现:

@SubscribeEvent
public void onConnectToServer(ClientPlayerNetworkEvent.LoggedInEvent event)
{event.getNetworkManager().channel().pipeline().replace("timeout","timeout",new ReadTimeoutHandler(6000));
}

客户端、服务器联合调试时,用装有此mod的Forge客户端进服即可。

参考链接:

【Minecraft】Bukkit/Spigot插件开发教程---搭建一个开发环境_WYH2004的博客-CSDN博客_spigot插件开发

IntelliJ: Debug Your Plugin | SpigotMC - High Performance Minecraft

java - Run Configuration to Debug Bukkit/Minecraft Plugin in IntelliJ IDEA? - Stack Overflow

【Minecraft】建立Bukkit/Spigot插件实时调试环境,并避免断点调试时客户端断开连接相关推荐

  1. JetBrains PhpStorm 2017.1.4 x64+PHPWAMP+Xdebug环境配置以及断点调试

    首先先来说下IDE和服务环境的配置: 第一步,在PHPWAMP的站点根目录下创建项目文件夹,然后把IDE项目文件指向该文件,如下图所示: 第二步,创建文件,然后通过服务器进行显示,这里我写了两个文件, ...

  2. Phpstorm 2017.1+PHPWAMP+Xdebug环境配置以及断点调试

    首先先来说下IDE和服务环境的配置: 第一步,在PHPWAMP的站点根目录下创建项目文件夹,然后把IDE项目文件指向该文件,如下图所示: 第二步,创建文件,然后通过服务器进行显示,这里我写了两个文件, ...

  3. VS Code 安装 Go 插件、自定义扩展配置、断点调试

    1. 安装插件 使用快捷键 Ctrl+Shift+X 打开插件安装页面,安装 Go 插件. 2. 自定义扩展配置 使用快捷键 Ctrl+, 打开自定义配置页,编辑 settings.json ,定义与 ...

  4. 搭建Android源码调试环境(三)——调试C/C++(使用CLion)

    前言 aosp自带gdbclient.py脚本用于调试 kevin@kevin-GS60-2PL /mnt/2ffc0bac-5896-499a-9ae6-79e610162482/aosp $ gd ...

  5. hbuilder php断点调试,Hbuilder配置php断点调试

    这篇文章主要介绍了关于Hbuilder配置php断点调试,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 首先到xdebug官网下载和你的php版本一致的xdebug扩展,我的是php- ...

  6. pycharm的debug调试指定循环次数进入断点调试

    文章目录 方法一: 方法二 方法一: 可以使用条件断点,在断点上右键可以设置运行停止的条件,这样代码就会一直运行至你设置的条件处,再进入debug模式 注意:k == 41842,中间有两个等号 方法 ...

  7. sublime_text配置php调试环境,SublimeText2配置PHP调试环境(在windows环境下)

    1:PHP安装,配置环境变量 PHP安装略过- 2:下载Sublime Text 2 下载地址:http://www.sublimetext.com/2 ,选择自己合适的版本 3:点击 sublime ...

  8. python单步调试的方法_python断点调试方法

    pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等.pdb 提供了 ...

  9. kdevelop怎么调试_Kdevelop的C++断点调试设置

    1. CMakeLists.txt 需要设置为 Debug 模式 示例 cmake_minimum_required(VERSION 2.8) Project (Eigen_test) include ...

  10. webuploader 怎么在react中_另辟蹊径搭建阅读React源码调试环境支持所有React版本细分文件断点调试...

    引言(为什么写这篇文章) 若要高效阅读和理解React源码,搭建调试环境是必不可少的一步.而常规方法:使用react.development.js和react-dom.development.js调试 ...

最新文章

  1. PathMatchingResourcePatternResolver通过适配符寻找符合条件的java类
  2. Web API应用架构设计分析(2)
  3. 地表最强的MySQL安装一键式安装,信不信你下完我就给你装好!附各种Mysql安装失败的解决办法(什么你安装失败了?快来看这个)
  4. weka连接mysql数据库
  5. Apache Flume 1.7深入浅出,快速入门
  6. android 自定义地图标注,Android中调用高德地图的自定义标记视图
  7. QT所有版本和VS插件下载
  8. Allegro PCB导入网表后,PCB规则变化怎么办?
  9. layui模板语言,渲染表格分组合并行
  10. Java 实现局域网聊天室功能(私聊,群聊)
  11. R语言read.xlsx( )函数报错 LoadLibrary failure: %1 不是有效的 Win32 应用程序
  12. 【Datawhale组队学习】机器学习数学基础 - 一元函数微分学【Task 03】
  13. Java实现Word转PDF方案选择
  14. 王道计算机网络 第一章 计算机网络
  15. OllyDbg插件编写
  16. Easyconnect For Mac 最新版 下载地址
  17. dockers安装Jenkins
  18. Android 自定义View流程
  19. openssl x509 证书命令
  20. 在音乐世界中的感悟:人生,朋友和音乐

热门文章

  1. MATLAB滑动窗口(移动方差)
  2. mac-Pro13 电池图标一直保持充电状态的问题解决
  3. 安装配置Axis2,为Eclipse安装配置Axis2插件教程
  4. 网线制作IP组网(基于华为eNSP模拟器)
  5. php猜拳,JavaScript面向对象实现猜拳游戏
  6. python里创建数据库表Column常用参数总结
  7. 日语中单词后面1,2,3,4,5是什么意思
  8. 科研人必备图像处理软件—ImageJ
  9. 在Redhat9下安装Oracle9
  10. 【网络流24题】火星探险问题 题解