2016-04-30 4 views
-1

Ich mache ein MagicBows-Plugin, wo Sie Sprüche auswählen können, indem Sie mit der linken Maustaste klicken und wenn Sie den Bogen schießen wird der ausgewählte Zauber seinen Effekt, aber der Selektor funktioniert nicht. Ich bin mir nicht sicher, wie ich das beheben soll.Spell Scroller funktioniert nicht

Das ist meine Hauptdatei:

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

Und dies ist mein erster Zauber: 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()); 
     } 
    } 
} 

Und das ist mein zweiter Zauber: ExplosionShot (Ich versuche, eine „Explosion zu machen Welle ")

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

auch irgendwie die ExplosionShot und LightningShot kombinieren, also hat der LightningShot Explosionen auf dem Weg des Pfeils?

Also, wenn ein Benutzer die rechte Maustaste klickt es sollte eine Nachricht im Chat sein, der sagt:

[X] (dieses Dienstprogramm mein Chat ist so dies nichts zu befürchten ist) ausgewählt: LightningShot

Und wenn sie ihre rechte Maustaste erneut auf:

[X] Ausgewählt: ExplosionShot

Und dann sollte es diese "Explosionswelle" erstellen, da es dem Pfeil folgt, aber ich kann den Scroller nicht zum Arbeiten bringen.

+0

Ihre 'onEntityShootBow' - und' onEntityShootBow1'-Methoden hören sich beide das gleiche 'EntityShootBowEvent' an, weshalb beide Arten von Aufgaben ausgeführt werden. Wenn ich dich richtig verstehe, willst du beim Klicken mit der rechten Maustaste zwischen den Zaubern wechseln. Denken Sie darüber nach, was diese Aufgabe mit sich bringt, worum geht es hier? Sie müssen herausfinden, wann der Spieler mit der rechten Maustaste klickt. Sie müssen speichern, welche Art von Zauberspruch der Spieler irgendwo ausgewählt hat. Wenn der Spieler dann mit der rechten Maustaste klickt, ermitteln Sie, welchen Zauberspruch er ausgewählt hat, und führen Sie die entsprechende Aufgabe aus. –

+0

@AdrianSohn Also, was ändere ich in der Hauptdatei, um das zu beheben? – Pixel

+0

An diesem Punkt scheint es, als würde ich Ihnen den Code spoon-füttern, der Ihnen nicht helfen wird zu lernen und ist nicht, soweit ich weiß, wofür Stack Overflow ist. Sie scheinen alles zu haben, was Sie brauchen, um das Problem zu lösen: Sie wissen, wie man Ereignisse registriert, und Sie haben eine Liste von Sprüchen, was bedeutet, dass Sie einige Datenstrukturen kennen. Stack Overflow sollte für die Lösung von * spezifischen * Problemen die letzte Lösung sein (http://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack-overflow-users) . –

Antwort

-1

Ich schlage vor, dass Sie statt einer BukkitRunnable eine neue abstrakte Klasse (ArrowSpell?) Erstellen und LightningShot und ExplosiveShot diese Klasse erweitern. Sie können ArrowSpell abstrakte Methoden hinzufügen, die LightningShot und ExplosiveShot implementieren müssen, z. B. onShoot (EntityShootBowEvent) oder onHit (EntityDamageByEntityEvent), auf die es nicht wartet, aber an sie übergeben wird. Ich habe tatsächlich etwas ähnliches, können Sie hier ein Beispiel sehen: https://github.com/ViperLordX/Divinity/tree/master/src/redempt/divinity/ability/modifier

Auf diese Weise Sie keine BukkitRunnable verwenden müssen, das ist, von dem, was ich sehe, eine sehr unangenehme Art und Weise, es zu tun.

+0

Danke Mann, so viel – Pixel

+0

Kein Problem, ich bin froh, dass ich helfen konnte. – ViperLordX

+0

Wie würde man immer wieder einen Effekt am Ort der Entity erzeugen, ohne sich zu wiederholen? Ich sehe, dass Ihre Klassen eine onTick() -Methode haben, wo würde dies von einem anderen als einem 'BukkitRunnable' aufgerufen werden? –