拼写滚动器不起作用
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);
}
}
}
此外,不知何故 ExplosionShot
和 LightningShot
结合在一起,所以 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,在我看来,这是一种非常笨拙的做法。
我正在制作一个 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);
}
}
}
此外,不知何故 ExplosionShot
和 LightningShot
结合在一起,所以 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,在我看来,这是一种非常笨拙的做法。