Jump to content

Spieler bei zu hohem Ping kicken, wenn dieser länger als 10 Sekunden anhält


Gelöscht_25272
 Share

Recommended Posts

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 by query
Verschrieben im Thema
Link to comment
Share on other sites

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

  • Thanks 1
Link to comment
Share on other sites

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!

  • Like 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