Skip to content

Commit

Permalink
refactor: adjust task system to better support folia
Browse files Browse the repository at this point in the history
  • Loading branch information
WiIIiam278 committed May 30, 2024
1 parent 63b5e75 commit 02574ce
Show file tree
Hide file tree
Showing 9 changed files with 139 additions and 78 deletions.
22 changes: 22 additions & 0 deletions bukkit/src/main/java/net/william278/huskhomes/BukkitHuskHomes.java
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,10 @@
import org.jetbrains.annotations.TestOnly;
import space.arim.morepaperlib.MorePaperLib;
import space.arim.morepaperlib.commands.CommandRegistration;
import space.arim.morepaperlib.scheduling.AsynchronousScheduler;
import space.arim.morepaperlib.scheduling.AttachedScheduler;
import space.arim.morepaperlib.scheduling.GracefulScheduling;
import space.arim.morepaperlib.scheduling.RegionalScheduler;

import java.io.File;
import java.nio.file.Path;
Expand Down Expand Up @@ -109,6 +112,8 @@ public class BukkitHuskHomes extends JavaPlugin implements HuskHomes, BukkitTask
private BukkitAudiences audiences;
@Getter(AccessLevel.NONE)
private MorePaperLib paperLib;
private AsynchronousScheduler asyncScheduler;
private RegionalScheduler regionalScheduler;
@Nullable
private Broker broker;

Expand Down Expand Up @@ -385,6 +390,23 @@ public GracefulScheduling getScheduler() {
return paperLib.scheduling();
}

@NotNull
public AsynchronousScheduler getAsyncScheduler() {
return asyncScheduler == null
? asyncScheduler = getScheduler().asyncScheduler() : asyncScheduler;
}

@NotNull
public RegionalScheduler getSyncScheduler() {
return regionalScheduler == null
? regionalScheduler = getScheduler().globalRegionalScheduler() : regionalScheduler;
}

@NotNull
public AttachedScheduler getUserSyncScheduler(@NotNull OnlineUser user) {
return getScheduler().entitySpecificScheduler(((BukkitUser) user).getPlayer());
}

