ServerPlugin Config aus Ressourcen kopieren

Dieses Thema im Forum "Programmierung" wurde erstellt von Mario52, 31. August 2014.

  1. Mario52
    Offline

    Mario52

    Registriert seit:
    19. August 2013
    Beiträge:
    511
    Minecraft:
    Mario_52
    Hallo, das Thema wurde vor kurzem schon angesprochen, aber ich habe ein neues Problem:
    Vorhin hat es geklappt, die Config aus den Ressourcen zu kopieren, jetzt gibt es einen Fehler.
    Code (Text):
    1. [21:58:59] [Server thread/ERROR]: Error occurred while enabling MySecureServer v1.0.0 (Is it up to date?)
    2. java.lang.NullPointerException
    3.     at de.mario52.Main.Mainclass.copyConfig(Mainclass.java:57) ~[?:?]
    4.     at de.mario52.Main.Mainclass.onEnable(Mainclass.java:21) ~[?:?]
    5.     at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:250) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    6.     at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:350) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    7.     at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:389) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    8.     at org.bukkit.craftbukkit.v1_7_R1.CraftServer.loadPlugin(CraftServer.java:439) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    9.     at org.bukkit.craftbukkit.v1_7_R1.CraftServer.enablePlugins(CraftServer.java:375) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    10.     at org.bukkit.craftbukkit.v1_7_R1.CraftServer.reload(CraftServer.java:773) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    11.     at org.bukkit.Bukkit.reload(Bukkit.java:279) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    12.     at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:23) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    13.     at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:175) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    14.     at org.bukkit.craftbukkit.v1_7_R1.CraftServer.dispatchCommand(CraftServer.java:683) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    15.     at org.bukkit.craftbukkit.v1_7_R1.CraftServer.dispatchServerCommand(CraftServer.java:670) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    16.     at net.minecraft.server.v1_7_R1.DedicatedServer.aw(DedicatedServer.java:286) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    17.     at net.minecraft.server.v1_7_R1.DedicatedServer.u(DedicatedServer.java:251) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    18.     at net.minecraft.server.v1_7_R1.MinecraftServer.t(MinecraftServer.java:545) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    19.     at net.minecraft.server.v1_7_R1.MinecraftServer.run(MinecraftServer.java:457) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    20.     at net.minecraft.server.v1_7_R1.ThreadServerApplication.run(SourceFile:617) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
    21. [21:58:59]
    Plugin Code:
    Code (Text):
    1. FileOutputStream writer = new FileOutputStream(new File("plugins//MySecureServer//config.yml"));
    2.             InputStream out = Mainclass.class.getResourceAsStream("/config.yml");
    3.             byte[] linebuffer = new byte[1024];
    4.             int lineLength;
    5.            
    6.             while((lineLength = out.read(linebuffer)) > 0)
    7.             {
    8.             writer.write(linebuffer, 0, lineLength);
    9.             }
    10.             out.close();
    11.             writer.close();
    Fehlerzeile:
    Code (Text):
    1. while((lineLength = out.read(linebuffer)) > 0)
    Ich hoffe jemand kann mir helfen.
    LG
     
    #1
  2. #2
  3. Mario52
    Offline

    Mario52

    Registriert seit:
    19. August 2013
    Beiträge:
    511
    Minecraft:
    Mario_52
    Oh. Ich habe vorhin im Bukkit-Forum danach gesucht, und es wurde nur meine Lösung vorgeschlagen.
    Trotzdem vielen Dank. Werde ich gleich ausprobieren.
     
    #3
  4. Mario52
    Offline

    Mario52

    Registriert seit:
    19. August 2013
    Beiträge:
    511
    Minecraft:
    Mario_52
    Gibt es sowas auch für Dateien, die nicht in den Ordner des Plugins sondern in das plugins-Verzeichnis kommen?
     
    #4
  5. derluuc
    Offline

    derluuc

    Registriert seit:
    1. September 2014
    Beiträge:
    4
    #5
  6. Mario52
    Offline

    Mario52

    Registriert seit:
    19. August 2013
    Beiträge:
    511
    Minecraft:
    Mario_52
    Danke.
     
    #6
  7. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Hallo,

    ist dieser Code richtig? Wenn ja, wie lasse ich den boolean beim start ausführen? Wenn nein, wie lautet der Code richtig?

    Code (Text):
    1.  
    2.        public boolean saveResourceToPath(String resourcePath, String targetFolder) {
    3.         java.io.InputStream in = getResource(resourcePath);
    4.         if(in == null)
    5.         return false;
    6.      
    7.         int lastIndex = resourcePath.lastIndexOf('/');
    8.         File outDir = new File(dataFolder, resourcePath.substring(0, lastIndex >= 0 ? lastIndex : 0));
    9.         if(!outDir.exists())
    10.         outDir.mkdirs();
    11.         File outFile = new File(targetFolder, resourcePath);
    12.         try {
    13.         if (!outFile.exists()) {
    14.         OutputStream out = new FileOutputStream(outFile);
    15.         byte[] buf = new byte[1024];
    16.         int len;
    17.         while ((len = in.read(buf)) > 0) {
    18.         out.write(buf, 0, len);
    19.         }
    20.         out.close();
    21.         in.close();
    22.         } else {
    23.         return false;
    24.         }
    25.         } catch (IOException ex) {
    26.         return false;
    27.         }
    28.         return true;
    29.         }
    30.  

    Von wo muss ich eigentlich den InputStream importieren? (Zu viele Auswahlmöglichkeiten)
     
    #7
  8. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Was willst du für einen boolean ausführen? Außerdem solltest du den Code richtig formatieren, damit man den auch lesen kann.
    InputStream musst du nicht importieren, weil schon angegeben ist, welchen du benutzen musst (
    java.io.InputStream).
     
    #8
  9. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Führt der sich der Code von alleine aus? Wenn er in der Main enthalten ist?

    http://pastebin.com/L4zQ12r6

    Dann habe ich es richtig importiert/immportieren lassen bzw gefixt/fixen lassen


    Mein obriger Code möchte einfach nicht funktionieren :(
     
    #9
  10. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Schau mal hier: http://de.wikipedia.org/wiki/Quelltextformatierung zur Quelltextformatierung.

    Du musst die Methode in der onEnable()-Methode aufrufen und die Pfade übergeben:
    Code (Text):
    1. public void onEnable() {
    2.   saveResourceToPath("Lobby/src/messages.yml", "plugins/Lobby/messages.yml");
    3.   //Weiterer Code
    4.  
    Die Variablen 'resourcePath' und 'targetFolder' benötigst du dann nicht mehr.
     
    #10
  11. derluuc
    Offline

    derluuc

    Registriert seit:
    1. September 2014
    Beiträge:
    4
    Der boolean ist nur der Rückgabewert ob das speichern geklappt hat. Du kannst ihn benutzen
    Code (Text):
    1.  
    2. boolean saved = saveResourceToPath("bla");
    3.  
    oder einfach ignorieren
    Code (Text):
    1.  
    2. saveResourceToPath ("bla");
    3.  
     
    #11
  12. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Es möchte einfach nicht kopieren!
    Und das dataFolder wird rot Unterstrichen

    Code (Text):
    1.  
    2. package de.mrpyro13.lobby;
    3.  
    4. import java.io.File;
    5. import java.io.FileOutputStream;
    6. import java.io.IOException;
    7. import java.io.OutputStream;
    8.  
    9. import org.bukkit.configuration.file.FileConfiguration;
    10. import org.bukkit.configuration.file.YamlConfiguration;
    11. import org.bukkit.inventory.Inventory;
    12. import org.bukkit.plugin.java.JavaPlugin;
    13.  
    14. public class Main extends JavaPlugin {
    15.  
    16.     @Override
    17.     public void onDisable() {
    18.         System.out.println("[Lobby] Plugin wurde beendet");
    19.     }
    20.  
    21.     @Override
    22.     public void onEnable() {
    23.         System.out.println("[Battelfield - Statistik] Plugin wurde gestartet");
    24.      
    25.         //Config Laden
    26.         loadConfig();
    27.      
    28.         //Messages + Levels Laden
    29.         saveResourceToPath("Lobby/src/messages.yml","/plugins/Lobby/messages.yml");
    30.      
    31.         //Command Imports
    32.      
    33.         //Listener Imports
    34.         new Listener_Join(this);
    35.         new Listener_Quit(this);
    36.         new Listener_InvMenu_Haupt(this);
    37.         new Listener_InvMenu_Opening(this);
    38.      
    39.     }
    40.  
    41.     //FILE IMPORT
    42.  
    43.     File messages= new File("plugins/Lobby", "messages.yml");
    44.     FileConfiguration msg_cfg = YamlConfiguration.loadConfiguration(messages);
    45.  
    46.     File data = new File("plugins/_Database_", "data.yml");
    47.     FileConfiguration data_cfg = YamlConfiguration.loadConfiguration(data);
    48.  
    49.     File levels = new File("plugins/_Database_", "levels.yml");
    50.     FileConfiguration lvl_cfg = YamlConfiguration.loadConfiguration(levels);
    51.  
    52.  
    53.     //Extra
    54.     public Inventory inv;
    55.  
    56.  
    57.     //Public Voids
    58.     public void loadConfig() {
    59.         getConfig().options().copyDefaults(true);
    60.         saveConfig();
    61.     }
    62.  
    63.     public void saveData() {
    64.         try {
    65.             data_cfg.save(data);
    66.         } catch (IOException e) {
    67.             e.printStackTrace();
    68.         }
    69.     }
    70.  
    71.     public boolean saveResourceToPath(String resourcePath, String targetFolder) {
    72.         java.io.InputStream in = getResource(resourcePath);
    73.         if(in == null)
    74.         return false;
    75.        
    76.         int lastIndex = resourcePath.lastIndexOf('/');
    77.         File outDir = new File(dataFolder, resourcePath.substring(0, lastIndex >= 0 ? lastIndex  : 0));
    78.         if(!outDir.exists())
    79.         outDir.mkdirs();
    80.         File outFile = new File(targetFolder, resourcePath);
    81.         try {
    82.         if (!outFile.exists()) {
    83.         OutputStream out = new FileOutputStream(outFile);
    84.         byte[] buf = new byte[1024];
    85.         int len;
    86.         while ((len = in.read(buf)) > 0) {
    87.         out.write(buf, 0, len);
    88.         }
    89.         out.close();
    90.         in.close();
    91.         } else {
    92.         return false;
    93.         }
    94.         } catch (IOException ex) {
    95.         return false;
    96.         }
    97.         return true;
    98.         }
    99.  
    100. }
    101.  
     
    #12
  13. Elrontur
    Offline

    Elrontur Ehem. Teammitglied

    Registriert seit:
    5. April 2013
    Beiträge:
    138
    Minecraft:
    Elrontur
    Wenn es echt nur um eine normale Config geht, habe ich auch was zu liefern. Das hat bei mir eig. immer gut funktioniert, was Windows angeht. Einige Leute haben auf meine Plugins geantwortet, dass damit ein Linux-MCServer net klarkommt... Ich kann da jedoch leider nicht ansetzen. ^^ Hat was mit den "/" zu tun bzw. "\" bei Windows. (Ich habe meinen Configfile-Pfad definitiv nicht hardcoded und keine / oder \ benutzt.)

    Code (Text):
    1.  
    2. File config = new File(getDataFolder(), "config.yml");
    3. if(!getDataFolder().exists()) {
    4.     getDataFolder().mkdir();
    5. }
    6. if (!config.exists()) {
    7.     getConfig().options().copyDefaults(true);
    8.     saveConfig();
    9.  
    10.     getLogger().log(Level.INFO, "Config created. Configure the config.yml and restart the server to connect to your database!");
    11. } else {
    12.     // DO STUFF ...
    13. }
     
    #13
  14. _Baum_
    Offline

    _Baum_

    Registriert seit:
    4. August 2013
    Beiträge:
    66
    Minecraft:
    PlueschAffe
    Hi zusammen,

    mal ganz ehrlich, worum geht es hier eigentlich? Eine ganz normale Config?!
    Wenn man schon den Luxus genießt und Bukkit benutzen kann, wieso dann so umständlich?

    Config laden:
    Code (Text):
    1.  
    2. //Sollte im onEnable() stehen
    3.  
    4. //Normale Config
    5. String currentDir= System.getProperty("config.yml");
    6. File Dir = new File(currentDir + "/plugins/PluginName/config.yml");
    7. if(!Dir.exists())
    8. {
    9.        plugin.saveDefaultConfig();
    10.   }
    11.  
    12. //Selbstbenannte Config
    13. FileConfiguratioon egal_yml = YamlConfiguration.loadConfiguration(new File("plugins/Egal/egal.yml"));
    14. //Der Ordner "Egal" und das Dokument "egal.yml" scheinen sich au magische Art und Weise zu erstellen :O
    15.  


    Mit der Config irgendwas machen:
    Code (Text):
    1.  
    2. FileConfiguration config = plugin.getConfig();
    3. //Für selbstbennante Config siehe oben
    4.  
    Die Config bearbeiten
    Code (Text):
    1.  
    2. config.set("pfad","Wert");
    3. //Wert kann hier zB. den Datentyp Boolean, String, Integer, etc. haben)
    4. //Methode überschreibt oder legt neu an
    5. //Für selbstbenannte Config identisch, da Datentyp gleich
    6.  

    Werte aus der Config auslesen:
    Code (Text):
    1.  
    2. config.get("pfad");
    3. //Oder:
    4. config.getString("Pfad");
    5. config.getStringList("Pfad");
    6. ...
    7. //Für selbstbenannte Config identisch, da Datentyp gleich
    8.  
    Die Config speichern:
    Code (Text):
    1.  
    2. //Normale Config
    3. plugin.saveConfig();
    4.  
    5. //Selbstbenannte Config
    6. egal_yml.save(new File("plugins/Egal/egal.yml"));
    7.  
    Sollte der Code in der Mainclass ausgeführt werden kann man statt "plugin" auch "this" schreiben.
    Sonst muss "plugin" ein Wert (in diesem Fall die Mainclass) zugewiesen werden.

    War das das Problem? :D

    MfG
    _Baum_
     
    #14
  15. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Es geht darum,zB eine messages.yml aus dem src-Ordner des Plugins in den Plugin Ordner des Servers zu kopieren
    Übrigens, es geht bei mir immer noch nicht :/
     
    #15
  16. [Dev] iTzSasukeHDxLP
    Offline

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938
    Schonmal was von copyDefaults gehört ? So macht man gewöhnlich auch configs. Damit geht das ganz einfach.
     
    #16
  17. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Ja, ich möchte meine Config nicht mit Nachrichten vollmüllen, deshalb eine messages.yml
     
    #17
  18. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Du kannst auch andere Dateien als FileConfiguration laden und dann diese Methoden (addDefault(), set(), ...) benutzen.
     
    #18
  19. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Leider hatte ich diese Idee auch schon. Doch wenn eine Datei 400 Zeilen lang ist, ist das echt schlecht....
     
    #19
  20. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Wenn du aber später Nachrichten hinzufügst (, weil das Plugin mehr Funktionen bekommen hat), stehen diese nicht mehr in der Datei. So musst du also immer die Datei neu kopieren und die Übersetzungen sind wieder auf standard.
     
    #20