• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

spieleranzahl zur jeden vollen stunde in file eintragen

EchtJetzt

Minecrafter
Registriert
7 Januar 2017
Beiträge
13
Alter
23
Diamanten
300
Minecraft
EchtJetzt
Hallo,
ich versuche grade für meinen Server Analytics zu programmieren, habe aber keine Ahnung wie ich zur jeden vollen Stunde oder jede 30 Minuten die Spieleranzahl in eine .yml Datei eintragen kann.
Wäre cool wenn man beispiel code + anregung schicken könnte.
 

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.675
Diamanten
830
Du berechnest einmalig beim Start wie lange es bis zur nächsten Stunde ist und dann setzt du einen Java Timer, der nach Ablauf einen Job in den Scheduler einfügt, der dann die Berechnung durchführt. Außerdem startest du einen neuen Timer, der das Selbe wieder in einer Stunde macht. Beachte, dass du den Timer nicht über den Bukkit Scheduler ausführen darfst, da dieser nicht auf der echten Zeit sondern auf Ingame Ticks basiert und es damit zu gewaltigen Abweichungen kommen kann, wenn die Tickrate nicht stabil ist (was sie nie ist).

Aufpassen, dass du den Timer als Daemon startest (beachte Konstruktor), da sonst der Server nicht mehr korrekt beendet wird. Außerdem beachten, dass du den Timer immer wieder benutzt und NICHT neu anlegst, da jeder Timer einen Thread startet und du sonst irgendwann keinen Arbeitsspeicher zur Verfügung hast.

Das Neustarten des Timers muss im Runnable des Timers erfolgen und nicht im Bukkit Scheduler, da du sonst den Zugriff auf den Timer synchronisieren musst.

Quellen:
Für Bungeecord kannst du auf den Java Timer verzichten, da Bungeecord bereits mit echten Zeiten arbeitet. Der Rest ändert sich aber nicht groß.
 
Zuletzt bearbeitet:

Lapura

Kuhfänger
Registriert
28 Dezember 2014
Beiträge
73
Alter
26
Diamanten
314
Code:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import org.bukkit.Bukkit;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitScheduler;

public class PlayerCountSaver extends JavaPlugin
  implements Listener
{
  public void onEnable()
  {
    saveDefaultConfig();

    Bukkit.getScheduler().scheduleAsyncRepeatingTask(this, new Runnable()
    {
      public void run()
      {
        PlayerCountSaver.this.logToFile();
      }
    }
    , 36000L, 36000L);
  }

  public void logToFile() {
    Date date = new Date();
    DateFormat filenameDateFormat = new SimpleDateFormat("dd-MM-yyyy");
    try
    {
      File dataFolder = getDataFolder();
      if (!dataFolder.exists()) {
        dataFolder.mkdir();
      }
      File saveTo = new File(getDataFolder(), filenameDateFormat.format(date) + ".log");
      if (!saveTo.exists()) {
        saveTo.createNewFile();
      }
      FileWriter fw = new FileWriter(saveTo, true);
      PrintWriter pw = new PrintWriter(fw);
      DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
      pw.println("[" + dateFormat.format(date) + "] " + Bukkit.getOnlinePlayers().size());
      pw.flush();
      pw.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
 

EchtJetzt

Minecrafter
Registriert
7 Januar 2017
Beiträge
13
Alter
23
Diamanten
300
Minecraft
EchtJetzt
Code:
@Override
    public void onEnable() {
    
        ProxyServer.getInstance().getScheduler().schedule(this, new Runnable() {
        
            @Override
            public void run() {
            
                logToFile();
            
            }
        }, 5, TimeUnit.MINUTES);
    
    }
    public void logToFile() {
        Date date = new Date();
        DateFormat filenameDateFormat = new SimpleDateFormat("dd-MM-yyyy");
        try
        {
          File dataFolder = getDataFolder();
          if (!dataFolder.exists()) {
            dataFolder.mkdir();
          }
          File saveTo = new File(getDataFolder(), filenameDateFormat.format(date) + ".log");
          if (!saveTo.exists()) {
            saveTo.createNewFile();
          }
          FileWriter fw = new FileWriter(saveTo, true);
          PrintWriter pw = new PrintWriter(fw);
          DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
          pw.println("[" + dateFormat.format(date) + "] " + BungeeCord.getInstance().getOnlineCount());
          pw.flush();
          pw.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }


würde das so gehen? weil ich möchte halt das wenn ich den server um 0:04 starten, der um 0:05 schon die spieleranzahl einträgt und nicht erst um 0:09
 
Oben