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

Problem bei Objektorientierung in Minecraft

CubBossa

Redstoneengineer
Mitglied seit
17 Juli 2015
Beiträge
42
Minecraft
CubBossa
Hallo liebes Forum. Ich übe mich gerade ein wenig im Programmieren mit Minecraft und habe versucht, eine Klasse, mit der ich einzelne Spielerfiles bearbeite, zu programmieren. Das ganz Objektorientiert, was ja eigentlich gut sein sollte oder? Nur bleibt ein eigenartiger Bug den ich nicht allzuleicht erklären kann.
Ich habe das SpielerFile Objekt so programmiert:

Javascript:
public class SpielerFile {

    //Variablen
   
    private Player p = null;
    private File file = null;
    private YamlConfiguration cfg = null;
   
    public static HashMap<Player, Boolean> tutAbsolved = new HashMap<Player, Boolean>();
   
    //Konstruktoren
   
    public SpielerFile(Player p) {
       
        this.p = p;
        this.file = new File("plugins/Athernon/Players", ""+p.getUniqueId()+".yml");
        this.cfg = YamlConfiguration.loadConfiguration(file);
    }
   
    public void setSpieler(Player p) {
        this.p = p;
        this.file = new File("plugins/Athernon/Players", ""+p.getUniqueId()+".yml");
        this.cfg = YamlConfiguration.loadConfiguration(file);
    }
    //Methoden
   
    /**
     * Erstellt ein Spielerfile wenn der Spieler noch keines besitzt
     */
    public void createFile(OfflinePlayer p) {
       
        if(!file.exists()) {
            cfg.set("Name", p.getName());
            try {
                cfg.save(file);
            } catch (Exception ex) {}
        }
    }
   
    public Object get(String pfad) {
       
        if(file.exists()) {
            return cfg.get(pfad);
        } else {
            createFile(p);
            return null;
        }
    }
}
So. Jetzt möchte ich in anderen Klassen, ebenfalls objektorientiert Einträge in das Spielerfile machen. Ich habe in dem File noch ein paar andere Methoden die ich jetzt mal nicht alle aufgeschrieben habe, da es glaube ich nicht an ihnen liegt. Durch rumprobieren habe ich nämlich festgestellt dass folgendes nicht funktioniert:


Javascript:
public class Ausdauer {
   
    //Variablen
   
    private Player p;
    private KlassenTools kt;
    private int TaskID = -1;
    private double ausdauer = 0;
    private Ausdauer ad = this;
    private SpielerFile pf;
   
    //Konstruktoren
   
    public Ausdauer(Player p) {
        this.p = p;
        this.kt = new KlassenTools(p);
        this.ausdauer = this.getAusdauerMax();
        this.pf = new SpielerFile(p);
    }
   
    public Ausdauer(Player p, double ausdauer, int TaskID) {
        this.p = p;
        this.kt = new KlassenTools(p);
        this.ausdauer = ausdauer;
        this.TaskID = TaskID;
        this.pf = new SpielerFile(p);
       
    }
   
    //Methoden
   
    public double getAusdauer() {
        return ausdauer;
    }
   
    public double getAusdauerMax() {
       
        return 30 + 100 *
                kt.getLevel() /
                kt.getMaxLevel(
                        pf.getString("Rasse.Name"));
    }
}
Um genauzusein gibt es eine Nullpointer Exception, die auf die Zeile 50, aka "pf.getString("Rasse.Name"));" verweist. Wenn ich also testweise in der methode getAusdauerMax() einmal ein File erstelle wie in der Klasse PlayerFiles, dann gibt es keine Fehlermeldungen mehr. Ich habe zum test auch schonmal im Konstruktor vom SpielerFiles nen Broadcast getippt aber der wurde ausgeführt. Also eigentlich müsste alles klappen

Ich hoffe sehr, mir kann jemand helfen,
Mfg CubBossa
 

UnityGaming

Workaholic
Osterei Experte
Mitglied seit
25 Oktober 2015
Beiträge
509
Alter
19
Minecraft
FastFelix771
Wenn die Datei noch nicht vorhanden ist, bzw. der Eintrag "Rasse.Name" fehlt, dann kriegst du dementsprechend auch null, also nichts, zurück oder es wird sogar eine Exception geworfen, je nachdem wie du das abfängst.

