1
0
mirror of https://github.com/Suiranoil/SkinRestorer.git synced 2026-01-16 04:42:12 +00:00

Merge branch '1.20.3-multiloader' into 1.20.2-multiloader

This commit is contained in:
2025-03-27 18:34:36 +03:00
5 changed files with 73 additions and 46 deletions

View File

@@ -11,10 +11,7 @@ import net.lionarius.skinrestorer.skin.SkinStorage;
import net.lionarius.skinrestorer.skin.SkinValue;
import net.lionarius.skinrestorer.skin.provider.*;
import net.lionarius.skinrestorer.translation.Translation;
import net.lionarius.skinrestorer.util.FileUtils;
import net.lionarius.skinrestorer.util.PlayerUtils;
import net.lionarius.skinrestorer.util.Result;
import net.lionarius.skinrestorer.util.WebUtils;
import net.lionarius.skinrestorer.util.*;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
@@ -37,6 +34,7 @@ public final class SkinRestorer {
private static SkinStorage skinStorage;
private static Path configDir;
private static Config config;
private static TickedScheduler tickedScheduler;
private SkinRestorer() {}
@@ -56,6 +54,10 @@ public final class SkinRestorer {
return SkinRestorer.providersRegistry;
}
public static TickedScheduler getTickedScheduler() {
return SkinRestorer.tickedScheduler;
}
public static Optional<SkinProvider> getProvider(String name) {
return Optional.ofNullable(SkinRestorer.providersRegistry.get(name));
}
@@ -119,6 +121,8 @@ public final class SkinRestorer {
PlayerUtils.refreshPlayer(player);
acceptedPlayers.add(player);
SkinRestorer.getTickedScheduler().cancel(player.getUUID());
}
return acceptedPlayers;
@@ -165,6 +169,8 @@ public final class SkinRestorer {
FileUtils.tryMigrateOldSkinDirectory(SkinRestorer.getConfigDir(), worldSkinDirectory);
SkinRestorer.skinStorage = new SkinStorage(new SkinIO(worldSkinDirectory));
SkinRestorer.tickedScheduler = new TickedScheduler(server);
server.addTickable(SkinRestorer.tickedScheduler);
}
public static void onCommandRegister(CommandDispatcher<CommandSourceStack> dispatcher) {

View File

@@ -5,7 +5,6 @@ import net.lionarius.skinrestorer.platform.Services;
import net.lionarius.skinrestorer.skin.SkinValue;
import net.lionarius.skinrestorer.skin.provider.SkinShuffleSkinProvider;
import net.lionarius.skinrestorer.util.PlayerUtils;
import net.lionarius.skinrestorer.util.ServerUtils;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;
@@ -41,7 +40,7 @@ public class SkinShuffleCompatibility {
if (!property.hasSignature())
return;
ServerUtils.scheduleServerTask(server, () -> {
server.execute(() -> {
SkinRestorer.applySkin(
server,
Collections.singleton(player.getGameProfile()),

View File

@@ -1,7 +1,6 @@
package net.lionarius.skinrestorer.mixin;
import net.lionarius.skinrestorer.SkinRestorer;
import net.lionarius.skinrestorer.util.ServerUtils;
import net.minecraft.network.Connection;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;
@@ -47,11 +46,11 @@ public abstract class PlayerListMixin {
skinrestorer$tryApplySkin(server, player);
} else {
var uuid = player.getUUID();
ServerUtils.scheduleServerTask(server, () -> {
SkinRestorer.getTickedScheduler().schedule(() -> {
var actualPlayer = server.getPlayerList().getPlayer(uuid);
if (actualPlayer != null)
skinrestorer$tryApplySkin(server, actualPlayer);
}, delay);
}, delay, uuid);
}
}

View File

@@ -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);
}
}
}

View File

@@ -0,0 +1,60 @@
package net.lionarius.skinrestorer.util;
import net.minecraft.server.MinecraftServer;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.PriorityBlockingQueue;
public class TickedScheduler implements Runnable {
private final MinecraftServer server;
private final Queue<TickTask> queue = new PriorityBlockingQueue<>();
private final Map<Integer, Integer> idMap = new ConcurrentHashMap<>();
public TickedScheduler(MinecraftServer server) {
this.server = server;
}
public void schedule(Runnable task, int delay) {
this.schedule(task, delay, task);
}
public void schedule(Runnable task, int delay, Object id) {
var taskId = id.hashCode();
var serverTick = this.server.getTickCount();
this.idMap.merge(taskId, serverTick, Integer::max);
this.queue.add(new TickTask(serverTick, serverTick + delay, taskId, task));
}
public void cancel(Object id) {
var taskId = id.hashCode();
this.idMap.remove(taskId);
}
@Override
public void run() {
TickTask nextTask;
while ((nextTask = this.queue.peek()) != null) {
if (nextTask.runOnTick() > this.server.getTickCount())
break;
var tickTask = this.queue.remove();
var lastTaskScheduledOnTick = this.idMap.get(tickTask.id());
if (lastTaskScheduledOnTick != null && lastTaskScheduledOnTick <= tickTask.scheduledOnTick()) {
this.idMap.remove(tickTask.id());
if (tickTask.task() != null)
tickTask.task().run();
}
}
}
private record TickTask(int scheduledOnTick, int runOnTick, int id, Runnable task) implements Comparable<TickTask> {
@Override
public int compareTo(@NotNull TickedScheduler.TickTask other) {
return Integer.compare(this.runOnTick, other.runOnTick);
}
}
}