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 { public interface ChunkMapAccessor {
@Accessor @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 com.mojang.authlib.GameProfile;
import net.lionarius.skinrestorer.SkinRestorer; import net.lionarius.skinrestorer.SkinRestorer;
import net.lionarius.skinrestorer.util.PlayerUtils; import net.lionarius.skinrestorer.util.PlayerUtils;
import net.minecraft.Util;
import net.minecraft.server.Services; import net.minecraft.server.Services;
import net.minecraft.world.level.block.entity.SkullBlockEntity; import net.minecraft.world.level.block.entity.SkullBlockEntity;
import org.spongepowered.asm.mixin.Mixin; 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.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.Locale;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@@ -25,7 +27,11 @@ public abstract class SkullBlockEntityMixin {
if (name == null) if (name == null)
return; 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); skinrestorer$replaceSkin(profileOpt, cir);
} }
@@ -57,7 +63,7 @@ public abstract class SkullBlockEntityMixin {
PlayerUtils.applyRestoredSkin(profile, skin.value()); PlayerUtils.applyRestoredSkin(profile, skin.value());
return Optional.of(profile); 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) { if (trackedEntity != null) {
var seenBy = Set.copyOf(trackedEntity.getSeenBy()); var seenBy = Set.copyOf(trackedEntity.getSeenBy());
for (var observerConnection : seenBy) { for (var observerConnection : seenBy) {
var observer = observerConnection.getPlayer(); var observer = observerConnection.getPlayer();
trackedEntity.invokeRemovePlayer(observer); trackedEntity.invokeRemovePlayer(observer);
var trackedObserverEntity = (TrackedEntityAccessorInvoker) ((ChunkMapAccessor) chunkMap).getEntityMap().get(observer.getId()); var trackedObserverEntity = ((ChunkMapAccessor) chunkMap).getEntityMap().get(observer.getId());
if (trackedObserverEntity != null) { if (trackedObserverEntity != null) {
trackedObserverEntity.invokeRemovePlayer(player); trackedObserverEntity.invokeRemovePlayer(player);
trackedObserverEntity.invokeUpdatePlayer(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", "PlayerListMixin",
"ServerLoginPacketListenerImplMixin", "ServerLoginPacketListenerImplMixin",
"TrackedEntityAccessorInvoker", "TrackedEntityAccessorInvoker",
"SkullBlockEntityMixin" "SkullBlockEntityMixin",
"GameProfileCacheAccessor"
], ],
"injectors": { "injectors": {
"defaultRequire": 1 "defaultRequire": 1

View File

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

View File

@@ -33,7 +33,7 @@ minecraft {
// Automatically enable forge AccessTransformers if the file exists // Automatically enable forge AccessTransformers if the file exists
// This location is hardcoded in Forge and can not be changed. // 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 // 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()) { if (at.exists()) {
accessTransformer = at accessTransformer = at
} }
@@ -92,3 +92,7 @@ sourceSets.each {
it.output.resourcesDir = dir it.output.resourcesDir = dir
it.java.destinationDirectory = dir it.java.destinationDirectory = dir
} }
tasks.named('processResources') {
duplicatesStrategy = DuplicatesStrategy.INCLUDE
}

View File

@@ -12,9 +12,9 @@ neoForge {
version = neoforge_version version = neoforge_version
// Automatically enable neoforge AccessTransformers if the file exists // 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()) { if (at.exists()) {
minecraft.accessTransformers.file(at) accessTransformers.from(at.absolutePath)
} }
parchment { parchment {