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

SpigotPlugin Cooldown in config speichern

DeHertiChes

Minecrafter
Registriert
17 September 2016
Beiträge
16
Diamanten
300
Hey, ich habe ein plugin für meinen server gemacht mann soll alle 30 tage mit /gruppen zu einem bestimmten Punkt teleportiert werden.
Ich würde gerne einstellen das immer wenn der server stoppt, die laufenden cooldowns von allen Spielern in die config gespeichert werden. Und wenn der server wieder startet sollen alle wieder aufgerufen werden. Wie kann ich das machen? (bitte simpel erklärt oder mit Beispiel :D das ist mein allererstes plugin)

Code:
import java.util.HashMap;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

public class TestPlugin extends JavaPlugin
{
   public HashMap<String, Long> cooldowns = new HashMap<String, Long>();
   private String prefix = "§4[RollmopsMC]§5";

   public void onEnable()
   {
       initConfig();
       System.out.println(prefix + " erfolgreich geladen!");
   }

   public void onDisable()
   {
       System.out.println(prefix + " erfolgreich deaktiviert!");
   }

   private void initConfig()
   {
       reloadConfig();
       getConfig().addDefault("plugin.prefix", "§4[Gruppen]§5");
       getConfig().options().copyDefaults(true);
       saveConfig();
       prefix = getConfig().getString("plugin.prefix");
   }

   public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
   {
       if (cmd.getName().equalsIgnoreCase("gruppeninfo"))
       {
           sender.sendMessage(prefix + " Mit /gruppen kannst du alle 30 tage deinen Beruf/Gruppe aendern. mehr infos dazu findest du im tutorialbuch (/tutorial)");
           return true;
       }
       if (cmd.getName().equalsIgnoreCase("gruppen"))
       {
       
       
           if(sender instanceof Player)
           {
               int cooldownTime = 2592000;
                if(cooldowns.containsKey(sender.getName())) {
                    long secondsLeft = ((cooldowns.get(sender.getName())/1000)+cooldownTime) - (System.currentTimeMillis()/1000);
                    long DaysLeft =  secondsLeft / 86400;
                    if(secondsLeft>0) {
                        sender.sendMessage(prefix + "Du kannst erst in "+ (DaysLeft+1) +"§5 Tagen wieder Gruppe wechseln!");
                        return true;
                    }
                }
                cooldowns.put(sender.getName(), System.currentTimeMillis());
               Player player = (Player) sender;
               player.sendMessage(prefix + " waehle deine Gruppe! §8 Achtung du kannst sie erst in 30 Tagen wieder wechseln");
               player.teleport(new Location(Bukkit.getWorld("Spawn"), 3000, 70, 3000));
               return true;
           }
           else
           {
               sender.sendMessage(prefix + "diesen Command koennen nur spieler ausfuehren");
               return true;
           }
       }
       return false;
   }
 
Zuletzt bearbeitet:

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.675
Diamanten
830
Unabhängig von der eigentlichen Frage möchte ich kurz darauf hinweisen, dass Server auch Mal crashen. Es wäre also sehr zu empfehlen, die Daten auch regelmäßig zu speichern.

Zur eigentlichen Frage: onDisable Methode in der Plugin Klasse überschreiben.
 

DeHertiChes

Minecrafter
Registriert
17 September 2016
Beiträge
16
Diamanten
300
Ich habe jetzt gemacht das der cooldown beim /gruppen command in die config gespeichert wird (ich mache dann auch das es immer beim stoppen gesaved wird) aber beim aufrufen zeigt mir eclipse einen Fehler an D: wieso ist das falsch?
Code:
import java.util.HashMap;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

public class TestPlugin extends JavaPlugin
{
   public static HashMap<String, Long> cooldowns = new HashMap<String, Long>();
  
   public String prefix = "§4[RollmopsMC]§5";
  
   public void onEnable()
   {
       initConfig();
       System.out.println(prefix + " erfolgreich geladen!");
   }
   
   public void onDisable()
   {
       System.out.println(prefix + " erfolgreich deaktiviert!");
   }
  
   private void initConfig()
   {
       reloadConfig();
       getConfig().addDefault("plugin.prefix", "§0[§4RollmopsMC§0] §5");
       getConfig().options().copyDefaults(true);
       getConfig().addDefault("cooldown.Default.zeituebrig", 0);
       saveConfig();
       prefix = getConfig().getString("plugin.prefix");
   }
  
