标签 Minecraft 下的文章

如题,玩了这么久Minecraft,开了那么多服,总该要会写服务器插件吧。

环境部署

JDK要求1.8,IDE随意,另外还要有Spigot的服务端,将服务端以库的形式导入到IDE即可。
比方说IDEA:文件 > 项目结构 > 项目设置 > 模块 来导入,导入后勾选导出选项。
13160207.png

入口类

现在我们随意取个名字,新建个类:

package com.yeziruo.mc.test;

import org.bukkit.plugin.java.JavaPlugin;

public class MainClass extends JavaPlugin {
    //服务器开启时执行
    public void onEnable() {
        super.onEnable();
    }

    //服务器关闭时执行
    public void onDisable() {
        super.onDisable();
    }
}

接着新建一个叫plugin.yml的文件,填写如下内容:

//名称,入口点,版本(打包时请删除本行说明)
name: Test
main: com.yeziruo.mc.test.MainClass
version: 0.0.1

接着打包,不同IDE方式不同,以IDEA为例:文件 > 项目结构 > 项目设置 > 工件 里添加。
13161101.png
并点击绿色箭头的加号,添加模块输出与plugin.yml文件,之后点击构建菜单下的构建工件,等打包完成后扔进服务端测试即可。

监听器

上面的例子只会在控制台有有一行输出罢了,下面我们做一个简单的欢迎插件,当玩家进入服务器后向其发送欢迎信息。
新建一个类,名称随意。

package com.yeziruo.mc.test;

//颜色
import org.bukkit.ChatColor;
//玩家对象
import org.bukkit.entity.Player;
//监听器头
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
//玩家加入事件
import org.bukkit.event.player.PlayerJoinEvent;

public class Welcome implements Listener {
    @EventHandler
    //on加监听器名去Event
    //监听器均在org.bukkit.event下,具体用法请翻阅文档
    public void onPlayerJoin(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        player.sendMessage(ChatColor.GREEN + "欢迎加入," + player.getName() + "!");
    }
}

回到入口类,在onEnable中添加一行:

this.getServer().getPluginManager().registerEvents(new Welcome(), this);

第一个个命令

同样新建一个类,名称随意。

package com.yeziruo.mc.test;

import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

public class PlayerCommand implements CommandExecutor {
    public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) {
        //commandSender 执行实体(比方说玩家) strings 参数
        //if(strings.length == 0) return false;
        commandSender.sendMessage("PONG!");
        //成功执行返回true,否则返回false
        return true;
    }
}

当然,同样要注册命令,首先在plugin.yml下面添加:

//记得删除注释
commands:
  //命令名
  ping:
    //介绍
    description: Return PONG!
    //用法
    usage: /ping

然后又回到入口类,在onEnable中添加一行:

//命令节点名与执行类
this.getCommand("ping").setExecutor(new PlayerCommand());

同样打包,在服务器中输入/ping即可看到回复。

最后

SpigotMC JavaDoc:
https://hub.spigotmc.org/javadocs/spigot/index.html

如果要实时计算或产生效果,可以建个线程来跑。

摸了!
博客现在在缓慢更新中,没有嗝屁!

与同学合租服使用的简单工具。

const start_comm = ['-jar','minecraft_server.jar'];
const ws = require('nodejs-websocket');
// exec(),spawn(),fork()
// 参考:https://www.cnblogs.com/chyingp/p/node-learning-guide-child_process.html
const mcprocess = require('child_process').spawn('java',start_comm);
var client = null;
var process = true;
function mcprocess_log(log){
        console.log(String(log));
        if(client){
                client.sendText(String(log));
        }
}
mcprocess.stdout.on('data',mcprocess_log); // 输出/错误事件绑定
mcprocess.stdout.on('data',mcprocess_log);
mcprocess.on('exit',(code) => process = false); // 子进程退出事件
var server = ws.createServer(function(conn){
        client = conn;
        conn.on('text',function(str){ // 消息事件
                console.log(str);
                if(process){
                        conn.sendText(str + '\n');
                        mcprocess.stdin.write(str + '\n');
                }else{
                        conn.sendText('服务器未开启\n');
                }
        });
        conn.on('close',function(code,reason){ // 断开事件
                console.log('客户端断开连接');
                client = null;
        });
}).listen(8080);
console.log('start...');

Html还是和上几篇文章一样:

<title>WebSockets Test</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script type="text/javascript">
var ws = new WebSocket("ws://server_ip:8080/");
ws.onmessage = function(msg){
        $('.message').append("<p>" + msg.data + "</p>");
}
ws.onclose = function(){
        $('.message').append("<p>Connection closed</p>");
}
function sendmsg(){
        var msg = $("#msg").val();
        ws.send(msg);
}
</script>
<div class='message'></div>
<textarea id="msg"></textarea>
<button type="but" onclick="sendmsg()">Send</button>

实际上服务器上使用的是我写的另外一个Python版本的,与Nodejs不同的是我需要新建一个线程去关注服务器核心的输出,所以简单尝试了Nodejs。

71_0.png