• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Spigot PlugIn Spieler erkennen, der eine Explosion veranlasst hat

iTzCeddy

Minecrafter
Osterei Experte
Mitglied seit
31 Mai 2015
Beiträge
27
Minecraft
iTzCeddy
Hey zusammen,

programmiere derzeit an einem RageMode-Plugin und bin nun bei einem Problem angekommen. Und zwar gibt es dort ja einen Bogen, dessen abgeschossender Pfeil eine Explosion an der Einschlagsstelle des Pfeils erzeugt, wenn er keinen Spieler trifft.
Soweit so gut.
Wenn aber nun ein Spieler durch diese Explosion stirbt, möchte ich gerne den Spieler, der den Pfeil abgeschossen hat, als Killer bekommen.
Wenn ich die Explosion nun mit World#createExplosion erstelle, kann ich dem ja leider keine Metadata setzen.
Wenn ich die Explosion über PrimedTNT (Also quasi so: TNTPrimed tnt = e.getEntity().getWorld().spawn(e.getEntity().getLocation(), TNTPrimed.class); ) lösen würde, wäre das Problem zwar gelöst, aber das TNT ist trotzdem kurz sichtbar und das möchte ich nicht, auch wenn ich die FuseTicks auf 0 setze. Gibt es vielleicht dort eine Möglichkeit, das TNT vollständig unsichtbar zu machen?
Oder hat jemand noch eine ganz andere Idee?

Mit HashMaps möchte ich das ganze nur ungerne lösen..

Viele Grüße
Ceddy
 

LapisMC

Kuhfänger
Osterei Experte
Mitglied seit
29 März 2014
Beiträge
58
Alter
20
Minecraft
LapisMC
Das sollte sich über NMS lösen lassen. Die Bukkit-Methode createExplosion läuft letztendlich auf WorldServer#createExplosion hinaus, dieser Methode wird auch eine Entity bzw. null übergeben. Wenn du diese Methode nutzt und den Pfeil übergibst, ist dieser die Explosionsquelle, die dann auch im EntityDamageByEntityEvent als Damager auftritt. In etwa würde das so aussehen:
Beispiel:
import net.minecraft.server.[version].WorldServer;
import net.minecraft.server.[version].EntityArrow;
...
   
public void createArrowExplosion(org.bukkit.entity.Arrow arrow) {
    EntityArrow nmsArrow = ((CraftArrow)arrow).getHandle();
    WorldServer nmsWorld = ((CraftWorld)arrow.getWorld()).getHandle();
   
    //Entity, Position (double), Stärke (float), Erzeugt Feuer (boolean),
    //zerstört Blöcke (boolean)
    nmsWorld.createExplosion(nmsArrow, x, y, z, power, fire, breakBlocks);
}

...
   
@EventHandler
public void onExplosion(EntityDamageByEntityEvent evt) {
    if(evt.getDamager() instanceof Arrow) {
        Entity shooter = ((Arrow)evt.getDamager()).getShooter();
       
        if(shooter instanceof Player) {
            //Der verantwortliche Spieler
            Player p = (Player)shooter;
        }
    }
}
Natürlich besteht dann das Problem der Kompatibilität, da das Paket, in dem die NMS-Klassen liegen, in jeder Version anders heißt (im Beispiel durch [version] markiert). Wenn das Plugin mehrere Versionen unterstützen soll, müsstest du Reflection nutzen.
 
Zuletzt bearbeitet:

iTzCeddy

Minecrafter
Osterei Experte
Mitglied seit
31 Mai 2015
Beiträge
27
Minecraft
iTzCeddy
Hey,

vielen Dank! Das konnte mir helfen!

Habs letztendlich so gelöst:
Code:
((CraftWorld) e.getEntity().getWorld()).getHandle().createExplosion(((CraftPlayer) e.getEntity().getShooter()).getHandle(), e.getEntity().getLocation().getX(), e.getEntity().getLocation().getY(), e.getEntity().getLocation().getZ(), 2.0F, false, false);
 
Allgemein
Hilfe Benutzer
  • Stern☆ Stern☆:
    Verheizen das ich im Winter schön warm hab.. was denkst du .....
  • HardSoul HardSoul:
    Wie war das mit den knappen Opfern gestern?
  • Stern☆ Stern☆:
    Tja.. brauche so auch was zum heizen..
  • Stern☆ Stern☆:
    sonst gibt’s kein warmwasser :D
  • HardSoul HardSoul:
    Kannst du sie nicht erst opfern und dann die Überreste als Brennstoff nutzen? Sodass sie sogar nach ihrem tot einen Zweck haben? Oder braucht du einfach die Schmerzschreie?
  • Stern☆ Stern☆:
    Da bleibt ja nie was übrig!!!
  • Matthias Matthias:
    Guten Morgen
  • SirYwell SirYwell:
    Guten Morgen
  • realMaxW realMaxW:
    Guten Morgen
  • realMaxW realMaxW:
    @Matthias, wann stehst du denn auf das du immer so früh Guten Morgen schreiben kannst? :O
  • SirYwell SirYwell:
    7 Uhr
    +1
  • maybeto maybeto:
    Matthias macht das clever, er lässt morgens seine Frau "guten Morgen" schreiben und pennt selbst bis um 12.....
  • LottaXL LottaXL:
    Moin, moin =)
  • HardSoul HardSoul:
    Moinsen!
  • Matthias Matthias:
    Ich steh vor meiner Frau auf ;)
  • HardSoul HardSoul:
    Gute Nacht!
  • Stern☆ Stern☆:
    gn8^^
  • realMaxW realMaxW:
    Guten Morgen <3:cow:
  • maybeto maybeto:
    guten Morgen....
  • Matthias Matthias:
    Guten Morgen
  • Matthias Matthias:
    heut mal richtig lang geschlafen
  • HardSoul HardSoul:
    Guten Morgen
  • LottaXL LottaXL:
    Moin, moin =)
    LottaXL LottaXL: Moin, moin =)
    Oben