ServerPlugin Scheduler -Playerlist

Dieses Thema im Forum "Programmierung" wurde erstellt von h3inz3l, 10. Februar 2015.

  1. h3inz3l
    Offline

    h3inz3l

    Registriert seit:
    12. April 2013
    Beiträge:
    131
    Ort:
    Hinter der nächsten Ecke
    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
     
    #1
  2. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Eine List, die als final deklariert wurde, kann trotzdem verändert werden bzw. es können Spieler hinzugefügt und entfernt werden.
     
    #2
  3. h3inz3l
    Offline

    h3inz3l

    Registriert seit:
    12. April 2013
    Beiträge:
    131
    Ort:
    Hinter der nächsten Ecke
    Minecraft:
    h3inz3l
    Dann liegt es an etwas anderem, auf jeden Fall werden, wenn der List neue Spieler hinzugefügt werden, diese nicht mit im Scheduler aufgerufen.
     
    #3
  4. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Poste mal bitte deinen kompletten Code.
     
    #4
  5. h3inz3l
    Offline

    h3inz3l

    Registriert seit:
    12. April 2013
    Beiträge:
    131
    Ort:
    Hinter der nächsten Ecke
    Minecraft:
    h3inz3l
    Code (Text):
    1. package me.h3inz3l.Example;
    2.  
    3. import java.util.ArrayList;
    4. import java.util.UUID;
    5.  
    6. import org.bukkit.Bukkit;
    7. import org.bukkit.entity.Player;
    8. import org.bukkit.event.EventHandler;
    9. import org.bukkit.event.Listener;
    10. import org.bukkit.event.player.PlayerJoinEvent;
    11. import org.bukkit.event.player.PlayerQuitEvent;
    12. import org.bukkit.metadata.FixedMetadataValue;
    13. import org.bukkit.plugin.java.JavaPlugin;
    14. import org.bukkit.scheduler.BukkitRunnable;
    15. import org.bukkit.scheduler.BukkitTask;
    16.  
    17. public class Example extends JavaPlugin implements Listener {
    18.    
    19.     private ArrayList<String> user = null;
    20.     private BukkitTask ex1 = null;
    21.     private Example pl;
    22.    
    23.     @Override
    24.     public void onEnable() {
    25.         Bukkit.getPluginManager().registerEvents(this, this);
    26.        
    27.         user = new ArrayList<>();
    28.         this.pl = this;
    29.        
    30.         ex1 = new BukkitRunnable() {
    31.            
    32.             @Override
    33.             public void run() {
    34.                
    35.                 for(String uuid : user) {
    36.                     Player p = Bukkit.getServer().getPlayer(UUID.fromString(uuid));
    37.                     p.setMetadata("VALUE", new FixedMetadataValue(pl, (p.getMetadata("VALUE").get(0).asDouble()) - 1));
    38.                 }
    39.                
    40.             }
    41.            
    42.         }.runTaskTimer(pl, 0L, 100L);
    43.        
    44.     }
    45.    
    46.     @Override
    47.     public void onDisable() {
    48.         ex1.cancel();
    49.     }
    50.    
    51.     @EventHandler
    52.     public void onJoin(PlayerJoinEvent e) {
    53.         String UUID = e.getPlayer().getUniqueId().toString();
    54.         user.add(UUID);
    55.     }
    56.    
    57.     @EventHandler
    58.     public void onLeave(PlayerQuitEvent e) {
    59.         String UUID = e.getPlayer().getUniqueId().toString();
    60.         if(user.contains(UUID)) {
    61.             user.remove(UUID);
    62.         }
    63.     }
    64. }
    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
     
    #5
  6. 可愛い
    Offline

    可愛い

    Registriert seit:
    19. Mai 2014
    Beiträge:
    654
    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.
     
    #6
  7. h3inz3l
    Offline

    h3inz3l

    Registriert seit:
    12. April 2013
    Beiträge:
    131
    Ort:
    Hinter der nächsten Ecke
    Minecraft:
    h3inz3l
    Also wie gesagt:

    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
     
    #7