私は左クリックをして呪文を選択できるMagicBowsプラグインを作っています。弓を撃った場合、選択した呪文は効果を発揮しますが、セレクタは機能しません。私はこれをどのように修正するか分からない。呪文スクロールが機能しない
これは私のメインファイルです:
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();
}
}
}
}
}
そして、これが私の最初の呪文です:
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());
}
}
}
をLightningShotそして、これは私の第二の呪文です:ExplosionShot
(私は「爆発を作るしようとしています波 ")
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](これはので、これは何も心配することはありません私のチャットユーティリティです)選択:LightningShot
そして彼らは再び自分のマウスの右ボタンをクリックした場合:
を[X] [選択:ExplosionShot
そして、この "爆発波"が矢印のように作成されるはずですが、スクロールが動作するようにはできません。
'onEntityShootBow'と' onEntityShootBow1'メソッドは両方とも同じ 'EntityShootBowEvent'をリッスンします。そのため、両方のタイプのタスクが実行されています。私があなたを正しく理解していれば、右クリックすると呪文の間を行き来することになります。このタスクが何を伴うのか、ここで何が関係しているのか考えてみましょう。あなたは、プレーヤーが右クリックする時を把握する必要があります。あなたは、プレイヤーがどこかで選んだ呪文の種類を保存する必要があります。次に、プレイヤーが右クリックすると、自分が選択した呪文を見つけて適切なタスクを実行します。 –
@AdrianSohnだから、これを修正するためにメインファイルで何を変更するのですか? – Pixel
この時点では、私はスプーンであなたにコードを提供するように思えます。これはあなたが学ぶのを助けないでしょうし、私が知る限り、どのようなスタックオーバーフローがあるのでしょうか。あなたは問題を解決するために必要なすべてのものを持っているように思えます:あなたはイベントを登録する方法を知っていて、呪文のリストを持っています。つまり、いくつかのデータ構造を知っています。スタックオーバーフローは、*特定の*問題を解決するためのものでなければならない(最後の手段)(http://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack-overflow-users) 。 –