Spigot coding cooldown einführen?
Hi wie geht es in einem 1.18.1 eine cooldown einzufü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?)
Nein wenn den Befehl ausgeführt hat und dann pro Spieler und nein keine dantenbank
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.
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.
Naja, einfach erst beim onDisable auf die Disk speichern und fertig.
Soll bei Neustarts erhalten bleiben, siehe neuste Frage des Fragestellers
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
Anstatt des HashSets kann man eine Config hernehmen. Ist ebenfalls ein Key-Value-Speicher, bleibt aber auch nach Server-Neustart erhalten.