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

Mod [CLOSED] Problem mit PlayerTickEvent

Skyriis

Kuhfänger
Registriert
11 Juni 2018
Beiträge
59
Diamanten
329
Minecraft
MrProfessor
Hallo liebes Forum,
ich habe ein kleines Problemchen und komme irgendwie nicht auf die Lösung ^^'

Habe hier einen check ob der Spieler schon mal auf dem Server war erstellt.
Wenn nicht wird ein NBT Tag erstellt und eine Nachricht wird ausgegeben.
Das Problem ist, dass bei jedem verbinden mit dem Server der Server denkt das der Spieler neu sei.

Hier mal mein Code:
java:
public void firstJoin(PlayerTickEvent event){
    EntityPlayer player = event.player;
    NBTTagCompound nbt = player.getEntityData();
    
    if(!nbt.getBoolean(Reference.MODID + ".joinedBefore")){
        NBTHandler.setNBT(player, Reference.MODID + ".joinedBefore", true);
        
        System.out.println(player.getName() + " joined the first time. Yeah!");
    }
}
java:
public static void setNBT(EntityPlayer player, String key, boolean value) {
    NBTTagCompound entityData = player.getEntityData();

    entityData.setBoolean(key, value);
}
Wäre toll wenn man mir erklären könnte woran das liegt ^^

Vielen Dank schon mal im voraus :3
 

JTK222

Threadripper
Registriert
5 September 2013
Beiträge
1.150
Diamanten
323
Minecraft
JTK222
Nein, nein und nochmal nein?
1. das Player Tick Event ist schrecklich dafür... dass wird 20 mal in der sekunde, pro spieler ausgeführt!
2. es ist nicht so einfach Daten an einen Spieler zu hängen, dass wird nicht gespeichert.

Es gibt einen PlayerCache, ich weis aber nicht ob dieser schon aktualisiert wurde zu dem zeitpunkt an dem du es überprüfen kannst.
Ansonsten wirst du selbst was programmieren müssen, wofür dir folgende lösungen zur verfügung stehen:
  • Speicher die Nutzer in einer Text Datei
  • Speicher die Nutzer in einer Datenbank
  • Hänge an jeden Spieler einen boolean dran (vermutlich das komplizierteste wenn du es richtig machen möchtest)
 

Skyriis

Kuhfänger
Registriert
11 Juni 2018
Beiträge
59
Diamanten
329
Minecraft
MrProfessor
das Player Tick Event ist schrecklich dafür... dass wird 20 mal in der sekunde, pro spieler ausgeführt!
Habe es davor mit dem PlayerLoggedInEvent probiert aber da ist einfach nichts passiert.

es ist nicht so einfach Daten an einen Spieler zu hängen, dass wird nicht gespeichert.
Wenn ich in der Welt nachgucke ist dort die Boolean in der Spieler .dat erstellt. Wieso sollte der nicht gespeichert werden?
Download.png


  • Speicher die Nutzer in einer Text Datei
  • Speicher die Nutzer in einer Datenbank
Wäre das einfachste aber wie das funktioniert weiß ich ja schon und ich möchte lernen wie ich solche Daten am Spieler direkt speichere. Der komplette Mod hat eigentlich nur den Sinn mein Verständnis in Sachen Forge etwas aufzubessern.

  • Hänge an jeden Spieler einen boolean dran (vermutlich das komplizierteste wenn du es richtig machen möchtest)
Genau das ist der Plan ^^ und wie im oben gezeigten Bild wird die Boolean ja beim Spieler angehangen aber... Naja wirklich funktionieren tut das nicht ^^"
 

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.675
Diamanten
830
Du könntest auch im Login Event nur den Task in den Scheduler werfen, sofern z.B. sichergestellt ist, dass im nächsten Tick das Spielerobjekt vollständig initialisiert wurde, das über das Tickevent zu Lösen ist aber so ineffizient, dass du darüber gar keine weiteren Gedanken verschwenden solltest.
 

JTK222

Threadripper
Registriert
5 September 2013
Beiträge
1.150
Diamanten
323
Minecraft
JTK222
Hmm... die Forge data ist mir neu, früher musste man dass selbst noch abspeichern wenn es hinzugefügt wurde.
Bzw. da ich es noch nie gesehen habe vermute ich einfach mal dass es etwas komplett veraltetes ist dass nicht mehr richtig funktioniert.
Der Moderne weg einem Spieler daten anzuhängen ist eine Capability, was für deine zwecke jedoch nicht wirklich geignet ist.
Diese werden beim joinen geladen, und über die ganze online zeit des spielers auch geladen gehalten.
Desweiteren müssen diese kopiert werden sobald der Spieler einmal respawned.
Was mir jedoch noch eingefallen ist, du könntest evtl. im PlayerJoined event schauen, ob die Spielerdatei bereits existiert.
 
Oben