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:
@@ -9,5 +9,5 @@ import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
public interface ChunkMapAccessor {
|
||||
|
||||
@Accessor
|
||||
Int2ObjectMap<Object> getEntityMap();
|
||||
Int2ObjectMap<TrackedEntityAccessorInvoker> getEntityMap();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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")));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
1
common/src/main/resources/META-INF/accesstransformer.cfg
Normal file
1
common/src/main/resources/META-INF/accesstransformer.cfg
Normal file
@@ -0,0 +1 @@
|
||||
public net.minecraft.server.players.GameProfileCache$GameProfileInfo
|
||||
3
common/src/main/resources/skinrestorer.accesswidener
Normal file
3
common/src/main/resources/skinrestorer.accesswidener
Normal file
@@ -0,0 +1,3 @@
|
||||
accessWidener v2 named
|
||||
|
||||
accessible class net/minecraft/server/players/GameProfileCache$GameProfileInfo
|
||||
@@ -10,7 +10,8 @@
|
||||
"PlayerListMixin",
|
||||
"ServerLoginPacketListenerImplMixin",
|
||||
"TrackedEntityAccessorInvoker",
|
||||
"SkullBlockEntityMixin"
|
||||
"SkullBlockEntityMixin",
|
||||
"GameProfileCacheAccessor"
|
||||
],
|
||||
"injectors": {
|
||||
"defaultRequire": 1
|
||||
|
||||
Reference in New Issue
Block a user