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

Compare commits

...

45 Commits

Author SHA1 Message Date
515b3f10c1 Merge branch '1.19.3-multiloader' into 1.19.1-multiloader 2025-08-17 19:07:57 +03:00
24b956a91c Merge branch '1.19.4-multiloader' into 1.19.3-multiloader 2025-08-17 19:06:37 +03:00
2233f28c68 Merge branch '1.20-multiloader' into 1.19.4-multiloader
# Conflicts:
#	fabric/gradle.properties
2025-08-17 19:04:38 +03:00
905fd9d851 Merge branch '1.19.3-multiloader' into 1.19.1-multiloader 2025-07-13 20:56:45 +03:00
7849aa9be2 Merge branch '1.19.4-multiloader' into 1.19.3-multiloader 2025-07-13 20:54:35 +03:00
47b59e61d1 Merge branch '1.20-multiloader' into 1.19.4-multiloader 2025-07-13 20:53:58 +03:00
4dd1c0d386 Merge branch '1.19.3-multiloader' into 1.19.1-multiloader 2025-07-09 21:54:29 +03:00
bdaf27e68a Merge branch '1.19.4-multiloader' into 1.19.3-multiloader 2025-07-09 21:53:09 +03:00
a59c920307 Merge branch '1.20-multiloader' into 1.19.4-multiloader 2025-07-09 21:52:48 +03:00
0bd8526f43 Merge branch '1.19.3-multiloader' into 1.19.1-multiloader 2025-07-05 20:49:53 +03:00
45c438b03e Merge branch '1.19.4-multiloader' into 1.19.3-multiloader 2025-07-05 20:49:33 +03:00
b2fed5be60 Merge branch '1.20-multiloader' into 1.19.4-multiloader
# Conflicts:
#	forge/src/main/java/net/lionarius/skinrestorer/forge/compat/skinshuffle/SkinShufflePacketHandler.java
2025-07-05 20:48:16 +03:00
c8aa805289 Merge branch '1.19.3-multiloader' into 1.19.1-multiloader 2025-06-21 11:13:45 +03:00
7958f26acf Merge branch '1.19.4-multiloader' into 1.19.3-multiloader 2025-06-21 11:13:41 +03:00
90e6bf554e Merge branch '1.20-multiloader' into 1.19.4-multiloader 2025-06-21 11:13:35 +03:00
ee0bca8cef Merge branch '1.19.3-multiloader' into 1.19.1-multiloader 2025-06-19 06:40:33 +03:00
6c96dcfd4a Merge branch '1.19.4-multiloader' into 1.19.3-multiloader 2025-06-19 06:40:25 +03:00
20ff29e8d9 Merge branch '1.20-multiloader' into 1.19.4-multiloader 2025-06-19 06:40:15 +03:00
16da52c460 Merge branch '1.19.3-multiloader' into 1.19.1-multiloader 2025-06-11 01:28:27 +03:00
474f601cc3 Merge branch '1.19.4-multiloader' into 1.19.3-multiloader 2025-06-11 01:28:22 +03:00
1aeedf9cb4 Merge branch '1.20-multiloader' into 1.19.4-multiloader 2025-06-11 01:28:17 +03:00
2d3f94c88a Merge branch '1.19.3-multiloader' into 1.19.1-multiloader 2025-06-01 19:38:13 +03:00
ff43c18634 Merge branch '1.19.4-multiloader' into 1.19.3-multiloader 2025-06-01 19:38:10 +03:00
02082e6a2a Merge branch '1.20-multiloader' into 1.19.4-multiloader 2025-06-01 19:38:02 +03:00
945ce667be Merge branch '1.19.3-multiloader' into 1.19.1-multiloader 2025-06-01 14:11:10 +03:00
bd983e10ec Merge branch '1.19.4-multiloader' into 1.19.3-multiloader 2025-06-01 14:09:42 +03:00
c695e66a94 Merge branch '1.20-multiloader' into 1.19.4-multiloader 2025-06-01 14:07:07 +03:00
4afd93e8bf Merge branch '1.19.3-multiloader' into 1.19.1-multiloader 2025-05-30 22:57:04 +03:00
c9bf691544 Merge branch '1.19.4-multiloader' into 1.19.3-multiloader 2025-05-30 22:56:56 +03:00
1a6327f91c Merge branch '1.20-multiloader' into 1.19.4-multiloader 2025-05-30 22:56:48 +03:00
e4b03a9989 Merge branch '1.19.3-multiloader' into 1.19.1-multiloader 2025-05-24 14:33:11 +03:00
034d4863b7 Merge branch '1.19.4-multiloader' into 1.19.3-multiloader 2025-05-24 14:21:37 +03:00
59ea3eb160 Merge branch '1.20-multiloader' into 1.19.4-multiloader 2025-05-24 14:17:51 +03:00
c36eb4db8c Merge branch '1.19.3-multiloader' into 1.19.1-multiloader 2025-05-03 11:32:23 +03:00
768125d11d Merge branch '1.19.4-multiloader' into 1.19.3-multiloader 2025-05-03 11:31:53 +03:00
276c670902 Merge branch '1.20-multiloader' into 1.19.4-multiloader 2025-05-03 11:31:23 +03:00
e16fbffa5c gradle properties for 1.19.2 2025-05-03 11:05:40 +03:00
b67ea1bb29 Merge branch '1.19.3-multiloader' into 1.19.1-multiloader
# Conflicts:
#	gradle.properties
2025-05-03 11:04:29 +03:00
eeb405dd96 gradle properties for 1.19.3 2025-05-03 11:03:18 +03:00
3509b2e63c Merge branch '1.19.4-multiloader' into 1.19.3-multiloader
# Conflicts:
#	gradle.properties
2025-05-03 11:02:17 +03:00
f4ade5f29d gradle properties for 1.19.4 2025-05-03 11:01:26 +03:00
1ed4c8fd17 Merge branch '1.20-multiloader' into 1.19.4-multiloader
# Conflicts:
#	gradle.properties
2025-05-03 10:59:41 +03:00
17e2d1a7c3 backport to 1.19.1 2025-05-03 10:04:18 +03:00
4fb3972416 backport to 1.19.3 2025-05-03 09:46:28 +03:00
cb0756902a backport to 1.19.4 2025-05-03 09:46:13 +03:00
24 changed files with 84 additions and 344 deletions