   public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
   {
       if (cmd.getName().equalsIgnoreCase("gruppeninfo"))
       {
           sender.sendMessage(prefix + " Mit /gruppen kannst du alle 30 tage deinen Beruf/Gruppe aendern. mehr infos dazu findest du im tutorialbuch (/tutorial)");
           return true;
       }
       if (cmd.getName().equalsIgnoreCase("gruppen"))
       {
          
          
           if(sender instanceof Player)
           {
               int cooldownTime = 2592000;
               reloadConfig();
               if(getConfig().get("cooldown." + sender.getName() + ".zeituebrig") == null)
               {
                   getConfig().set("cooldown." + sender.getName() + ".zeituebrig", 0);
                   saveConfig();
               }
               cooldowns.put(sender.getName(), getConfig().get("cooldown." + sender.getName() + ".zeituebrig"));
                if(cooldowns.containsKey(sender.getName())) {
                    long secondsleft = ((cooldowns.get(sender.getName())/1000)+cooldownTime) - (System.currentTimeMillis()/1000);
                    long daysleft = secondsleft / 86400;
                    if(secondsleft>0) {
                        sender.sendMessage(prefix + "Du kannst erst in "+ (daysleft+1) +"§5 Tagen wieder Gruppe wechseln!");
                        return true;
                    }
                }
                cooldowns.put(sender.getName(), System.currentTimeMillis());
                getConfig().set("cooldown." + sender.getName() + ".zeituebrig", System.currentTimeMillis());
                saveConfig();
               Player player = (Player) sender;
               player.sendMessage(prefix + " waehle deine Gruppe! §8 Achtung du kannst sie erst in 30 Tagen wieder wechseln");
               player.teleport(new Location(Bukkit.getWorld("Spawn"), 3000, 70, 3000));
               return true;
           }
           else
           {
               sender.sendMessage(prefix + "diesen Command koennen nur spieler ausfuehren");
               return true;
           }
       }
       return false;
   }
}
 

PSandro

Kuhfänger
Registriert
7 November 2016
Beiträge
51
Diamanten
302
Hallo @DasHanfbauer !
Wollte zuerst den Fehler in deinem Code suchen, doch habe dann die Übersicht verloren und ihn deshalb ein bisschen aufgeräumt. Gewöhne Dir am besten direkt an, dich an die Java Konventionen zu halten. So fällt es anderen Programmierern leichter, Deinen Code nachvollziehen zu können.
Wie ich gesehen habe, speicherst du den Cooldown in der Config selber und noch zusätzlich in einer Map. Das ist zwar möglich, aber meiner Meinung nach nicht nötig.
Code:
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.Calendar;
import java.util.Date;
import java.util.UUID;

/**
* Created by sandro on 05.05.17.
*/
public class GroupCooldown implements CommandExecutor {


    private static final String CONFIG_PATTERN = "cooldown.%s.remainingTime";
    private static final Location GROUP_LOCATION = new Location(Bukkit.getWorld("Spawn"), 3000, 70, 3000);

    private final FileConfiguration yamlConfiguration;
    private final JavaPlugin javaPlugin;
    private final String prefix;

    public GroupCooldown(final JavaPlugin javaPlugin, String prefix) {
        Preconditions.checkNotNull(javaPlugin, "The javaPlugin cannot be null");
        this.yamlConfiguration = javaPlugin.getConfig();
        this.javaPlugin = javaPlugin;
        this.prefix = (prefix == null ? "§4[RollmopsMC]§5 " : prefix);
    }

