From bf2262c392c7e234c8662aa7be5d2970dcacee65 Mon Sep 17 00:00:00 2001 From: Luck Date: Mon, 26 Aug 2019 09:02:55 +0100 Subject: Various misc changes to spark-forge and spark-fabric --- .../lucko/spark/forge/ForgeClientSparkPlugin.java | 124 -------------------- .../me/lucko/spark/forge/ForgeCommandSender.java | 1 + .../lucko/spark/forge/ForgeServerSparkPlugin.java | 97 ---------------- .../java/me/lucko/spark/forge/ForgeSparkMod.java | 2 + .../me/lucko/spark/forge/ForgeSparkPlugin.java | 86 -------------- .../spark/forge/plugin/ForgeClientSparkPlugin.java | 127 +++++++++++++++++++++ .../spark/forge/plugin/ForgeServerSparkPlugin.java | 100 ++++++++++++++++ .../lucko/spark/forge/plugin/ForgeSparkPlugin.java | 94 +++++++++++++++ 8 files changed, 324 insertions(+), 307 deletions(-) delete mode 100644 spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientSparkPlugin.java delete mode 100644 spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerSparkPlugin.java delete mode 100644 spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkPlugin.java create mode 100644 spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeClientSparkPlugin.java create mode 100644 spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeServerSparkPlugin.java create mode 100644 spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeSparkPlugin.java (limited to 'spark-forge/src') diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientSparkPlugin.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientSparkPlugin.java deleted file mode 100644 index 0d38ea2..0000000 --- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientSparkPlugin.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.lucko.spark.forge; - -import com.mojang.brigadier.CommandDispatcher; -import me.lucko.spark.common.sampler.TickCounter; -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.client.network.play.ClientPlayNetHandler; -import net.minecraft.command.ICommandSource; -import net.minecraft.command.ISuggestionProvider; -import net.minecraftforge.client.event.ClientChatEvent; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; - -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.concurrent.TimeUnit; -import java.util.stream.Stream; - -public class ForgeClientSparkPlugin extends ForgeSparkPlugin { - - private static final Field COMMAND_DISPATCHER_FIELD; - static { - COMMAND_DISPATCHER_FIELD = Arrays.stream(ClientPlayNetHandler.class.getDeclaredFields()) - .filter(f -> f.getType() == CommandDispatcher.class) - .findFirst().orElseThrow(() -> new RuntimeException("No field with CommandDispatcher type")); - COMMAND_DISPATCHER_FIELD.setAccessible(true); - } - - public static void register(ForgeSparkMod mod, FMLClientSetupEvent event) { - Minecraft minecraft = event.getMinecraftSupplier().get(); - - ForgeClientSparkPlugin plugin = new ForgeClientSparkPlugin(mod, minecraft); - MinecraftForge.EVENT_BUS.register(plugin); - - plugin.scheduler.scheduleWithFixedDelay(plugin::checkCommandRegistered, 10, 10, TimeUnit.SECONDS); - } - - private final Minecraft minecraft; - private CommandDispatcher dispatcher; - - public ForgeClientSparkPlugin(ForgeSparkMod mod, Minecraft minecraft) { - super(mod); - this.minecraft = minecraft; - } - - private void checkCommandRegistered() { - ClientPlayerEntity player = this.minecraft.player; - if (player == null) { - return; - } - - ClientPlayNetHandler connection = player.connection; - if (connection == null) { - return; - } - - try { - CommandDispatcher dispatcher = (CommandDispatcher) COMMAND_DISPATCHER_FIELD.get(connection); - if (dispatcher != this.dispatcher) { - this.dispatcher = dispatcher; - registerCommands(this.dispatcher, context -> 1, "sparkc", "sparkclient"); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - @SubscribeEvent - public void onClientChat(ClientChatEvent event) { - String chat = event.getMessage(); - String[] split = chat.split(" "); - if (split.length == 0 || (!split[0].equals("/sparkc") && !split[0].equals("/sparkclient"))) { - return; - } - - String[] args = Arrays.copyOfRange(split, 1, split.length); - this.platform.executeCommand(new ForgeCommandSender(this.minecraft.player, this), args); - this.minecraft.ingameGUI.getChatGUI().addToSentMessages(chat); - event.setCanceled(true); - } - - @Override - boolean hasPermission(ICommandSource sender, String permission) { - return true; - } - - @Override - public Stream getSendersWithPermission(String permission) { - return Stream.of(new ForgeCommandSender(this.minecraft.player, this)); - } - - @Override - public TickCounter createTickCounter() { - return new ForgeTickCounter(TickEvent.Type.CLIENT); - } - - @Override - public String getCommandName() { - return "sparkc"; - } - -} diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeCommandSender.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeCommandSender.java index 418cf2d..ff988f0 100644 --- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeCommandSender.java +++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeCommandSender.java @@ -21,6 +21,7 @@ package me.lucko.spark.forge; import me.lucko.spark.common.CommandSender; +import me.lucko.spark.forge.plugin.ForgeSparkPlugin; import net.kyori.text.Component; import net.kyori.text.serializer.gson.GsonComponentSerializer; import net.minecraft.command.ICommandSource; diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerSparkPlugin.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerSparkPlugin.java deleted file mode 100644 index 13ccb59..0000000 --- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerSparkPlugin.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.lucko.spark.forge; - -import com.mojang.brigadier.Command; -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import me.lucko.spark.common.sampler.TickCounter; -import net.minecraft.command.CommandSource; -import net.minecraft.command.ICommandSource; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.server.MinecraftServer; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.fml.event.server.FMLServerStartingEvent; -import net.minecraftforge.server.permission.DefaultPermissionLevel; -import net.minecraftforge.server.permission.PermissionAPI; - -import java.util.Arrays; -import java.util.stream.Stream; - -public class ForgeServerSparkPlugin extends ForgeSparkPlugin implements Command { - - public static void register(ForgeSparkMod mod, FMLServerStartingEvent event) { - MinecraftServer server = event.getServer(); - CommandDispatcher dispatcher = event.getCommandDispatcher(); - - ForgeServerSparkPlugin plugin = new ForgeServerSparkPlugin(mod, server); - registerCommands(dispatcher, plugin, "spark"); - PermissionAPI.registerNode("spark", DefaultPermissionLevel.OP, "Access to the spark command"); - } - - private final MinecraftServer server; - - public ForgeServerSparkPlugin(ForgeSparkMod mod, MinecraftServer server) { - super(mod); - this.server = server; - } - - @Override - public int run(CommandContext context) throws CommandSyntaxException { - String[] split = context.getInput().split(" "); - if (split.length == 0 || !split[0].equals("/spark")) { - return 0; - } - - String[] args = Arrays.copyOfRange(split, 1, split.length); - - this.platform.executeCommand(new ForgeCommandSender(context.getSource().asPlayer(), this), args); - return 1; - } - - @Override - boolean hasPermission(ICommandSource sender, String permission) { - if (sender instanceof PlayerEntity) { - return PermissionAPI.hasPermission((PlayerEntity) sender, permission); - } else { - return true; - } - } - - @Override - public Stream getSendersWithPermission(String permission) { - return Stream.concat( - this.server.getPlayerList().getPlayers().stream().filter(player -> PermissionAPI.hasPermission(player, permission)), - Stream.of(this.server) - ).map(sender -> new ForgeCommandSender(sender, this)); - } - - @Override - public TickCounter createTickCounter() { - return new ForgeTickCounter(TickEvent.Type.SERVER); - } - - @Override - public String getCommandName() { - return "spark"; - } -} diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkMod.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkMod.java index f3bf5c3..1f7199d 100644 --- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkMod.java +++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkMod.java @@ -20,6 +20,8 @@ package me.lucko.spark.forge; +import me.lucko.spark.forge.plugin.ForgeClientSparkPlugin; +import me.lucko.spark.forge.plugin.ForgeServerSparkPlugin; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.ModContainer; diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkPlugin.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkPlugin.java deleted file mode 100644 index 7141e8d..0000000 --- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkPlugin.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.lucko.spark.forge; - -import com.google.common.util.concurrent.ThreadFactoryBuilder; -import com.mojang.brigadier.Command; -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.arguments.StringArgumentType; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import com.mojang.brigadier.builder.RequiredArgumentBuilder; -import me.lucko.spark.common.SparkPlatform; -import me.lucko.spark.common.SparkPlugin; -import me.lucko.spark.common.sampler.ThreadDumper; -import net.minecraft.command.ICommandSource; - -import java.nio.file.Path; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; - -public abstract class ForgeSparkPlugin implements SparkPlugin { - - public static void registerCommands(CommandDispatcher dispatcher, Command executor, String... aliases) { - for (String alias : aliases) { - LiteralArgumentBuilder command = LiteralArgumentBuilder.literal(alias) - .executes(executor) - .then(RequiredArgumentBuilder.argument("args", StringArgumentType.greedyString()) - .executes(executor) - ); - - dispatcher.register(command); - } - } - - private final ForgeSparkMod mod; - protected final ScheduledExecutorService scheduler; - protected final SparkPlatform platform; - - protected ForgeSparkPlugin(ForgeSparkMod mod) { - this.mod = mod; - this.scheduler = Executors.newSingleThreadScheduledExecutor( - new ThreadFactoryBuilder().setNameFormat("spark-forge-async-worker").build() - ); - this.platform = new SparkPlatform(this); - this.platform.enable(); - } - - abstract boolean hasPermission(ICommandSource sender, String permission); - - @Override - public String getVersion() { - return this.mod.getVersion(); - } - - @Override - public Path getPluginDirectory() { - return this.mod.getConfigDirectory(); - } - - @Override - public void executeAsync(Runnable task) { - this.scheduler.execute(task); - } - - @Override - public ThreadDumper getDefaultThreadDumper() { - return new ThreadDumper.Specific(new long[]{Thread.currentThread().getId()}); - } -} diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeClientSparkPlugin.java b/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeClientSparkPlugin.java new file mode 100644 index 0000000..7de0038 --- /dev/null +++ b/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeClientSparkPlugin.java @@ -0,0 +1,127 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.lucko.spark.forge.plugin; + +import com.mojang.brigadier.CommandDispatcher; +import me.lucko.spark.common.sampler.TickCounter; +import me.lucko.spark.forge.ForgeCommandSender; +import me.lucko.spark.forge.ForgeSparkMod; +import me.lucko.spark.forge.ForgeTickCounter; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.client.network.play.ClientPlayNetHandler; +import net.minecraft.command.ICommandSource; +import net.minecraft.command.ISuggestionProvider; +import net.minecraftforge.client.event.ClientChatEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; +import java.util.stream.Stream; + +public class ForgeClientSparkPlugin extends ForgeSparkPlugin { + + private static final Field COMMAND_DISPATCHER_FIELD; + static { + COMMAND_DISPATCHER_FIELD = Arrays.stream(ClientPlayNetHandler.class.getDeclaredFields()) + .filter(f -> f.getType() == CommandDispatcher.class) + .findFirst().orElseThrow(() -> new RuntimeException("No field with CommandDispatcher type")); + COMMAND_DISPATCHER_FIELD.setAccessible(true); + } + + public static void register(ForgeSparkMod mod, FMLClientSetupEvent event) { + Minecraft minecraft = event.getMinecraftSupplier().get(); + + ForgeClientSparkPlugin plugin = new ForgeClientSparkPlugin(mod, minecraft); + MinecraftForge.EVENT_BUS.register(plugin); + + plugin.scheduler.scheduleWithFixedDelay(plugin::checkCommandRegistered, 10, 10, TimeUnit.SECONDS); + } + + private final Minecraft minecraft; + private CommandDispatcher dispatcher; + + public ForgeClientSparkPlugin(ForgeSparkMod mod, Minecraft minecraft) { + super(mod); + this.minecraft = minecraft; + } + + private void checkCommandRegistered() { + ClientPlayerEntity player = this.minecraft.player; + if (player == null) { + return; + } + + ClientPlayNetHandler connection = player.connection; + if (connection == null) { + return; + } + + try { + CommandDispatcher dispatcher = (CommandDispatcher) COMMAND_DISPATCHER_FIELD.get(connection); + if (dispatcher != this.dispatcher) { + this.dispatcher = dispatcher; + registerCommands(this.dispatcher, context -> 1, "sparkc", "sparkclient"); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @SubscribeEvent + public void onClientChat(ClientChatEvent event) { + String chat = event.getMessage(); + String[] split = chat.split(" "); + if (split.length == 0 || (!split[0].equals("/sparkc") && !split[0].equals("/sparkclient"))) { + return; + } + + String[] args = Arrays.copyOfRange(split, 1, split.length); + this.platform.executeCommand(new ForgeCommandSender(this.minecraft.player, this), args); + this.minecraft.ingameGUI.getChatGUI().addToSentMessages(chat); + event.setCanceled(true); + } + + @Override + public boolean hasPermission(ICommandSource sender, String permission) { + return true; + } + + @Override + public Stream getSendersWithPermission(String permission) { + return Stream.of(new ForgeCommandSender(this.minecraft.player, this)); + } + + @Override + public TickCounter createTickCounter() { + return new ForgeTickCounter(TickEvent.Type.CLIENT); + } + + @Override + public String getCommandName() { + return "sparkc"; + } + +} diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeServerSparkPlugin.java b/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeServerSparkPlugin.java new file mode 100644 index 0000000..5eb61f8 --- /dev/null +++ b/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeServerSparkPlugin.java @@ -0,0 +1,100 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.lucko.spark.forge.plugin; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import me.lucko.spark.common.sampler.TickCounter; +import me.lucko.spark.forge.ForgeCommandSender; +import me.lucko.spark.forge.ForgeSparkMod; +import me.lucko.spark.forge.ForgeTickCounter; +import net.minecraft.command.CommandSource; +import net.minecraft.command.ICommandSource; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.server.MinecraftServer; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.fml.event.server.FMLServerStartingEvent; +import net.minecraftforge.server.permission.DefaultPermissionLevel; +import net.minecraftforge.server.permission.PermissionAPI; + +import java.util.Arrays; +import java.util.stream.Stream; + +public class ForgeServerSparkPlugin extends ForgeSparkPlugin implements Command { + + public static void register(ForgeSparkMod mod, FMLServerStartingEvent event) { + MinecraftServer server = event.getServer(); + CommandDispatcher dispatcher = event.getCommandDispatcher(); + + ForgeServerSparkPlugin plugin = new ForgeServerSparkPlugin(mod, server); + registerCommands(dispatcher, plugin, "spark"); + PermissionAPI.registerNode("spark", DefaultPermissionLevel.OP, "Access to the spark command"); + } + + private final MinecraftServer server; + + public ForgeServerSparkPlugin(ForgeSparkMod mod, MinecraftServer server) { + super(mod); + this.server = server; + } + + @Override + public int run(CommandContext context) throws CommandSyntaxException { + String[] split = context.getInput().split(" "); + if (split.length == 0 || !split[0].equals("/spark")) { + return 0; + } + + String[] args = Arrays.copyOfRange(split, 1, split.length); + + this.platform.executeCommand(new ForgeCommandSender(context.getSource().asPlayer(), this), args); + return 1; + } + + @Override + public boolean hasPermission(ICommandSource sender, String permission) { + if (sender instanceof PlayerEntity) { + return PermissionAPI.hasPermission((PlayerEntity) sender, permission); + } else { + return true; + } + } + + @Override + public Stream getSendersWithPermission(String permission) { + return Stream.concat( + this.server.getPlayerList().getPlayers().stream().filter(player -> hasPermission(player, permission)), + Stream.of(this.server) + ).map(sender -> new ForgeCommandSender(sender, this)); + } + + @Override + public TickCounter createTickCounter() { + return new ForgeTickCounter(TickEvent.Type.SERVER); + } + + @Override + public String getCommandName() { + return "spark"; + } +} diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeSparkPlugin.java b/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeSparkPlugin.java new file mode 100644 index 0000000..915ca6d --- /dev/null +++ b/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeSparkPlugin.java @@ -0,0 +1,94 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.lucko.spark.forge.plugin; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.builder.RequiredArgumentBuilder; +import com.mojang.brigadier.tree.LiteralCommandNode; +import me.lucko.spark.common.SparkPlatform; +import me.lucko.spark.common.SparkPlugin; +import me.lucko.spark.common.sampler.ThreadDumper; +import me.lucko.spark.forge.ForgeSparkMod; +import net.minecraft.command.ICommandSource; + +import java.nio.file.Path; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; + +public abstract class ForgeSparkPlugin implements SparkPlugin { + + public static void registerCommands(CommandDispatcher dispatcher, Command executor, String... aliases) { + if (aliases.length == 0) { + return; + } + + String mainName = aliases[0]; + LiteralArgumentBuilder command = LiteralArgumentBuilder.literal(mainName) + .executes(executor) + .then(RequiredArgumentBuilder.argument("args", StringArgumentType.greedyString()) + .executes(executor) + ); + + LiteralCommandNode node = dispatcher.register(command); + for (int i = 1; i < aliases.length; i++) { + dispatcher.register(LiteralArgumentBuilder.literal(aliases[i]).redirect(node)); + } + } + + private final ForgeSparkMod mod; + protected final ScheduledExecutorService scheduler; + protected final SparkPlatform platform; + + protected ForgeSparkPlugin(ForgeSparkMod mod) { + this.mod = mod; + this.scheduler = Executors.newSingleThreadScheduledExecutor( + new ThreadFactoryBuilder().setNameFormat("spark-forge-async-worker").build() + ); + this.platform = new SparkPlatform(this); + this.platform.enable(); + } + + public abstract boolean hasPermission(ICommandSource sender, String permission); + + @Override + public String getVersion() { + return this.mod.getVersion(); + } + + @Override + public Path getPluginDirectory() { + return this.mod.getConfigDirectory(); + } + + @Override + public void executeAsync(Runnable task) { + this.scheduler.execute(task); + } + + @Override + public ThreadDumper getDefaultThreadDumper() { + return new ThreadDumper.Specific(new long[]{Thread.currentThread().getId()}); + } +} -- cgit