前言

    本文中所使用的快速开发框架为:https://blog.csdn.net/zhanghaishan/article/details/103965311

    本文中所使用的快速开发框架下载自:https://download.csdn.net/download/zhanghaishan/12100651

    本文中的代码已经上传到了:https://github.com/MountCloud/testmcplugin-demo

    QQ群:828604217

开始

    是不是很兴奋,是不是很激动,马上就要开发一款自己的插件了,不用过多的去研究api,只要利用快速开发插件和基本的编程技术与高深莫测的我的世界技巧就可以开发出自己需要的插件。

    本文中暂时不讲怎么debug插件,后续补上。

一:下载bukkit服务器

地址:https://download.csdn.net/download/zhanghaishan/12100664,这个版本跟快速开发框架中的版本一致。下载好后开服,打开mc 1.13并登陆上去。

二:下载快速开发框架基础jar包

本文中所使用的快速开发框架下载自:https://download.csdn.net/download/zhanghaishan/12100651   ,下载好丢进服务器的plugins里。

三:创建一个maven工程并配置项目

这里我选quickstart:

 项目创建好后引用框架:

  <dependencies>
    <!-- 快速开发框架 -->
    <dependency>
      <groupId>org.mountcloud</groupId>
      <artifactId>mc-plugin-common</artifactId>
      <version>1.13-R0.1-SNAPSHOT-v1.0</version>
      <scope>provided</scope>
    </dependency>


    <!--Spigot API -->
    <dependency>
      <groupId>org.spigotmc</groupId>
      <artifactId>spigot-api</artifactId>
      <version>1.13-R0.1-SNAPSHOT</version>
      <scope>provided</scope>
    </dependency>

    <!--Bukkit API -->
    <dependency>
      <groupId>org.bukkit</groupId>
      <artifactId>bukkit</artifactId>
      <version>1.13-R0.1-SNAPSHOT</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

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看:https://github.com/MountCloud/minecraft-plugin-common,所有类的和方法都有注释

刚刚主函数类为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文件是:

      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <!--游戏plugin目录   如D://mcserver/plugins-->
          <outputDirectory>${devServerPluginPath}</outputDirectory>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>assembly</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

五:回到游戏进行测试

利用reload命令刷新一下服务器的插件

刷新完之后会提示:Reload complete。

在游戏中输入我们刚刚定义的  test showconfig命令和test showlang命令

试试test showlang

基础教程完毕,demo已经上传到了:https://github.com/MountCloud/testmcplugin-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

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