Spigot Cooldown hilfe?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Das sollte die performanteste Möglichkeiten mit geringem Aufwand sein:

// Instanzvariablen
// Speichert die letzten Ausführungen pro Spieler
private Map<UUID, Long> lastExecutions = new HashMap<>();
// Konstante für Intervall in Millisekunden
private static final long INTERVAL = 3000;

// Bei Verwendung des Items
boolean shouldExecute = false;
UUID id = player.getUniqueId();

if (lastExecutions.contains(id)) {
    if (lastExecutions.get(id) + INTERVAL <= System.currentTimeMillis()) {
        shouldExecute = true;
        lastExecutions.remove(id);
    }
} else {
    shouldExecute = true;
}

if (shouldExecute) {
    lastExecutions.put(id, System.currentTimeMillis());
    
    // Hier Code einfügen, der nur alle drei Sekunden ausgeführt werden soll
}

Bisher enthält das ganze noch ein Speicherleck, da Spieler, welche das Item nicht mehr verwenden, im Speicher belassen werden. Das ist nicht sehr signifikant, sollte aber trotzdem behoben werden:

// Bei PlayerQuitEvent ausführen
lastExecutions.remove(player.getUniqueId());
TimeGriefing 
Fragesteller
 07.08.2019, 02:18

Dankeschön !!! <3<3

0
TimeGriefing 
Fragesteller
 07.08.2019, 02:23

Das nenne ich mal Hilfreich wirklich bin dir so dankbar <3

0

Mit etwas namens Scheduler

TimeGriefing 
Fragesteller
 05.08.2019, 23:25

Aber wie :D

0
ToxicDark  05.08.2019, 23:32
@TimeGriefing

Tust den Spieler 3 Sekunden lang in eine ArrayList und nach 3 Sek entfernst du ihn wieder aus der ArrayList. Wenn er in der ArrayList ist kann er es halt nicht benutzen und muss abwarten.

1
FireEraser  06.08.2019, 01:34
@ToxicDark

Das funktioniert, ist aber aus zwei Gründen suboptimal:

  1. ArrayLists sollte man bei contains-Operations nicht einsetzen, wenn auch HashSets möglich sind (letztere sind schneller, v.a. bei 10 Elementen und mehr)
  2. Den Scheduler sollte man mit möglichst wenigen Aufgaben belasten, hier ist die Verwendung nicht nötig.
0