Expose rollbacks to the API, refactor the scheduler

This commit is contained in:
2026-05-19 13:22:38 -04:00
parent e1a6b57f22
commit 8a6c695e10
21 changed files with 586 additions and 250 deletions
@@ -7,8 +7,11 @@ import dev.plex.services.impl.BanService;
import dev.plex.services.impl.GameRuleService;
import dev.plex.services.impl.TimingService;
import dev.plex.services.impl.UpdateCheckerService;
import io.papermc.paper.threadedregions.scheduler.ScheduledTask;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.bukkit.Bukkit;
@@ -17,6 +20,7 @@ public class ServiceManager
{
private final Plex plugin;
private final List<AbstractService> services = Lists.newArrayList();
private final Map<AbstractService, ScheduledTask> scheduledTasks = new HashMap<>();
public ServiceManager(Plex plugin)
{
@@ -45,25 +49,36 @@ public class ServiceManager
public void startService(AbstractService service)
{
ScheduledTask existingTask = scheduledTasks.remove(service);
if (existingTask != null)
{
existingTask.cancel();
}
ScheduledTask task = null;
if (!service.isRepeating())
{
int time = service.repeatInSeconds();
if (time == 0)
{
Bukkit.getGlobalRegionScheduler().run(plugin, service::run);
task = Bukkit.getGlobalRegionScheduler().run(plugin, service::run);
}
else
{
Bukkit.getAsyncScheduler().runDelayed(plugin, service::run, time, TimeUnit.SECONDS);
task = Bukkit.getAsyncScheduler().runDelayed(plugin, service::run, time, TimeUnit.SECONDS);
}
}
else if (service.isRepeating() && service.isAsynchronous())
{
Bukkit.getAsyncScheduler().runAtFixedRate(plugin, service::run, 1, service.repeatInSeconds(), TimeUnit.SECONDS);
task = Bukkit.getAsyncScheduler().runAtFixedRate(plugin, service::run, 1, service.repeatInSeconds(), TimeUnit.SECONDS);
}
else if (service.isRepeating() && !service.isAsynchronous())
{
Bukkit.getGlobalRegionScheduler().runAtFixedRate(plugin, service::run, 1, 20L * service.repeatInSeconds());
task = Bukkit.getGlobalRegionScheduler().runAtFixedRate(plugin, service::run, 1, 20L * service.repeatInSeconds());
}
if (task != null)
{
scheduledTasks.put(service, task);
}
if (!services.contains(service))
{
@@ -74,8 +89,11 @@ public class ServiceManager
public void endService(AbstractService service, boolean remove)
{
Bukkit.getGlobalRegionScheduler().cancelTasks(plugin);
Bukkit.getAsyncScheduler().cancelTasks(plugin);
ScheduledTask task = scheduledTasks.remove(service);
if (task != null)
{
task.cancel();
}
service.onEnd();
if (remove)
{
@@ -30,33 +30,16 @@ public class AutoWipeService extends AbstractService
{
if (entities.stream().anyMatch(entityName -> entityName.equalsIgnoreCase(entity.getType().name())))
{
Bukkit.getRegionScheduler().run(plugin, entity.getLocation(), this::entityRun);
entity.getScheduler().run(plugin, scheduledTask -> entity.remove(), null);
}
}
}
}
}
private void entityRun(ScheduledTask task)
{
List<String> entities = plugin.config.getStringList("autowipe.entities");
for (World world : Bukkit.getWorlds())
{
for (Entity entity : world.getEntities())
{
if (entities.stream().anyMatch(entityName -> entityName.equalsIgnoreCase(entity.getType().name())))
{
entity.remove();
task.cancel();
}
}
}
}
@Override
public int repeatInSeconds()
{
return Math.max(1, plugin.config.getInt("autowipe.interval"));
}
}
}