我遇到了问题,并且是制作Minecraft插件和编写代码的新手。
我正在尝试制作一个在执行第二个命令之前需要等待约15秒的插件,但是我尝试执行的代码(插件,新的Runnable())现在出现了错误。人们说那是因为我的Main班上没有这个问题,问题是我不想在Main上。所以我想知道要做什么才能做到这一点。
下面的代码。在此先感谢您提供的任何帮助。 〜石头
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (sender instanceof Player){
//checks to see if player sent command
Player player = (Player) sender;
if (args.length >= 1) {
//too many arguments message
player.sendMessage(Utils.chat("&4There were too many arguments, I could not complete that command"));
}
if (player.hasPermission("reloadc.use")) {
//reloads server, sends message, and stores variable value
Bukkit.broadcastMessage(Utils.chat("&6Server will be reloaded in 15 seconds by &5" + player.getDisplayName()));
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
public void run() {
Bukkit.broadcastMessage(Utils.chat("&6This works"));
}
}, 20L);
Bukkit.broadcastMessage(Utils.chat("&6IT WORKED!!!!!"));
}
else if (!player.hasPermission("reloadc.use")) {
player.sendMessage(Utils.chat("&4You do not have permission to reload the server"));
player.sendMessage(Utils.chat("&5If you belive this is a mistake please contact an admin"));
}
}
return true;
}
}
给我带来麻烦的代码就在这里(单词插件)
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
public void run() {
Bukkit.broadcastMessage(Utils.chat("&6This works"));
}
}, 20L);
这里有3张图像,它带有错误信息。我没有做的唯一更改是getServer()。因为它给了我更多的错误,并且至少从我所能告诉的情况来看,没有做任何改善。
好,所以我已经完成了更改,所有内容都表明它可以正常工作,但是现在当我运行我设置的命令时,它会执行所有操作,除了等待15秒。它一个接一个地执行文本,告诉我它将在15秒内重新加载,然后同时告诉我它可以工作。现在对我来说似乎没有什么错,它只是说它运行良好,我的等待时间是300L,这是服务器的滴答声。那应该等于15。
以下完整代码的图片。
答案 0 :(得分:0)
响应您的更新/编辑:
发生错误是因为您使用plugin
对您的代码没有任何意义。您需要先将其声明为变量,然后再在其中使用,或者假设您在一个类中为插件编写了所有代码,然后可以像这样{{1}那样轻松地将plugin
替换为this
}。
如果它在另一个类中,则要声明该变量,您需要将其从另一个类传递或从您的Main插件类中调用。下面将向您展示如何将其传递给您的侦听器类。
在您的主插件类中,您需要执行此操作,请注意我们如何将Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
添加到调用命令类this
的函数中,请注意您的类将具有与{{1 }}:
new CommandClass(this)
然后在命令类中,我们对其进行修改以接收变量CommandClass
:
public class Main extends JavaPlugin{
@Override
public void onEnable(){
new CommandClass(this);
}
}
现在,您的onCommand方法将起作用,因为您在类中引用了public CommandClass(Main plugin)
:
public class CommandClass implements CommandExecutor{
private Main plugin;
public CommandClass(Main plugin){
this.plugin = plugin;
}
}
原始答案进行了一些编辑,以包括对屏幕截图的一些回复:
我可以看到四个问题:
plugin
。@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
@Override
public void run() {
Bukkit.broadcastMessage(Utils.chat("&6This works"));
}
}, 300L);
}
批注,但这对于可运行的任务非常重要。plugin
代替@Override
,以防万一您的代码中发生了一些奇怪的情况,并且您设法启动了多个服务器实例。这是您的代码的更新版本,其中固定了1和3:
getServer().getScheduler()
这是您代码的更新版本,其中包含建议4:
Bukkit.getScheduler()