Skip to content

Commit d1091d2

Browse files
committed
Add FabricScheduler and FabricTask for task scheduling
1 parent 4035ddb commit d1091d2

File tree

2 files changed

+103
-0
lines changed

2 files changed

+103
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package it.renvins.serverpulse.fabric.task;
2+
3+
import java.util.Queue;
4+
import java.util.concurrent.CompletableFuture;
5+
import java.util.concurrent.ConcurrentLinkedDeque;
6+
import java.util.concurrent.ForkJoinPool;
7+
8+
import it.renvins.serverpulse.common.scheduler.Task;
9+
import it.renvins.serverpulse.common.scheduler.TaskScheduler;
10+
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
11+
import net.minecraft.server.MinecraftServer;
12+
13+
public class FabricScheduler implements TaskScheduler {
14+
15+
private final Queue<FabricTask> tasks = new ConcurrentLinkedDeque<>();
16+
17+
public FabricScheduler() {
18+
ServerTickEvents.END_SERVER_TICK.register(this::onServerTick);
19+
}
20+
21+
@Override
22+
public void runSync(Runnable task) {
23+
FabricTask taskWrapper = new FabricTask(task, false, 0, 0);
24+
tasks.add(taskWrapper);
25+
}
26+
27+
@Override
28+
public void runAsync(Runnable task) {
29+
CompletableFuture.runAsync(task);
30+
}
31+
32+
@Override
33+
public Task runTaskTimerAsync(Runnable task, long delayTicks, long periodTicks) {
34+
FabricTask fabricTask = new FabricTask(() -> CompletableFuture.runAsync(task),
35+
true, delayTicks, periodTicks);
36+
tasks.add(fabricTask);
37+
return fabricTask;
38+
}
39+
40+
private void onServerTick(MinecraftServer server) {
41+
tasks.removeIf(task -> {
42+
if (task.isCancelled()) {
43+
return true;
44+
}
45+
task.tick();
46+
return task.isCancelled();
47+
});
48+
}
49+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package it.renvins.serverpulse.fabric.task;
2+
3+
import java.util.concurrent.atomic.AtomicBoolean;
4+
import java.util.logging.Level;
5+
6+
import it.renvins.serverpulse.common.scheduler.Task;
7+
import it.renvins.serverpulse.fabric.ServerPulseFabric;
8+
9+
public class FabricTask implements Task {
10+
11+
private final AtomicBoolean cancelled = new AtomicBoolean(false);
12+
13+
private final Runnable runnable;
14+
private final boolean isPeriodic;
15+
private final long period;
16+
17+
private long ticksUntilRun;
18+
19+
public FabricTask(Runnable runnable, boolean isPeriodic, long delay, long period) {
20+
this.runnable = runnable;
21+
this.isPeriodic = isPeriodic;
22+
this.period = period;
23+
this.ticksUntilRun = delay;
24+
}
25+
26+
@Override
27+
public void cancel() {
28+
cancelled.set(true);
29+
}
30+
31+
@Override
32+
public boolean isCancelled() {
33+
return cancelled.get();
34+
}
35+
36+
public void tick() {
37+
if (cancelled.get()) {
38+
return;
39+
}
40+
41+
if (--ticksUntilRun <= 0) {
42+
try {
43+
runnable.run();
44+
} catch (Exception e) {
45+
ServerPulseFabric.LOGGER.log(Level.SEVERE, "An error occurred while executing task!", e);
46+
}
47+
if (isPeriodic && !cancelled.get()) {
48+
ticksUntilRun = period;
49+
} else {
50+
cancel();
51+
}
52+
}
53+
}
54+
}

0 commit comments

Comments
 (0)