diff options
Diffstat (limited to 'src/main/java/luckyblock/action/LuckyActionManager.java')
| -rw-r--r-- | src/main/java/luckyblock/action/LuckyActionManager.java | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/main/java/luckyblock/action/LuckyActionManager.java b/src/main/java/luckyblock/action/LuckyActionManager.java new file mode 100644 index 0000000..4acc2eb --- /dev/null +++ b/src/main/java/luckyblock/action/LuckyActionManager.java @@ -0,0 +1,67 @@ +package luckyblock.action; + +import luckyblock.Main; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; + +import java.util.LinkedList; +import java.util.Queue; + +public class LuckyActionManager { + private static class Task { + String fieldName; + BlockPos pos; + ServerLevel level; + int remainingTicks; + + Task(String fieldName, BlockPos pos, ServerLevel level, int remainingTicks) { + this.fieldName = fieldName.replace("-", "_"); + this.pos = pos; + this.level = level; + this.remainingTicks = remainingTicks; + } + } + + private static final Queue<Task> actions = new LinkedList<>(); + + public static void enqueue(String actionField, BlockPos pos, ServerLevel level, int delayTicks) { + actions.offer(new Task(actionField, pos, level, delayTicks)); + } + + public static void enqueue(String actionField, BlockPos pos, int delayTicks) { + if (net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer() != null) { + enqueue(actionField, pos, net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer().overworld(), delayTicks); + } + } + + @SubscribeEvent + public static void onServerTick(TickEvent.ServerTickEvent event) { + if (event.phase != TickEvent.Phase.END + || actions.isEmpty() + || Main.settings == null) { + return; + } + + int size = actions.size(); + for (int i=0;i<size;i++) { + Task task = actions.poll(); + if (task == null) continue; + + task.remainingTicks--; + if (task.remainingTicks <= 0) { + ServerLevel level = task.level; + if (level == null) { + level = event.getServer().overworld(); + } + LuckyActionHolder action = Main.settings.events.get(task.fieldName); + if (action != null) { + action.execute(level, task.pos); + } + }else { + actions.offer(task); + } + } + } +} |
