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

Spigot Suche eine Methode um zu überprüfen ob der Block das erste mal abgebaut wird

MelonigeMelone

Minecrafter
Registriert
10 Januar 2018
Beiträge
5
Diamanten
308
Hallo,
ich habe folgendes Problem. Ich schreibe gerade ein Plugin, indem man etwas bekommt, wenn man bestimmte Blöcke abbaut. Mein Problem ist das man dies nur ein mal bekommen soll, sodass wenn der abgebauten Block nochmal platziert wird und abgebaut wird man nichts mehr bekommen soll. Also suche ich nach einer Methode, wo man überprüfen kann ob der Block zum ersten mal abgebaut wird. Falls es keine Methode gibt würde ich mich auch über andere Lösungsvorschläge freuen.
 

Tomekk.

Minecrafter
Registriert
3 März 2018
Beiträge
13
Alter
26
Diamanten
307
Minecraft
Tomekk
Kp, wenn dir die Methode egal ist, kannst du eine Art File für den Spieler erstellen mit seinen SpielerDaten und wenn jemand bspweise Stein abbaut, addest du diesen Block zu dem Spielernamen/der Spieler-UUID in der File.

Dannach brauchst du beim BlockBreakEvent nur abfragen, ob sich der Block in der File des Spielers befindet. Wenn ja, Führe etwas aus oder eben nicht.

Würde ich auf einem Server mit ein paar mehr Spielern jedoch nicht empfehlen. Der Performance zuliebe.
 

AconTM

Schafhirte
Registriert
15 Juni 2015
Beiträge
118
Alter
29
Diamanten
260
Minecraft
AconTM
Ich stimme Tomekk zu, für deine Zwecke wäre eine Spieler DB/File sicherlich ratsam. Jedoch wie er ebenfalls
erwähnte solltest du diese Methode mit bedacht einsetzen da bei jedem BlockBreak/BlockPlace event eine
Verbindung zur DB oder File aufgebaut werden muss.

Solltest du es jedoch verwenden wollen hätte ich folgenden Vorschlag: Lege für jeden Spieler einen Eintrag
in einer DB oder File an (UUID nicht der Name) und trade dort die Materials ein welche bereits abgebaut
wurden.

Ich weiß grad nicht ob es eine bessere Methode hierfür gibt, diese ist grad sehr spontan ^^ Jedoch wäre
wie bereits erwähnt so oder so davon abzuraten da im Regelfall recht häufig ein Block gesetzt oder
abgebaut wird.


Lg. AconTM
 

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.675
Diamanten
830
Das übersteigt vermutlich die Fähigkeiten etwas, aber man kann die Daten mit den Chunks abspeichern und dann das Chunk Load und Unload Event benutzten um alle Datenbankeinträge der aktiven Chunks im RAM zu halten. Das Ganze kann man asynchron machen, da es unwahrscheinlich ist, dass ein Spieler direkt nachdem ein Chunk geladen wurde den Block abbauen wird. Damit es aber trotzdem zu keinem Fehler kommt, müsste man den Hauptthread natürlich blockieren, wenn das asynchrone Laden der Chunkdaten noch nicht abgeschlossen ist.

In den meisten Fällen, entsteht somit überhaupt keine Verzögerung und man hat alle Daten die man braucht direkt im RAM. Man kann das eigentlich nach belieben optimieren, wenn man Probleme mit der Performance bekommt, nur die Daten im RAM bekommt man halt nicht kleiner, aber so wie ich die Problembeschreibung verstanden habe, redet wir hier von ein paar verstecken Easter Eggs oder sowas und nicht von 300 Blöcken pro Chunk.
 

PSandro

Kuhfänger
Registriert
7 November 2016
Beiträge
51
Diamanten
302
wenn man bestimmte Blöcke abbaut
Geht es hier wirklich um einen Block im Sinne der Position (sprich einen Block an bestimmten Koordinaten) oder nur generell um das Material ("Ein Spieler bekommt XY, wenn er zum ersten mal einen beliebigen Kohleblock abgebaut hat.")?

wenn der abgebauten Block nochmal platziert wird und abgebaut wird man nichts mehr bekommen soll.
ob der Block zum ersten mal abgebaut wird
Soll dann nur der Spieler, der genau diesen Block (an diesen Koordinaten) abgebaut hat keine Belohnung mehr bekommen, oder soll diese Belohnung dann für alle Spieler des Servers für diesen Block gesperrt werden?

Je nachdem welches Problem du zu lösen versuchst gibt es einfache und anspruchsvolle Wege:
Falls du jeden Spieler belohnen willst, der...
  1. ein - für sich - neues Material abbaut. Lösungsvorschlag: 1:n Beziehung in einer Datenbank ausgehend von dem Spieler, oder nur ein Spalte mit dem Spieler und einem Set der bereits abgebauten Materialien
  2. ein generell noch nie abgebautes Material abbaut. Lösungsvorschlag: Set der bereits abgebauten Materialien beim Start aus einer Datei laden, zur Laufzeit im RAM behalten und ggf. durch neu abgebaute Materialien ergänzen und beim Stop wieder in eine Datei schreiben.
  3. einen - für sich - neuen Block an bestimmten Koordinaten abbaut. Lösungsvorschlag: Mischung aus 1. und @❤️可愛い❤️ s Beitrag.
  4. einen - generell - noch nie abgebauten Block an bestimmen Koordinaten abbaut. Lösungsvorschlag Siehe @❤️可愛い❤️ s Beitrag.

Besten Gruß,
Sandro
 
Oben