拼写滚动器不起作用

Spell Scroller doesn't work

我正在制作一个 MagicBows 插件,你可以通过左键单击 select 法术,如果你射弓,selected 法术会产生效果,但是 select 或不起作用。我不确定如何解决这个问题。

这是我的主文件:

package me.Pixel;

import java.util.ArrayList;
import java.util.List;

import org.bukkit.ChatColor;
import org.bukkit.Effect;
import org.bukkit.Material;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.entity.EntityShootBowEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin implements Listener {
    public Main plugin;
    public List<String> spells = new ArrayList<String>();
    public getTargets getTargets = new getTargets();
    private Arrow arrow;
    public LightningShot LightningShot = new LightningShot(arrow);
    public ExplosionShot ExplosionShot = new ExplosionShot(arrow);

    @Override
    public void onEnable() {    
        plugin = this;
        this.getServer().getPluginManager().registerEvents(this, this);
        getCommand("bow").setExecutor(new BowCommand());
        spells.add("LightningShot");
        spells.add("ExplosionShot");
    }

    @EventHandler
    public void onEntityShootBow(EntityShootBowEvent event) {
        if(event.getProjectile() instanceof Arrow) {
            Arrow arrow = (Arrow) event.getProjectile();
            new LightningShot(arrow).runTaskTimer(this, 0, 1);
        }
    }       

    @EventHandler
    public void onEntityShootBow1(EntityShootBowEvent event) {
        if(event.getProjectile() instanceof Arrow) {
            Arrow arrow = (Arrow) event.getProjectile();
            new ExplosionShot(arrow).runTaskTimer(this, 0, 1);
        }
    }

    @EventHandler
    public void onClick(PlayerInteractEvent e) {
        if(e.getAction() == Action.LEFT_CLICK_AIR || e.getAction() == Action.LEFT_CLICK_BLOCK) {
            Player p = e.getPlayer();
            ItemStack stack = p.getItemInHand();
            if(stack != null && stack.getType() == Material.BOW && stack.hasItemMeta() && stack.getItemMeta().getDisplayName().equals(ChatColor.RED + "Bow")) {
                int SpellSelected = stack.getDurability();
                if (SpellSelected < 2) {
                    stack.setDurability((short) (SpellSelected + 1));
                    p.getWorld().playEffect(p.getLocation(), Effect.STEP_SOUND, ParticleEffect.SNOW_SHOVEL);
                } else {
                    stack.setDurability((short) 0);
                }
                ChatUtilities.sendMessage(p, "Selected: " + spells.get(SpellSelected));
            }
        }
        if(e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK) {
            Player p = e.getPlayer();
            ItemStack stack = p.getItemInHand();
            if(stack != null && stack.getType() == Material.BOW && stack.hasItemMeta() && stack.getItemMeta().getDisplayName().equals(ChatColor.RED + "Bow")) {
                int SpellSelected = stack.getDurability();
                if(SpellSelected == 1) {
                    this.LightningShot.run();
                } else if (SpellSelected == 2) {
                    this.ExplosionShot.run();
                }
            }
        }
    }
}

这是我的第一个法术:LightningShot

package me.Pixel;

import org.bukkit.entity.Arrow;
import org.bukkit.scheduler.BukkitRunnable;

public class LightningShot extends BukkitRunnable {
    private Arrow arrow;
    private int tick = 1;

    public LightningShot(Arrow arrow) {
        this.arrow = arrow;
    }

    @Override
    public void run() {
        if (arrow == null || arrow.isOnGround() || tick++ > 20 * 10) {
            this.cancel();
        } else {
            arrow.getWorld().strikeLightning(arrow.getLocation());
        }
    }
}

这是我的第二个咒语:ExplosionShot(我正在尝试制作 "explosion wave")

package me.Pixel;

import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.entity.Arrow;
import org.bukkit.scheduler.BukkitRunnable;

public class ExplosionShot extends BukkitRunnable {
    private Arrow arrow;
    private int tick = 1;

    public ExplosionShot(Arrow arrow) {
        this.arrow = arrow;
    }

    @Override
    public void run() {
        if (arrow == null || arrow.isOnGround() || tick++ > 20 * 10) {
            this.cancel();
        } else {
            arrow.getWorld().createExplosion(arrow.getLocation(), 1);
            FireworkEffect.builder().with(Type.BALL).withColor(Color.AQUA).withFade(Color.FUCHSIA).flicker(true).trail(true);
        }
    }
}

此外,不知何故 ExplosionShotLightningShot 结合在一起,所以 LightningShot 在箭的轨迹上爆炸了?

因此,如果用户单击鼠标右键,聊天中应该会显示一条消息:

[X] (this is my chat utility so this is nothing to worry about) Selected: LightningShot

如果他们再次单击鼠标右键:

[X] Selected: ExplosionShot

然后它应该创建这个 "explosion wave",因为它跟随箭头,但我无法让滚动条工作。

我建议您不要使用 BukkitRunnable,而是创建一个新的抽象 class(ArrowSpell?)并使 LightningShot 和 ExplosiveShot 扩展 class。您可以向 ArrowSpell 添加 LightningShot 和 ExplosiveShot 必须实现的抽象方法,例如它不监听但传递给它的 onShoot(EntityShootBowEvent) 或 onHit(EntityDamageByEntityEvent)。我实际上做了类似的事情,你可以在这里看到一个例子: https://github.com/ViperLordX/Divinity/tree/master/src/redempt/divinity/ability/modifier

这样,您就不需要使用 BukkitRunnable,在我看来,这是一种非常笨拙的做法。