本文共 8502 字,大约阅读时间需要 28 分钟。
前言
本文中所使用的快速开发框架为:
本文中所使用的快速开发框架下载自:
本文中的代码已经上传到了:
QQ群:828604217
开始
是不是很兴奋,是不是很激动,马上就要开发一款自己的插件了,不用过多的去研究api,只要利用快速开发插件和基本的编程技术与高深莫测的我的世界技巧就可以开发出自己需要的插件。
本文中暂时不讲怎么debug插件,后续补上。
一:下载bukkit服务器
地址:,这个版本跟快速开发框架中的版本一致。下载好后开服,打开mc 1.13并登陆上去。
二:下载快速开发框架基础jar包
本文中所使用的快速开发框架下载自: ,下载好丢进服务器的plugins里。
三:创建一个maven工程并配置项目
这里我选quickstart:
项目创建好后引用框架:
org.mountcloud mc-plugin-common 1.13-R0.1-SNAPSHOT-v1.0 provided org.spigotmc spigot-api 1.13-R0.1-SNAPSHOT provided org.bukkit bukkit 1.13-R0.1-SNAPSHOT provided
scope一定是provided,因为基础jar已经放到了plugin里 。
添加插件的配置文件
插件的配置文件分为:config.yml、lang.yml、plugin.yml,下文中将各个插件的作用。而且快速开发框架会将这三个文件生成到我的世界服务器plugin目录中的插件名目录下,以供上线后修改,仅是快速开发框架提供生成功能,原生并不生成。
1:插件配置文件config.yml,这个里存的是插件的配置,比如称号插件的称号默认颜色等等,如果插件用到数据库就存数据库地址帐号啥的,为了测试,就写一个配置,key为sayhello的配置:
sayhello: hello world.
2:国际化插件配置lang.yml,我们配置一个TEST_LANG_HELLO,等会从插件中取这个国际化配置:
#我们自己的国际化配置,名字自己起,java enum对应即可TEST_LANG_HELLO: '测试的语言配置'#需要配置以下4个国际化选项,key是固定的,值是当前插件语言对应的话语,不配置就是英文。#无权限提醒COMMAND_PERMISSIONDENIEDMESSAGE: '&4你没有使用 /{0} 命令的权限'#不属于命令执行范围,如玩家无法执行控制台命令,控制台无法执行玩家的命令COMMAND_NOCOMMANDSENDERTYPEMESSAGE: '&4你使用的终端无法使用该命令'#参数列表不正确COMMAND_ARGS_ERROR: '&4参数列表不正确'#命令未找到COMMAND_NOT_FOUND_COMMAND: '&4命令不存在'
3:plugin.yml这个是插件的配置,用来配置插件名字,插件的描述,插件所需要使用的命令,我们注册一个根命令为test的命令,下文中我们用代码扩展test命令,扩展出test showconfig、test showlang
#插件名字name: TestPlugin#插件作者authors: [MountCloud]#插件的主页website: http://www.mountcloud.org#插件描述description: this is test plugin.#使用mc-plugin-common必须设置依赖关系为 [McPluginCommon],use mc-plugin-common must set the dependency [McPluginCommon]depend: [McPluginCommon]#main函数类main: org.mountcloud.mcplugin.TestPlugin#版本version: 1.0#插件需要注册的命令commands: #命令是test test: #描述 description: test #用法 usage: /test
配置工作完毕,开始正式开发拉!
四:开发这个测试插件
API看:,所有类的和方法都有注释
刚刚主函数类为org.mountcloud.mcplugin.TestPlugin,我们创建并继承BasePlugin,重写enable()方法,返回true!!!必须返回true,说明启用此插件,必要的初始化初始失败可以返回false。插件main类加一个返回实例的方法,因为main类是插件的核心,所有插件功能都依赖它:
package org.mountcloud.mcplugin;import org.mountcloud.mcplugin.common.BasePlugin;/** * @author zhanghaishan * @version 创建时间:2020/1/13 22:53 * TODO: */public class TestPlugin extends BasePlugin { //这是插件运行时的实例 private static TestPlugin testPlugin; @Override public boolean enable() { testPlugin = this; return true; } //返回实例 public static TestPlugin getInstance(){ return testPlugin; }}
创建两个测试命令,一个测试配置文件,一个测试国际化lang文件。
先创建config文件对应的java类,一个配置文件一个java类,除了lang.yml和plugin.yml:
package org.mountcloud.mcplugin.config;import org.mountcloud.mcplugin.TestPlugin;import org.mountcloud.mcplugin.common.BasePlugin;import org.mountcloud.mcplugin.common.config.BaseConfig;/** * @author zhanghaishan * @version 创建时间:2020/1/14 0:16 * TODO: */public class TestConfig extends BaseConfig { public TestConfig() { super("config.yml", TestPlugin.getInstance()); } //是否自动创建配置文件到 plugin目录中的插件名目录 @Override protected boolean createConfig() { return true; } @Override public void loadConfig() { //可以写一些预加载,比如,这个类可以定义一些属性,然后可以在此处初始化这些属性,reload也可以重新初始化。 }}
创建TestShowConfigCommand.java继承BaseCommand并且给玩家发送消息,消息内容为刚刚的配置。
package org.mountcloud.mcplugin.command;import org.bukkit.command.CommandSender;import org.mountcloud.mcplugin.TestPlugin;import org.mountcloud.mcplugin.common.command.BaseCommand;import org.mountcloud.mcplugin.common.command.BaseCommandSenderType;import org.mountcloud.mcplugin.common.config.BaseConfig;import org.mountcloud.mcplugin.common.service.config.BaseConfigService;/** * @author zhanghaishan * @version 创建时间:2020/1/13 23:31 * TODO: */public class TestShowConfigCommand extends BaseCommand { /** * 构造函数,BaseCommand提供了含权限的构造函数,这个到时候再讲 */ public TestShowConfigCommand() { super("showconfig", BaseCommandSenderType.ARBITRARLIY, 0); } @Override public void run(CommandSender commandSender, String[] strings, BaseCommandSenderType baseCommandSenderType) { BaseConfig config = TestPlugin.getInstance().getBaseConfigService().getConfig("config.yml"); String sayhello = config.getConfig().getString("sayhello"); //向玩家发送 sayhello的配置 TestPlugin.getInstance().getBaseMessageService().sendMessage(commandSender,sayhello); }}
创建TestShowLangCommand.java并且集成BaseCommand
package org.mountcloud.mcplugin.command;import org.bukkit.command.CommandSender;import org.mountcloud.mcplugin.TestPlugin;import org.mountcloud.mcplugin.common.command.BaseCommand;import org.mountcloud.mcplugin.common.command.BaseCommandSenderType;/** * @author zhanghaishan * @version 创建时间:2020/1/13 23:59 * TODO: */public class TestShowLangCommand extends BaseCommand { public TestShowLangCommand() { super("showlang", BaseCommandSenderType.ARBITRARLIY, 0); } @Override public void run(CommandSender commandSender, String[] strings, BaseCommandSenderType baseCommandSenderType) { //取到刚刚配置的国际化,default参数为取不到的情况下返回什么话,一般为英文,配置文件中为中文或者其他语言的。 String testLang = TestPlugin.getInstance().getBaseLanguageService().getLanguage("TEST_LANG_HELLO","test lang default."); TestPlugin.getInstance().getBaseMessageService().sendMessage(commandSender,"配置为:"+testLang); }}
创建一个命令服务,用来管理命令TestCommandService.java继承BaseCommandService。
package org.mountcloud.mcplugin.command;import org.bukkit.command.Command;import org.bukkit.command.CommandSender;import org.mountcloud.mcplugin.TestPlugin;import org.mountcloud.mcplugin.common.BasePlugin;import org.mountcloud.mcplugin.common.command.BaseCommand;import org.mountcloud.mcplugin.common.command.BaseCommandSenderType;import org.mountcloud.mcplugin.common.service.command.BaseCommandeSercvice;/** * @author zhanghaishan * @version 创建时间:2020/1/14 0:04 * TODO: */public class TestCommandService extends BaseCommandeSercvice { public TestCommandService() { //跟命令,因为允许存在多个跟命令,所以多个跟命令需要多个实例,第二个参数是插件的main类 super("test", TestPlugin.getInstance()); } //执行命令,如果需要特殊执行,就在这里定制执行, @Override public boolean execCommand(CommandSender commandSender, BaseCommand baseCommand, String[] args, BaseCommandSenderType baseCommandSenderType) { baseCommand.run(commandSender, args, baseCommandSenderType); return true; } //找不到命令的话执行什么 @Override public boolean notFoundCommand(CommandSender commandSender, Command command, String[] args) { TestPlugin.getInstance().getBaseMessageService().sendMessage(commandSender,"未知命令"); return true; }}
在TestPlugin.java的enable()方法中注册配置与命令
@Override public boolean enable() { testPlugin = this; //创建命令服务 TestCommandService testCommandService = new TestCommandService(); //创建showconfig命令 TestShowConfigCommand testShowConfigCommand = new TestShowConfigCommand(); testCommandService.registerCommand(testShowConfigCommand); //创建showlang命令 TestShowLangCommand testShowLangCommand = new TestShowLangCommand(); testCommandService.registerCommand(testShowLangCommand); //必须注册配置文件 this.getBaseConfigService().registerConfig(new TestConfig()); //lang.yml对应的是BaseLanguageConfig,这个是封装好的,每个项目不一样,没法集体封装config.yml this.getBaseConfigService().registerConfig(new BaseLanguageConfig(this)); //注册命令服务 this.registerCommand(testCommandService); return true; }
利用jar-with-dependencies插件将插件生成到plugin目录下,生成命令是mvn package,对应的pom文件是:
maven-assembly-plugin jar-with-dependencies ${devServerPluginPath} make-assembly package assembly
五:回到游戏进行测试
利用reload命令刷新一下服务器的插件
刷新完之后会提示:Reload complete。
在游戏中输入我们刚刚定义的 test showconfig命令和test showlang命令
试试test showlang
基础教程完毕,demo已经上传到了: ,后续我会写怎么debug插件,怎么给插件设置权限,复杂命令的演示,以及怎么注册一个提供给其他插件使用的api。
可以参考以下项目进行研发
称号插件GIT:https://github.com/MountCloud/minecraft-plugin-prefix称号插件API GIT:https://github.com/MountCloud/minecraft-plugin-prefix-api称号插件商店GIT:https://github.com/MountCloud/minecraft-plugin-prefix-shop
转载地址:https://blog.csdn.net/zhanghaishan/article/details/103965521 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!