From 5821302eb82f16dc6cff4f90252d99199ea3c653 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 21 Apr 2021 15:37:10 -0700 Subject: [PATCH] create TaskScheduler --- .../java/com/dfsek/terra/api/TerraPlugin.java | 3 ++ .../dfsek/terra/api/task/TaskScheduler.java | 35 +++++++++++++++++++ .../src/test/java/biome/DistributionTest.java | 6 ++++ .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 9 +++++ .../bukkit/task/BukkitTaskScheduler.java | 33 +++++++++++++++++ .../dfsek/terra/fabric/TerraFabricPlugin.java | 10 +++++- .../fabric/task/FabricTaskScheduler.java | 20 +++++++++++ .../com/dfsek/terra/StandalonePlugin.java | 6 ++++ .../dfsek/terra/sponge/TerraSpongePlugin.java | 6 ++++ 9 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/task/TaskScheduler.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/task/BukkitTaskScheduler.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/task/FabricTaskScheduler.java diff --git a/common/src/main/java/com/dfsek/terra/api/TerraPlugin.java b/common/src/main/java/com/dfsek/terra/api/TerraPlugin.java index fb9f87613..6a22dafb3 100644 --- a/common/src/main/java/com/dfsek/terra/api/TerraPlugin.java +++ b/common/src/main/java/com/dfsek/terra/api/TerraPlugin.java @@ -7,6 +7,7 @@ import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.LockedRegistry; +import com.dfsek.terra.api.task.TaskScheduler; import com.dfsek.terra.api.util.logging.DebugLogger; import com.dfsek.terra.api.util.logging.Logger; import com.dfsek.terra.config.PluginConfig; @@ -64,4 +65,6 @@ public interface TerraPlugin extends LoaderRegistrar { default void runPossiblyUnsafeTask(Runnable task) { task.run(); } + + TaskScheduler getScheduler(); } diff --git a/common/src/main/java/com/dfsek/terra/api/task/TaskScheduler.java b/common/src/main/java/com/dfsek/terra/api/task/TaskScheduler.java new file mode 100644 index 000000000..c75fe9e79 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/task/TaskScheduler.java @@ -0,0 +1,35 @@ +package com.dfsek.terra.api.task; + +public interface TaskScheduler { + /** + * Run a task synchronously on the next tick. + * Functionally equivalent to {@link #runTask(Runnable, long)} + * @param task Task to run. + */ + default void runTask(Runnable task) { + runTask(task, 0); + } + + /** + * Schedule a task asynchronously immediately. + * Functionally equivalent to {@link #runTaskAsynchronously(Runnable)} (Runnable, long)} + * @param task Task to run. + */ + default void runTaskAsynchronously(Runnable task) { + runTaskAsynchronously(task, 0); + } + + /** + * Run a task asynchronously after a number of ticks. + * @param task Task to run. + * @param ticks Delay before running the task, in ticks. + */ + void runTaskAsynchronously(Runnable task, long ticks); + + /** + * Run a task synchronously after a number of ticks. + * @param task Task to run. + * @param ticks Delay before running the task, in ticks. + */ + void runTask(Runnable task, long ticks); +} diff --git a/common/src/test/java/biome/DistributionTest.java b/common/src/test/java/biome/DistributionTest.java index 711aba9c7..018a16d41 100644 --- a/common/src/test/java/biome/DistributionTest.java +++ b/common/src/test/java/biome/DistributionTest.java @@ -18,6 +18,7 @@ import com.dfsek.terra.api.platform.world.Biome; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.LockedRegistry; +import com.dfsek.terra.api.task.TaskScheduler; import com.dfsek.terra.api.util.collections.ProbabilityCollection; import com.dfsek.terra.api.util.logging.DebugLogger; import com.dfsek.terra.api.util.logging.JavaLogger; @@ -137,6 +138,11 @@ public class DistributionTest { return null; } + @Override + public TaskScheduler getScheduler() { + return null; + } + @Override public void register(TypeRegistry registry) { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index e1254e51e..581d7c3c3 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -18,6 +18,7 @@ import com.dfsek.terra.api.platform.world.Biome; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.LockedRegistry; +import com.dfsek.terra.api.task.TaskScheduler; import com.dfsek.terra.api.util.logging.DebugLogger; import com.dfsek.terra.api.util.logging.JavaLogger; import com.dfsek.terra.api.util.logging.Logger; @@ -32,6 +33,7 @@ import com.dfsek.terra.bukkit.listeners.CommonListener; import com.dfsek.terra.bukkit.listeners.PaperListener; import com.dfsek.terra.bukkit.listeners.SpigotListener; import com.dfsek.terra.bukkit.listeners.TerraListener; +import com.dfsek.terra.bukkit.task.BukkitTaskScheduler; import com.dfsek.terra.bukkit.util.PaperUtil; import com.dfsek.terra.bukkit.world.BukkitBiome; import com.dfsek.terra.commands.CommandUtil; @@ -64,6 +66,8 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { private final Map worldMap = new HashMap<>(); private final Map worlds = new HashMap<>(); + private final TaskScheduler scheduler = new BukkitTaskScheduler(this); + private final ConfigRegistry registry = new ConfigRegistry(); private final CheckedRegistry checkedRegistry = new CheckedRegistry<>(registry); @@ -141,6 +145,11 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { Bukkit.getScheduler().runTask(this, task); } + @Override + public TaskScheduler getScheduler() { + return scheduler; + } + @Override public void onDisable() { BukkitChunkGeneratorWrapper.saveAll(); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/task/BukkitTaskScheduler.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/task/BukkitTaskScheduler.java new file mode 100644 index 000000000..2f33ea6c5 --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/task/BukkitTaskScheduler.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.bukkit.task; + +import com.dfsek.terra.api.task.TaskScheduler; +import com.dfsek.terra.bukkit.TerraBukkitPlugin; +import org.bukkit.Bukkit; + +public class BukkitTaskScheduler implements TaskScheduler { + private final TerraBukkitPlugin plugin; + + public BukkitTaskScheduler(TerraBukkitPlugin plugin) { + this.plugin = plugin; + } + + @Override + public void runTaskAsynchronously(Runnable task, long ticks) { + Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, task, ticks); + } + + @Override + public void runTask(Runnable task, long ticks) { + Bukkit.getScheduler().runTaskLater(plugin, task, ticks); + } + + @Override + public void runTask(Runnable task) { + Bukkit.getScheduler().runTask(plugin, task); + } + + @Override + public void runTaskAsynchronously(Runnable task) { + Bukkit.getScheduler().runTask(plugin, task); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index ea70c4247..0b584ea16 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -24,6 +24,7 @@ import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.LockedRegistry; +import com.dfsek.terra.api.task.TaskScheduler; import com.dfsek.terra.api.transform.NotNullValidator; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.api.util.logging.DebugLogger; @@ -38,6 +39,7 @@ import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.fabric.inventory.FabricItemHandle; import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; +import com.dfsek.terra.fabric.task.FabricTaskScheduler; import com.dfsek.terra.fabric.world.FabricAdapter; import com.dfsek.terra.fabric.world.FabricBiome; import com.dfsek.terra.fabric.world.FabricTree; @@ -98,7 +100,6 @@ import static net.minecraft.server.command.CommandManager.literal; public class TerraFabricPlugin implements TerraPlugin, ModInitializer { - public static final PopulatorFeature POPULATOR_FEATURE = new PopulatorFeature(DefaultFeatureConfig.CODEC); public static final ConfiguredFeature POPULATOR_CONFIGURED_FEATURE = POPULATOR_FEATURE.configure(FeatureConfig.DEFAULT).decorate(Decorator.NOPE.configure(NopeDecoratorConfig.INSTANCE)); private static TerraFabricPlugin instance; @@ -134,6 +135,8 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private final Transformer biomeFixer = new Transformer.Builder() .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse(id)), new NotNullValidator<>()) .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse("minecraft:" + id.toLowerCase())), new NotNullValidator<>()).build(); + + private final TaskScheduler scheduler = new FabricTaskScheduler(); private File dataFolder; public static TerraFabricPlugin getInstance() { @@ -391,6 +394,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { return eventManager; } + @Override + public TaskScheduler getScheduler() { + return scheduler; + } + @Addon("Terra-Fabric") @Author("Terra") @Version("1.0.0") diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/task/FabricTaskScheduler.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/task/FabricTaskScheduler.java new file mode 100644 index 000000000..ae1ea5839 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/task/FabricTaskScheduler.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.fabric.task; + +import com.dfsek.terra.api.task.TaskScheduler; +import net.minecraft.server.MinecraftServer; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class FabricTaskScheduler implements TaskScheduler { + private final ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()-1); + @Override + public void runTaskAsynchronously(Runnable task, long ticks) { + runTask(() -> executorService.execute(task), ticks); + } + + @Override + public void runTask(Runnable task, long ticks) { + // TODO implementation + } +} diff --git a/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java b/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java index a1dd2e4c9..99cfc5b0c 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java +++ b/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java @@ -12,6 +12,7 @@ import com.dfsek.terra.api.platform.world.Biome; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.LockedRegistry; +import com.dfsek.terra.api.task.TaskScheduler; import com.dfsek.terra.api.util.logging.DebugLogger; import com.dfsek.terra.api.util.logging.JavaLogger; import com.dfsek.terra.config.GenericLoaders; @@ -147,4 +148,9 @@ public class StandalonePlugin implements TerraPlugin { public EventManager getEventManager() { return eventManager; } + + @Override + public TaskScheduler getScheduler() { + return null; + } } diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java index 78baf45d5..ca559e0b9 100644 --- a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java @@ -10,6 +10,7 @@ import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.LockedRegistry; +import com.dfsek.terra.api.task.TaskScheduler; import com.dfsek.terra.api.util.logging.DebugLogger; import com.dfsek.terra.config.PluginConfig; import com.dfsek.terra.config.lang.Language; @@ -138,4 +139,9 @@ public class TerraSpongePlugin implements TerraPlugin { public EventManager getEventManager() { return eventManager; } + + @Override + public TaskScheduler getScheduler() { + return null; + } }