Beiträge von Admiral_Zott

    Wenn du die Objekt Value in einer Map updaten willst, kannst du das einfach machen, ohne diese dann wieder zurück zu schreiben.

    Code
    1. Map<Integer, ArrayList<String>> map = new HashMap<>();
    2. ArrayList<String> arrayList = map.get(20);
    3. arrayList.add("Test Message");

    Dies funktioniert durch die Pointer die auf das ArrayList Objekt zeigen. Wenn du mal den Debug Modus in deiner IDE startest, siehst du, dass arrayList und der 20te Eintrag in deiner Map die selbe Id haben.

    Bitte prüf mal deinen Code auf Objekte, die du Statisch in Variablen speichert.
    Diese können Memory-Leaks produzieren. Wie schon gabriel2029 erwähnt hat, solltest du hier diese Variablen nur in einer WeakReference speichern. Am besten übergibst du diese schon bei der Initialisierung des Runnables und speicherst das Objekt in die WeakReference.

    Ich glaube auch, dass der Craft Scheduler Thread nicht nur in deinen Runnables läuft. Um den Server am leben zu halten läuft immer irgend ein (oder mehrere) Thread der auf etwas lauscht.


    // EDIT

    Noch böser wird der ganze Spaß, wenn du den Timer asynchron laufen lässt und das Objekt auf einmal null ist. Da ist eine WeakReference das beste was du machen kannst. Solltest du natürlich dann auf null checken. reference.get() != null

    Um es ein bisschen performanter zu gestalten, könntest du nen async Timer mit laufen lassen und ca alle 10 Sekunden prüfen, ob sich ein Spieler in z.B. einem 50 Block Radius um deine Region befindet. Wenn ja, steckst du den in eine Liste und prüfst mit dem MoveEvent ob er nun die Region betritt oder halt nicht.

    Das zweite was einiges an Performance zieht, ist deine Instance von SuperAPI die du in deinem Objekt zwischenspeicherst. Sowas verursacht Leaks und kostet Rechenzeit.

    Mir ist schon seit einiger Zeit aufgefallen, dass es immer wieder zu Komplikationen mit den Bewertungen hier im Forum kommt. Ich bin zwar jetzt noch nicht so lange aktiv wie andere hier, trotzdem ist mir das ein Dorn im Auge und ich wollte das einfach mal loswerden.

    Die Bewertungen dienen dazu einfach seine Meinung abzugeben. Diese muss auch meines Erachtens nicht begründet werden. Wenn jemand einen Beitrag auf gut deutsch gesagt Scheiße findet, dann soll er ihn auch bitte negativ bewerten. Niemand ist dem anderen hier eine Rechenschaft schuldig, warum, weshalb und wieso er das gemacht hat. Schließlich meckert ja auch keiner bei einer positiven Bewertung rum.

    Deshalb bitte ich hier die Menschen im Forum diese belanglosen Textphrasen wie "Ich verstehe nicht warum du mir einen Dislike gegeben hast" oder "Dislike zurückziehen oder Begründung" wegzulassen. Ich denke das wird im Interesse aller sein.


    Danke.

    Wenn im Hauptthread jedoch nichts gemacht wird, dann schließt sich das Programm doch, oder nicht. Ist das vielleicht nur so, wenn keine anderen Threads vorhanden sind?

    Ein Programm läuft solange bis alle Tasks abgearbeitet sind. Wenn ein weiterer Task (In diesem Fall ein neuer Thread) noch nicht fertig ist, kann das Programm auch nicht beenden. Skyleiger ich habe irgendwie das Gefühl, dass du die Grundlagen der Programmierung übersprungen hast :)

    Normalerweise sollte aber das Blockieren des Hauptthreads wichtig sein, da sonst sich das Programm beenden würde.

    Das ist totaler Quatsch. Wenn du den Hauptthread blockierst, klappt gar nichts mehr. Das ist wie ne while(true) Schleife. Die läuft und läuft und läuft solange das Programm aktiv ist. Du kannst das aber verhindern, wenn du diese Funktion in einem neuen Thread startest. Somit blockierst du auch nicht den Hauptthread und das Programm läuft trotzdem weiter.

    Dies kannst du mit:

    Java
    1. new Thread(new Runnable() {
    2. @Override
    3. public void run() {
    4. // Hier kommt dann deine Schleife rein:
    5. }
    6. }).start();

    Die Schleife solltest du, wenn du mehrere Clients benutzen willst, so aufbauen:

    Java
    1. while (true) {
    2. try {
    3. Socket client = serverSocket.accept();
    4. clients.add(client); // clients ist hier eine einfache java.util.List
    5. } catch (IOException e) {
    6. e.printStackTrace();
    7. }
    8. }

    Wenn du nun den Clients eine Nachricht schicken willst, musst du die Liste clients nun einfach noch mit einer Schleife durchgehen und deine Nachricht senden. Wenn du einen Client spezifisch anfragen willst, solltest du diese in einer Map einem Key zuweisen.

    Habe mich gerade nochmal mit der Durability beschäftigt und nach kurzem googlen herausgefunden, dass sich diese anders rum, als die Logik es gibt, setzten lässt. D.h. wenn du 5 abziehen willst sieht die Logik ca so aus:

    maxDurability - currentDirability + deinWertZumAbziehen


    Bezüglich deiner zweiten Frage: kannst du mir da mal bitte ein Stück Code von dir zeigen wo du das Rezept erstellst?

    //EDIT: Vielleicht kannst du ja schon hiermit was anfangen: https://bukkit.org/threads/fur…ged-and-new-items.137795/

    Ist doch eigentlich ganz einfach.

    Du durchsucht dein Craft-Inventar nach einem Feuerzeug, nimmst dies als ItemStack raus -> veränderst die durability und setzt es wieder an den Slot.

    Hier nochmal ein kleines Codebeispiel:

    Java
    1. private void replaceFlintAndSteel(Inventory inventory, short durability) {
    2. for (int i = 0; i < inventory.getSize(); i++) {
    3. ItemStack item = inventory.getItem(i);
    4. if (item.getType() == Material.FLINT_AND_STEEL) {
    5. item.setDurability((short) (item.getDurability() - durability));
    6. inventory.setItem(i, item);
    7. }
    8. }
    9. }

    Werte gibt es schon mal in SQL gar nicht. Eien Datenbank gliedert sich in Tabellen und diese in Spalten und Zeilen. Wenn wir dir helfen sollen, gib uns bitte die Struktur deiner Tabelle und vielleicht ein paar Beispielwerte.

    Um dir diesbezüglich weiterzuhelfen -> eine Datenbankstruktur sieht in etwa so aus:

    kwr59ckh.png