Jump to content

Death als Kill von jmdn anderes werten


Reddi
 Share

Recommended Posts

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

Link to comment
Share on other sites

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

Edited by BloodSKreaper
  • Thanks 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...
B
B