aboutsummaryrefslogtreecommitdiff
path: root/spark-fabric/src/main/java/me/lucko/spark
diff options
context:
space:
mode:
Diffstat (limited to 'spark-fabric/src/main/java/me/lucko/spark')
-rw-r--r--spark-fabric/src/main/java/me/lucko/spark/fabric/FabricSparkGameHooks.java33
-rw-r--r--spark-fabric/src/main/java/me/lucko/spark/fabric/FabricSparkMod.java16
-rw-r--r--spark-fabric/src/main/java/me/lucko/spark/fabric/FabricTickCounter.java34
-rw-r--r--spark-fabric/src/main/java/me/lucko/spark/fabric/mixin/MinecraftClientMixin.java52
-rw-r--r--spark-fabric/src/main/java/me/lucko/spark/fabric/mixin/MinecraftServerMixin.java53
-rw-r--r--spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricClientSparkPlugin.java20
-rw-r--r--spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricServerSparkPlugin.java6
-rw-r--r--spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricSparkPlugin.java39
8 files changed, 66 insertions, 187 deletions
diff --git a/spark-fabric/src/main/java/me/lucko/spark/fabric/FabricSparkGameHooks.java b/spark-fabric/src/main/java/me/lucko/spark/fabric/FabricSparkGameHooks.java
index d046ab8..5eec53d 100644
--- a/spark-fabric/src/main/java/me/lucko/spark/fabric/FabricSparkGameHooks.java
+++ b/spark-fabric/src/main/java/me/lucko/spark/fabric/FabricSparkGameHooks.java
@@ -20,16 +20,11 @@
package me.lucko.spark.fabric;
-import java.util.HashSet;
-import java.util.Set;
import java.util.function.Predicate;
public enum FabricSparkGameHooks {
INSTANCE;
- private final Set<FabricTickCounter> clientCounters = new HashSet<>();
- private final Set<FabricTickCounter> serverCounters = new HashSet<>();
-
// Use events from Fabric API later
// Return true to abort sending to server
private Predicate<String> chatSendCallback = s -> false;
@@ -42,32 +37,4 @@ public enum FabricSparkGameHooks {
return this.chatSendCallback.test(message);
}
- public void addClientCounter(FabricTickCounter counter) {
- this.clientCounters.add(counter);
- }
-
- public void removeClientCounter(FabricTickCounter counter) {
- this.clientCounters.remove(counter);
- }
-
- public void addServerCounter(FabricTickCounter counter) {
- this.serverCounters.add(counter);
- }
-
- public void removeServerCounter(FabricTickCounter counter) {
- this.serverCounters.remove(counter);
- }
-
- public void tickClientCounters() {
- for (FabricTickCounter counter : this.clientCounters) {
- counter.onTick();
- }
- }
-
- public void tickServerCounters() {
- for (FabricTickCounter counter : this.serverCounters) {
- counter.onTick();
- }
- }
-
}
diff --git a/spark-fabric/src/main/java/me/lucko/spark/fabric/FabricSparkMod.java b/spark-fabric/src/main/java/me/lucko/spark/fabric/FabricSparkMod.java
index 0f6fb1f..780cedd 100644
--- a/spark-fabric/src/main/java/me/lucko/spark/fabric/FabricSparkMod.java
+++ b/spark-fabric/src/main/java/me/lucko/spark/fabric/FabricSparkMod.java
@@ -20,19 +20,19 @@
package me.lucko.spark.fabric;
+import me.lucko.spark.fabric.plugin.FabricClientSparkPlugin;
+import me.lucko.spark.fabric.plugin.FabricServerSparkPlugin;
import net.fabricmc.api.ModInitializer;
+import net.fabricmc.fabric.api.event.server.ServerStartCallback;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer;
+import net.minecraft.client.MinecraftClient;
import java.nio.file.Path;
public class FabricSparkMod implements ModInitializer {
private static FabricSparkMod mod;
- public static FabricSparkMod getMod() {
- return mod;
- }
-
private ModContainer container;
private Path configDirectory;
@@ -44,6 +44,14 @@ public class FabricSparkMod implements ModInitializer {
this.container = loader.getModContainer("spark")
.orElseThrow(() -> new IllegalStateException("Unable to get container for spark"));
this.configDirectory = loader.getConfigDirectory().toPath().resolve("spark");
+
+ // load hooks
+ ServerStartCallback.EVENT.register(server -> FabricServerSparkPlugin.register(this, server));
+ }
+
+ // called be entrypoint defined in fabric.mod.json
+ public static void initializeClient() {
+ FabricClientSparkPlugin.register(FabricSparkMod.mod, MinecraftClient.getInstance());
}
public String getVersion() {
diff --git a/spark-fabric/src/main/java/me/lucko/spark/fabric/FabricTickCounter.java b/spark-fabric/src/main/java/me/lucko/spark/fabric/FabricTickCounter.java
index ce58dcf..7781e03 100644
--- a/spark-fabric/src/main/java/me/lucko/spark/fabric/FabricTickCounter.java
+++ b/spark-fabric/src/main/java/me/lucko/spark/fabric/FabricTickCounter.java
@@ -22,35 +22,45 @@ package me.lucko.spark.fabric;
import me.lucko.spark.common.sampler.AbstractTickCounter;
import me.lucko.spark.common.sampler.TickCounter;
+import net.fabricmc.fabric.api.event.client.ClientTickCallback;
+import net.fabricmc.fabric.api.event.server.ServerTickCallback;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.server.MinecraftServer;
public abstract class FabricTickCounter extends AbstractTickCounter implements TickCounter {
+ protected boolean closed = false;
+
@Override
- public void onTick() {
- super.onTick();
+ public void close() {
+ this.closed = true;
}
- public static final class Server extends FabricTickCounter {
+ public static final class Server extends FabricTickCounter implements ServerTickCallback {
@Override
- public void start() {
- FabricSparkGameHooks.INSTANCE.addServerCounter(this);
+ public void tick(MinecraftServer minecraftServer) {
+ if (!this.closed) {
+ onTick();
+ }
}
@Override
- public void close() {
- FabricSparkGameHooks.INSTANCE.removeServerCounter(this);
+ public void start() {
+ ServerTickCallback.EVENT.register(this);
}
}
- public static final class Client extends FabricTickCounter {
+ public static final class Client extends FabricTickCounter implements ClientTickCallback {
@Override
- public void start() {
- FabricSparkGameHooks.INSTANCE.addClientCounter(this);
+ public void tick(MinecraftClient minecraftClient) {
+ if (!this.closed) {
+ onTick();
+ }
}
@Override
- public void close() {
- FabricSparkGameHooks.INSTANCE.removeClientCounter(this);
+ public void start() {
+ ClientTickCallback.EVENT.register(this);
}
}
}
diff --git a/spark-fabric/src/main/java/me/lucko/spark/fabric/mixin/MinecraftClientMixin.java b/spark-fabric/src/main/java/me/lucko/spark/fabric/mixin/MinecraftClientMixin.java
deleted file mode 100644
index ae7ef5f..0000000
--- a/spark-fabric/src/main/java/me/lucko/spark/fabric/mixin/MinecraftClientMixin.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * This file is part of spark.
- *
- * Copyright (c) lucko (Luck) <luck@lucko.me>
- * 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 <http://www.gnu.org/licenses/>.
- */
-
-package me.lucko.spark.fabric.mixin;
-
-import me.lucko.spark.fabric.FabricSparkGameHooks;
-import me.lucko.spark.fabric.FabricSparkMod;
-import me.lucko.spark.fabric.plugin.FabricClientSparkPlugin;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.util.NonBlockingThreadExecutor;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(MinecraftClient.class)
-public abstract class MinecraftClientMixin extends NonBlockingThreadExecutor<Runnable> {
-
- public MinecraftClientMixin(String string_1) {
- super(string_1);
- }
-
- // Inject at when menu pops up
- @Inject(method = "init()V", at = @At(value = "INVOKE",
- target = "Lnet/minecraft/client/gui/screen/SplashScreen;method_18819(Lnet/minecraft/client/MinecraftClient;)V"))
- public void onInit(CallbackInfo ci) {
- FabricClientSparkPlugin.register(FabricSparkMod.getMod(), (MinecraftClient) (Object) this);
- }
-
- @Inject(method = "tick()V", at = @At("RETURN"))
- public void onTick(CallbackInfo ci) {
- FabricSparkGameHooks.INSTANCE.tickClientCounters();
- }
-
-}
diff --git a/spark-fabric/src/main/java/me/lucko/spark/fabric/mixin/MinecraftServerMixin.java b/spark-fabric/src/main/java/me/lucko/spark/fabric/mixin/MinecraftServerMixin.java
deleted file mode 100644
index 4e3a0ab..0000000
--- a/spark-fabric/src/main/java/me/lucko/spark/fabric/mixin/MinecraftServerMixin.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * This file is part of spark.
- *
- * Copyright (c) lucko (Luck) <luck@lucko.me>
- * 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 <http://www.gnu.org/licenses/>.
- */
-
-package me.lucko.spark.fabric.mixin;
-
-import me.lucko.spark.fabric.FabricSparkGameHooks;
-import me.lucko.spark.fabric.FabricSparkMod;
-import me.lucko.spark.fabric.plugin.FabricServerSparkPlugin;
-import net.minecraft.server.MinecraftServer;
-import net.minecraft.server.ServerTask;
-import net.minecraft.util.NonBlockingThreadExecutor;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(MinecraftServer.class)
-public abstract class MinecraftServerMixin extends NonBlockingThreadExecutor<ServerTask> {
-
- public MinecraftServerMixin(String string_1) {
- super(string_1);
- }
-
- // Inject before set favicon call
- @Inject(method = "run()V",
- at = @At(value = "INVOKE", target = "Lnet/minecraft/server/MinecraftServer;setFavicon(Lnet/minecraft/server/ServerMetadata;)V"))
- public void onRun(CallbackInfo ci) {
- FabricServerSparkPlugin.register(FabricSparkMod.getMod(), (MinecraftServer) (Object) this);
- }
-
- @Inject(method = "tick(Ljava/util/function/BooleanSupplier;)V", at = @At("RETURN"))
- public void onTick(CallbackInfo ci) {
- FabricSparkGameHooks.INSTANCE.tickServerCounters();
- }
-
-}
diff --git a/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricClientSparkPlugin.java b/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricClientSparkPlugin.java
index 2541f7d..8cacc62 100644
--- a/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricClientSparkPlugin.java
+++ b/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricClientSparkPlugin.java
@@ -34,11 +34,11 @@ import me.lucko.spark.fabric.FabricSparkMod;
import me.lucko.spark.fabric.FabricTickCounter;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayNetworkHandler;
-import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.server.command.CommandOutput;
import net.minecraft.server.command.CommandSource;
import java.util.Arrays;
+import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;
@@ -47,7 +47,6 @@ public class FabricClientSparkPlugin extends FabricSparkPlugin implements Sugges
public static void register(FabricSparkMod mod, MinecraftClient client) {
FabricClientSparkPlugin plugin = new FabricClientSparkPlugin(mod, client);
-
plugin.scheduler.scheduleWithFixedDelay(plugin::checkCommandRegistered, 10, 10, TimeUnit.SECONDS);
}
@@ -59,19 +58,20 @@ public class FabricClientSparkPlugin extends FabricSparkPlugin implements Sugges
this.minecraft = minecraft;
}
- private void checkCommandRegistered() {
- ClientPlayerEntity player = this.minecraft.player;
- if (player == null) {
- return;
- }
+ private CommandDispatcher<CommandSource> getPlayerCommandDispatcher() {
+ return Optional.ofNullable(this.minecraft.player)
+ .map(player -> player.networkHandler)
+ .map(ClientPlayNetworkHandler::getCommandDispatcher)
+ .orElse(null);
+ }
- ClientPlayNetworkHandler connection = player.networkHandler;
- if (connection == null) {
+ private void checkCommandRegistered() {
+ CommandDispatcher<CommandSource> dispatcher = getPlayerCommandDispatcher();
+ if (dispatcher == null) {
return;
}
try {
- CommandDispatcher<CommandSource> dispatcher = connection.getCommandDispatcher();
if (dispatcher != this.dispatcher) {
this.dispatcher = dispatcher;
registerCommands(this.dispatcher, c -> Command.SINGLE_SUCCESS, this, "sparkc", "sparkclient");
diff --git a/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricServerSparkPlugin.java b/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricServerSparkPlugin.java
index 76568c3..a75b2aa 100644
--- a/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricServerSparkPlugin.java
+++ b/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricServerSparkPlugin.java
@@ -21,7 +21,6 @@
package me.lucko.spark.fabric.plugin;
import com.mojang.brigadier.Command;
-import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.suggestion.SuggestionProvider;
@@ -31,6 +30,7 @@ import me.lucko.spark.common.sampler.TickCounter;
import me.lucko.spark.fabric.FabricCommandSender;
import me.lucko.spark.fabric.FabricSparkMod;
import me.lucko.spark.fabric.FabricTickCounter;
+import net.fabricmc.fabric.api.registry.CommandRegistry;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.command.CommandOutput;
@@ -44,10 +44,8 @@ import java.util.stream.Stream;
public class FabricServerSparkPlugin extends FabricSparkPlugin implements Command<ServerCommandSource>, SuggestionProvider<ServerCommandSource> {
public static void register(FabricSparkMod mod, MinecraftServer server) {
- CommandDispatcher<ServerCommandSource> dispatcher = server.getCommandManager().getDispatcher();
-
FabricServerSparkPlugin plugin = new FabricServerSparkPlugin(mod, server);
- registerCommands(dispatcher, plugin, plugin, "spark");
+ CommandRegistry.INSTANCE.register(false, dispatcher -> registerCommands(dispatcher, plugin, plugin, "spark"));
}
private final MinecraftServer server;
diff --git a/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricSparkPlugin.java b/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricSparkPlugin.java
index 1f6f098..3cc125e 100644
--- a/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricSparkPlugin.java
+++ b/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricSparkPlugin.java
@@ -40,25 +40,6 @@ import java.util.concurrent.ScheduledExecutorService;
public abstract class FabricSparkPlugin implements SparkPlugin {
- public static <T> void registerCommands(CommandDispatcher<T> dispatcher, Command<T> executor, SuggestionProvider<T> suggestor, String... aliases) {
- if (aliases.length == 0) {
- return;
- }
-
- String mainName = aliases[0];
- LiteralArgumentBuilder<T> command = LiteralArgumentBuilder.<T>literal(mainName)
- .executes(executor)
- .then(RequiredArgumentBuilder.<T, String>argument("args", StringArgumentType.greedyString())
- .suggests(suggestor)
- .executes(executor)
- );
-
- LiteralCommandNode<T> node = dispatcher.register(command);
- for (int i = 1; i < aliases.length; i++) {
- dispatcher.register(LiteralArgumentBuilder.<T>literal(aliases[i]).redirect(node));
- }
- }
-
private final FabricSparkMod mod;
protected final ScheduledExecutorService scheduler;
protected final SparkPlatform platform;
@@ -93,4 +74,24 @@ public abstract class FabricSparkPlugin implements SparkPlugin {
public ThreadDumper getDefaultThreadDumper() {
return new ThreadDumper.Specific(new long[]{Thread.currentThread().getId()});
}
+
+ public static <T> void registerCommands(CommandDispatcher<T> dispatcher, Command<T> executor, SuggestionProvider<T> suggestor, String... aliases) {
+ if (aliases.length == 0) {
+ return;
+ }
+
+ String mainName = aliases[0];
+ LiteralArgumentBuilder<T> command = LiteralArgumentBuilder.<T>literal(mainName)
+ .executes(executor)
+ .then(RequiredArgumentBuilder.<T, String>argument("args", StringArgumentType.greedyString())
+ .suggests(suggestor)
+ .executes(executor)
+ );
+
+ LiteralCommandNode<T> node = dispatcher.register(command);
+ for (int i = 1; i < aliases.length; i++) {
+ dispatcher.register(LiteralArgumentBuilder.<T>literal(aliases[i]).redirect(node));
+ }
+ }
+
}