2016-04-30 8 views
-1

私は左クリックをして呪文を選択できる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); 
     } 
    } 
} 

また、何とかExplosionShotLightningShotが結合しているので、LightningShotは矢印の跡に爆発を起こしていますか?

ユーザーがマウスの右ボタンをクリックした場合だと言うのチャットでメッセージがあるはずです:

[X](これはので、これは何も心配することはありません私のチャットユーティリティです)選択:LightningShot

そして彼らは再び自分のマウスの右ボタンをクリックした場合:

を[X] [選択:ExplosionShot

そして、この "爆発波"が矢印のように作成されるはずですが、スクロールが動作するようにはできません。

+0

'onEntityShootBow'と' onEntityShootBow1'メソッドは両方とも同じ 'EntityShootBowEvent'をリッスンします。そのため、両方のタイプのタスクが実行されています。私があなたを正しく理解していれば、右クリックすると呪文の間を行き来することになります。このタスクが何を伴うのか、ここで何が関係しているのか考えてみましょう。あなたは、プレーヤーが右クリックする時を把握する必要があります。あなたは、プレイヤーがどこかで選んだ呪文の種類を保存する必要があります。次に、プレイヤーが右クリックすると、自分が選択した呪文を見つけて適切なタスクを実行します。 –

+0

@AdrianSohnだから、これを修正するためにメインファイルで何を変更するのですか? – Pixel

+0

この時点では、私はスプーンであなたにコードを提供するように思えます。これはあなたが学ぶのを助けないでしょうし、私が知る限り、どのようなスタックオーバーフローがあるのでしょうか。あなたは問題を解決するために必要なすべてのものを持っているように思えます:あなたはイベントを登録する方法を知っていて、呪文のリストを持っています。つまり、いくつかのデータ構造を知っています。スタックオーバーフローは、*特定の*問題を解決するためのものでなければならない(最後の手段)(http://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack-overflow-users) 。 –

答えて

-1

BukkitRunnableを使用する代わりに、新しい抽象クラス(ArrowSpell?)を作成し、LightningShotとExplosiveShotでそのクラスを拡張することをお勧めします。 onShoot(EntityShootBowEvent)やonHit(EntityDamageByEntityEvent)など、LightningShotとExplosiveShotが実装する必要があるArrowSpellに抽象メソッドを追加できます。私は実際に似たような、あなたはここで例を見ることができなかった。 https://github.com/ViperLordX/Divinity/tree/master/src/redempt/divinity/ability/modifier

この方法で、あなたは私が見たものから、あるBukkitRunnable、それを行うのは非常に厄介な方法を使用する必要はありません。

+0

ありがとう、あまりにも – Pixel

+0

問題ない、私は助けることができてうれしいです。 – ViperLordX

+0

繰り返しタスクなしで、エンティティの場所に繰り返しエフェクトを発生させるにはどうすればよいでしょうか?あなたのクラスにはonTick()メソッドがあり、これは 'BukkitRunnable'以外から呼び出されるでしょうか? –

関連する問題