Spigot coding cooldown einführen?

3 Antworten

Pro Spieler?

Soll der Cooldown auch bei Server-Neustart erhalten bleiben? (Falls ja, soll dafür eine Datenbank benutzt werden (welche?) oder eine simple ((Default-)Config-)Datei?)

Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf

NickyM257 
Beitragsersteller
 24.02.2022, 18:46

Nein wenn den Befehl ausgeführt hat und dann pro Spieler und nein keine dantenbank

0

Das Prinzip von Endivie02 in einem kleinen Beispiel:

public class BlockListener implements Listener {
    final Plugin plugin;
    final HashSet<UUID> players = new HashSet<>();

    public BlockListener(Plugin plugin) {
        this.plugin = plugin;
    }

    @EventHandler
    public void onBlockPlace(BlockPlaceEvent event) {
        final Material blockType = event.getBlock().getType();
        final UUID playerId = event.getPlayer().getUniqueId();

        if (blockType == Material.TNT) {
            if (players.contains(playerId)) {
                event.setCancelled(true);
                event.getPlayer().sendMessage("Not Allowed!");
            } else {
                players.add(playerId);
                Bukkit.getScheduler().runTaskLater(plugin, () -> players.remove(playerId), 20 * 3);
            }
        }
    }
}

Das wichtige ist das HashSet, welches die Player UUIDs im Cooldown speichert.

Das Plugin bietet ein Scheduler an, welchen man sehr gut verwenden kann. Als Parameter brauchst du das Plugin, das Runnable, welches später ausgeführt werden soll und die Zeit in Ticks.

In dem Beispiel kann jeder Spieler nur ein TNT Block frühestens alle 3 Sekunden platzieren.


MrAmazing2  26.02.2022, 15:06

Anstatt des HashSets kann man eine Config hernehmen. Ist ebenfalls ein Key-Value-Speicher, bleibt aber auch nach Server-Neustart erhalten.

0
tide1109  26.02.2022, 17:34
@MrAmazing2

Wenn man die Config Datei nutzt, hat man wieder das Dateisystem dabei. Lesen und Schreiben geht auf die Performance und Langlebigkeit des Datenträgers.

Wenn es längeres Cooldowns sind, die auch erhalten bleiben sollen, wäre es eine Option.

Wenn sie nach dem Neustart vom Server nicht erhalten bleiben müssen, ist ein In-Memory Lösung mit z.B. einem HashSet sehr gut.

Die optimale Lösung kommt auf die Ansprüche drauf an.

0
MrAmazing2  26.02.2022, 18:16
@tide1109

Naja, einfach erst beim onDisable auf die Disk speichern und fertig.

Soll bei Neustarts erhalten bleiben, siehe neuste Frage des Fragestellers

0

Ein Cooldown für einen Befehl?

Joa, ganz einfach...

Wenn der aber nach einem Server-/Plugin-Neustart bleiben soll, wirst du eine Datenbank (Kann auch eine yml Datei sein) benötigen.

Ansonsten kannst du es einfach so machen:

Die UUID des Spielers in eine Liste hinzufügen (Die UUID, damit man den Cooldown nicht durch simples Rejoinen negieren kann) und einen Scheduler starten damit die UUID wieder aus der Liste entfernt wird.

Wenn der Befehl ausgeführt wird, einfach jedes mal Überprüfen, ob die UUID in der Liste steht