Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.google.common.base.Preconditions;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.conversations.Conversation;
import org.bukkit.conversations.ConversationContext;
import org.bukkit.conversations.ConversationFactory;
Expand All @@ -11,6 +10,7 @@
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import vg.civcraft.mc.civmodcore.CivModCorePlugin;
import vg.civcraft.mc.civmodcore.scheduling.CivScheduler;

public abstract class Dialog {

Expand All @@ -33,7 +33,7 @@ public Dialog(final Player player, final Plugin plugin, final String prompt) {
Preconditions.checkNotNull(player, "Player cannot be null!");
Preconditions.checkNotNull(plugin, "Plugin cannot be null!");
this.player = player;
Bukkit.getScheduler().runTask(plugin, (Runnable) player::closeInventory);
CivScheduler.runEntity(player, player::closeInventory);
this.conversation = new ConversationFactory(plugin)
.withModality(false)
.withLocalEcho(false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@
import java.util.List;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import vg.civcraft.mc.civmodcore.CivModCorePlugin;
import vg.civcraft.mc.civmodcore.scheduling.CivScheduler;
import vg.civcraft.mc.civmodcore.scheduling.CivTask;

public class AnimatedClickable extends IClickable {

Expand Down Expand Up @@ -41,12 +40,7 @@ public ItemStack getItemStack() {
@Override
public void addedToInventory(final ClickableInventory inv, final int slot) {
// Schedule swapping out of item
BukkitTask task = new BukkitRunnable() {
@Override
public void run() {
inv.setItem(getNext(), slot);
}
}.runTaskTimer(CivModCorePlugin.getInstance(), timing, timing);
CivTask task = CivScheduler.runGlobalTimer(() -> inv.setItem(getNext(), slot), timing, timing);
inv.registerTask(task);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitTask;
import vg.civcraft.mc.civmodcore.CivModCorePlugin;
import vg.civcraft.mc.civmodcore.scheduling.CivScheduler;
import vg.civcraft.mc.civmodcore.scheduling.CivTask;

/**
* Represents an inventory filled with Clickables. Whenever one of those is
Expand Down Expand Up @@ -43,7 +43,7 @@ public class ClickableInventory {

private IClickable[] clickables;

private List<BukkitTask> runnables;
private List<CivTask> runnables;

private String name;
private Runnable onClose;
Expand Down Expand Up @@ -193,7 +193,7 @@ public void showInventory(Player p) {
public void showInventory(Player p, boolean eventSafe) {
if (p != null) {
if (eventSafe) {
Bukkit.getScheduler().runTask(CivModCorePlugin.getInstance(), () -> {
CivScheduler.runEntity(p, () -> {
p.openInventory(inventory);
openInventories.put(p.getUniqueId(), this);
});
Expand Down Expand Up @@ -245,7 +245,7 @@ public void setItem(ItemStack is, int slot) {
inventory.setItem(slot, is);
}

public void registerTask(BukkitTask runnable) {
public void registerTask(CivTask runnable) {
this.runnables.add(runnable);
}

Expand Down Expand Up @@ -310,7 +310,7 @@ private static void inventoryClosed(Player p, boolean force) {
private static void stopRunnables(ClickableInventory ci) {
if (ci.inventory.getViewers().size() == 1) {
// last one is closing
for (BukkitTask runnable : ci.runnables) {
for (CivTask runnable : ci.runnables) {
runnable.cancel();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Stream;
import org.apache.commons.lang3.StringUtils;
import org.bukkit.Bukkit;
Expand All @@ -16,20 +16,23 @@
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import vg.civcraft.mc.civmodcore.scheduling.CivScheduler;

public final class PlayerNames implements Listener {

private static final Set<String> names = new HashSet<>();
// Concurrent: the async-seed task writes on the global region thread while the login handler and external
// getPlayerNames() callers touch it from connection/region threads under Folia.
private static final Set<String> names = ConcurrentHashMap.newKeySet();

public PlayerNames(Plugin plugin) {
names.clear();
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
CivScheduler.runAsync(plugin, () -> {
OfflinePlayer[] players = Bukkit.getOfflinePlayers();
List<String> namesList = Stream.of(players)
.map(OfflinePlayer::getName)
.filter(StringUtils::isNotBlank)
.toList();
Bukkit.getScheduler().runTask(plugin, () -> {
CivScheduler.runGlobal(plugin, () -> {
names.addAll(namesList);
});
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,27 @@
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiFunction;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import vg.civcraft.mc.civmodcore.CivModCorePlugin;
import vg.civcraft.mc.civmodcore.scheduling.CivScheduler;
import vg.civcraft.mc.civmodcore.scheduling.CivTask;

public class BottomLine implements Comparable<BottomLine> {

private Map<UUID, String> texts;
private String identifier;
private BukkitRunnable updater;
private CivTask updater;
private int priority;

BottomLine(String identifier, int priority) {
this.identifier = identifier;
this.priority = priority;
this.texts = new TreeMap<>();
// Mutated by event handlers on region/entity threads while the updatePeriodically task iterates it
// on the global thread under Folia; UUID keys are never sorted, so a hash map is enough.
this.texts = new ConcurrentHashMap<>();
}

public String getIdentifier() {
Expand All @@ -44,30 +46,25 @@ public void updatePeriodically(BiFunction<Player, String, String> updateFunction
if (updater != null) {
updater.cancel();
}
updater = new BukkitRunnable() {

@Override
public void run() {
Iterator<Entry<UUID, String>> iter = texts.entrySet().iterator();
while (iter.hasNext()) {
Entry<UUID, String> entry = iter.next();
Player player = Bukkit.getPlayer(entry.getKey());
if (player != null) {
String newText = updateFunction.apply(player, entry.getValue());
if (newText == null) {
iter.remove();
BottomLineAPI.refreshIndividually(player.getUniqueId());
continue;
}
if (!newText.equals(entry.getValue())) {
entry.setValue(newText);
BottomLineAPI.refreshIndividually(player.getUniqueId());
}
updater = CivScheduler.runGlobalTimer(() -> {
Iterator<Entry<UUID, String>> iter = texts.entrySet().iterator();
while (iter.hasNext()) {
Entry<UUID, String> entry = iter.next();
Player player = Bukkit.getPlayer(entry.getKey());
if (player != null) {
String newText = updateFunction.apply(player, entry.getValue());
if (newText == null) {
iter.remove();
BottomLineAPI.refreshIndividually(player.getUniqueId());
continue;
}
if (!newText.equals(entry.getValue())) {
entry.setValue(newText);
BottomLineAPI.refreshIndividually(player.getUniqueId());
}
}
}
};
updater.runTaskTimer(CivModCorePlugin.getInstance(), delay, delay);
}, delay, delay);
}

public void removePlayer(Player player) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,15 @@
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import vg.civcraft.mc.civmodcore.CivModCorePlugin;
import vg.civcraft.mc.civmodcore.scheduling.CivScheduler;

public final class BottomLineAPI {

private static Set<BottomLine> lines = new TreeSet<>();
private static final String SEPARATOR = ChatColor.BOLD + " " + ChatColor.BLACK + "|| " + ChatColor.RESET;

public static void init() {
BukkitRunnable run = new BukkitRunnable() {

@Override
public void run() {
refreshAll();
}
};
run.runTaskTimer(CivModCorePlugin.getInstance(), 15, 15);
CivScheduler.runGlobalTimer(BottomLineAPI::refreshAll, 15, 15);
}

public static BottomLine createBottomLine(String identifier, int priority) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,28 @@
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiFunction;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Score;
import org.bukkit.scoreboard.Scoreboard;
import vg.civcraft.mc.civmodcore.CivModCorePlugin;
import vg.civcraft.mc.civmodcore.scheduling.CivScheduler;
import vg.civcraft.mc.civmodcore.scheduling.CivTask;

public class CivScoreBoard {

private String scoreName;
private Map<UUID, String> currentScoreText;
private BukkitRunnable updater;
private CivTask updater;

CivScoreBoard(String scoreName) {
this.scoreName = scoreName;
this.currentScoreText = new TreeMap<>();
// Updater runs on the global region thread while set/hide/purge mutate from player region threads on Folia.
this.currentScoreText = new ConcurrentHashMap<>();
}

public String getName() {
Expand All @@ -34,30 +35,25 @@ public void updatePeriodically(BiFunction<Player, String, String> updateFunction
if (updater != null) {
updater.cancel();
}
updater = new BukkitRunnable() {

@Override
public void run() {
Iterator<Entry<UUID, String>> iter = currentScoreText.entrySet().iterator();
while (iter.hasNext()) {
Entry<UUID, String> entry = iter.next();
Player player = Bukkit.getPlayer(entry.getKey());
if (player != null) {
String newText = updateFunction.apply(player, entry.getValue());
if (newText == null) {
hideForPlayer(player);
iter.remove();
continue;
}
if (!newText.equals(entry.getValue())) {
internalUpdate(player, entry.getValue(), newText);
entry.setValue(newText);
}
updater = CivScheduler.runGlobalTimer(() -> {
Iterator<Entry<UUID, String>> iter = currentScoreText.entrySet().iterator();
while (iter.hasNext()) {
Entry<UUID, String> entry = iter.next();
Player player = Bukkit.getPlayer(entry.getKey());
if (player != null) {
String newText = updateFunction.apply(player, entry.getValue());
if (newText == null) {
hideForPlayer(player);
iter.remove();
continue;
}
if (!newText.equals(entry.getValue())) {
internalUpdate(player, entry.getValue(), newText);
entry.setValue(newText);
}
}
}
};
updater.runTaskTimer(CivModCorePlugin.getInstance(), delay, delay);
}, delay, delay);
}

public void set(Player p, String newText) {
Expand Down
Loading