对我看到的教程有疑问



我想知道getInstance((附近的"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);
}
}
}   
}   
}

方法Scheduler#runTaskLater(plugin, runnable, delay)将插件的 Main 类(扩展 JavaPlugin 的类(作为第一个参数,以便它可以管理任务(即在插件被禁用时取消它(

但是,不建议使用静态 getInstance(( 来获取主类,您应该更喜欢使用本答案中概述的依赖注入。


不是主要讨论的一部分,但:

以下是该代码的一些优化提示:

  1. 即使移动鼠标,即多次,也会调用 PlayerMoveEvent。你应该检查一下,确保他们正在进入另一个街区,并且他们首先拿着发光石。
  2. 在战斗更新中,添加了双持,因此getItemInHand((被标记为已弃用。您应该使用Player#getInventory().getItemInMainHand();Player#getInventory().getItemInOffHand();来获取该项目。
  3. 根据维基的建议,你应该使用BukkitRunnable而不是Scheduler#runTaskLater();
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(){...}

最新更新