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