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

Scheduler -Playerlist

h3inz3l

Schafhirte
Registriert
12 April 2013
Beiträge
132
Diamanten
0
Minecraft
h3inz3l
Hallo Community,

ich habe ein kleines aber feines Problem.

Ich möchte einen RepeatingTask Server weit laufen lassen. Hierbei verändert sich immer ein Wert. Nur ist dieser Wert für jeden Spieler anders. Wenn ich nun den Task bein Starten des Plugins mit Starte, soll dieser über einen Player list iterieren und somit jeden Wert eines Spielers auslesen und verändern.
Da die Spielerlist aber als final deklariert werden muss werden auch nur die Spieler für den Task genommen, die zu diesem Zeitpunkt in der Liste sind.
Wenn ein Spieler dann joint, ist er natürlich nicht in der Liste über die iteriert wird.
Im Moment wird es so geregelt, dass für jeden Spieler dieser task einzeln gestartet und beim leaven wieder gecancelt wird.
Das ist natürlich nicht sehr Ressourcen sparend, deshalb meine Frage.

Gibt es eine Möglichkeit, einen Running Task zu erstellen, der über einen Player list iteriert, die aber veränderbar ist, ohne den Task zu canceln und wieder neu zu starten?
Wenn nicht, wie kann ich eine Möglichst Ressourcen sparende Alternative verwirklichen?

Vielen Dank und Viele grüße

h3inz3l aka Lucas
 

h3inz3l

Schafhirte
Registriert
12 April 2013
Beiträge
132
Diamanten
0
Minecraft
h3inz3l
Code:
package me.h3inz3l.Example;

import java.util.ArrayList;
import java.util.UUID;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;

public class Example extends JavaPlugin implements Listener {
   
    private ArrayList<String> user = null;
    private BukkitTask ex1 = null;
    private Example pl;
   
    @Override
    public void onEnable() {
        Bukkit.getPluginManager().registerEvents(this, this);
       
        user = new ArrayList<>();
        this.pl = this;
       
        ex1 = new BukkitRunnable() {
           
            @Override
            public void run() {
               
                for(String uuid : user) {
                    Player p = Bukkit.getServer().getPlayer(UUID.fromString(uuid));
                    p.setMetadata("VALUE", new FixedMetadataValue(pl, (p.getMetadata("VALUE").get(0).asDouble()) - 1));
                }
               
            }
           
        }.runTaskTimer(pl, 0L, 100L);
       
    }
   
    @Override
    public void onDisable() {
        ex1.cancel();
    }
   
    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
        String UUID = e.getPlayer().getUniqueId().toString();
        user.add(UUID);
    }
   
    @EventHandler
    public void onLeave(PlayerQuitEvent e) {
        String UUID = e.getPlayer().getUniqueId().toString();
        if(user.contains(UUID)) {
            user.remove(UUID);
        }
    }
}

Hab ich schnell geschrieben, da mein jetziger Code eben für jeden Spieler einen eigenen Task startet.
Also irgendwelche Kleinigkeiten müssen nicht bemängelt werden.

Es geht nur um die ArrayList user, in der im Task iteriert wird.

Danke h3inz3l
 

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.675
Diamanten
830
Also als erstes solltest du aufhören die UUID in einen String umzuwandeln. Das ist nämlich garnicht nötig und solange sie als UUID-Typ gespeichert ist hast du Typsicherheit.

Ansonsten sollte das so funktionieren, wie du es gepostet hast, wobei es keinen sinn macht, da du den Code im Task auch direkt beim joinen ausführen kannst, ich seh da grad keinen Grund den regelämßig auszufüren, der setzt eh immer dieselben Metadaten.

Ansonsten hast du auch diverse Fehler bei Plugin Laden/Entladen. Wenn dein Plugin nämlich erst geladen wird, nachdem schon Spieler auf dem Server sind ist deine Spielerliste fälschlicherweise leer. Außerdem solltest du beim deaktivieren die gesetzten Metadaten wieder löschen. Das ist zwar nicht die Ursache für dein Problem, aber trozdem wichtig, damit das Plugin sauber gestoppt werden kann ohne den Server zu beenden.
 

h3inz3l

Schafhirte
Registriert
12 April 2013
Beiträge
132
Diamanten
0
Minecraft
h3inz3l
Also wie gesagt:

Es geht nur um die ArrayList user, in der im Task iteriert wird.

Ich hab den Code nur kurz hingeschrieben und schnell exportiert.
Der Server läuft und es passiert nichts.
(Ja ich hab mir die Daten in der Konsole ausgeben lassen, ja ich bin davor auch auf den Server gejoint)

An sich ist der Code ja völlig in Ordnung, abgesehen von der Sache mit UUID und Metadaten löschen.
.
.
.
Misteriös, ich habe grade einfach nichts verändert und plötzlich geht es einwandfrei...

Naja, trotzdem vielen Dank an alle
 
Oben