Gelöscht_25272 Posted December 11, 2020 Share Posted December 11, 2020 (edited) 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! Edited December 11, 2020 by query Verschrieben im Thema Link to comment Share on other sites More sharing options...
TileEntity Posted December 11, 2020 Share Posted December 11, 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 to comment Share on other sites More sharing options...
NobleKev Posted December 11, 2020 Share Posted December 11, 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 to comment Share on other sites More sharing options...
Gelöscht_25272 Posted December 11, 2020 Author Share Posted December 11, 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 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