Reddi Posted March 12, 2019 Share Posted March 12, 2019 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 More sharing options...
BloodSKreaper Posted March 12, 2019 Share Posted March 12, 2019 (edited) 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 March 12, 2019 by BloodSKreaper 1 Link to comment Share on other sites More sharing options...
Reddi Posted March 17, 2019 Author Share Posted March 17, 2019 Danke geht alles Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now