Gelöscht_25272 Geschrieben 11. Dezember 2020 Share Geschrieben 11. Dezember 2020 (bearbeitet) Ein Spieler hat das Problem, dass er manchmal einen Ping über 1000 hat, 'cause Internet dies das. Das Problem ist ja, dass wenn er so stark laggt bis er einen Timeout bekommt, dass er von einem Mob getötet wird. Um das zu verhindern, habe ich diese Idee, den Spieler vom Server zu werfen, wenn er länger als 10 Sekunden einen Ping von 1000ms hat. Aber ich habe absolut keine Idee, welche Methoden ich anwenden soll, um die Vorstellung zu verwirklichen. Aber ich weiß: PingCheck(){ PingHöherAls1000ms?() PingLängerAls10SekundenSoHoch?() } und so weiter... Ich bedanke mich im Voraus für hilfreiche Antworten! bearbeitet 11. Dezember 2020 von query Verschrieben im Thema Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Bedrock Geschrieben 11. Dezember 2020 Share Geschrieben 11. Dezember 2020 Es gibt da schon Plugins dafür: https://www.spigotmc.org/resources/better-ping-check-the-players-ping-on-the-server.81018/ In der Config lässt sich dann einstellen, ab welchem Ping gekickt werden soll 1 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
NobleKev Geschrieben 11. Dezember 2020 Share Geschrieben 11. Dezember 2020 So, dieses Plugin sollte funktionieren. (Ungetestet) private static HashMap<Player, ArrayList<Integer>> pingPlayers = new HashMap<>(); @Override public void onEnable() { //Startet den Runnable startRunnable(); } private void startRunnable(){ //Runnable alle 20 ticks (eine Sekunde) new BukkitRunnable(){ @Override public void run() { //Player loop for(Player player : Bukkit.getOnlinePlayers()){ //Abfrage ob Spieler in der letzen abfrage einen Ping über 1000 hat. if(pingPlayers.containsKey(player)){ //Holt die letzten pings die der Spieler hatte. ArrayList<Integer> lastPings = pingPlayers.get(player); //Holt den letzen Ping die der Spieler hatte. int lastPing = lastPings.get(lastPings.size() - 1); //Hold den derzeitigen Ping die der Spieler hat. int currentPing = getPing(player); //Abfrage ob schon 10 pings eingetragen sind if(lastPings.size() >= 9){ //Abfrage ob letzer Ping über 1000 war, und ob derzeitiger Ping über 1000 ist. if(lastPing >= 1000 && currentPing >= 1000){ //Löscht den Spieler aus dem zwischenspeicher pingPlayers.remove(player); //Kickt den Spieler player.kickPlayer(ChatColor.RED + "Dein Ping war für 10 Sekunden über 1000!"); continue; } } //Abfrage ob letzer ping > 1000 war. if(lastPing > 1000){ //Abfrage ob derzeitiger Ping über 1000 ist if(currentPing >= 1000){ //Fügt den derzeitigen Ping zur liste hinzu. lastPings.add(currentPing); //Update für die HashMap pingPlayers.remove(player); pingPlayers.put(player, lastPings); }else{ //Wenn nicht, wird der Spieler aus dem Zwischenspeicher gelöscht pingPlayers.remove(player); } } }else{ //Wenn nicht, wird der derzeitige Ping abgetfragt int currentPing = getPing(player); //Abfrage ob derzeitiger Ping größer als 1000 if(currentPing >= 1000){ ArrayList<Integer> pings = new ArrayList<>(); //Wenn ja, wird der Spieler zum zwischenspeicher hinzugefügt. pings.add(currentPing); pingPlayers.put(player, pings); } } } } }.runTaskTimer(this, 0, 20); } /** * @param player * @return player's ping */ private int getPing(Player player){ try{ Object entityPlayer = player.getClass().getMethod("getHandle").invoke(player); return (int)entityPlayer.getClass().getField("ping").get(entityPlayer); }catch (Exception e){ e.printStackTrace(); } return -1; } Hoffe das hilft dir! MFG NobleKev 1 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Gelöscht_25272 Geschrieben 11. Dezember 2020 Autor Share Geschrieben 11. Dezember 2020 vor 4 Stunden schrieb NobleKev: So, dieses Plugin sollte funktionieren. (Ungetestet) private static HashMap<Player, ArrayList<Integer>> pingPlayers = new HashMap<>(); @Override public void onEnable() { //Startet den Runnable startRunnable(); } private void startRunnable(){ //Runnable alle 20 ticks (eine Sekunde) new BukkitRunnable(){ @Override public void run() { //Player loop for(Player player : Bukkit.getOnlinePlayers()){ //Abfrage ob Spieler in der letzen abfrage einen Ping über 1000 hat. if(pingPlayers.containsKey(player)){ //Holt die letzten pings die der Spieler hatte. ArrayList<Integer> lastPings = pingPlayers.get(player); //Holt den letzen Ping die der Spieler hatte. int lastPing = lastPings.get(lastPings.size() - 1); //Hold den derzeitigen Ping die der Spieler hat. int currentPing = getPing(player); //Abfrage ob schon 10 pings eingetragen sind if(lastPings.size() >= 9){ //Abfrage ob letzer Ping über 1000 war, und ob derzeitiger Ping über 1000 ist. if(lastPing >= 1000 && currentPing >= 1000){ //Löscht den Spieler aus dem zwischenspeicher pingPlayers.remove(player); //Kickt den Spieler player.kickPlayer(ChatColor.RED + "Dein Ping war für 10 Sekunden über 1000!"); continue; } } //Abfrage ob letzer ping > 1000 war. if(lastPing > 1000){ //Abfrage ob derzeitiger Ping über 1000 ist if(currentPing >= 1000){ //Fügt den derzeitigen Ping zur liste hinzu. lastPings.add(currentPing); //Update für die HashMap pingPlayers.remove(player); pingPlayers.put(player, lastPings); }else{ //Wenn nicht, wird der Spieler aus dem Zwischenspeicher gelöscht pingPlayers.remove(player); } } }else{ //Wenn nicht, wird der derzeitige Ping abgetfragt int currentPing = getPing(player); //Abfrage ob derzeitiger Ping größer als 1000 if(currentPing >= 1000){ ArrayList<Integer> pings = new ArrayList<>(); //Wenn ja, wird der Spieler zum zwischenspeicher hinzugefügt. pings.add(currentPing); pingPlayers.put(player, pings); } } } } }.runTaskTimer(this, 0, 20); } /** * @param player * @return player's ping */ private int getPing(Player player){ try{ Object entityPlayer = player.getClass().getMethod("getHandle").invoke(player); return (int)entityPlayer.getClass().getField("ping").get(entityPlayer); }catch (Exception e){ e.printStackTrace(); } return -1; } Hoffe das hilft dir! MFG NobleKev Das ist einfach perfekt! Danke! 1 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Empfohlene Beiträge
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 erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden