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 {
|
public interface ChunkMapAccessor {
|
||||||
|
|
||||||
@Accessor
|
@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 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")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
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",
|
"PlayerListMixin",
|
||||||
"ServerLoginPacketListenerImplMixin",
|
"ServerLoginPacketListenerImplMixin",
|
||||||
"TrackedEntityAccessorInvoker",
|
"TrackedEntityAccessorInvoker",
|
||||||
"SkullBlockEntityMixin"
|
"SkullBlockEntityMixin",
|
||||||
|
"GameProfileCacheAccessor"
|
||||||
],
|
],
|
||||||
"injectors": {
|
"injectors": {
|
||||||
"defaultRequire": 1
|
"defaultRequire": 1
|
||||||
|
|||||||
@@ -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}",
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user