我在向Minecraft的Bukkit服务器发送命令时遇到了问题。 我的代码完全适用于Vanilla,但是当我尝试使用Bukkit时,它似乎不再需要工作了。我仍然可以收到服务器的所有输出,我只能发送命令,如"帮助"或者"停止。" 这是我处理服务器线程的类。
public class Sender{
ConsoleWriter cWriter = new ConsoleWriter();
private BufferedWriter writer;
private OutputStreamWriter out;
public void execute(){
this.ui = ui;
try{
ProcessBuilder pb = new ProcessBuilder(path_to_server+"launch.bat");
Process process = pb.start();
StreamGobbler sgError = new StreamGobbler(process.getErrorStream());
new Thread( sgError ).start();
out = new OutputStreamWriter(process.getOutputStream());
writer = new PrintWriter(out);
} catch ( IOException e ){
e.printStackTrace();
}
}
private class StreamGobbler implements Runnable
{
private InputStream is;
public StreamGobbler( InputStream is ){
this.is = is;
}
@Override
public void run() {
try {
InputStreamReader isr = new InputStreamReader( is );
BufferedReader br = new BufferedReader( isr );
String line = null;
while ( ( line = br.readLine() ) != null ){
cWriter.writer(line, ui);
}
} catch ( IOException e ){
e.printStackTrace();
}
}
}
}
那么这里发生了什么?为什么它适用于Vanilla而不是Bukkit?
谢谢!
答案 0 :(得分:1)
Vanilla
代码与Bukkit
代码完全不同。对于您必须使用的命令
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
因此,如果你想创建一个简单的Say命令(因为help
并且stop
已经包含在bukkit中),你可以这样做:
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
if(cmd.getName().equalsIgnoreCase("say")){
if(args.length != 0){
Bukkit.getServer().broadcastMessage(args);
}
return true;
}
return false;
}
您还必须创建一个plugin.yml
文件,并使用
commands:
say:
description: Say something
usage: /say
学习Bukkit API的一个好方法是访问这些网站:
官方Bukkit插件教程:http://wiki.bukkit.org/Plugin_Tutorial
Bukkit API文档:http://jd.bukkit.org/dev/apidocs/
同样,Bukkit与Vanilla有所不同,因此您必须修改几乎所有代码。祝你好运!