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

fix server freeze when loading head

This commit is contained in:
2025-07-26 10:12:27 +03:00
parent f604ac2c8b
commit 1d8472e35c
10 changed files with 39 additions and 9 deletions

View File

@@ -9,5 +9,5 @@ import org.spongepowered.asm.mixin.gen.Accessor;
public interface ChunkMapAccessor {
@Accessor
Int2ObjectMap<Object> getEntityMap();
Int2ObjectMap<TrackedEntityAccessorInvoker> getEntityMap();
}

View File

@@ -0,0 +1,14 @@
package net.lionarius.skinrestorer.mixin;
import net.minecraft.server.players.GameProfileCache;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.Map;
@Mixin(GameProfileCache.class)
public interface GameProfileCacheAccessor {
@Accessor
Map<String, GameProfileCache.GameProfileInfo> getProfilesByName();
}

View File

@@ -3,6 +3,7 @@ package net.lionarius.skinrestorer.mixin;
import com.mojang.authlib.GameProfile;
import net.lionarius.skinrestorer.SkinRestorer;
import net.lionarius.skinrestorer.util.PlayerUtils;
import net.minecraft.Util;
import net.minecraft.server.Services;
import net.minecraft.world.level.block.entity.SkullBlockEntity;
import org.spongepowered.asm.mixin.Mixin;
@@ -11,6 +12,7 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.Locale;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
@@ -25,7 +27,11 @@ public abstract class SkullBlockEntityMixin {
if (name == null)
return;
var profileOpt = services.profileCache().get(name);
var profileOpt = Optional.<GameProfile>empty();
var gameProfileInfo = ((GameProfileCacheAccessor) services.profileCache()).getProfilesByName().get(name.toLowerCase(Locale.ROOT));
if (gameProfileInfo != null)
profileOpt = Optional.of(gameProfileInfo.getProfile());
skinrestorer$replaceSkin(profileOpt, cir);
}
@@ -57,7 +63,7 @@ public abstract class SkullBlockEntityMixin {
PlayerUtils.applyRestoredSkin(profile, skin.value());
return Optional.of(profile);
}));
}, Util.backgroundExecutor().forName("getProfile")));
}
}
}

View File

@@ -50,14 +50,14 @@ public final class PlayerUtils {
)
));
var trackedEntity = (TrackedEntityAccessorInvoker) ((ChunkMapAccessor) chunkMap).getEntityMap().get(player.getId());
var trackedEntity = ((ChunkMapAccessor) chunkMap).getEntityMap().get(player.getId());
if (trackedEntity != null) {
var seenBy = Set.copyOf(trackedEntity.getSeenBy());
for (var observerConnection : seenBy) {
var observer = observerConnection.getPlayer();
trackedEntity.invokeRemovePlayer(observer);
var trackedObserverEntity = (TrackedEntityAccessorInvoker) ((ChunkMapAccessor) chunkMap).getEntityMap().get(observer.getId());
var trackedObserverEntity = ((ChunkMapAccessor) chunkMap).getEntityMap().get(observer.getId());
if (trackedObserverEntity != null) {
trackedObserverEntity.invokeRemovePlayer(player);
trackedObserverEntity.invokeUpdatePlayer(player);

View File

@@ -0,0 +1 @@
public net.minecraft.server.players.GameProfileCache$GameProfileInfo

View File

@@ -0,0 +1,3 @@
accessWidener v2 named
accessible class net/minecraft/server/players/GameProfileCache$GameProfileInfo

View File

@@ -10,7 +10,8 @@
"PlayerListMixin",
"ServerLoginPacketListenerImplMixin",
"TrackedEntityAccessorInvoker",
"SkullBlockEntityMixin"
"SkullBlockEntityMixin",
"GameProfileCacheAccessor"
],
"injectors": {
"defaultRequire": 1

View File

@@ -24,6 +24,7 @@
"${mod_id}.mixins.json",
"${mod_id}.fabric.mixins.json"
],
"accessWidener": "${mod_id}.accesswidener",
"depends": {
"fabricloader": ">=${fabric_loader_version}",
"minecraft": ">=${minecraft_version}",

View File

@@ -33,7 +33,7 @@ minecraft {
// Automatically enable forge AccessTransformers if the file exists
// This location is hardcoded in Forge and can not be changed.
// https://github.com/MinecraftForge/MinecraftForge/blob/be1698bb1554f9c8fa2f58e32b9ab70bc4385e60/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java#L123
def at = project(':common').file('src/main/resources/META-INF/accesstransformer.cfg')
def at = project(":common").file('src/main/resources/META-INF/accesstransformer.cfg')
if (at.exists()) {
accessTransformer = at
}
@@ -92,3 +92,7 @@ sourceSets.each {
it.output.resourcesDir = dir
it.java.destinationDirectory = dir
}
tasks.named('processResources') {
duplicatesStrategy = DuplicatesStrategy.INCLUDE
}

View File

@@ -12,9 +12,9 @@ neoForge {
version = neoforge_version
// Automatically enable neoforge AccessTransformers if the file exists
def at = project(':common').file('src/main/resources/META-INF/accesstransformer.cfg')
def at = project(":common").file('src/main/resources/META-INF/accesstransformer.cfg')
if (at.exists()) {
minecraft.accessTransformers.file(at)
accessTransformers.from(at.absolutePath)
}
parchment {