    public boolean onCommand(CommandSender commandSender, Command command, String commandLabel, String[] args) {
        Preconditions.checkNotNull(commandSender, "The commandSender cannot be null");
        Preconditions.checkNotNull(command, "The command cannot be null");

        if (commandSender instanceof Player) {
            commandSender.sendMessage(prefix + "Diesen Command können nur Spieler ausführen.");
            return false;
        }

        Player player = (Player) commandSender;
        String commandName = command.getName();

        if ("gruppeninfo".equalsIgnoreCase(commandName)) {
            player.sendMessage(prefix + "Mit /gruppen kannst du alle 30 Tage deinen Beruf/Gruppe ändern. Mehr Infos dazu findest du im Tutorialbuch (/tutorial).");
        } else if ("gruppen".equalsIgnoreCase(commandName)) {
            Optional<Long> cooldown = this.getCooldown(player.getUniqueId());
            Date currentDate = new Date();
            if (cooldown.isPresent()) {
                Date date = new Date(cooldown.get());
                if (date.before(currentDate)) {
                    player.sendMessage(prefix + "Du kannst erst in " + this.daysBetween(currentDate, date) + " Tagen wieder die Gruppe wechseln.");
                    return true;
                }
            }

            this.setCooldown(player.getUniqueId(), currentDate);
            player.sendMessage(prefix + " waehle deine Gruppe! §8 Achtung du kannst sie erst in 30 Tagen wieder wechseln");
            player.teleport(GROUP_LOCATION);
        }

        return true;
    }

    private int daysBetween(Date start, Date end) {
        Preconditions.checkNotNull(start, "The start Date cannot be null");
        Preconditions.checkNotNull(end, "The end Date cannot be null");

        return (int) ((start.getTime() - end.getTime()) / (1000 * 60 * 60 * 24));
    }

    private Optional<Long> getCooldown(UUID uuid) {
        Preconditions.checkNotNull(uuid, "The uuid cannot be null");

        return Optional.fromNullable(this.yamlConfiguration.getLong(String.format(CONFIG_PATTERN, uuid.toString())));
    }

    private void setCooldown(UUID uuid, Date currentDate) {
        Preconditions.checkNotNull(uuid, "The uuid cannot be null");
        Preconditions.checkNotNull(currentDate, "The currentDate cannot be null");

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(currentDate);
        calendar.add(Calendar.MONTH, 1);
        Long endTime = calendar.getTimeInMillis();
        this.yamlConfiguration.set(String.format(CONFIG_PATTERN, uuid.toString()), endTime);
        this.javaPlugin.saveConfig();
    }


}
Wie Du siehst, steht der CommandExecutor nun in einer neuen Klasse. Du musst also noch den Executor in deiner Hauptklasse registrieren:
Code:
import org.bukkit.command.CommandExecutor;
import org.bukkit.plugin.java.JavaPlugin;

/**
* Created by sandro on 05.05.17.
*/
public class CooldownPlugin extends JavaPlugin {

    private static String prefix;

    @Override
    public void onEnable() {
        this.initConfig();

        CommandExecutor groupCooldownExecutor = new GroupCooldown(this, prefix);
        super.getServer().getPluginCommand("gruppeninfo").setExecutor(groupCooldownExecutor);
        super.getServer().getPluginCommand("gruppen").setExecutor(groupCooldownExecutor);
    }

    private void initConfig() {
        super.getConfig().options().copyDefaults(true);
        super.getConfig().addDefault("plugin.prefix", "§0[§4RollmopsMC§0] §5");
        super.saveConfig();
        CooldownPlugin.prefix = super.getConfig().getString("plugin.prefix");
    }

}

Hoffentlich konnte ich Dir helfen.
Besten Gruß,
Sandro

Der Code ist nicht getestet und kann unter Umständen noch Fehler enthalten.
 

PSandro

Kuhfänger
Registriert
7 November 2016
Beiträge
51
Diamanten
302
hier steht
CooldownPlugin cannot be resolved to a variable main.java /Gruppe/src/me/dashanfbauer/gruppe line 26(habe oben noch
package me.dashanfbauer.gruppe; sonst währe es 24)

Java Problem
Okay. Das liegt daran, dass ich in meinem Beispiel auf die statische Variable CooldownPlugin.prefix zugreife. Da Deine Klasse aber nicht (mehr) CooldownPlugin heißt, kann der Compiler sie natürlich auch nicht mehr finden. Die Lösung wäre, den Klassennamen bei diesem Variablenaufruf einfach deines Klassennamens anzupassen, oder je nach Geschmack den Klassennamen hier sogar ganz weg zu lassen, sodass die Variable nur noch mit prefix aufgerufen wird.
Ich empfehle Dir, Klassen möglichst eindeutig und gut verständlich zu benennen und den Namen "main" in der Form zu vermeiden.

Besten Gruß,
Sandro
 

PSandro

Kuhfänger
Registriert
7 November 2016
Beiträge
51
Diamanten
302
Habe gerade meinen Code getestet und den Fehler gefunden: In Zeile 55 habe ich nicht dran gedacht, dass das Ende verglichen wird, und nicht der Eintragezeitpunkt. Außerdem lieferte yamlConfiguration#getLong bei getCooldown nicht, wie zuerst angenommen ein Objekt vom typ Long, sondern den primitiven Datentyp long, welcher nicht null sein kann.

Code:
import com.google.common.base.Preconditions;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.Calendar;
import java.util.Date;
import java.util.Optional;
import java.util.UUID;

/**
* Created by sandro on 05.05.17.
*/
public final class GroupCooldown implements CommandExecutor {


