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

store original skin value when setting skin

This commit is contained in:
2024-07-01 20:04:01 +03:00
parent b3c4340b89
commit d474c7902f
4 changed files with 27 additions and 4 deletions

View File

@@ -85,6 +85,9 @@ public final class SkinRestorer {
var acceptedPlayers = new HashSet<ServerPlayer>(); var acceptedPlayers = new HashSet<ServerPlayer>();
for (var profile : targets) { for (var profile : targets) {
if (!SkinRestorer.getSkinStorage().hasSavedSkin(profile.getId()))
value = value.setOriginalValue(PlayerUtils.getPlayerSkin(profile));
SkinRestorer.getSkinStorage().setSkin(profile.getId(), value); SkinRestorer.getSkinStorage().setSkin(profile.getId(), value);
if (PlayerUtils.areSkinPropertiesEquals(value.value(), PlayerUtils.getPlayerSkin(profile))) if (PlayerUtils.areSkinPropertiesEquals(value.value(), PlayerUtils.getPlayerSkin(profile)))

View File

@@ -4,6 +4,7 @@ import com.mojang.authlib.GameProfile;
import net.lionarius.skinrestorer.SkinRestorer; import net.lionarius.skinrestorer.SkinRestorer;
import net.lionarius.skinrestorer.skin.SkinValue; import net.lionarius.skinrestorer.skin.SkinValue;
import net.lionarius.skinrestorer.skin.provider.SkinProviderContext; import net.lionarius.skinrestorer.skin.provider.SkinProviderContext;
import net.lionarius.skinrestorer.util.PlayerUtils;
import net.lionarius.skinrestorer.util.Result; import net.lionarius.skinrestorer.util.Result;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerLoginPacketListenerImpl; import net.minecraft.server.network.ServerLoginPacketListenerImpl;
@@ -36,12 +37,20 @@ public abstract class ServerLoginPacketListenerImplMixin {
if (skinrestorer_pendingSkin == null) { if (skinrestorer_pendingSkin == null) {
skinrestorer_pendingSkin = CompletableFuture.supplyAsync(() -> { skinrestorer_pendingSkin = CompletableFuture.supplyAsync(() -> {
assert authenticatedProfile != null; assert authenticatedProfile != null;
SkinRestorer.LOGGER.debug("Fetching {}'s skin", authenticatedProfile.getName()); var originalSkin = PlayerUtils.getPlayerSkin(authenticatedProfile);
if (SkinRestorer.getSkinStorage().hasSavedSkin(authenticatedProfile.getId())) if (SkinRestorer.getSkinStorage().hasSavedSkin(authenticatedProfile.getId())) {
if (originalSkin != null) { // update to the latest official skin
var value = SkinRestorer.getSkinStorage().getSkin(authenticatedProfile.getId());
SkinRestorer.getSkinStorage().setSkin(authenticatedProfile.getId(), value.setOriginalValue(originalSkin));
}
return null; return null;
}
if (!server.enforceSecureProfile() && SkinRestorer.getConfig().fetchSkinOnFirstJoin()) { // fetch from mojang provider by username if (originalSkin == null && SkinRestorer.getConfig().fetchSkinOnFirstJoin()) {
SkinRestorer.LOGGER.debug("Fetching {}'s skin", authenticatedProfile.getName());
var context = new SkinProviderContext("mojang", authenticatedProfile.getName(), null); var context = new SkinProviderContext("mojang", authenticatedProfile.getName(), null);
var result = SkinRestorer.getProvider(context.name()).map( var result = SkinRestorer.getProvider(context.name()).map(
provider -> provider.getSkin(context.argument(), context.variant()) provider -> provider.getSkin(context.argument(), context.variant())

View File

@@ -44,6 +44,9 @@ public class SkinStorage {
if (skin == null) if (skin == null)
skin = SkinValue.EMPTY; skin = SkinValue.EMPTY;
if (skinMap.containsKey(uuid) && skin.originalValue() == null)
skin = skin.setOriginalValue(skinMap.get(uuid).originalValue());
skinMap.put(uuid, skin); skinMap.put(uuid, skin);
} }
} }

View File

@@ -6,10 +6,14 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
public record SkinValue(@NotNull String provider, @Nullable String argument, @Nullable SkinVariant variant, public record SkinValue(@NotNull String provider, @Nullable String argument, @Nullable SkinVariant variant,
@Nullable Property value) { @Nullable Property value, @Nullable Property originalValue) {
public static final SkinValue EMPTY = new SkinValue("empty", null, null, null); public static final SkinValue EMPTY = new SkinValue("empty", null, null, null);
public SkinValue(String provider, String argument, SkinVariant variant, Property value) {
this(provider, argument, variant, value, null);
}
public static SkinValue fromProviderContextWithValue(SkinProviderContext context, Property value) { public static SkinValue fromProviderContextWithValue(SkinProviderContext context, Property value) {
return new SkinValue(context.name(), context.argument(), context.variant(), value); return new SkinValue(context.name(), context.argument(), context.variant(), value);
} }
@@ -17,4 +21,8 @@ public record SkinValue(@NotNull String provider, @Nullable String argument, @Nu
public SkinProviderContext toProviderContext() { public SkinProviderContext toProviderContext() {
return new SkinProviderContext(this.provider, this.argument, this.variant); return new SkinProviderContext(this.provider, this.argument, this.variant);
} }
public SkinValue setOriginalValue(Property originalValue) {
return new SkinValue(this.provider, this.argument, this.variant, this.value, originalValue);
}
} }