对我看过的教程有疑问

时间:2017-08-06 07:46:23

标签: java minecraft bukkit

我想知道什么是" 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);
                }
            }
        }   
    }   
}

2 个答案:

答案 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

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

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

  1. 即使移动鼠标,也会调用PlayerMoveEvent,即很多次。你应该检查一下,确保他们正在进入另一个街区,并且他们先拿着发光石。
  2. Combat Update开始,添加了Dual Wielding,因此将getItemInHand()标记为已弃用。您应该使用Player#getInventory().getItemInMainHand();Player#getInventory().getItemInOffHand();来获取该项目。
  3. As recommended by the wiki,您应该使用BukkitRunnable代替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(){...}