@NotNull
public CommandRegistration getCommandRegistrar() {
return paperLib.commandRegistration();
Expand Down
42 changes: 15 additions & 27 deletions bukkit/src/main/java/net/william278/huskhomes/user/BukkitUser.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,10 @@
import org.bukkit.metadata.MetadataValue;
import org.bukkit.permissions.PermissionAttachmentInfo;
import org.jetbrains.annotations.NotNull;
import space.arim.morepaperlib.scheduling.GracefulScheduling;

import java.util.Map;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.logging.Level;
import java.util.stream.Collectors;

/**
Expand Down Expand Up @@ -100,17 +98,11 @@ public Map<String, Boolean> getPermissions() {
@Override
public CompletableFuture<Void> dismount() {
final CompletableFuture<Void> future = new CompletableFuture<>();
((BukkitHuskHomes) plugin).getScheduler().entitySpecificScheduler(player).run(
() -> {
player.leaveVehicle();
player.eject();
future.complete(null);
},
() -> {
plugin.log(Level.WARNING, "User offline when dismounting: " + player.getName());
future.complete(null);
}
);
plugin.runSync(() -> {
player.leaveVehicle();
player.eject();
future.complete(null);
}, this);
return future;
}

Expand All @@ -129,19 +121,15 @@ public void teleportLocally(@NotNull Location location, boolean async) throws Te
}

// Run on the appropriate thread scheduler for this platform
final GracefulScheduling scheduler = ((BukkitHuskHomes) plugin).getScheduler();
scheduler.entitySpecificScheduler(player).run(
() -> {
player.leaveVehicle();
player.eject();
if (async || scheduler.isUsingFolia()) {
PaperLib.teleportAsync(player, bukkitLocation, PlayerTeleportEvent.TeleportCause.PLUGIN);
return;
}
player.teleport(bukkitLocation, PlayerTeleportEvent.TeleportCause.PLUGIN);
},
() -> plugin.log(Level.WARNING, "User offline when teleporting: " + player.getName())
);
plugin.runSync(() -> {
player.leaveVehicle();
player.eject();
if (async || ((BukkitHuskHomes) plugin).getScheduler().isUsingFolia()) {
PaperLib.teleportAsync(player, bukkitLocation, PlayerTeleportEvent.TeleportCause.PLUGIN);
return;
}
player.teleport(bukkitLocation, PlayerTeleportEvent.TeleportCause.PLUGIN);
}, this);
}

@Override
Expand Down Expand Up @@ -171,7 +159,7 @@ public void handleInvulnerability() {
long invulnerabilityTimeInTicks = 20L * plugin.getSettings().getGeneral().getTeleportInvulnerabilityTime();
player.setInvulnerable(true);
// Remove the invulnerability
plugin.runSyncDelayed(() -> player.setInvulnerable(false), invulnerabilityTimeInTicks);
plugin.runSyncDelayed(() -> player.setInvulnerable(false), this, invulnerabilityTimeInTicks);
}

}
69 changes: 49 additions & 20 deletions bukkit/src/main/java/net/william278/huskhomes/util/BukkitTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,12 @@

import net.william278.huskhomes.BukkitHuskHomes;
import net.william278.huskhomes.HuskHomes;
import net.william278.huskhomes.user.OnlineUser;
import org.jetbrains.annotations.NotNull;
import space.arim.morepaperlib.scheduling.GracefulScheduling;
import org.jetbrains.annotations.Nullable;
import space.arim.morepaperlib.scheduling.AsynchronousScheduler;
import space.arim.morepaperlib.scheduling.AttachedScheduler;
import space.arim.morepaperlib.scheduling.RegionalScheduler;
import space.arim.morepaperlib.scheduling.ScheduledTask;

import java.time.Duration;
Expand All @@ -33,9 +37,12 @@ public interface BukkitTask extends Task {
class Sync extends Task.Sync implements BukkitTask {

private ScheduledTask task;
private final @Nullable OnlineUser user;

protected Sync(@NotNull HuskHomes plugin, @NotNull Runnable runnable, long delayTicks) {
protected Sync(@NotNull HuskHomes plugin, @NotNull Runnable runnable,
@Nullable OnlineUser user, long delayTicks) {
super(plugin, runnable, delayTicks);
this.user = user;
}

@Override
Expand All @@ -52,11 +59,27 @@ public void run() {
runnable.run();
return;
}
if (cancelled) {
return;
}

// Use entity-specific scheduler if user is not null
if (user != null) {
final AttachedScheduler scheduler = ((BukkitHuskHomes) getPlugin()).getUserSyncScheduler(user);
if (delayTicks > 0) {
this.task = scheduler.runDelayed(runnable, null, delayTicks);
} else {
this.task = scheduler.run(runnable, null);
}
return;
}

// Or default to the global scheduler
final RegionalScheduler scheduler = ((BukkitHuskHomes) getPlugin()).getSyncScheduler();
if (delayTicks > 0) {
this.task = getScheduler().globalRegionalScheduler().runDelayed(runnable, delayTicks);
this.task = scheduler.runDelayed(runnable, delayTicks);
} else {
this.task = getScheduler().globalRegionalScheduler().run(runnable);
this.task = scheduler.run(runnable);
}
}
}
Expand All @@ -65,8 +88,8 @@ class Async extends Task.Async implements BukkitTask {

private ScheduledTask task;

protected Async(@NotNull HuskHomes plugin, @NotNull Runnable runnable) {
super(plugin, runnable);
protected Async(@NotNull HuskHomes plugin, @NotNull Runnable runnable, long delayTicks) {
super(plugin, runnable, delayTicks);
}

@Override
Expand All @@ -83,9 +106,18 @@ public void run() {
runnable.run();
return;
}
if (cancelled) {
return;
}

if (!cancelled) {
this.task = getScheduler().asyncScheduler().run(runnable);
final AsynchronousScheduler scheduler = ((BukkitHuskHomes) getPlugin()).getAsyncScheduler();
if (delayTicks > 0) {
this.task = scheduler.runDelayed(
runnable,
Duration.of(delayTicks * 50L, ChronoUnit.MILLIS)
);
} else {
this.task = scheduler.run(runnable);
}
}
}
Expand Down Expand Up @@ -113,8 +145,10 @@ public void run() {
}

if (!cancelled) {
this.task = getScheduler().asyncScheduler().runAtFixedRate(runnable, Duration.ZERO, Duration
.of(repeatingTicks * 50L, ChronoUnit.MILLIS)
final AsynchronousScheduler scheduler = ((BukkitHuskHomes) getPlugin()).getAsyncScheduler();
this.task = scheduler.runAtFixedRate(
runnable, Duration.ZERO,
Duration.of(repeatingTicks * 50L, ChronoUnit.MILLIS)
);
}
}
Expand All @@ -129,14 +163,14 @@ interface Supplier extends Task.Supplier {

@NotNull
@Override
default Task.Sync getSyncTask(@NotNull Runnable runnable, long delayTicks) {
return new Sync(getPlugin(), runnable, delayTicks);
default Task.Sync getSyncTask(@NotNull Runnable runnable, @Nullable OnlineUser user, long delayTicks) {
return new Sync(getPlugin(), runnable, user, delayTicks);
}

@NotNull
@Override
default Task.Async getAsyncTask(@NotNull Runnable runnable) {
return new Async(getPlugin(), runnable);
default Task.Async getAsyncTask(@NotNull Runnable runnable, long delayTicks) {
return new Async(getPlugin(), runnable, delayTicks);
}

@NotNull
Expand All @@ -152,9 +186,4 @@ default void cancelTasks() {

}

@NotNull
default GracefulScheduling getScheduler() {
return ((BukkitHuskHomes) getPlugin()).getScheduler();
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ protected final void handlePlayerJoin(@NotNull OnlineUser onlineUser) {

// Synchronize the global player list
plugin.runSyncDelayed(() -> this.synchronizeGlobalPlayerList(
onlineUser, plugin.getLocalPlayerList()), 40L
onlineUser, plugin.getLocalPlayerList()),
onlineUser, 40L
);

// Request updated player lists from other servers
Expand Down Expand Up @@ -167,7 +168,7 @@ private void handleInboundRespawn(@NotNull OnlineUser teleporter) {
.teleporter(teleporter)
.target(spawn)
.updateLastPosition(false)
.buildAndComplete(false), 40L);
.buildAndComplete(false), teleporter, 40L);
} else {
try {
teleporter.teleportLocally(spawn, plugin.getSettings().getGeneral().isTeleportAsync());
Expand Down
32 changes: 24 additions & 8 deletions common/src/main/java/net/william278/huskhomes/util/Task.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
package net.william278.huskhomes.util;

import net.william278.huskhomes.HuskHomes;
import net.william278.huskhomes.user.OnlineUser;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.concurrent.CompletableFuture;

Expand Down Expand Up @@ -51,8 +53,11 @@ public HuskHomes getPlugin() {

abstract class Async extends Base {

protected Async(@NotNull HuskHomes plugin, @NotNull Runnable runnable) {
protected long delayTicks;

protected Async(@NotNull HuskHomes plugin, @NotNull Runnable runnable, long delayTicks) {
super(plugin, runnable);
this.delayTicks = delayTicks;
}

}
Expand Down Expand Up @@ -83,29 +88,40 @@ protected Repeating(@NotNull HuskHomes plugin, @NotNull Runnable runnable, long
interface Supplier {

@NotNull
Task.Sync getSyncTask(@NotNull Runnable runnable, long delayTicks);
Task.Sync getSyncTask(@NotNull Runnable runnable, @Nullable OnlineUser user, long delayTicks);

@NotNull
Task.Async getAsyncTask(@NotNull Runnable runnable);
Task.Async getAsyncTask(@NotNull Runnable runnable, long delayTicks);

@NotNull
Task.Repeating getRepeatingTask(@NotNull Runnable runnable, long repeatingTicks);

@NotNull
default Task.Sync runSyncDelayed(@NotNull Runnable runnable, long delayTicks) {
final Task.Sync task = getSyncTask(runnable, delayTicks);
default Task.Sync runSyncDelayed(@NotNull Runnable runnable, @Nullable OnlineUser user, long delayTicks) {
final Task.Sync task = getSyncTask(runnable, user, delayTicks);
task.run();
return task;
}

default Task.Async runAsyncDelayed(@NotNull Runnable runnable, long delayTicks) {
final Task.Async task = getAsyncTask(runnable, delayTicks);
task.run();
return task;
}

@NotNull
default Task.Sync runSync(@NotNull Runnable runnable) {
return runSyncDelayed(runnable, 0);
return runSyncDelayed(runnable, null, 0);
}

@NotNull
default Task.Sync runSync(@NotNull Runnable runnable, @NotNull OnlineUser user) {
return runSyncDelayed(runnable, user, 0);
}

@NotNull
default Task.Async runAsync(@NotNull Runnable runnable) {
final Task.Async task = getAsyncTask(runnable);
final Task.Async task = getAsyncTask(runnable, 0);
task.run();
return task;
}
Expand All @@ -132,4 +148,4 @@ default <T> CompletableFuture<T> supplyAsync(@NotNull java.util.function.Supplie
@NotNull
HuskHomes getPlugin();

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ public CompletableFuture<Void> dismount() {
player.stopRiding();
player.getPassengerList().forEach(Entity::stopRiding);
future.complete(null);
});
}, this);
return future;
}

Expand Down Expand Up @@ -185,8 +185,9 @@ public void handleInvulnerability() {
}
long invulnerabilityTimeInTicks = 20L * plugin.getSettings().getGeneral().getTeleportInvulnerabilityTime();
player.setInvulnerable(true);

// Remove the invulnerability
plugin.runSyncDelayed(() -> player.setInvulnerable(false), invulnerabilityTimeInTicks);
plugin.runSyncDelayed(() -> player.setInvulnerable(false), this, invulnerabilityTimeInTicks);
}

}
Loading

0 comments on commit 02574ce

Please sign in to comment.