mirror of
https://github.com/Suiranoil/SkinRestorer.git
synced 2026-01-16 04:42:12 +00:00
fix main thread blocking
This commit is contained in:
@@ -11,10 +11,7 @@ import net.lionarius.skinrestorer.skin.SkinStorage;
|
|||||||
import net.lionarius.skinrestorer.skin.SkinValue;
|
import net.lionarius.skinrestorer.skin.SkinValue;
|
||||||
import net.lionarius.skinrestorer.skin.provider.*;
|
import net.lionarius.skinrestorer.skin.provider.*;
|
||||||
import net.lionarius.skinrestorer.translation.Translation;
|
import net.lionarius.skinrestorer.translation.Translation;
|
||||||
import net.lionarius.skinrestorer.util.FileUtils;
|
import net.lionarius.skinrestorer.util.*;
|
||||||
import net.lionarius.skinrestorer.util.PlayerUtils;
|
|
||||||
import net.lionarius.skinrestorer.util.Result;
|
|
||||||
import net.lionarius.skinrestorer.util.WebUtils;
|
|
||||||
import net.minecraft.commands.CommandSourceStack;
|
import net.minecraft.commands.CommandSourceStack;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
@@ -37,6 +34,7 @@ public final class SkinRestorer {
|
|||||||
private static SkinStorage skinStorage;
|
private static SkinStorage skinStorage;
|
||||||
private static Path configDir;
|
private static Path configDir;
|
||||||
private static Config config;
|
private static Config config;
|
||||||
|
private static TickedScheduler tickedScheduler;
|
||||||
|
|
||||||
private SkinRestorer() {}
|
private SkinRestorer() {}
|
||||||
|
|
||||||
@@ -56,6 +54,10 @@ public final class SkinRestorer {
|
|||||||
return SkinRestorer.providersRegistry;
|
return SkinRestorer.providersRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static TickedScheduler getTickedScheduler() {
|
||||||
|
return SkinRestorer.tickedScheduler;
|
||||||
|
}
|
||||||
|
|
||||||
public static Optional<SkinProvider> getProvider(String name) {
|
public static Optional<SkinProvider> getProvider(String name) {
|
||||||
return Optional.ofNullable(SkinRestorer.providersRegistry.get(name));
|
return Optional.ofNullable(SkinRestorer.providersRegistry.get(name));
|
||||||
}
|
}
|
||||||
@@ -165,6 +167,8 @@ public final class SkinRestorer {
|
|||||||
FileUtils.tryMigrateOldSkinDirectory(SkinRestorer.getConfigDir(), worldSkinDirectory);
|
FileUtils.tryMigrateOldSkinDirectory(SkinRestorer.getConfigDir(), worldSkinDirectory);
|
||||||
|
|
||||||
SkinRestorer.skinStorage = new SkinStorage(new SkinIO(worldSkinDirectory));
|
SkinRestorer.skinStorage = new SkinStorage(new SkinIO(worldSkinDirectory));
|
||||||
|
SkinRestorer.tickedScheduler = new TickedScheduler(server);
|
||||||
|
server.addTickable(SkinRestorer.tickedScheduler);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void onCommandRegister(CommandDispatcher<CommandSourceStack> dispatcher) {
|
public static void onCommandRegister(CommandDispatcher<CommandSourceStack> dispatcher) {
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import net.lionarius.skinrestorer.platform.Services;
|
|||||||
import net.lionarius.skinrestorer.skin.SkinValue;
|
import net.lionarius.skinrestorer.skin.SkinValue;
|
||||||
import net.lionarius.skinrestorer.skin.provider.SkinShuffleSkinProvider;
|
import net.lionarius.skinrestorer.skin.provider.SkinShuffleSkinProvider;
|
||||||
import net.lionarius.skinrestorer.util.PlayerUtils;
|
import net.lionarius.skinrestorer.util.PlayerUtils;
|
||||||
import net.lionarius.skinrestorer.util.ServerUtils;
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
@@ -41,7 +40,7 @@ public class SkinShuffleCompatibility {
|
|||||||
if (!property.hasSignature())
|
if (!property.hasSignature())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ServerUtils.scheduleServerTask(server, () -> {
|
server.execute(() -> {
|
||||||
SkinRestorer.applySkin(
|
SkinRestorer.applySkin(
|
||||||
server,
|
server,
|
||||||
Collections.singleton(player.getGameProfile()),
|
Collections.singleton(player.getGameProfile()),
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package net.lionarius.skinrestorer.mixin;
|
package net.lionarius.skinrestorer.mixin;
|
||||||
|
|
||||||
import net.lionarius.skinrestorer.SkinRestorer;
|
import net.lionarius.skinrestorer.SkinRestorer;
|
||||||
import net.lionarius.skinrestorer.util.ServerUtils;
|
|
||||||
import net.minecraft.network.Connection;
|
import net.minecraft.network.Connection;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
@@ -47,7 +46,7 @@ public abstract class PlayerListMixin {
|
|||||||
skinrestorer$tryApplySkin(server, player);
|
skinrestorer$tryApplySkin(server, player);
|
||||||
} else {
|
} else {
|
||||||
var uuid = player.getUUID();
|
var uuid = player.getUUID();
|
||||||
ServerUtils.scheduleServerTask(server, () -> {
|
SkinRestorer.getTickedScheduler().schedule(() -> {
|
||||||
var actualPlayer = server.getPlayerList().getPlayer(uuid);
|
var actualPlayer = server.getPlayerList().getPlayer(uuid);
|
||||||
if (actualPlayer != null)
|
if (actualPlayer != null)
|
||||||
skinrestorer$tryApplySkin(server, actualPlayer);
|
skinrestorer$tryApplySkin(server, actualPlayer);
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
package net.lionarius.skinrestorer.util;
|
|
||||||
|
|
||||||
import net.minecraft.server.MinecraftServer;
|
|
||||||
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
public class ServerUtils {
|
|
||||||
|
|
||||||
private ServerUtils() {}
|
|
||||||
|
|
||||||
public static void scheduleServerTask(MinecraftServer server, Consumer<MinecraftServer> task) {
|
|
||||||
ServerUtils.scheduleServerTask(server, task, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void scheduleServerTask(MinecraftServer server, Runnable task) {
|
|
||||||
ServerUtils.scheduleServerTask(server, task, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void scheduleServerTask(MinecraftServer server, Consumer<MinecraftServer> task, int tickDelay) {
|
|
||||||
server.execute(new ScheduledTickTask(server, task, server.getTickCount() + tickDelay));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void scheduleServerTask(MinecraftServer server, Runnable task, int tickDelay) {
|
|
||||||
server.execute(new ScheduledTickTask(server, _server -> task.run(), server.getTickCount() + tickDelay));
|
|
||||||
}
|
|
||||||
|
|
||||||
public record ScheduledTickTask(MinecraftServer server, Consumer<MinecraftServer> task,
|
|
||||||
int tickTarget) implements Runnable {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (this.server.getTickCount() >= this.tickTarget)
|
|
||||||
this.task.accept(this.server);
|
|
||||||
else
|
|
||||||
this.server.execute(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package net.lionarius.skinrestorer.util;
|
||||||
|
|
||||||
|
import com.google.common.collect.Queues;
|
||||||
|
import net.minecraft.server.MinecraftServer;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Queue;
|
||||||
|
|
||||||
|
public class TickedScheduler implements Runnable {
|
||||||
|
private final MinecraftServer server;
|
||||||
|
private final Queue<TickTask> queue = Queues.newPriorityBlockingQueue();
|
||||||
|
|
||||||
|
public TickedScheduler(MinecraftServer server) {
|
||||||
|
this.server = server;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void schedule(Runnable task, int delay) {
|
||||||
|
this.queue.add(new TickTask(this.server.getTickCount() + delay, task));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
TickTask nextTask;
|
||||||
|
while ((nextTask = this.queue.peek()) != null) {
|
||||||
|
if (nextTask.tick() > this.server.getTickCount())
|
||||||
|
break;
|
||||||
|
|
||||||
|
var tickTask = this.queue.remove();
|
||||||
|
tickTask.task().run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private record TickTask(int tick, Runnable task) implements Comparable<TickTask> {
|
||||||
|
@Override
|
||||||
|
public int compareTo(@NotNull TickedScheduler.TickTask other) {
|
||||||
|
return Integer.compare(this.tick, other.tick);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user