ServerPlugin Kopieren

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

  1. MrPyro13
    Offline

    MrPyro13

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

    ich habe mal eine Frage, unzwar:
    Wie kopiere ich jedesmal, wenn der Server startet, eine Datei aus dem src-Ordner (aus dem Projekt) in den Plugin-Ordner des Servers?
     
    #1
  2. [Dev] iTzSasukeHDxLP
    Offline

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938
    FileInPut und FileOuputStream:

    Code (Text):
    1. private static void copyFileUsingFileStreams(File source, File dest)
    2.         throws IOException {
    3.     InputStream input = null;
    4.     OutputStream output = null;
    5.     try {
    6.         input = new FileInputStream(source);
    7.         output = new FileOutputStream(dest);
    8.         byte[] buf = new byte[1024];
    9.         int bytesRead;
    10.         while ((bytesRead = input.read(buf)) > 0) {
    11.             output.write(buf, 0, bytesRead);
    12.         }
    13.     } finally {
    14.         input.close();
    15.         output.close();
    16.     }
    17. }

    Die Files übergibst du halt (new File("pfad"))
     
    #2
  3. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Ehm... Okay?
    Ich blicke irgendwie nicht so richtig durch.
    Meine messages.yml soll beim Plugin/Server Start in den Plugin-Ordner kopiert werden.

    Code (Text):
    1.  
    2. File file= new File("plugins/PLUGIN_ORDNER", "messages.yml");  
    3.  
    4. private static void copyFileUsingFileStreams(File src\messages.yml, file)
    5.         throws IOException {
    6.     InputStream input = null;
    7.     OutputStream output = null;
    8.     try {
    9.         input = new FileInputStream(src\messages.yml);
    10.         output = new FileOutputStream(file);
    11.         byte[] buf = new byte[1024];
    12.         int bytesRead;
    13.         while ((bytesRead = input.read(buf)) > 0) {
    14.             output.write(buf, 0, bytesRead);
    15.         }
    16.     } finally {
    17.         input.close();
    18.         output.close();
    19.     }
    20. }
    21.  
     
    #3
  4. [Dev] iTzSasukeHDxLP
    Offline

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938
    Nein. Es werden zwei Files übergeben.

    Diese musst du, wie unten beschrieben so initialiseren:

    File source = new File("Pfad/zu/Sasukes/geilem/File.png");
    File dest = new("Koolheit/Log/File.png");
     
    #4
  5. Mario52
    Offline

    Mario52

    Registriert seit:
    19. August 2013
    Beiträge:
    511
    Minecraft:
    Mario_52
    Er meint wie man eine Datei aus den Ressourcen der .jar rüberkopiert denke ich mal.

    Code (Text):
    1. FileOutputStream writer = new FileOutputStream(new File("verzeichnis//messages.yml"));
    2.             InputStream out = Mainclass.class.getResourceAsStream("/messages.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();
     
    #5
  6. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Ja, das meine ich :D

    Dann noch eine Frage:
    Ich habe eine File definiert, die jeden Kill abspeichert (funktioniert). Doch wenn ich mit /kills die Kills abrufen möchte, dann zeigt er nur die Kills an, die vor dem letzen Reload passiert sind, obwohl in der File die richtige Zahl steht.
    Reloade ich den Server, dann stimmt die Zahl bei /kills, solange ich keinen Töte. Sonst ist sie wieder falsch.
    Was ist der Fehler? Muss ich die data in der /kills Klasse nochmal relaoden? Wenn ja, wie?
     
    #6
  7. Mario52
    Offline

    Mario52

    Registriert seit:
    19. August 2013
    Beiträge:
    511
    Minecraft:
    Mario_52
    Habe dir den Code gepostet.

    Bist du sicher das du jede Änderung abgespeichert hast? Bis jetzt hat das bei mir immer funktioniert.
     
    #7
  8. Basti07711
    Offline

    Basti07711 Ehem. Teammitglied

    Registriert seit:
    2. August 2012
    Beiträge:
    714
    Ort:
    Hinter dir
    Minecraft:
    Basti07711
    Wenn du eine YMLConfiguration nutzt, kannst du ja bevore du die Kills abrufst die file Laden.
     
    #8
  9. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    Naja ich habe eigentlich keinen Fehler gefunden. Vielleicht findet ihr/du ja den Fehler:

    Code (Text):
    1.  
    2. package de.mrpyro13.bf_stats;
    3.  
    4. import java.io.File;
    5. import java.io.IOException;
    6.  
    7. import org.bukkit.Bukkit;
    8. import org.bukkit.Sound;
    9. import org.bukkit.configuration.file.FileConfiguration;
    10. import org.bukkit.configuration.file.YamlConfiguration;
    11. import org.bukkit.entity.Player;
    12. import org.bukkit.event.EventHandler;
    13. import org.bukkit.event.Listener;
    14. import org.bukkit.event.entity.PlayerDeathEvent;
    15.  
    16. public class Listener_Kills_Death implements Listener {
    17.  
    18.     //MAIN IMPORT - Listener
    19.     @SuppressWarnings("unused")
    20.     private Main inst;
    21.     public Listener_Kills_Death(Main plugin) {
    22.         this.inst = plugin;
    23.         plugin.getServer().getPluginManager().registerEvents(this, plugin);
    24.     }
    25.  
    26.     //FILE IMPORT - messages
    27.     File messages= new File("plugins/Battelfield_Statistik_Plugin", "messages.yml");
    28.     FileConfiguration msg_cfg = YamlConfiguration.loadConfiguration(messages);
    29.  
    30.     //FILE IMPORT - data
    31.     File data = new File("plugins/Battelfield_Statistik_Plugin", "data.yml");
    32.     FileConfiguration data_cfg = YamlConfiguration.loadConfiguration(data);
    33.  
    34.     @EventHandler
    35.     public void onKill(PlayerDeathEvent e) {
    36.         if (e.getEntity().getKiller() instanceof Player) {
    37.  
    38.             Player death = e.getEntity();
    39.             Player killer = e.getEntity().getKiller();
    40.      
    41.             int verluste = data_cfg.getInt(death.getName() + ".deaths");
    42.             int kills = data_cfg.getInt(killer.getName() + ".kills");
    43.      
    44.             verluste++;
    45.             kills++;
    46.      
    47.             data_cfg.set(death.getName() + ".deaths", verluste);
    48.             data_cfg.set(killer.getName() + ".kills", kills);
    49.             try {
    50.                 data_cfg.save(data);
    51.             } catch (IOException e1) {
    52.                 e1.printStackTrace();
    53.             }
    54.      
    55.             String death_message = msg_cfg.getString("messages.system.death_message");
    56.             death_message = death_message.replace("{Killer}", killer.getName());
    57.             death_message = death_message.replace("{Death}", death.getName());
    58.      
    59.             if (killer.getInventory().getItemInHand().hasItemMeta()) {
    60.                 death_message = death_message.replace("{Item}", killer.getInventory().getItemInHand().getItemMeta().getDisplayName());
    61.                 Bukkit.broadcastMessage(death_message);
    62.                 e.setDeathMessage(null);
    63.             } else {
    64.                 death_message = death_message.replace("{Item}", killer.getInventory().getItemInHand().getType().name());
    65.                 Bukkit.broadcastMessage(death_message);
    66.                 e.setDeathMessage(null);
    67.             }
    68.      
    69.             String prefix = msg_cfg.getString("messages.global.prefix");
    70.      
    71.             String add_death = msg_cfg.getString("messages.system.add_death");
    72.             death.sendMessage(prefix + " " + add_death);
    73.             death.playSound(death.getLocation(), Sound.GHAST_SCREAM, 100, 100);
    74.      
    75.             String add_kill = msg_cfg.getString("messages.system.add_kill");
    76.             killer.sendMessage(prefix + " " + add_kill);
    77.             killer.playSound(killer.getLocation(), Sound.LEVEL_UP, 100, 100);
    78.         }
    79.     }
    80.  
    81.     //Static Voids
    82.  
    83. }
    84.  

    Code (Text):
    1.  
    2. package de.mrpyro13.bf_stats;
    3.  
    4. import java.io.File;
    5.  
    6. import org.bukkit.command.Command;
    7. import org.bukkit.command.CommandExecutor;
    8. import org.bukkit.command.CommandSender;
    9. import org.bukkit.configuration.file.FileConfiguration;
    10. import org.bukkit.configuration.file.YamlConfiguration;
    11. import org.bukkit.entity.Player;
    12.  
    13. public class Command_Kills implements CommandExecutor {
    14.  
    15.     //MAIN IMPORT - CommandExecutor
    16.     @SuppressWarnings("unused")
    17.     private Main inst;
    18.     public Command_Kills(Main plugin){
    19.         this.inst = plugin;
    20.     }
    21.  
    22.     //FILE IMPORT - messages
    23.     File messages= new File("plugins/Battelfield_Statistik_Plugin", "messages.yml");
    24.     FileConfiguration msg_cfg = YamlConfiguration.loadConfiguration(messages);
    25.  
    26.     //FILE IMPORT - data
    27.     File data = new File("plugins/Battelfield_Statistik_Plugin", "data.yml");
    28.     FileConfiguration data_cfg = YamlConfiguration.loadConfiguration(data);
    29.  
    30.     @Override
    31.     public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
    32.         //SCRIPT ANFANG
    33.  
    34.         if (sender instanceof Player) {
    35.             Player p = (Player) sender;
    36.             if (p.hasPermission("Battelfield.kills")) {
    37.                 int kills = data_cfg.getInt(p.getName() + ".kills");
    38.                 String your_kills = msg_cfg.getString("messages.system.your_kills");
    39.                 your_kills = your_kills.replace("{Kills}", String.valueOf(kills));
    40.                 String prefix = msg_cfg.getString("messages.global.prefix");
    41.                 p.sendMessage(prefix + " " + your_kills);
    42.                 return true;
    43.             } else {
    44.                 String no_perms = msg_cfg.getString("messages.error.no_perms");
    45.                 String error_prefix = msg_cfg.getString("messages.error.error_prefix");
    46.                 p.sendMessage(error_prefix + " " + no_perms);
    47.                 return true;
    48.             }
    49.         } else {
    50.             String only_for_players = msg_cfg.getString("messages.error.only_for_players");
    51.             String error_prefix = msg_cfg.getString("messages.error.error_prefix");
    52.             sender.sendMessage(error_prefix + " " + only_for_players);
    53.             return true;
    54.         }
    55.  
    56.         //SCRIPT ENDE
    57.     }
    58.  
    59.     //Static Voids
    60.  
    61. }
    62.  

    @Mario52
    Ich habe den Code auf mein Plugin zugeschnitten und wollte ihn als static-Methode einfügen.
    Doch 2 zeilen werden unterstrichen:

    [​IMG]
     
    #9
  10. Mario52
    Offline

    Mario52

    Registriert seit:
    19. August 2013
    Beiträge:
    511
    Minecraft:
    Mario_52
    Ich habe vergessen Main mit (Hauptklasse) auszutauschen. Du benötigst stat Main den Namen deiner Hauptklasse
     
    #10
  11. MrPyro13
    Offline

    MrPyro13

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

    die Main ist meine Hauptklasse. Hast du evtl. eine Lösung für das /kills Problem?

    //EDIT:
    Das /kills Problem wurde gelöst! Einfach die YAML-Datei laden.
     
    #11
  12. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Es wäre sinnvoll, die FileConfiguration der Dateien 1x zu laden, statt die Datei für jede Klasse neu zu laden. Kein Wunder, dass das nicht so klappt, wie es soll. Außerdem musst du nicht immer die Datei speichern, wenn du was geändert hast. Es reicht, wenn man das beim herunterfahren des Servers (evtl. auch in einem bestimmten Intervall, falls der Server nicht richtig heruntergefahren wird), die Daten in die Datei geschrieben werden.
     
    #12
  13. MrPyro13
    Offline

    MrPyro13

    Registriert seit:
    29. April 2013
    Beiträge:
    829
    Minecraft:
    MrPyro13
    @MiCrJonas1997
    Also soll ich die File in der Main importieren?
    Code (Text):
    1.  
    2. //FILE IMPORT - messages
    3. File messages= new File("plugins/Battelfield_Statistik_Plugin", "messages.yml");
    4. FileConfiguration msg_cfg = YamlConfiguration.loadConfiguration(messages);
    5.  
    Code (Text):
    1.  
    2. //MAIN IMPORT - Listener
    3. private Main inst;
    4. public Listener_Level(Main plugin) {
    5.      this.inst = plugin;
    6.      plugin.getServer().getPluginManager().registerEvents(this, plugin);
    7.     }
    8.  
    und dann von den anderen Klassen einfach darauf zugreifen? mit inst.data_cfg.....
    Funktioniert iwie nicht :/

    @Mario52
    PS: Wie kopiere ich nun eine Datei aus den Ressourcen der .jar rüber?
     
    #13