From 15e3ba306c516256975898b674e90a94dbdc2c55 Mon Sep 17 00:00:00 2001 From: Frank van der Heijden Date: Tue, 5 Oct 2021 12:46:45 +0200 Subject: [PATCH] Fix the common module being relocated due to adventure Making a single distributable jar with adventure is fun --- Bukkit/build.gradle | 4 -- Bungee/build.gradle | 4 -- Velocity/build.gradle | 2 - .../velocity/entities/VelocityAudience.java | 38 +++++++++++++++++++ build.gradle | 11 +++++- 5 files changed, 47 insertions(+), 12 deletions(-) diff --git a/Bukkit/build.gradle b/Bukkit/build.gradle index bb38e53..9af4031 100644 --- a/Bukkit/build.gradle +++ b/Bukkit/build.gradle @@ -25,8 +25,4 @@ processResources { shadowJar { relocate 'org.bstats', dependencyDir + '.bstats' - relocate 'net.kyori.adventure', rootDependencyDir + '.adventure' - relocate 'net.kyori.examination', rootDependencyDir + '.examination' - relocate 'net.frankheijden.serverutils.common', dependencyDir + '.su.common' - relocate 'net.kyori.adventure.text.minimessage', dependencyDir + '.adventure.text.minimessage' } diff --git a/Bungee/build.gradle b/Bungee/build.gradle index 055d2cf..d39ff8b 100644 --- a/Bungee/build.gradle +++ b/Bungee/build.gradle @@ -29,8 +29,4 @@ processResources { shadowJar { relocate 'org.bstats', dependencyDir + '.bstats' - relocate 'net.kyori.adventure', rootDependencyDir + '.adventure' - relocate 'net.kyori.examination', rootDependencyDir + '.examination' - relocate 'net.kyori.adventure.text.minimessage', dependencyDir + '.adventure.text.minimessage' - relocate 'net.frankheijden.serverutils.common', dependencyDir + '.su.common' } diff --git a/Velocity/build.gradle b/Velocity/build.gradle index 57c1d6a..e270bbe 100644 --- a/Velocity/build.gradle +++ b/Velocity/build.gradle @@ -27,8 +27,6 @@ dependencies { shadowJar { relocate 'org.bstats', dependencyDir + '.bstats' - relocate 'net.frankheijden.serverutils.common', dependencyDir + '.su.common' - relocate 'net.kyori.adventure.text.minimessage', dependencyDir + '.adventure.text.minimessage' } blossom { diff --git a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/entities/VelocityAudience.java b/Velocity/src/main/java/net/frankheijden/serverutils/velocity/entities/VelocityAudience.java index cacb75d..3ab9e4a 100644 --- a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/entities/VelocityAudience.java +++ b/Velocity/src/main/java/net/frankheijden/serverutils/velocity/entities/VelocityAudience.java @@ -2,11 +2,38 @@ package net.frankheijden.serverutils.velocity.entities; import com.velocitypowered.api.command.CommandSource; import com.velocitypowered.api.proxy.Player; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; import net.frankheijden.serverutils.common.entities.ServerUtilsAudience; import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; public class VelocityAudience extends ServerUtilsAudience { + private static final GsonComponentSerializer serializer = GsonComponentSerializer.gson(); + private static Object deserializer; + private static MethodHandle deserializeMethodHandle; + private static MethodHandle sendMessageMethodHandle; + + static { + try { + MethodHandles.Lookup lookup = MethodHandles.lookup(); + + @SuppressWarnings("LineLength") + Class deserializerClass = Class.forName("net.frankheijden.serverutils.dependencies.impl.adventure.text.serializer.gson.GsonComponentSerializer"); + deserializer = deserializerClass.getDeclaredMethod("gson").invoke(null); + deserializeMethodHandle = lookup.unreflect(deserializerClass.getMethod("deserialize", Object.class)); + + Class componentClass = Class.forName( + new String(new char[]{'n', 'e', 't'}) + ".kyori.adventure.text.Component" // relocate is smart + ); + sendMessageMethodHandle = lookup.unreflect(CommandSource.class.getMethod("sendMessage", componentClass)); + } catch (Throwable th) { + th.printStackTrace(); + } + } + protected VelocityAudience(Audience audience, CommandSource source) { super(audience, source); } @@ -20,4 +47,15 @@ public class VelocityAudience extends ServerUtilsAudience { public boolean hasPermission(String permission) { return source.hasPermission(permission); } + + @Override + public void sendMessage(Component component) { + // Shading in adventure is fun when making a single distributable jar... + String serializedString = serializer.serialize(component); + try { + sendMessageMethodHandle.invoke(source, deserializeMethodHandle.invoke(deserializer, serializedString)); + } catch (Throwable th) { + th.printStackTrace(); + } + } } diff --git a/build.gradle b/build.gradle index 9fb6834..8768a33 100644 --- a/build.gradle +++ b/build.gradle @@ -76,6 +76,10 @@ subprojects { relocate 'cloud.commandframework', dependencyDir + '.cloud' relocate 'me.lucko.commodore', dependencyDir + '.commodore' relocate 'io.leangen.geantyref', dependencyDir + '.typetoken' + relocate 'net.kyori.adventure', dependencyDir + '.adventure' + relocate 'net.kyori.examination', dependencyDir + '.examination' + relocate 'net.kyori.adventure.text.minimessage', dependencyDir + '.adventure.text.minimessage' + relocate 'dev.frankheijden.minecraftreflection', dependencyDir + '.minecraftreflection' } shadowJar.dependsOn checkstyleMain, checkstyleTest, test @@ -90,11 +94,14 @@ dependencies { implementation project(path: ':Bukkit', configuration: 'shadow') implementation project(path: ':Bungee', configuration: 'shadow') implementation project(path: ':Velocity', configuration: 'shadow') + implementation("net.kyori:adventure-text-serializer-gson:${rootProject.adventureVersion}") { + exclude group: 'net.kyori', module: 'adventure-api' + exclude group: 'com.google.code.gson', module: 'gson' + } } shadowJar { - relocate 'org.apache.commons.codec', dependencyDir + '.codec' - relocate 'dev.frankheijden.minecraftreflection', dependencyDir + '.minecraftreflection' + relocate 'net.kyori.adventure.text.serializer.gson', dependencyDir + '.impl.adventure.text.serializer.gson' archiveFileName = "${archiveBaseName.orNull}-${archiveVersion.orNull}.${archiveExtension.orNull}" }