    private static final String CONFIG_PATTERN = "cooldown.%s.remainingTime";

    private final Location GROUP_LOCATION = new Location(Bukkit.getWorld("world"), 3000, 70, 3000);
    private final FileConfiguration yamlConfiguration;
    private final JavaPlugin javaPlugin;
    private final String prefix;

    public GroupCooldown(final JavaPlugin javaPlugin, String prefix) {
        Preconditions.checkNotNull(javaPlugin, "The javaPlugin cannot be null");
        this.yamlConfiguration = javaPlugin.getConfig();
        this.javaPlugin = javaPlugin;
        this.prefix = (prefix == null ? "§4[RollmopsMC]§5 " : prefix);
    }

    public boolean onCommand(CommandSender commandSender, Command command, String commandLabel, String[] args) {
        Preconditions.checkNotNull(commandSender, "The commandSender cannot be null");
        Preconditions.checkNotNull(command, "The command cannot be null");

        if (!(commandSender instanceof Player)) {
            commandSender.sendMessage(prefix + "Diesen Command können nur Spieler ausführen.");
            return false;
        }

        final Player player = (Player) commandSender;
        final String commandName = command.getName();

        if ("gruppeninfo".equalsIgnoreCase(commandName)) {
            player.sendMessage(prefix + "Mit /gruppen kannst du alle 30 Tage deinen Beruf/Gruppe ändern. Mehr Infos dazu findest du im Tutorialbuch (/tutorial).");
        } else if ("gruppen".equalsIgnoreCase(commandName)) {
            Optional<Long> cooldown = this.getCooldown(player.getUniqueId());
            Date currentDate = new Date();
            if (cooldown.isPresent()) {
                Date expireDate = new Date(cooldown.get());
                if (expireDate.after(currentDate)) {
                    player.sendMessage(prefix + "Du kannst erst in " + this.daysBetween(currentDate, expireDate) + " Tagen wieder die Gruppe wechseln.");
                    return true;
                }
            }

            this.setCooldown(player.getUniqueId(), currentDate);
            player.sendMessage(prefix + " waehle deine Gruppe! §8 Achtung du kannst sie erst in 30 Tagen wieder wechseln");
            player.teleport(GROUP_LOCATION);
        }

        return true;
    }

    private long daysBetween(Date currentDate, Date expireDate) {
        Preconditions.checkNotNull(currentDate, "The start Date cannot be null");
        Preconditions.checkNotNull(expireDate, "The end Date cannot be null");

        return ((expireDate.getTime() - currentDate.getTime()) / (1000 * 60 * 60 * 24));
    }

    private Optional<Long> getCooldown(UUID uuid) {
        Preconditions.checkNotNull(uuid, "The uuid cannot be null");
        final String path = String.format(CONFIG_PATTERN, uuid.toString());
        if (this.yamlConfiguration.contains(path))
            return Optional.of(this.yamlConfiguration.getLong(path));
        else return Optional.empty();
    }

    private void setCooldown(UUID uuid, Date currentDate) {
        Preconditions.checkNotNull(uuid, "The uuid cannot be null");
        Preconditions.checkNotNull(currentDate, "The currentDate cannot be null");

        final Calendar calendar = Calendar.getInstance();
        calendar.setTime(currentDate);
        calendar.add(Calendar.MONTH, 1);
        final Long endTime = calendar.getTimeInMillis();
        this.yamlConfiguration.set(String.format(CONFIG_PATTERN, uuid.toString()), endTime);
        this.javaPlugin.saveConfig();
    }


}
 
Oben