我想知道什么是" Magic"靠近getInstance()。我在回答这个问题(Setting the block underneath any player to glowstone, then setting it back to the original material)的回答中找到了它,所以我想知道Magic是什么,因为它不起作用以及如何解决它。魔法无法解决是错误所说的。
package me.deltarift.walkonwater;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.plugin.java.JavaPlugin;
public class WalkOnWater extends JavaPlugin {
@EventHandler
public void onStep(PlayerMoveEvent pme) {
Player player = pme.getPlayer();
final Block block = player.getLocation().subtract(0, 1, 0).getBlock();
final Material type = block.getType();
if(!type.equals(Material.GLOWSTONE)){
@SuppressWarnings("deprecation")
Material m = player.getItemInHand().getType();
if (m == Material.GLOWSTONE) {
if(type.isSolid()) {
block.setType(Material.GLOWSTONE);
Bukkit.getScheduler().runTaskLater(Magic.getInstance(), new Runnable(){
public void run(){
block.setType(type);
}
},10L);
}
}
}
}
}
答案 0 :(得分:3)
方法Scheduler#runTaskLater(plugin, runnable, delay)
takes the Main class of your plugin (The one that extends JavaPlugin) as the first argument以便它可以管理任务(即在禁用插件时取消它)
但是,不建议使用静态getInstance()来获取主类,并且您更应该使用dependency injection回答中所述的this。
不是主要讨论的一部分,但是:
以下是该代码的一些优化提示:
Player#getInventory().getItemInMainHand();
或Player#getInventory().getItemInOffHand();
来获取该项目。Scheduler#runTaskLater();
答案 1 :(得分:0)
Magic.getInstance()
是在原始用户自己的插件中引用名为Magic
的主类的静态尝试。要在您自己的插件中使用此代码,只需将Magic.getInstance()
替换为对您自己的主类的正确实例的引用。
如果此代码已经在您的主类中,您只需使用this
,如下所示:
Bukkit.getScheduler().runTaskLater(this, new Runnable(){...}
否则,您可以将主类传递给类构造函数,其中“Main”是主类的名称:
Main plugin;
public class SecondaryClass {
SecondaryClass(Main plugin) {
this.plugin = plugin;
}
}
...然后像这样引用它:
Bukkit.getScheduler().runTaskLater(plugin, new Runnable(){...}