View File

@@ -169,7 +169,7 @@ public final class SkinCommand {
private static int configReloadSubcommand(CommandContext<CommandSourceStack> context) { private static int configReloadSubcommand(CommandContext<CommandSourceStack> context) {
SkinRestorer.reloadConfig(); SkinRestorer.reloadConfig();
context.getSource().sendSuccess(() -> Translation.translatableWithFallback( context.getSource().sendSuccess(Translation.translatableWithFallback(
Translation.COMMAND_SKIN_CONFIG_RELOADED_KEY Translation.COMMAND_SKIN_CONFIG_RELOADED_KEY
), true); ), true);
@@ -178,7 +178,7 @@ public final class SkinCommand {
private static void sendResponse(CommandSourceStack src, Collection<ServerPlayer> updatedPlayers, boolean setByOperator) { private static void sendResponse(CommandSourceStack src, Collection<ServerPlayer> updatedPlayers, boolean setByOperator) {
if (updatedPlayers.isEmpty()) { if (updatedPlayers.isEmpty()) {
src.sendSuccess(() -> Translation.translatableWithFallback( src.sendSuccess(Translation.translatableWithFallback(
Translation.COMMAND_SKIN_NO_CHANGES_KEY Translation.COMMAND_SKIN_NO_CHANGES_KEY
), true); ), true);
return; return;
@@ -187,12 +187,12 @@ public final class SkinCommand {
if (setByOperator) { if (setByOperator) {
var playersComponent = PlayerUtils.createPlayerListComponent(updatedPlayers); var playersComponent = PlayerUtils.createPlayerListComponent(updatedPlayers);
src.sendSuccess(() -> Translation.translatableWithFallback( src.sendSuccess(Translation.translatableWithFallback(
Translation.COMMAND_SKIN_AFFECTED_PLAYERS_KEY, Translation.COMMAND_SKIN_AFFECTED_PLAYERS_KEY,
playersComponent playersComponent
), true); ), true);
} else { } else {
src.sendSuccess(() -> Translation.translatableWithFallback( src.sendSuccess(Translation.translatableWithFallback(
Translation.COMMAND_SKIN_OK_KEY Translation.COMMAND_SKIN_OK_KEY
), true); ), true);
} }

View File

@@ -1,55 +0,0 @@
package net.lionarius.skinrestorer.compat.skinshuffle;
import net.lionarius.skinrestorer.SkinRestorer;
import net.lionarius.skinrestorer.platform.Services;
import net.lionarius.skinrestorer.skin.SkinValue;
import net.lionarius.skinrestorer.skin.provider.SkinShuffleSkinProvider;
import net.lionarius.skinrestorer.util.PlayerUtils;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;
import java.util.Collections;
public class SkinShuffleCompatibility {
public static final String MOD_ID = "skinshuffle";
private static final boolean SHOULD_APPLY = !Services.PLATFORM.isModLoaded(SkinShuffleCompatibility.MOD_ID);
private SkinShuffleCompatibility() {}
public static boolean shouldApply() {
return SkinShuffleCompatibility.SHOULD_APPLY;
}
public static ResourceLocation resourceLocation(String name) {
return new ResourceLocation(SkinShuffleCompatibility.MOD_ID, name);
}
public static void onPlayerJoin(ServerPlayer player) {
Services.COMPATIBILITY.skinShuffle_sendHandshake(player);
}
public static void handleSkinRefresh(MinecraftServer server, ServerPlayer player, SkinShuffleSkinRefreshPayload payload) {
var property = payload.textureProperty();
if (!property.getName().equals(PlayerUtils.TEXTURES_KEY))
return;
if (!property.hasSignature())
return;
server.execute(() -> {
SkinRestorer.applySkin(
server,
Collections.singleton(player.getGameProfile()),
new SkinValue(SkinShuffleSkinProvider.PROVIDER_NAME, null, null, property),
!server.usesAuthentication()
);
if (server.usesAuthentication() && SkinRestorer.getSkinStorage().hasSavedSkin(player.getUUID()))
SkinRestorer.getSkinStorage().deleteSkin(player.getUUID());
});
}
}

View File

@@ -1,10 +0,0 @@
package net.lionarius.skinrestorer.compat.skinshuffle;
import net.minecraft.resources.ResourceLocation;
public record SkinShuffleHandshakePayload() {
public static final SkinShuffleHandshakePayload INSTANCE = new SkinShuffleHandshakePayload();
public static final ResourceLocation PACKET_ID = SkinShuffleCompatibility.resourceLocation("handshake");
}

View File

@@ -1,7 +0,0 @@
package net.lionarius.skinrestorer.compat.skinshuffle;
import com.mojang.authlib.properties.Property;
public interface SkinShuffleSkinRefreshPayload {
Property textureProperty();
}

View File

@@ -1,23 +0,0 @@
package net.lionarius.skinrestorer.compat.skinshuffle;
import com.mojang.authlib.properties.Property;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
public record SkinShuffleSkinRefreshV1Payload(
Property textureProperty) implements SkinShuffleSkinRefreshPayload {
public static final ResourceLocation PACKET_ID = SkinShuffleCompatibility.resourceLocation("refresh");
public static void encode(FriendlyByteBuf buf, SkinShuffleSkinRefreshV1Payload value) {
var textureProperty = value.textureProperty();
buf.writeUtf(textureProperty.getName());
buf.writeUtf(textureProperty.getValue());
buf.writeNullable(textureProperty.getSignature(), FriendlyByteBuf::writeUtf);
}
public static SkinShuffleSkinRefreshV1Payload decode(FriendlyByteBuf buf) {
return new SkinShuffleSkinRefreshV1Payload(new Property(buf.readUtf(), buf.readUtf(), buf.readNullable(FriendlyByteBuf::readUtf)));
}
}

View File

@@ -1,31 +0,0 @@
package net.lionarius.skinrestorer.compat.skinshuffle;
import com.mojang.authlib.properties.Property;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
public record SkinShuffleSkinRefreshV2Payload(
Property textureProperty) implements SkinShuffleSkinRefreshPayload {
public static final ResourceLocation PACKET_ID = SkinShuffleCompatibility.resourceLocation("skin_refresh");
public static void encode(FriendlyByteBuf buf, SkinShuffleSkinRefreshV2Payload value) {
var textureProperty = value.textureProperty();
buf.writeBoolean(textureProperty.hasSignature());
buf.writeUtf(textureProperty.getName());
buf.writeUtf(textureProperty.getValue());
if (textureProperty.hasSignature()) {
assert textureProperty.getSignature() != null;
buf.writeUtf(textureProperty.getSignature());
}
}
public static SkinShuffleSkinRefreshV2Payload decode(FriendlyByteBuf buf) {
if (buf.readBoolean()) {
return new SkinShuffleSkinRefreshV2Payload(new Property(buf.readUtf(), buf.readUtf(), buf.readUtf()));
}
return new SkinShuffleSkinRefreshV2Payload(new Property(buf.readUtf(), buf.readUtf(), null));
}
}

View File

@@ -1,8 +1,4 @@
package net.lionarius.skinrestorer.platform.services; package net.lionarius.skinrestorer.platform.services;
import net.minecraft.server.level.ServerPlayer;
public interface CompatibilityHelper { public interface CompatibilityHelper {
void skinShuffle_sendHandshake(ServerPlayer player);
} }

View File

@@ -9,11 +9,25 @@ import org.jetbrains.annotations.Nullable;
import java.util.Objects; import java.util.Objects;
public record SkinValue(@NotNull String provider, @Nullable String argument, @Nullable SkinVariant variant, public final class SkinValue implements GsonPostProcessable {
@Nullable Property value, @Nullable Property originalValue) implements GsonPostProcessable {
public static final SkinValue EMPTY = new SkinValue(EmptySkinProvider.PROVIDER_NAME, null, null, null); public static final SkinValue EMPTY = new SkinValue(EmptySkinProvider.PROVIDER_NAME, null, null, null);
private @NotNull String provider;
private @Nullable String argument;
private @Nullable SkinVariant variant;
private @Nullable Property value;
private @Nullable Property originalValue;
public SkinValue(@NotNull String provider, @Nullable String argument, @Nullable SkinVariant variant,
@Nullable Property value, @Nullable Property originalValue) {
this.provider = provider;
this.argument = argument;
this.variant = variant;
this.value = value;
this.originalValue = originalValue;
}
public SkinValue(String provider, String argument, SkinVariant variant, Property value) { public SkinValue(String provider, String argument, SkinVariant variant, Property value) {
this(provider, argument, variant, value, null); this(provider, argument, variant, value, null);
} }
@@ -38,4 +52,23 @@ public record SkinValue(@NotNull String provider, @Nullable String argument, @Nu
public void gsonPostProcess() { public void gsonPostProcess() {
Objects.requireNonNull(this.provider); Objects.requireNonNull(this.provider);
} }
public @NotNull String provider() {
return provider;
}
public @Nullable String argument() {
return argument;
}
public @Nullable SkinVariant variant() {
return variant;}
public @Nullable Property value() {
return value;
}
public @Nullable Property originalValue() {
return originalValue;
}
} }

View File

@@ -39,11 +39,11 @@ public final class Translation {
} }
public static MutableComponent translatableWithFallback(String key) { public static MutableComponent translatableWithFallback(String key) {
return Component.translatableWithFallback(key, Translation.get(key)); return Component.translatable(Translation.get(key));
} }
public static MutableComponent translatableWithFallback(String key, Object... args) { public static MutableComponent translatableWithFallback(String key, Object... args) {
return Component.translatableWithFallback(key, Translation.get(key), args); return Component.translatable(Translation.get(key), args);
} }
public static void reloadTranslations() { public static void reloadTranslations() {

View File

@@ -1,9 +1,6 @@
package net.lionarius.skinrestorer.util; package net.lionarius.skinrestorer.util;
import com.google.gson.Gson; import com.google.gson.*;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property; import com.mojang.authlib.properties.Property;
import com.mojang.authlib.properties.PropertyMap; import com.mojang.authlib.properties.PropertyMap;
@@ -22,7 +19,7 @@ public final class JsonUtils {
.registerTypeAdapterFactory(new PostProcessingEnabler()) .registerTypeAdapterFactory(new PostProcessingEnabler())
.registerTypeAdapter(UUID.class, new UUIDTypeAdapter()) .registerTypeAdapter(UUID.class, new UUIDTypeAdapter())
.registerTypeAdapter(PropertyMap.class, new PropertyMap.Serializer()) .registerTypeAdapter(PropertyMap.class, new PropertyMap.Serializer())
.registerTypeAdapter(GameProfile.class, new GameProfile.Serializer()) .registerTypeAdapter(GameProfile.class, new GameProfileSerializer())
.setPrettyPrinting() .setPrettyPrinting()
.create(); .create();
@@ -60,4 +57,26 @@ public final class JsonUtils {
return null; return null;
} }
} }
private static class GameProfileSerializer implements JsonSerializer<GameProfile>, JsonDeserializer<GameProfile> {
@Override
public GameProfile deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) throws JsonParseException {
final JsonObject object = (JsonObject) json;
final UUID id = object.has("id") ? context.deserialize(object.get("id"), UUID.class) : null;
final String name = object.has("name") ? object.getAsJsonPrimitive("name").getAsString() : null;
return new GameProfile(id, name);
}
@Override
public JsonElement serialize(final GameProfile src, final Type typeOfSrc, final JsonSerializationContext context) {
final JsonObject result = new JsonObject();
if (src.getId() != null) {
result.add("id", context.serialize(src.getId()));
}
if (src.getName() != null) {
result.addProperty("name", src.getName());
}
return result;
}
}
} }

View File

@@ -40,16 +40,12 @@ public final class PlayerUtils {
} }
public static void refreshPlayer(ServerPlayer player) { public static void refreshPlayer(ServerPlayer player) {
ServerLevel serverLevel = player.serverLevel(); ServerLevel serverLevel = player.getLevel();
PlayerList playerList = serverLevel.getServer().getPlayerList(); PlayerList playerList = serverLevel.getServer().getPlayerList();
ChunkMap chunkMap = serverLevel.getChunkSource().chunkMap; ChunkMap chunkMap = serverLevel.getChunkSource().chunkMap;
playerList.broadcastAll(new ClientboundBundlePacket( playerList.broadcastAll(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.REMOVE_PLAYER, player));
List.of( playerList.broadcastAll(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, player));
new ClientboundPlayerInfoRemovePacket(List.of(player.getUUID())),
ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(Collections.singleton(player))
)
));
var trackedEntity = ((ChunkMapAccessor) chunkMap).getEntityMap().get(player.getId()); var trackedEntity = ((ChunkMapAccessor) chunkMap).getEntityMap().get(player.getId());
if (trackedEntity != null) { if (trackedEntity != null) {
@@ -70,16 +66,15 @@ public final class PlayerUtils {
if (!player.isDeadOrDying()) { if (!player.isDeadOrDying()) {
player.connection.send( player.connection.send(
new ClientboundRespawnPacket( new ClientboundRespawnPacket(
player.level().dimensionTypeId(), player.getLevel().dimensionTypeId(),
player.level().dimension(), player.getLevel().dimension(),
BiomeManager.obfuscateSeed(player.serverLevel().getSeed()), BiomeManager.obfuscateSeed(player.getLevel().getSeed()),
player.gameMode.getGameModeForPlayer(), player.gameMode.getGameModeForPlayer(),
player.gameMode.getPreviousGameModeForPlayer(), player.gameMode.getPreviousGameModeForPlayer(),
player.level().isDebug(), player.getLevel().isDebug(),
player.serverLevel().isFlat(), player.getLevel().isFlat(),
(byte) 3, true,
player.getLastDeathLocation(), player.getLastDeathLocation()
player.getPortalCooldown()
) )
); );
player.connection.teleport(player.getX(), player.getY(), player.getZ(), player.getYRot(), player.getXRot()); player.connection.teleport(player.getX(), player.getY(), player.getZ(), player.getYRot(), player.getXRot());

View File

@@ -14,8 +14,6 @@ dependencies {
} }
modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}" modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}"
modCompileOnly "net.fabricmc.fabric-api:fabric-api:${fabric_api_version}"
include implementation("org.mineskin:java-client:${mineskin_client_version}") include implementation("org.mineskin:java-client:${mineskin_client_version}")
} }

View File

@@ -1,6 +1,4 @@
# Fabric, see https://fabricmc.net/develop/ for new versions # Fabric, see https://fabricmc.net/develop/ for new versions
fabric_loader_version=0.15.0 fabric_loader_version=0.15.0
fabric_api_version=0.83.0+1.20
optional_dependencies=fabric-api
additional_modloaders=quilt additional_modloaders=quilt

View File

@@ -2,18 +2,11 @@ package net.lionarius.skinrestorer.fabric;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
import net.lionarius.skinrestorer.SkinRestorer; import net.lionarius.skinrestorer.SkinRestorer;
import net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleCompatibility;
import net.lionarius.skinrestorer.platform.Services;
public final class SkinRestorerFabric implements ModInitializer { public final class SkinRestorerFabric implements ModInitializer {
public static final boolean FABRIC_API_LOADED = Services.PLATFORM.isModLoaded("fabric-api");
@Override @Override
public void onInitialize() { public void onInitialize() {
SkinRestorer.onInitialize(); SkinRestorer.onInitialize();
if (SkinShuffleCompatibility.shouldApply())
net.lionarius.skinrestorer.fabric.compat.skinshuffle.SkinShuffleCompatibility.initialize();
} }
} }

View File

@@ -1,46 +0,0 @@
package net.lionarius.skinrestorer.fabric.compat.skinshuffle;
import net.fabricmc.fabric.api.networking.v1.PacketSender;
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.lionarius.skinrestorer.SkinRestorer;
import net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleSkinRefreshPayload;
import net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleSkinRefreshV1Payload;
import net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleSkinRefreshV2Payload;
import net.lionarius.skinrestorer.fabric.SkinRestorerFabric;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerGamePacketListenerImpl;
public final class SkinShuffleCompatibility {
private SkinShuffleCompatibility() {}
public static void initialize() {
if (!SkinRestorerFabric.FABRIC_API_LOADED) {
SkinRestorer.LOGGER.warn("fabric-api is not loaded, SkinShuffle compatibility will not be available");
return;
}
ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleCompatibility.onPlayerJoin(handler.getPlayer()));
ServerPlayNetworking.registerGlobalReceiver(SkinShuffleSkinRefreshV1Payload.PACKET_ID, SkinShuffleCompatibility::handleSkinRefreshV1Packet);
ServerPlayNetworking.registerGlobalReceiver(SkinShuffleSkinRefreshV2Payload.PACKET_ID, SkinShuffleCompatibility::handleSkinRefreshV2Packet);
}
private static void handleSkinRefreshV1Packet(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl listener, FriendlyByteBuf buf, PacketSender sender) {
var payload = SkinShuffleSkinRefreshV1Payload.decode(buf);
SkinShuffleCompatibility.handleSkinRefreshPacket(payload, server, player);
}
private static void handleSkinRefreshV2Packet(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl listener, FriendlyByteBuf buf, PacketSender sender) {
var payload = SkinShuffleSkinRefreshV2Payload.decode(buf);
SkinShuffleCompatibility.handleSkinRefreshPacket(payload, server, player);
}
private static void handleSkinRefreshPacket(SkinShuffleSkinRefreshPayload payload, MinecraftServer server, ServerPlayer player) {
net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleCompatibility.handleSkinRefresh(server, player, payload);
}
}

View File

@@ -1,14 +1,6 @@
package net.lionarius.skinrestorer.fabric.platform; package net.lionarius.skinrestorer.fabric.platform;
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleHandshakePayload;
import net.lionarius.skinrestorer.platform.services.CompatibilityHelper; import net.lionarius.skinrestorer.platform.services.CompatibilityHelper;
import net.minecraft.server.level.ServerPlayer;
public final class FabricCompatibilityHelper implements CompatibilityHelper { public final class FabricCompatibilityHelper implements CompatibilityHelper {
@Override
public void skinShuffle_sendHandshake(ServerPlayer player) {
ServerPlayNetworking.send(player, SkinShuffleHandshakePayload.PACKET_ID, PacketByteBufs.empty());
}
} }

View File

@@ -29,8 +29,5 @@
"fabricloader": ">=${fabric_loader_version}", "fabricloader": ">=${fabric_loader_version}",
"minecraft": ">=${minecraft_version}", "minecraft": ">=${minecraft_version}",
"java": ">=${java_version}" "java": ">=${java_version}"
},
"suggests": {
"fabric-api": "*"
} }
} }

View File

@@ -1,5 +1,5 @@
# Forge, see https://files.minecraftforge.net/net/minecraftforge/forge/ for new versions # Forge, see https://files.minecraftforge.net/net/minecraftforge/forge/ for new versions
forge_version=46.0.1 forge_version=42.0.0
forge_loader_version_range=[46,) forge_loader_version_range=[42,)
# Forge sometimes skips minor minecraft versions (like 1.20.5) # Forge sometimes skips minor minecraft versions (like 1.20.5)
forge_minecraft_version=1.20 forge_minecraft_version=1.19.1

View File

@@ -1,7 +1,6 @@
package net.lionarius.skinrestorer.forge; package net.lionarius.skinrestorer.forge;
import net.lionarius.skinrestorer.SkinRestorer; import net.lionarius.skinrestorer.SkinRestorer;
import net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleCompatibility;
import net.minecraftforge.event.RegisterCommandsEvent; import net.minecraftforge.event.RegisterCommandsEvent;
import net.minecraftforge.event.server.ServerStartedEvent; import net.minecraftforge.event.server.ServerStartedEvent;
import net.minecraftforge.event.server.ServerStoppedEvent; import net.minecraftforge.event.server.ServerStoppedEvent;
@@ -14,9 +13,6 @@ public final class SkinRestorerForge {
public SkinRestorerForge() { public SkinRestorerForge() {
SkinRestorer.onInitialize(); SkinRestorer.onInitialize();
if (SkinShuffleCompatibility.shouldApply())
net.lionarius.skinrestorer.forge.compat.skinshuffle.SkinShuffleCompatibility.initialize();
} }
@SubscribeEvent @SubscribeEvent

View File

@@ -1,14 +0,0 @@
package net.lionarius.skinrestorer.forge.compat.skinshuffle;
import net.minecraftforge.common.MinecraftForge;
public final class SkinShuffleCompatibility {
private SkinShuffleCompatibility() {}
public static void initialize() {
MinecraftForge.EVENT_BUS.register(SkinShuffleGameEventHandler.class);
SkinShufflePacketHandler.initialize();
}
}

View File

@@ -1,16 +0,0 @@
package net.lionarius.skinrestorer.forge.compat.skinshuffle;
import net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleCompatibility;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
public final class SkinShuffleGameEventHandler {
private SkinShuffleGameEventHandler() {}
@SubscribeEvent
public static void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) {
SkinShuffleCompatibility.onPlayerJoin((ServerPlayer) event.getEntity());
}
}

View File

@@ -1,68 +0,0 @@
package net.lionarius.skinrestorer.forge.compat.skinshuffle;
import io.netty.buffer.Unpooled;
import net.lionarius.skinrestorer.compat.skinshuffle.SkinShuffleCompatibility;
import net.lionarius.skinrestorer.compat.skinshuffle.*;
import net.minecraft.network.Connection;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.protocol.game.ClientboundCustomPayloadPacket;
import net.minecraftforge.network.NetworkEvent;
import net.minecraftforge.network.NetworkRegistry;
import net.minecraftforge.network.event.EventNetworkChannel;
public class SkinShufflePacketHandler {
private static final EventNetworkChannel HANDSHAKE_INSTANCE = NetworkRegistry.ChannelBuilder
.named(SkinShuffleHandshakePayload.PACKET_ID)
.clientAcceptedVersions(NetworkRegistry.acceptMissingOr(""))
.serverAcceptedVersions(NetworkRegistry.acceptMissingOr(""))
.networkProtocolVersion(() -> "")
.eventNetworkChannel();
private static final EventNetworkChannel SKIN_REFRESH_V1_INSTANCE = NetworkRegistry.ChannelBuilder
.named(SkinShuffleSkinRefreshV1Payload.PACKET_ID)
.clientAcceptedVersions(NetworkRegistry.acceptMissingOr(""))
.serverAcceptedVersions(NetworkRegistry.acceptMissingOr(""))
.networkProtocolVersion(() -> "")
.eventNetworkChannel();
private static final EventNetworkChannel SKIN_REFRESH_V2_INSTANCE = NetworkRegistry.ChannelBuilder
.named(SkinShuffleSkinRefreshV2Payload.PACKET_ID)
.clientAcceptedVersions(NetworkRegistry.acceptMissingOr(""))
.serverAcceptedVersions(NetworkRegistry.acceptMissingOr(""))
.networkProtocolVersion(() -> "")
.eventNetworkChannel();
protected static void initialize() {
SKIN_REFRESH_V1_INSTANCE.addListener(SkinShufflePacketHandler::skinRefreshV1Listener);
SKIN_REFRESH_V2_INSTANCE.addListener(SkinShufflePacketHandler::skinRefreshV2Listener);
}
private SkinShufflePacketHandler() {
}
public static void sendHandshake(Connection connection) {
connection.send(new ClientboundCustomPayloadPacket(SkinShuffleHandshakePayload.PACKET_ID, new FriendlyByteBuf(Unpooled.buffer(0, 0))));
}
private static void skinRefreshV1Listener(NetworkEvent.ClientCustomPayloadEvent event) {
var payload = SkinShuffleSkinRefreshV1Payload.decode(event.getPayload());
handleSkinRefreshPacket(payload, event.getSource().get());
event.getSource().get().setPacketHandled(true);
}
private static void skinRefreshV2Listener(NetworkEvent.ClientCustomPayloadEvent event) {
var payload = SkinShuffleSkinRefreshV2Payload.decode(event.getPayload());
handleSkinRefreshPacket(payload, event.getSource().get());
event.getSource().get().setPacketHandled(true);
}
private static void handleSkinRefreshPacket(SkinShuffleSkinRefreshPayload payload, NetworkEvent.Context context) {
var sender = context.getSender();
if (!context.getDirection().getReceptionSide().isServer() || sender == null)
return;
SkinShuffleCompatibility.handleSkinRefresh(sender.getServer(), sender, payload);
}
}

View File

@@ -1,13 +1,6 @@
package net.lionarius.skinrestorer.forge.platform; package net.lionarius.skinrestorer.forge.platform;
import net.lionarius.skinrestorer.forge.compat.skinshuffle.SkinShufflePacketHandler;
import net.lionarius.skinrestorer.platform.services.CompatibilityHelper; import net.lionarius.skinrestorer.platform.services.CompatibilityHelper;
import net.minecraft.server.level.ServerPlayer;
public final class ForgeCompatibilityHelper implements CompatibilityHelper { public final class ForgeCompatibilityHelper implements CompatibilityHelper {
@Override
public void skinShuffle_sendHandshake(ServerPlayer player) {
SkinShufflePacketHandler.sendHandshake(player.connection.connection);
}
} }

View File

@@ -3,9 +3,9 @@ group=net.lionarius
java_version=17 java_version=17
# Common # Common
minecraft_version=1.20 minecraft_version=1.19.1
minecraft_version_list=1.20,1.20.1 minecraft_version_list=1.19.1,1.19.2
minecraft_version_range=[1.20, 1.20.1] minecraft_version_range=[1.19.1,1.19.2]
mod_id=skinrestorer mod_id=skinrestorer
mod_name=SkinRestorer mod_name=SkinRestorer
mod_version=2.4.3 mod_version=2.4.3
@@ -21,8 +21,8 @@ description=A server-side mod for managing skins.
mineskin_client_version=3.0.6-SNAPSHOT mineskin_client_version=3.0.6-SNAPSHOT
# ParchmentMC mappings, see https://parchmentmc.org/docs/getting-started#choose-a-version for new versions # ParchmentMC mappings, see https://parchmentmc.org/docs/getting-started#choose-a-version for new versions
parchment_minecraft=1.20.1 parchment_minecraft=1.19.2
parchment_version=2023.09.03 parchment_version=2022.11.27
# Publishing # Publishing
curseforge_id=443823 curseforge_id=443823