Jump to content

Hast du schon das Minecraftforum.de-Gütesiegel gesehen? Hier kommst du dorthin!

Empfohlene Beiträge

Hallo.

Ich programmier gerade BedWars und ich bin gerade beim DeathEvent

Es soll so sein, dass wenn man ins Void geschlagen wird, dass dann der, der schlug, den Kill bekommt.

Jetzt ist es aber so, dass der, der ihn ins Void schlägt, nicht den Kill bekommt und somit wird es als normaler "Tod" gewertet.

Ich frage ihn in meinem derzeitigen Code ab, ob der killer null ist. Wenn nicht, dann soll es eben als Kill gewertet werden.

Hier der DeathListener:

https://pastebin.com/erMfJwk4

MfG,

Mrredstone

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Guten Abend,

 

im Prinzip musst du dann ja speichern, wer als letztes den Spieler geschlagen hat und beim Spielertod durch Void diese Information mitverarbeiten. Wichtig ist hierfür, dass man den Zeitstempel mitspeichert und eben eine bestimmte Zeit festlegt, die zwischen Hit und Tod sein darf.

Dies könnte man mit einer HashMap lösen:

In der Event-Listener Klasse

  @EventHandler
  public void onPvP(EntityDamageByEntityEvent event) {
    if (event.isCancelled())
      return; // Abbruch, wenn Event gecancelled ist.
    if (!(event.getDamager() instanceof Player && event.getEntity() instanceof Player))
      return; // Abbruch, wenn Angreifer oder Verteidiger kein Spieler ist

    // Speichert in der Verwaltungsklasse für Hits den Angreifer eines Spielers mit der derzeitigen
    // Zeit in Millisekunden ab.
    VerwaltungsklasseHits.setLastDamagerOfPlayer((Player) event.getEntity(),
        System.currentTimeMillis(), (Player) event.getDamager());
  }

  /*
   * Gekürzte Variante. Wollte ursprünglich deinen Listener benutzen, aber mit so einem
   * unaufgeräumten Code wie deinem macht das keinen Spaß
   */
  @EventHandler
  public void onDeath(PlayerDeathEvent e) {
    Player player = e.getEntity();
    Player player2 = e.getEntity().getKiller();

    if (player2 == null) {
      if (VerwaltungsklasseHits.getLastDamagerOfPlayer(player) == null) {
        // SPIELER IST NICHT DURCH ANDEREN SPIELER GESTORBEN
        // Hier kommt die Abhandlung für einen dummen Spieler hin: Todesnachricht setzen, etc.
        return; // Beenden des Unterprogramms
      }
      player2 = VerwaltungsklasseHits.getLastDamagerOfPlayer(player);
    }

    // Hier kommt die Abhandlung hin, wenn ein Spieler durch einen anderen Spieler getötet,
    // geschubbst, oder was auch immer wurde.
  }

VerwaltungsklasseHits

public class VerwaltungsklasseHits {

  private static HashMap<UUID, PlayerHit> playerhits = new HashMap<>();

  public static void setLastDamagerOfPlayer(Player damagedPlayer, long timestamp,
      Player attackingPlayer) {
    PlayerHit ph = new PlayerHit(attackingPlayer.getUniqueId(), timestamp);
    playerhits.put(damagedPlayer.getUniqueId(), ph);
  }

  /*
   * Gibt die UUID des letzten Angreifers zurück, sofern der letzte Angriff nicht abgelaufen ist Ist
   * der letzte Angriff zu lange her, so wird null zurückgegeben
   */
  public static UUID getLastDamagerUUIDOfPlayer(Player damagedPlayer) {
    PlayerHit ph = playerhits.get(damagedPlayer.getUniqueId());
    if (ph == null) // Es gibt keinen letzten Angriff
      return null;
    if (ph.isOutdated()) {// Letzter Angriff ist zu lange her.
      playerhits.remove(damagedPlayer.getUniqueId()); // Lösche den abgelaufenen Hit
      return null;
    }
    return ph.getAttackerUUID();

  }

  /*
   * Gibt den letzten Angreifer zurück, sofern der letzte Angriff nicht abgelaufen ist und der
   * Angreifer online ist. Ist der letzte Angriff zu lange her oder der Angreifer ist offline, so
   * wird null zurückgegeben
   */
  public static Player getLastDamagerOfPlayer(Player damagedPlayer) {
    PlayerHit ph = playerhits.get(damagedPlayer.getUniqueId());
    if (ph == null) // Es gibt keinen letzten Angriff
      return null;
    if (ph.isOutdated()) {// Letzter Angriff ist zu lange her.
      playerhits.remove(damagedPlayer.getUniqueId()); // Lösche den abgelaufenen Hit
      return null;
    }
    if (ph.getAttacker() == null)
      return null;
    return ph.getAttacker();

  }

  /*
   * Löscht den PlayerHit-Eintrag eines bestimmten Spielers
   */
  public static void removeLastPlayerHitOfPlayer(Player damagedPlayer) {
    playerhits.remove(damagedPlayer.getUniqueId());
  }

}

 

PlayerHit

public class PlayerHit {
  private UUID uuid;
  private long timestamp;

  public PlayerHit(UUID uuid, long timestamp) {
    this.uuid = uuid;
    this.timestamp = timestamp;
  }

  /*
   * Gibt die Minecraft-UUID des Angreifers zurück.
   */
  public UUID getAttackerUUID() {
    return uuid;
  }

  /*
   * Wandelt die Minecraft-UUID des Angreifers in einen Spieler um und gibt diesen zurück. Ist der
   * Spieler der zugehörigen UUID offline, so wird null zurückgegebben.
   */
  public Player getAttacker() {
    return Bukkit.getServer().getPlayer(uuid);
  }

  /*
   * Gibt zurück, ob der Hit noch aktuell ist, also ob er noch nicht zu lange her ist.
   */
  public boolean isOutdated() {
    long differenceInMilliseconds = System.currentTimeMillis() - timestamp; //Zeitdifferenz zwischen jetzt und dem Angriff in ms
    double differenceInSeconds = differenceInMilliseconds / 1000; //Zeitdifferenz zwischen jetzt und dem Angriff in Sekunden
    if (differenceInSeconds > 10) { //Wenn Angriff länger als 10 Sekunden her then return true, else return false
      return true;
    }
    return false;
  }

}

 

Ich hoffe das ist ausreichend und funktioniert für dich. Habe dein Programm ja nicht und konnte deshalb nicht testen.

 

Freundliche Grüße
BloodSKreaper

bearbeitet von BloodSKreaper
  • Danke 1

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden

×