From 875a04a8504425500395dcc9e7e2040cc55697a4 Mon Sep 17 00:00:00 2001 From: ineanto Date: Wed, 2 Apr 2025 18:23:19 +0200 Subject: [PATCH] feat: update paper plugin sender, fix protocollib classpath access --- build.gradle.kts | 10 +- img/LOGO.png | Bin 8524 -> 0 bytes .../nicko/appearance/AppearanceManager.java | 18 ++- .../ineanto/nicko/gui/prompt/SignPrompt.java | 16 +- .../xyz/ineanto/nicko/language/Language.java | 2 +- .../ineanto/nicko/language/LanguageKey.java | 3 +- .../nicko/loader/NickoPluginLoader.java | 3 +- .../xyz/ineanto/nicko/mojang/MojangSkin.java | 8 + .../ineanto/nicko/packet/PacketSender.java | 4 +- ...cketSender.java => PaperPacketSender.java} | 72 +++++---- .../nicko/packet/WrapperPacketSender.java | 139 ------------------ src/main/resources/en.yml | 5 +- src/main/resources/fr.yml | 5 +- src/main/resources/paper-plugin.yml | 9 +- 14 files changed, 84 insertions(+), 210 deletions(-) delete mode 100644 img/LOGO.png rename src/main/java/xyz/ineanto/nicko/packet/{InternalPacketSender.java => PaperPacketSender.java} (72%) delete mode 100644 src/main/java/xyz/ineanto/nicko/packet/WrapperPacketSender.java diff --git a/build.gradle.kts b/build.gradle.kts index ca19101..868f042 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,7 @@ plugins { id("java") id("com.gradleup.shadow") version "8.3.2" - id("xyz.jpenilla.run-paper") version "2.3.0" + id("xyz.jpenilla.run-paper") version "2.3.1" id("io.papermc.paperweight.userdev") version "2.0.0-beta.10" } @@ -31,11 +31,11 @@ repositories { dependencies { paperweight.paperDevBundle("1.21.4-R0.1-SNAPSHOT") - compileOnly("com.comphenix.protocol:ProtocolLib:5.4.0-SNAPSHOT") compileOnly("me.clip:placeholderapi:2.11.5") compileOnly("net.kyori:adventure-api:4.17.0") compileOnly("xyz.xenondevs.invui:invui-core:$invuiVersion") compileOnly("net.wesjd:anvilgui:1.10.4-SNAPSHOT") + compileOnly("com.comphenix.protocol:ProtocolLib:5.4.0-SNAPSHOT") implementation("de.rapha149.signgui:signgui:2.5.0") implementation("com.github.jsixface:yamlconfig:1.2") @@ -62,7 +62,7 @@ tasks { relocate("net.wesjd", "xyz.ineanto.nicko.libs.anvilgui") relocate("com.github.jsixface", "xyz.ineanto.nicko.libs.yaml") relocate("me.clip", "xyz.ineanto.nicko.libs.placeholderapi") - relocate("com.fasterxml.jackson", "xyz.ineanto.nicko.libs.jacksonpr") + relocate("com.fasterxml.jackson", "xyz.ineanto.nicko.libs.jackson") relocate("com.mysql", "xyz.ineanto.nicko.libs.mysql") relocate("org.mariadb.jdbc", "xyz.ineanto.nicko.libs.mariadb") relocate("redis.clients", "xyz.ineanto.nicko.libs.redis") @@ -95,10 +95,10 @@ tasks { runServer { downloadPlugins { - url("https://download.luckperms.net/1568/bukkit/loader/LuckPerms-Bukkit-5.4.151.jar") + url("https://download.luckperms.net/1575/bukkit/loader/LuckPerms-Bukkit-5.4.158.jar") // 1.20.5 - latest testing - url("https://ci.dmulloy2.net/job/ProtocolLib/lastSuccessfulBuild/artifact/build/libs/ProtocolLib.jar") + //url("https://ci.dmulloy2.net/job/ProtocolLib/lastSuccessfulBuild/artifact/build/libs/ProtocolLib.jar") } minecraftVersion("1.21.4") diff --git a/img/LOGO.png b/img/LOGO.png deleted file mode 100644 index 747222945b1fa5dde3bebadb04535a33b0d1db01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8524 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 lines = List.of( - "VVVVVVVVVVVVVVV", - null, - null, - "ΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛ" + private final ArrayList lines = new ArrayList<>( + List.of( + "VVVVVVVVVVVVVVV", + "", + "", + "ΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛ" + ) ); private final AtomicReference> name = new AtomicReference<>(); @@ -73,6 +75,7 @@ public class SignPrompt implements Prompt { try { final SignGUI gui = SignGUI.builder() .setLines(lines.toArray(new String[0])) + .setLine(2, null) .setType(Material.OAK_SIGN) .setHandler((_, result) -> { final String internalLine2 = result.getLineWithoutColor(2); @@ -89,6 +92,7 @@ public class SignPrompt implements Prompt { gui.open(player); return reference.get(); } catch (SignGUIVersionException exception) { + exception.printStackTrace(); return Optional.empty(); } } diff --git a/src/main/java/xyz/ineanto/nicko/language/Language.java b/src/main/java/xyz/ineanto/nicko/language/Language.java index 049039c..d916301 100644 --- a/src/main/java/xyz/ineanto/nicko/language/Language.java +++ b/src/main/java/xyz/ineanto/nicko/language/Language.java @@ -9,7 +9,7 @@ public enum Language implements Serializable { FRENCH("fr", "Français"), CUSTOM("cm", "Server Custom"); - public static final Version VERSION = new Version(1, 2, 0); + public static final Version VERSION = new Version(1, 3, 0); private final String code; private transient final String name; diff --git a/src/main/java/xyz/ineanto/nicko/language/LanguageKey.java b/src/main/java/xyz/ineanto/nicko/language/LanguageKey.java index 0dea8af..7e8fb29 100644 --- a/src/main/java/xyz/ineanto/nicko/language/LanguageKey.java +++ b/src/main/java/xyz/ineanto/nicko/language/LanguageKey.java @@ -10,8 +10,7 @@ public class LanguageKey { public static final String PERMISSION = ERROR_KEY + "permission"; public static final String CACHE = ERROR_KEY + "cache"; - public static final String MOJANG_NAME = ERROR_KEY + "mojang_name"; - public static final String MOJANG_SKIN = ERROR_KEY + "mojang_skin"; + public static final String MOJANG = ERROR_KEY + "mojang"; } public static class Event { diff --git a/src/main/java/xyz/ineanto/nicko/loader/NickoPluginLoader.java b/src/main/java/xyz/ineanto/nicko/loader/NickoPluginLoader.java index eaac594..096e9c7 100644 --- a/src/main/java/xyz/ineanto/nicko/loader/NickoPluginLoader.java +++ b/src/main/java/xyz/ineanto/nicko/loader/NickoPluginLoader.java @@ -3,8 +3,8 @@ package xyz.ineanto.nicko.loader; import io.papermc.paper.plugin.loader.PluginClasspathBuilder; import io.papermc.paper.plugin.loader.PluginLoader; import io.papermc.paper.plugin.loader.library.impl.MavenLibraryResolver; -import org.eclipse.aether.graph.Dependency; import org.eclipse.aether.artifact.DefaultArtifact; +import org.eclipse.aether.graph.Dependency; import org.eclipse.aether.repository.RemoteRepository; public class NickoPluginLoader implements PluginLoader { @@ -15,7 +15,6 @@ public class NickoPluginLoader implements PluginLoader { resolver.addRepository(new RemoteRepository.Builder("xenondevs", "default", "https://repo.xenondevs.xyz/releases/").build()); resolver.addRepository(new RemoteRepository.Builder("codemc", "default", "https://repo.codemc.io/repository/maven-snapshots/").build()); resolver.addDependency(new Dependency(new DefaultArtifact("xyz.xenondevs.invui:invui:pom:1.44"), null)); - //resolver.addDependency(new Dependency(new DefaultArtifact("net.wesjd:anvilgui:1.10.4-SNAPSHOT"), null)); pluginClasspathBuilder.addLibrary(resolver); } diff --git a/src/main/java/xyz/ineanto/nicko/mojang/MojangSkin.java b/src/main/java/xyz/ineanto/nicko/mojang/MojangSkin.java index 3e50105..0b22223 100644 --- a/src/main/java/xyz/ineanto/nicko/mojang/MojangSkin.java +++ b/src/main/java/xyz/ineanto/nicko/mojang/MojangSkin.java @@ -1,7 +1,11 @@ package xyz.ineanto.nicko.mojang; +import com.destroystokyo.paper.profile.ProfileProperty; import com.google.gson.JsonObject; +import java.util.Collection; +import java.util.Collections; + public record MojangSkin(String value, String signature) { public static MojangSkin buildFromJson(JsonObject object) { final JsonObject properties = object.get("properties").getAsJsonArray().get(0).getAsJsonObject(); @@ -9,4 +13,8 @@ public record MojangSkin(String value, String signature) { final String signature = properties.get("signature").getAsString(); return new MojangSkin(value, signature); } + + public Collection asProfileProperties() { + return Collections.singleton(new ProfileProperty("textures", value, signature)); + } } diff --git a/src/main/java/xyz/ineanto/nicko/packet/PacketSender.java b/src/main/java/xyz/ineanto/nicko/packet/PacketSender.java index ef93153..28bb695 100644 --- a/src/main/java/xyz/ineanto/nicko/packet/PacketSender.java +++ b/src/main/java/xyz/ineanto/nicko/packet/PacketSender.java @@ -5,7 +5,9 @@ import xyz.ineanto.nicko.appearance.ActionResult; public interface PacketSender { void sendEntityRespawn(); - ActionResult sendGameProfileUpdate(String name, boolean skinChange, boolean reset); + ActionResult updatePlayerProfile(String name); + + ActionResult updatePlayerProfileProperties(); void sendEntityMetadataUpdate(); diff --git a/src/main/java/xyz/ineanto/nicko/packet/InternalPacketSender.java b/src/main/java/xyz/ineanto/nicko/packet/PaperPacketSender.java similarity index 72% rename from src/main/java/xyz/ineanto/nicko/packet/InternalPacketSender.java rename to src/main/java/xyz/ineanto/nicko/packet/PaperPacketSender.java index d1796cb..ded8f5e 100644 --- a/src/main/java/xyz/ineanto/nicko/packet/InternalPacketSender.java +++ b/src/main/java/xyz/ineanto/nicko/packet/PaperPacketSender.java @@ -1,8 +1,7 @@ package xyz.ineanto.nicko.packet; -import com.mojang.authlib.GameProfile; -import com.mojang.authlib.properties.Property; -import com.mojang.authlib.properties.PropertyMap; +import com.destroystokyo.paper.profile.CraftPlayerProfile; +import com.destroystokyo.paper.profile.PlayerProfile; import it.unimi.dsi.fastutil.ints.IntList; import net.minecraft.Optionull; import net.minecraft.network.chat.MutableComponent; @@ -39,11 +38,11 @@ import java.util.concurrent.ExecutionException; * I want you to really stare at this code. * You made me do this. */ -public class InternalPacketSender implements PacketSender { +public class PaperPacketSender implements PacketSender { private final Player player; private final NickoProfile profile; - public InternalPacketSender(Player player, NickoProfile profile) { + public PaperPacketSender(Player player, NickoProfile profile) { this.player = player; this.profile = profile; } @@ -74,41 +73,40 @@ public class InternalPacketSender implements PacketSender { } @Override - public ActionResult sendGameProfileUpdate(String name, boolean skinChange, boolean reset) { - final GameProfile gameProfile = new GameProfile(player.getUniqueId(), name); - - // TODO (Ineanto, 31/10/2024): Could this be refactored to get rid of the boolean? - if (skinChange) { - Optional skin; - try { - final MojangAPI mojangAPI = Nicko.getInstance().getMojangAPI(); - final Optional uuid = mojangAPI.getUUID(profile.getSkin()); - if (uuid.isPresent()) { - skin = reset ? mojangAPI.getSkinWithoutCaching(uuid.get()) : mojangAPI.getSkin(uuid.get()); - if (skin.isPresent()) { - final MojangSkin skinResult = skin.get(); - final PropertyMap properties = gameProfile.getProperties(); - properties.get("textures").clear(); - properties.put("textures", new Property("textures", skinResult.value(), skinResult.signature())); - ((CraftPlayer) player).getHandle().gameProfile = gameProfile; - } else { - return ActionResult.error(LanguageKey.Error.MOJANG_SKIN); - } - } else { - return ActionResult.error(LanguageKey.Error.MOJANG_NAME); - } - return ActionResult.ok(); - } catch (ExecutionException e) { - return ActionResult.error(LanguageKey.Error.CACHE); - } catch (IOException e) { - return ActionResult.error(LanguageKey.Error.MOJANG_NAME); - } catch (InterruptedException e) { - return ActionResult.error("Unknown error"); - } - } + public ActionResult updatePlayerProfile(String name) { + final PlayerProfile playerProfile = new CraftPlayerProfile(player.getUniqueId(), name); + // Copy previous properties to preserve skin + playerProfile.setProperties(playerProfile.getProperties()); + player.setPlayerProfile(playerProfile); return ActionResult.ok(); } + @Override + public ActionResult updatePlayerProfileProperties() { + final PlayerProfile playerProfile = new CraftPlayerProfile(player.getUniqueId(), profile.getName() == null ? player.getName() : profile.getName()); + + try { + final MojangAPI mojangAPI = Nicko.getInstance().getMojangAPI(); + + final Optional uuid = mojangAPI.getUUID(profile.getSkin()); + if (uuid.isEmpty()) { + return ActionResult.error(LanguageKey.Error.MOJANG); + } + + final Optional skin = mojangAPI.getSkin(uuid.get()); + if (skin.isEmpty()) { + return ActionResult.error(LanguageKey.Error.MOJANG); + } + + final MojangSkin skinResult = skin.get(); + playerProfile.setProperties(skinResult.asProfileProperties()); + player.setPlayerProfile(playerProfile); + return ActionResult.ok(); + } catch (ExecutionException | IOException e) { + return ActionResult.error(LanguageKey.Error.CACHE); + } + } + @Override public void sendEntityMetadataUpdate() { final SynchedEntityData.DataValue dataValueComponent = diff --git a/src/main/java/xyz/ineanto/nicko/packet/WrapperPacketSender.java b/src/main/java/xyz/ineanto/nicko/packet/WrapperPacketSender.java deleted file mode 100644 index fc2b140..0000000 --- a/src/main/java/xyz/ineanto/nicko/packet/WrapperPacketSender.java +++ /dev/null @@ -1,139 +0,0 @@ -package xyz.ineanto.nicko.packet; - -import com.comphenix.protocol.wrappers.*; -import com.google.common.collect.Multimap; -import it.unimi.dsi.fastutil.ints.IntList; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.entity.Player; -import xyz.ineanto.nicko.Nicko; -import xyz.ineanto.nicko.appearance.ActionResult; -import xyz.ineanto.nicko.language.LanguageKey; -import xyz.ineanto.nicko.mojang.MojangAPI; -import xyz.ineanto.nicko.mojang.MojangSkin; -import xyz.ineanto.nicko.packet.wrapper.*; -import xyz.ineanto.nicko.profile.NickoProfile; - -import java.io.IOException; -import java.util.EnumSet; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.ExecutionException; - -public class WrapperPacketSender implements PacketSender { - private final Player player; - private final NickoProfile profile; - - private WrappedGameProfile gameProfile; - - public WrapperPacketSender(Player player, NickoProfile profile) { - this.player = player; - this.profile = profile; - } - - @Override - public void sendEntityRespawn() { - if (!profile.hasData()) return; - - final WrapperPlayServerEntityDestroy destroy = new WrapperPlayServerEntityDestroy(); - final WrapperPlayServerSpawnEntity spawn = new WrapperPlayServerSpawnEntity(); - destroy.setEntityIds(IntList.of(player.getEntityId())); - spawn.setEntityId(player.getEntityId()); - spawn.setLocation(player.getLocation()); - spawn.setPlayerId(player.getUniqueId()); - Bukkit.getOnlinePlayers().stream().filter(receiver -> receiver.getUniqueId() != player.getUniqueId()).forEach(receiver -> { - destroy.sendPacket(receiver); - spawn.sendPacket(receiver); - }); - } - - @Override - public ActionResult sendGameProfileUpdate(String name, boolean skinChange, boolean reset) { - this.gameProfile = WrappedGameProfile.fromPlayer(player).withName(name); - - // TODO (Ineanto, 31/10/2024): Could get refactored to omit this boolean? - if (skinChange) { - Optional skin; - try { - final MojangAPI mojangAPI = Nicko.getInstance().getMojangAPI(); - final Optional uuid = mojangAPI.getUUID(profile.getSkin()); - if (uuid.isPresent()) { - skin = reset ? mojangAPI.getSkinWithoutCaching(uuid.get()) : mojangAPI.getSkin(uuid.get()); - if (skin.isPresent()) { - final MojangSkin skinResult = skin.get(); - final Multimap properties = gameProfile.getProperties(); - properties.get("textures").clear(); - properties.put("textures", new WrappedSignedProperty("textures", skinResult.value(), skinResult.signature())); - } else { - return ActionResult.error(LanguageKey.Error.MOJANG_SKIN); - } - } else { - return ActionResult.error(LanguageKey.Error.MOJANG_NAME); - } - return ActionResult.ok(); - } catch (ExecutionException e) { - return ActionResult.error(LanguageKey.Error.CACHE); - } catch (IOException e) { - return ActionResult.error(LanguageKey.Error.MOJANG_NAME); - } catch (InterruptedException e) { - return ActionResult.error("Unknown error"); - } - } - return ActionResult.ok(); - } - - - @Override - public void sendEntityMetadataUpdate() { - final WrappedDataWatcher entityWatcher = WrappedDataWatcher.getEntityWatcher(player); - entityWatcher.setObject(17, (byte) 0x7f, true); - } - - @Override - public void sendPlayerRespawn() { - final World world = player.getWorld(); - - final WrapperPlayServerRespawn respawn = new WrapperPlayServerRespawn(); - respawn.setDimension(world); - respawn.setSeed(world.getSeed()); - respawn.setGameMode(player.getGameMode()); - respawn.setPreviousGameMode(player.getGameMode()); - respawn.setCopyMetadata(true); - respawn.sendPacket(player); - } - - @Override - public void sendTabListUpdate(String displayName) { - if (gameProfile == null) { - Nicko.getInstance().getLogger().warning("Hello. I sincerely hope you're doing great out there."); - Nicko.getInstance().getLogger().warning("If you see this message, I've failed at my task and I'm a terrible programmer."); - Nicko.getInstance().getLogger().warning("Report this issue on https://git.ineanto.xyz/ineanto/nicko, thank you!"); - return; - } - - final WrapperPlayerServerPlayerInfo add = new WrapperPlayerServerPlayerInfo(); - final WrapperPlayerServerPlayerInfoRemove remove = new WrapperPlayerServerPlayerInfoRemove(); - final EnumSet actions = EnumSet.of( - EnumWrappers.PlayerInfoAction.ADD_PLAYER, - EnumWrappers.PlayerInfoAction.INITIALIZE_CHAT, - EnumWrappers.PlayerInfoAction.UPDATE_LISTED, - EnumWrappers.PlayerInfoAction.UPDATE_DISPLAY_NAME, - EnumWrappers.PlayerInfoAction.UPDATE_GAME_MODE, - EnumWrappers.PlayerInfoAction.UPDATE_LATENCY); - remove.setUUIDs(List.of(player.getUniqueId())); - remove.broadcastPacket(); - add.setActions(actions); - - add.setData(List.of(new PlayerInfoData( - player.getUniqueId(), - player.getPing(), - true, - EnumWrappers.NativeGameMode.fromBukkit(player.getGameMode()), - gameProfile, - WrappedChatComponent.fromText(displayName), - WrappedRemoteChatSessionData.fromPlayer(player) - ))); - - add.broadcastPacket(); - } -} diff --git a/src/main/resources/en.yml b/src/main/resources/en.yml index 887ebce..888ff59 100644 --- a/src/main/resources/en.yml +++ b/src/main/resources/en.yml @@ -1,7 +1,7 @@ # Nicko ${version} - Language File: # Specifies the configuration version, don't change. -version: "1.2.0" +version: "1.3.0" prefix: "NICKO" whoosh: "WHOOSH!" @@ -10,8 +10,7 @@ oops: "OOPS!" error: permission: "You're missing the permission to do that." invalid_username: "This is an invalid Minecraft username." - mojang_name: "There's is not Minecraft account with this username." - mojang_skin: "This Minecraft account has no skin." + mojang: "Something went wrong while fetching data from Mojang." cache: "Unable to get data from the cache." event: diff --git a/src/main/resources/fr.yml b/src/main/resources/fr.yml index eb92b7b..68df92e 100644 --- a/src/main/resources/fr.yml +++ b/src/main/resources/fr.yml @@ -1,7 +1,7 @@ # Nicko ${version} - Fichier de langue: # Précise la version de la configuration, ne pas changer. -version: "1.2.0" +version: "1.3.0" prefix: "NICKO" whoosh: "WHOOSH!" @@ -10,8 +10,7 @@ oops: "OOPS!" error: permission: "Vous n'avez pas la permission de faire cela." invalid_username: "Nom d'utilisateur Minecraft invalide." - mojang_name: "Aucun compte Minecraft associé à ce nom d'utilisateur." - mojang_skin: "Ce compte Minecraft n'a pas de skin." + mojang: "Une erreur est surevenue en récupérant les information depuis Mojang." cache: "Impossible de récupérer les données depuis le cache." event: diff --git a/src/main/resources/paper-plugin.yml b/src/main/resources/paper-plugin.yml index 048a12e..f515c80 100644 --- a/src/main/resources/paper-plugin.yml +++ b/src/main/resources/paper-plugin.yml @@ -9,10 +9,11 @@ softdepend: [ PlaceholderAPI ] depend: - ProtocolLib -# Suppose we require ProtocolLib to be loaded for our plugin -AnvilGUI: - join-classpath: true - required: true +dependencies: + server: + ProtocolLib: + load: BEFORE + join-classpath: true permissions: nicko.*: