2016-05-14 67 views
-2

改變的一切都在這裏。請幫我在閃電的箭頭位置的每個刻度不產卵骨架可以使用我的插件?

主文件

package me.Pixel; 

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

import org.bukkit.ChatColor; 
import org.bukkit.Material; 
import org.bukkit.command.Command; 
import org.bukkit.command.CommandSender; 
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.inventory.meta.ItemMeta; 
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); 

    @Override 
    public void onEnable() {  
     plugin = this; 
     this.getServer().getPluginManager().registerEvents(this, this); 
     spells.add("LightningShot"); 
    } 

    @Override 
    public boolean onCommand(CommandSender sender, Command command, 
      String label, String[] args) { 
     if(label.equalsIgnoreCase("bow")) { 
      if(!(sender instanceof Player)) { 
       sender.sendMessage(ChatColor.RED + "You need to be an in-game player to execute this command!"); 
      }else{ 
       Player p = (Player)sender; 
       if(sender.hasPermission("bow.bow")) { 
       ItemStack stack = new ItemStack(Material.BOW); 
       ItemMeta stackMeta = stack.getItemMeta(); 
       stackMeta.setDisplayName(ChatColor.AQUA + "Magic" + ChatColor.RED + "Bow"); 
       stack.setItemMeta(stackMeta); 
       p.getInventory().addItem(stack); 
       ChatUtilities.sendMessage(p, "You now have the powerfull Magic Bow"); 
       }else{ 
        sender.sendMessage(ChatColor.RED + "No Permission!"); 
       } 
      } 
     } 
     return false; 
    } 

    @SuppressWarnings("deprecation") 
    @EventHandler 
    public void onEntityShootBow(EntityShootBowEvent ev) { 
     if (ev.getProjectile() instanceof Arrow) { 
      Arrow a = (Arrow) ev.getProjectile(); 
      if (a.getShooter() instanceof Player) { 
       ItemStack bow = ev.getBow(); 
       if (bow.hasItemMeta() && bow.getItemMeta().getDisplayName().equals(ChatColor.AQUA + "Magic" + ChatColor.RED + "Bow")) { 
       new LightningShot(a); 
       } 
      } 
     } 
    } 

    @EventHandler 
    public void onClick(PlayerInteractEvent e) { 
     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.AQUA + "Magic" + ChatColor.RED + "Bow")) { 
       int SpellSelected = stack.getDurability(); 
       if(SpellSelected == 1) { 
        this.LightningShot.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()); 
     } 
    } 
} 

所以我希望你能幫助我得到它的工作。 這是所有新代碼。

+0

有你閱讀我對你的[問題](http://stackoverflow.com/questions/36954963/spell-scroller-doesnt-work)的另一個評論嗎?請停止濫用Stack Snippets! – bcsb1001

回答

1

如果你想檢查弓,箭從射擊是一個「魔術弓」,你可以得到弓的ItemStackEntityShootBowEventevent.getBow()。現在,您可以查看事件中弓的名稱是否等於您在「/弓」命令中給予玩家的弓的名稱。

希望這有助於你:)而我的英語不好對不起; d

編輯: 像這樣

@EventHandler 
public void onEntityShootBow(EntityShootBowEvent ev) { 
    if (ev.getProjectile() instanceof Arrow) { 
     Arrow a = (Arrow) ev.getProjectile(); 
     if (a.getShooter() instanceof Player) { 
      ItemStack bow = ev.getBow(); 
      if (bow.hasItemMeta() && bow.getItemMeta().getDisplayName().equals(ChatColor.AQUA + "Magic" + ChatColor.RED + "Bow")) { 
       System.out.println("Launching LightningShot..."); 
       new LightningShot(arrow).runTaskTimer(this, 0, 1); 
      } 
     } 
    } 
} 

編輯#2:

LightningShot.java:

package me.Pixel; 

import org.bukkit.Bukkit; 
import org.bukkit.Location; 
import org.bukkit.entity.Arrow; 
import org.bukkit.scheduler.BukkitTask; 

public class LightningShot { 
    private static int interval = 5; 

    Arrow arrow; 
    int tick = interval; 

    public LightningShot(Arrow a) { 
     arrow = a; 

     BukkitTask[] task = new BukkitTask[1]; 
     task[0] = Bukkit.getScheduler().runTaskTimerAsynchronously(Main.plugin, new Runnable() { 
      @Override 
      public void run() { 
       if (arrow == null || arrow.isOnGround() || arrow.isDead() || tick >= 200) { 
        System.out.println("Stopping..."); 
        task[0].cancel(); 
       } else { 
        tick += interval; 
        System.out.println("Launching Lightning..."); 
        Location loc = arrow.getLocation(); 
        System.out.println("At " + loc.getWorld().getName() + " " + loc.getX() + "/"+ loc.getY() + "/" + loc.getZ()); 
        loc.getWorld().strikeLightning(arrow.getLocation()); 
       } 
      } 
     }, interval, interval); 
    } 
} 