Bevor du diese Werte versuchst zu verwenden solltest du sicherstellen, dass die Dateien erstellt wurden und z.B. Standardwerte gesetzt wurden, damit dir sowas idR. nicht mehr passiert während der Laufzeit.

Alternativ kannst du auch defensiv coden und bei der Abfrage einen null-check einbauen und dementsprechend einen "fallback" Wert einsetzen.
 

BlackHole

Workaholic
Mitglied seit
1 Juli 2012
Beiträge
749
Minecraft
BlackHole
Statt solcher Config-Dateien würde ich GSON verwenden. Damit ist es viel leichter, Objektbäume aus oder in JSON-Dateien zu bekommen.

Die Klasse Plugin bietet eine Methode getDataFolder(), die den Ordner des Plugins zurückgibt.

Die Map tutAbsolved sollte als Schlüssel nicht Player verwenden, sondern z.B. die UUID der Spieler. Spielerobjekte halten Referenzen zu vielen anderen Objekten, die dann nicht freigegeben werden können und somit ein Speicherleck erzeugen.
 

CubBossa

Redstoneengineer
Mitglied seit
17 Juli 2015
Beiträge
42
Minecraft
CubBossa
Vielen dank für die Antworten. UnityGaming, das habe ich auch schon versucht. Ich habe testweise auch einfach mal sofort als rückgabewert den String "Default" festgelegt und gar nicht mehr auf irgendein File zugegriffen und es entstand das selbe problem. Aber danke für den Hinweis :)

BlackHole ich werde mich mal reinlesen, dankeschön. Das mit der map ist auch gut zu wissen, das werde ich dann auch gleich mal bei meinen anderen maps ändern.
 

Twitter

Allgemein
Hilfe Benutzer
  • S Serpentos:
    Man muss halt echt aufpassen und schauen, dass man keine Plugins nimmt, die mit TPS arbeiten nd wenig konfigurierbar sind
  • SirYwell SirYwell:
    Ja möglich ist es schon, nur hast du dann ne Bug-Garantie direkt dabei
  • iTz_Proph3t iTz_Proph3t:
    Bug ist ja noch milde ausgedrückt :3
  • Kroseida Kroseida:
    CPU last steigt ja damit automatisch an
  • Kroseida Kroseida:
    also das Konzept dahinter finde ich eher najaaaa
    Sinnvoller ist es eher ein Async Spigot zu basteln, wo z.B jede welt oder jedes Entity einen async tick hat
  • iTz_Proph3t iTz_Proph3t:
    na dann hopp hopp
  • iTz_Proph3t iTz_Proph3t:
    wobei ich hab ne super Mod idee :p
  • iTz_Proph3t iTz_Proph3t:
    aber ka obs machbar wär
  • Kroseida Kroseida:
    sag an :eek:
  • Kroseida Kroseida:
    bukkit async machen bedeutet viele, seeeehr viele Bugs xD
  • Kroseida Kroseida:
    und Aufwand.
  • SirYwell SirYwell:
    Paper hat ja immerhin async Chunk Loading, das ist auch schon Gold wert
  • BloodEko BloodEko:
    Bei vor-gerendeter Welt mit schneller SSD geht es eig? Finde dass meistens entities meistens das Problem sind....
  • BloodEko BloodEko:
    meistens die Entities das Problem sind'
  • Kroseida Kroseida:
    richtig^^
  • Kroseida Kroseida:
    aber auch die Nutzung von vielen Welten macht probleme
  • BloodEko BloodEko:
    Gut eine Welt ist kein kleines Objekt da sind dann viele Sache doppelt
  • BloodEko BloodEko:
    Sachen'
  • BloodEko BloodEko:
    Die trotzdem sync sind?
  • iTz_Proph3t iTz_Proph3t:
    Nix für alle Ohren Kroseida :p
  • Kroseida Kroseida:
    discord? :p
  • iTz_Proph3t iTz_Proph3t:
    ne heut nix, hatte migräne anfall, kopf streikt komplett bei allem
  • ❤️可愛いちゃん️❤️ ❤️可愛いちゃん️❤️:
    Fürs Spamen im Chat reichts scheinbar
  • Kroseida Kroseida:
    ChinaMann, meine Nudeln haben nicht gut geschmeckt. Kannst du den Chinesen um die Ecke bitte verbessern?
    Kroseida Kroseida: ChinaMann, meine Nudeln haben nicht gut geschmeckt. Kannst du den Chinesen um die Ecke bitte...
    Oben