2016-05-14 3 views
-2

Alles, was sich geändert hat, ist hier drin. Bitte helfen Sie mir Blitz nicht an der Pfeile Standort Laich jedem TickSkelette können mein Plugin benutzen?

Hauptdatei

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(); 
       } 
      } 
     } 
    } 
} 

Und meine LightningShot Datei

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()); 
     } 
    } 
} 

So hoffe ich Sie mir helfen können, um es zu arbeiten. Dies ist der neue Code.

+0

Sie haben Lesen Sie meinen Kommentar zu einem anderen Ihrer [Frage] (http://stackoverflow.com/questions/36954963/spell-scroller-doesnt-work) s? Stoppt den Missbrauch von Stack Snippets, bitte! – bcsb1001

Antwort

1

Wenn Sie, wenn der Bogen überprüfen möchten, war der Pfeil-Shooting von einem „Magic Bow“ ist, können Sie die ItemStack des Bow am EntityShootBowEvent bekommen: event.getBow(). Jetzt können Sie nachsehen, ob der Name des Bogens beim Ereignis dem Namen des Bogens entspricht, den Sie dem Spieler beim Befehl "/ Bogen" gegeben haben.

Hoffnung, dies hilft Ihnen :) Und sorry für mein schlechtes Englisch; D

EDIT: Gefällt Ihnen dieses

@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); 
      } 
     } 
    } 
} 

EDIT # 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); 
     } 
    } 
} 

Sie können das Intervall ändern, um zu ändern, wie oft ein Lightning generiert wird.

EDIT # 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); 
    } 
} 

Beide sind die volle Klassen I verwendet und es funktionierte ...

+0

Man du bist eine tolle Person: P und dein Englisch ist in Ordnung xD – Pixel

+0

Kein Problem und danke :) Können Sie bitte meine Antwort als richtig markieren ?! – Nightfighter001

+0

Ich habe es jetzt so gemacht. @EventHandler public void onEntityShootBow (EntityShootBowEvent event) { if (event.getProjectile() instanceof Pfeil) { \t wenn return ((event.getBow() instanceof Plugin)!); Pfeil Pfeil = (Pfeil) event.getProjectile(); neuer LightningShot (Pfeil) .runTaskTimer (this, 0, 1); } } – Pixel

Verwandte Themen