EntityShootBowEvent:

@EventHandler 
public void onEntityShootBow(EntityShootBowEvent ev) { 
    if (ev.getProjectile() instanceof Arrow) { 
     Arrow a = (Arrow) ev.getProjectile(); 
     if (a.getShooter() instanceof Player) { 
      System.out.println("Launching LightningShot..."); 
      new LightningShot(a); 
     } 
    } 
} 

您可以更改間隔以更改閃電產生的頻率。

編輯#3:

Main.java

package me.Pixel; 

import java.util.HashSet; 
import java.util.Set; 

import org.bukkit.ChatColor; 
import org.bukkit.Material; 
import org.bukkit.command.Command; 
import org.bukkit.command.CommandSender; 
import org.bukkit.entity.Arrow; 
import org.bukkit.entity.Player; 
import org.bukkit.event.EventHandler; 
import org.bukkit.event.Listener; 
import org.bukkit.event.entity.EntityShootBowEvent; 
import org.bukkit.inventory.ItemStack; 
import org.bukkit.inventory.meta.ItemMeta; 
import org.bukkit.plugin.java.JavaPlugin; 

public class Main extends JavaPlugin implements Listener { 
    public static Main plugin; 
    public Set<String> spells = new HashSet<String>(); 

    @Override 
    public void onEnable() { 
     plugin = this; 
     this.getServer().getPluginManager().registerEvents(this, this); 
     spells.add("LightningShot"); 
    } 

    @Override 
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { 
     if (label.equalsIgnoreCase("bow")) { 
      if (!(sender instanceof Player)) { 
       sender.sendMessage(ChatColor.RED + "You need to be an in-game player to execute this command!"); 
      } else { 
       Player p = (Player) sender; 
       if (sender.hasPermission("bow.bow")) { 
        ItemStack stack = new ItemStack(Material.BOW); 
        ItemMeta stackMeta = stack.getItemMeta(); 
        stackMeta.setDisplayName(ChatColor.AQUA + "Magic" + ChatColor.RED + "Bow"); 
        stack.setItemMeta(stackMeta); 
        p.getInventory().addItem(stack); 
        p.sendMessage("You now have the powerfull Magic Bow"); 
       } else { 
        sender.sendMessage(ChatColor.RED + "No Permission!"); 
       } 
      } 
     } 
     return false; 
    } 

    @EventHandler 
    public void onEntityShootBow(EntityShootBowEvent ev) { 
     if (ev.getProjectile() instanceof Arrow) { 
      Arrow a = (Arrow) ev.getProjectile(); 
      if (a.getShooter() instanceof Player) { 
       ItemStack bow = ev.getBow(); 
       if (bow.hasItemMeta() && bow.getItemMeta().getDisplayName() 
         .equals(ChatColor.AQUA + "Magic" + ChatColor.RED + "Bow")) { 
        new LightningShot(a); 
       } 
      } 
     } 
    } 
} 

LightningShot.java

package me.Pixel; 

import org.bukkit.Bukkit; 
import org.bukkit.Location; 
import org.bukkit.entity.Arrow; 
import org.bukkit.scheduler.BukkitTask; 

public class LightningShot { 

    Arrow arrow; 
    int tick = 3; 

    public LightningShot(Arrow a) { 
     arrow = a; 

     BukkitTask[] task = new BukkitTask[1]; 
     task[0] = Bukkit.getScheduler().runTaskTimerAsynchronously(Main.plugin, new Runnable() { 
      @Override 
      public void run() { 
       if (arrow == null || arrow.isOnGround() || arrow.isDead() || tick >= 200) { 
        task[0].cancel(); 
       } else { 
        tick += 1; 
        Location loc = arrow.getLocation(); 
        loc.getWorld().strikeLightning(arrow.getLocation()); 
       } 
      } 
     }, 3, 1); 
    } 
} 

兩個都是我用了全類和它的工作...

+0

男人你是一個了不起的人:P和你的英語很好thD xD – Pixel

+0

沒問題,謝謝你:)你能否標記我的答案是正確的比?! – Nightfighter001

+0

我現在這樣做了。 @EventHandler 公共無效onEntityShootBow(EntityShootBowEvent事件){ 如果(event.getProjectile()的instanceof箭頭){ \t如果 回報((event.getBow()的instanceof插件)!);箭頭=(箭頭)event.getProjectile(); 新的LightningShot(箭頭).runTaskTimer(this,0,1); }} 哦 – Pixel

相關問題