Jump to content

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


Gelöscht_25272

Empfohlene Beiträge

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 von query
Verschrieben im Thema
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

  • Danke 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 zu diesem Kommentar
Auf anderen Seiten teilen

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 erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...
B
B