ServerPlugin ArrayList Speichern

Dieses Thema im Forum "Programmierung" wurde erstellt von CrackRudi, 12. Mai 2016.

  1. CrackRudi
    Offline

    CrackRudi

    Registriert seit:
    18. April 2016
    Beiträge:
    33
    Hallo bin es jetzt schon wieder xD :) Ich bin noch neu in Bukkit/JAVA.!

    Ich wollte Frage wie meine ArrayList einen Neustart überlebt . Also die Sachen die ich dort gespeichert habe !

    Danke schon wieder für eure Hilfe !
    Code (Javascript):
    1. package de.crackburn.cmd;
    2.  
    3. import java.io.File;
    4. import java.util.HashMap;
    5.  
    6. import org.bukkit.GameMode;
    7. import org.bukkit.Material;
    8. import org.bukkit.command.Command;
    9. import org.bukkit.command.CommandExecutor;
    10. import org.bukkit.command.CommandSender;
    11. import org.bukkit.configuration.file.FileConfiguration;
    12. import org.bukkit.configuration.file.YamlConfiguration;
    13. import org.bukkit.entity.Player;
    14. import org.bukkit.event.Listener;
    15. import org.bukkit.inventory.ItemStack;
    16. import org.bukkit.inventory.meta.ItemMeta;
    17.  
    18. import de.crackburn.main.main;
    19.  
    20. public class CMD_Builder implements CommandExecutor, Listener{
    21.    
    22.     public static HashMap<String, ItemStack[]> inventory = new HashMap<>();
    23.  
    24.     @Override
    25.     public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
    26.         Player p = (Player) sender;
    27.         if(p.hasPermission("crackburn.buildermodus")){
    28.         if(cmd.getName().equalsIgnoreCase("builder")){
    29.             if(args.length == 0){
    30.                
    31.                 p.sendMessage(main.pr + " /builder <on>");
    32.                 p.sendMessage(main.pr + " /builder <off>");
    33.                
    34.                 return true;
    35.             }
    36.             if(args[0].equalsIgnoreCase("on")){
    37.                 p.getInventory().clear();
    38.                 ItemStack[]contents = inventory.get(p.getName());
    39.                 p.getInventory().setContents(contents);
    40.                 p.sendMessage(main.pr + " Der Builder modus wurde eingeschaltet");
    41.                 p.setGameMode(GameMode.CREATIVE);
    42.    
    43.                 return false;
    44.                
    45.             }
    46.             if(args[0].equalsIgnoreCase("off")){
    47.                 inventory.put(p.getName(), p.getInventory().getContents());
    48.                 p.sendMessage(main.pr + " Der Builder modus wurde ausgeschaltetet");
    49.                 p.getInventory().clear();
    50.                 p.setGameMode(GameMode.ADVENTURE);
    51.                
    52.                 ItemStack compass = new ItemStack(Material.COMPASS);
    53.                 ItemMeta compassM = compass.getItemMeta();
    54.                 compassM.setDisplayName("§aNavigation §7(Rechtsklick)");
    55.                 compass.setItemMeta(compassM);
    56.                
    57.                 ItemStack charge = new ItemStack(Material.ENDER_PEARL);
    58.                 ItemMeta chargemeta = charge.getItemMeta();
    59.                 chargemeta.setDisplayName("§5EnderPearl");
    60.                 charge.setItemMeta(chargemeta);
    61.                
    62.                 ItemStack chest = new ItemStack(Material.ENDER_CHEST);
    63.                 ItemMeta chestmeta = chest.getItemMeta();
    64.                 chestmeta.setDisplayName("§cRegeln §7& §6Extras §7(Rechtsklick)");
    65.                 chest.setItemMeta(chestmeta);
    66.                
    67.                 ItemStack clock = new ItemStack(Material.WATCH);
    68.                 ItemMeta clockM = clock.getItemMeta();
    69.                 clockM.setDisplayName("§3Lobby Switcher §7(Rechtsklick)");
    70.                 clock.setItemMeta(clockM);
    71.                
    72.                 ItemStack blaze = new ItemStack(Material.BLAZE_ROD);
    73.                 ItemMeta blazemeta = blaze.getItemMeta();
    74.                 blazemeta.setDisplayName("§4Spieler verstecken §7(Rechtsklick)");
    75.                 blaze.setItemMeta(blazemeta);
    76.                
    77.                 p.getInventory().setItem(0, charge);
    78.                 p.getInventory().setItem(2, chest);
    79.                 p.getInventory().setItem(4, compass);
    80.                 p.getInventory().setItem(6, blaze);
    81.                 p.getInventory().setItem(8, clock);
    82.                 return false;
    83.                
    84.             }
    85.         }
    86.  
    87.     }else{
    88.         p.sendMessage(main.pr + " Du hast keine Rechte für diesen Befehl!");
    89.     }
    90.         return false;
    91.     }
    92.  
    93.    
    94.  
    95. }
    96.  
     
    #1
  2. jensIO
    Offline

    jensIO

    Registriert seit:
    28. Juli 2015
    Beiträge:
    602
    Ort:
    Internet, im Neuland
    Minecraft:
    jens1o
    Eine ArrayList kann meines Wissens nach serialisiert werden. (Bin aber nicht ganz fit in Java.) Das Stichwort dürfte dir hilfreich sein.
     
    #2
  3. Verschraubt
    Online

    Verschraubt

    Mit einer Config.
    Da gibt es eine passende Schnittstelle direkt von Bukkit. Mit dieser kannst du eine Liste ganz einfach speichern und wieder auslesen.
    Hierzu gibt es einen Eintrag in der Bukkit Wiki: KLICK


    Besten Gruß,
    Verschraubt
     
    #3
  4. jensIO
    Offline

    jensIO

    Registriert seit:
    28. Juli 2015
    Beiträge:
    602
    Ort:
    Internet, im Neuland
    Minecraft:
    jens1o
    wäre eine Serialisierung hierbei nicht sinnvoller?

    Serialisierung mit yaml?
     
    #4
  5. Verschraubt
    Online

    Verschraubt

    Sinnvoller ja, aber für einen Laien nicht empfehlenswert. Der Vorteil einer Config ist, dass sie so benutzerfreundlich ist.
     
    #5
  6. jensIO
    Offline

    jensIO

    Registriert seit:
    28. Juli 2015
    Beiträge:
    602
    Ort:
    Internet, im Neuland
    Minecraft:
    jens1o
    Hmm... Da hast du Recht, wobei ich eher der Meinung bin, es gleich richtig zu machen, deutlich besser ist.
     
    #6
    Verschraubt gefällt das.
  7. CrackRudi
    Offline

    CrackRudi

    Registriert seit:
    18. April 2016
    Beiträge:
    33
    Vielen Dank muss mal morgen kucken sie ich dass mache. :)
     
    #7
  8. Inkemann
    Offline

    Inkemann

    Registriert seit:
    3. Mai 2015
    Beiträge:
    341
    Ort:
    Aachen
    Minecraft:
    Inkemann
    Händische Serialisierung ist hier nicht unbedingt die bessere Methode, allein aufgrund der hohen Kosten.
     
    #8
  9. 可愛い
    Offline

    可愛い

    Registriert seit:
    19. Mai 2014
    Beiträge:
    654
    Selbst wenn da 1000 Einträge drin sind, ich vermute ja mal so wie der TE die Frage gestellt hat, dass die Liste nur einmal bei Start geladen wird, von daher ist die Performance schon fast egal.

    Zum Thema: Bukkit bietet dafür z.B. die Config Klasse an, aber es spricht auch nichts dagegen eine andere Library für die Serialisierung zu nutzen, mein Favorit ist Gson, aber solange du nicht die Grundlegende Idee dahinter verstanden hast solltest du überhaupt nichts davon benutzen.
     
    #9
    Verschraubt und jensIO gefällt das.
  10. CrackRudi
    Offline

    CrackRudi

    Registriert seit:
    18. April 2016
    Beiträge:
    33
    Ok Danke
     
    #10
  11. Inkemann
    Offline

    Inkemann

    Registriert seit:
    3. Mai 2015
    Beiträge:
    341
    Ort:
    Aachen
    Minecraft:
    Inkemann
    Mir ging es mehr darum, dass die Serialisierung (natürlich serialisiert jede API irgendwo, aber direkt "selbstgemachte" Serialisierung) als "richtiger" oder "besser" dargestellt wird. Dabei macht Bukkits Configuration API einen sehr guten Job, was so simple Probleme angeht und erzeugt nicht noch zusätzlich Overhead (wie mit einer Dritt-API).
     
    #11