From 9e7d96795e1dd08b45937f8c819989cb0bc925a5 Mon Sep 17 00:00:00 2001 From: Lilly <46890129+RainbowDashLabs@users.noreply.github.com> Date: Tue, 8 Oct 2024 14:31:41 +0200 Subject: [PATCH 1/4] Attempt to fix shitty heads --- .envrc | 1 + .../landlord/api/IMaterialsManager.java | 4 +- .../biz/princeps/landlord/util/Skulls.java | 29 ++++-------- LandLord-latest/build.gradle.kts | 8 ++-- .../landlord/manager/MaterialsManager.java | 44 ++++++++++++++++--- LandLord-legacy/build.gradle.kts | 2 +- .../landlord/manager/MaterialsManager.java | 20 +++++++-- .../biz.princeps.java-conventions.gradle.kts | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- shell.nix | 11 +++++ 10 files changed, 88 insertions(+), 37 deletions(-) create mode 100644 .envrc create mode 100644 shell.nix diff --git a/.envrc b/.envrc new file mode 100644 index 00000000..1d953f4b --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use nix diff --git a/LandLord-api/src/main/java/biz/princeps/landlord/api/IMaterialsManager.java b/LandLord-api/src/main/java/biz/princeps/landlord/api/IMaterialsManager.java index d3f11876..d3f407f1 100644 --- a/LandLord-api/src/main/java/biz/princeps/landlord/api/IMaterialsManager.java +++ b/LandLord-api/src/main/java/biz/princeps/landlord/api/IMaterialsManager.java @@ -20,7 +20,9 @@ public interface IMaterialsManager { Material getLongGrass(); ItemStack getPlayerHead(UUID owner); - ItemStack getPlayerHead(OfflinePlayer owner); + ItemStack getPlayerHead(UUID owner, String texture); + ItemStack getPlayerHead(OfflinePlayer owner, String texture); + ItemStack getPlayerHead(String texture); ItemStack getWitherSkull(); diff --git a/LandLord-core/src/main/java/biz/princeps/landlord/util/Skulls.java b/LandLord-core/src/main/java/biz/princeps/landlord/util/Skulls.java index aa1b1f60..b6408112 100644 --- a/LandLord-core/src/main/java/biz/princeps/landlord/util/Skulls.java +++ b/LandLord-core/src/main/java/biz/princeps/landlord/util/Skulls.java @@ -3,6 +3,9 @@ import biz.princeps.landlord.api.ILandLord; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.SkullMeta; @@ -86,26 +89,8 @@ public static List numToSkull(int num) { } public ItemStack getSkull(ILandLord plugin) { - UUID uuid = UUID.randomUUID(); - ItemStack head = plugin.getMaterialsManager().getPlayerHead(uuid); - if (texture.isEmpty()) - return head; - - SkullMeta headMeta = (SkullMeta) head.getItemMeta(); - GameProfile profile = new GameProfile(uuid, uuid.toString().substring(0, 16)); - - profile.getProperties().put("textures", new Property("textures", texture)); - - try { - Field profileField = headMeta.getClass().getDeclaredField("profile"); - profileField.setAccessible(true); - profileField.set(headMeta, profile); - - } catch (IllegalArgumentException | NoSuchFieldException | SecurityException | IllegalAccessException error) { - error.printStackTrace(); - } - head.setItemMeta(headMeta); - return head; + UUID uuid = plugin.getServer().getOnlinePlayers().stream().findAny().get().getUniqueId(); + return plugin.getMaterialsManager().getPlayerHead(uuid, texture); } @Override @@ -114,4 +99,8 @@ public String toString() { this.name() + '}'; } + + public record Profile(Textures textures){} + public record Textures(Skin SKIN){} + public record Skin(String url){} } diff --git a/LandLord-latest/build.gradle.kts b/LandLord-latest/build.gradle.kts index c6ca06b0..2a083eda 100644 --- a/LandLord-latest/build.gradle.kts +++ b/LandLord-latest/build.gradle.kts @@ -1,13 +1,15 @@ plugins { - id("com.github.johnrengelman.shadow") version "8.1.1" + id("com.gradleup.shadow") version "8.3.1" id("biz.princeps.library-conventions") } dependencies { implementation(project(":LandLord-core")) - compileOnly("org.spigotmc:spigot-api:1.21-R0.1-SNAPSHOT") + compileOnly("io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT") compileOnly("com.sk89q.worldedit:worldedit-bukkit:7.2.20") - compileOnly("com.sk89q.worldguard:worldguard-bukkit:7.0.5") + compileOnly("com.sk89q.worldguard:worldguard-bukkit:7.0.5") { + exclude("org.spigotmc") + } compileOnly("io.papermc:paperlib:1.0.8") } diff --git a/LandLord-latest/src/main/java/biz/princeps/landlord/manager/MaterialsManager.java b/LandLord-latest/src/main/java/biz/princeps/landlord/manager/MaterialsManager.java index 7b8d1796..55c2acea 100644 --- a/LandLord-latest/src/main/java/biz/princeps/landlord/manager/MaterialsManager.java +++ b/LandLord-latest/src/main/java/biz/princeps/landlord/manager/MaterialsManager.java @@ -2,16 +2,25 @@ import biz.princeps.landlord.api.ILandLord; import biz.princeps.landlord.api.IMaterialsManager; +import biz.princeps.landlord.util.Skulls; +import com.destroystokyo.paper.profile.PlayerProfile; +import com.google.gson.Gson; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.SkullMeta; +import org.bukkit.profile.PlayerTextures; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Base64; import java.util.UUID; public class MaterialsManager implements IMaterialsManager { private final ILandLord plugin; + private static final Gson GSON = new Gson(); public MaterialsManager(ILandLord plugin) { this.plugin = plugin; @@ -38,18 +47,41 @@ public Material getLongGrass() { @Override public ItemStack getPlayerHead(UUID owner) { - return getPlayerHead(plugin.getServer().getOfflinePlayer(owner)); - } - - @Override - public ItemStack getPlayerHead(OfflinePlayer owner) { ItemStack skull = new ItemStack(Material.PLAYER_HEAD); SkullMeta itemMeta = (SkullMeta) skull.getItemMeta(); - itemMeta.setOwnerProfile(owner.getPlayerProfile()); + itemMeta.setOwningPlayer(Bukkit.getOfflinePlayer(owner)); skull.setItemMeta(itemMeta); return skull; } + @Override + public ItemStack getPlayerHead(UUID owner, String texture) { + return getPlayerHead(texture); + } + + @Override + public ItemStack getPlayerHead(OfflinePlayer owner, String texture) { + return getPlayerHead(texture); + } + + @Override + public ItemStack getPlayerHead(String texture) { + PlayerProfile profile = Bukkit.createProfile(UUID.randomUUID()); + PlayerTextures textures = profile.getTextures(); + Skulls.Profile parsed = GSON.fromJson(new String(Base64.getDecoder().decode(texture)), Skulls.Profile.class); + try { + textures.setSkin(new URL(parsed.textures().SKIN().url())); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + profile.setTextures(textures); + ItemStack stack = ItemStack.of(Material.PLAYER_HEAD); + SkullMeta meta = (SkullMeta) stack.getItemMeta(); + meta.setPlayerProfile(profile); + stack.setItemMeta(meta); + return stack; + } + @Override public ItemStack getWitherSkull() { return new ItemStack(Material.WITHER_SKELETON_SKULL); diff --git a/LandLord-legacy/build.gradle.kts b/LandLord-legacy/build.gradle.kts index dd4cf4c9..bd10a2d8 100644 --- a/LandLord-legacy/build.gradle.kts +++ b/LandLord-legacy/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("com.github.johnrengelman.shadow") version "8.1.1" + id("com.gradleup.shadow") version "8.3.1" id("biz.princeps.library-conventions") } diff --git a/LandLord-legacy/src/main/java/biz/princeps/landlord/manager/MaterialsManager.java b/LandLord-legacy/src/main/java/biz/princeps/landlord/manager/MaterialsManager.java index 1a52173e..320f43e9 100644 --- a/LandLord-legacy/src/main/java/biz/princeps/landlord/manager/MaterialsManager.java +++ b/LandLord-legacy/src/main/java/biz/princeps/landlord/manager/MaterialsManager.java @@ -2,6 +2,8 @@ import biz.princeps.landlord.api.ILandLord; import biz.princeps.landlord.api.IMaterialsManager; +import org.apache.commons.lang.NotImplementedException; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; @@ -34,19 +36,29 @@ public Material getLongGrass() { } @Override - public ItemStack getPlayerHead(UUID owner) { - return getPlayerHead(plugin.getServer().getOfflinePlayer(owner)); + public ItemStack getPlayerHead(UUID owner, String texture) { + return getPlayerHead(plugin.getServer().getOfflinePlayer(owner), texture); } @Override - public ItemStack getPlayerHead(OfflinePlayer owner) { + public ItemStack getPlayerHead(UUID owner) { ItemStack skull = new ItemStack(Material.SKULL_ITEM); SkullMeta itemMeta = (SkullMeta) skull.getItemMeta(); - itemMeta.setOwningPlayer(owner); + itemMeta.setOwningPlayer(Bukkit.getOfflinePlayer(owner)); skull.setItemMeta(itemMeta); return skull; } + @Override + public ItemStack getPlayerHead(OfflinePlayer owner, String texture) { + return getPlayerHead(texture); + } + + @Override + public ItemStack getPlayerHead(String texture) { + throw new NotImplementedException(); + } + @Override public ItemStack getWitherSkull() { return new ItemStack(Material.SKULL_ITEM, 1, (short) 1); diff --git a/buildSrc/src/main/kotlin/biz.princeps.java-conventions.gradle.kts b/buildSrc/src/main/kotlin/biz.princeps.java-conventions.gradle.kts index a4d2392b..c013d7fd 100644 --- a/buildSrc/src/main/kotlin/biz.princeps.java-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/biz.princeps.java-conventions.gradle.kts @@ -29,7 +29,9 @@ allprojects { java { withSourcesJar() withJavadocJar() - sourceCompatibility = JavaVersion.VERSION_1_8 + toolchain{ + languageVersion = JavaLanguageVersion.of(21) + } } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 09523c0e..9355b415 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/shell.nix b/shell.nix new file mode 100644 index 00000000..e6613cbb --- /dev/null +++ b/shell.nix @@ -0,0 +1,11 @@ +{ pkgs ? import {}, ... }: + +let +jdk = pkgs.jdk21; +gradle= pkgs.gradle.override { java = jdk; }; +in +pkgs.mkShell +{ + packages = with pkgs; [jdk gradle]; +} + From e622c8e3c802522a8eddc96c8c72bc7bf624bec0 Mon Sep 17 00:00:00 2001 From: Lilly <46890129+RainbowDashLabs@users.noreply.github.com> Date: Tue, 8 Oct 2024 14:32:07 +0200 Subject: [PATCH 2/4] Update gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3fc212de..89fefe81 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,5 @@ gradle-app.setting *.iws # IntelliJ -out/ \ No newline at end of file +out/ +.direnv From 7dadc8dc33b25fc614a3657eb2664d4495e97473 Mon Sep 17 00:00:00 2001 From: Lilly <46890129+RainbowDashLabs@users.noreply.github.com> Date: Tue, 8 Oct 2024 14:57:10 +0200 Subject: [PATCH 3/4] Use url instead of base64 encoded strings --- .../biz/princeps/landlord/util/Skulls.java | 28 ++++++++++--------- .../landlord/manager/MaterialsManager.java | 14 ++++------ 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/LandLord-core/src/main/java/biz/princeps/landlord/util/Skulls.java b/LandLord-core/src/main/java/biz/princeps/landlord/util/Skulls.java index b6408112..4d38ce8e 100644 --- a/LandLord-core/src/main/java/biz/princeps/landlord/util/Skulls.java +++ b/LandLord-core/src/main/java/biz/princeps/landlord/util/Skulls.java @@ -1,24 +1,19 @@ package biz.princeps.landlord.util; import biz.princeps.landlord.api.ILandLord; -import com.mojang.authlib.GameProfile; -import com.mojang.authlib.properties.Property; -import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; +import com.google.gson.Gson; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.SkullMeta; -import java.lang.reflect.Field; import java.util.ArrayList; +import java.util.Base64; import java.util.List; import java.util.UUID; public enum Skulls { FORWARD1("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjUyN2ViYWU5ZjE1MzE1NGE3ZWQ0OWM4OGMwMmI1YTlhOWNhN2NiMTYxOGQ5OTE0YTNkOWRmOGNjYjNjODQifX19"), - FORWARD5("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmI0YzFkYmQ4NTQ0Y2ZhZWQ5NjNkZjRkMTM5YmM4YmFjNGI3NmFjNGJiYjMwYWI4NmY3NmZiYzMxYWI5YTcwIn19fQ===="), - FORWARD10("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGVmMzU2YWQyYWE3YjE2NzhhZWNiODgyOTBlNWZhNWEzNDI3ZTVlNDU2ZmY0MmZiNTE1NjkwYzY3NTE3YjgifX19="), + FORWARD5("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmI0YzFkYmQ4NTQ0Y2ZhZWQ5NjNkZjRkMTM5YmM4YmFjNGI3NmFjNGJiYjMwYWI4NmY3NmZiYzMxYWI5YTcwIn19fQ=="), + FORWARD10("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGVmMzU2YWQyYWE3YjE2NzhhZWNiODgyOTBlNWZhNWEzNDI3ZTVlNDU2ZmY0MmZiNTE1NjkwYzY3NTE3YjgifX19"), BACK1("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWRmNWMyZjg5M2JkM2Y4OWNhNDA3MDNkZWQzZTQyZGQwZmJkYmE2ZjY3NjhjODc4OWFmZGZmMWZhNzhiZjYifX19"), BACK5("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzQ5ZDI3MWM1ZGY4NGY4YTNjOGFhNWQxNTQyN2Y2MjgzOTM0MWRhYjUyYzYxOWE1OTg3ZDM4ZmJlMThlNDY0In19fQ=="), BACK10("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjg0ZjU5NzEzMWJiZTI1ZGMwNThhZjg4OGNiMjk4MzFmNzk1OTliYzY3Yzk1YzgwMjkyNWNlNGFmYmEzMzJmYyJ9fX0="), @@ -40,9 +35,11 @@ public enum Skulls { ; final String texture; + final Profile profile; Skulls(String texture) { this.texture = texture; + profile = new Gson().fromJson(new String(Base64.getDecoder().decode(texture)), Profile.class); } public static List numToSkull(int num) { @@ -90,7 +87,7 @@ public static List numToSkull(int num) { public ItemStack getSkull(ILandLord plugin) { UUID uuid = plugin.getServer().getOnlinePlayers().stream().findAny().get().getUniqueId(); - return plugin.getMaterialsManager().getPlayerHead(uuid, texture); + return plugin.getMaterialsManager().getPlayerHead(uuid, profile.textures.SKIN.url); } @Override @@ -100,7 +97,12 @@ public String toString() { '}'; } - public record Profile(Textures textures){} - public record Textures(Skin SKIN){} - public record Skin(String url){} + public record Profile(Textures textures) { + } + + public record Textures(Skin SKIN) { + } + + public record Skin(String url) { + } } diff --git a/LandLord-latest/src/main/java/biz/princeps/landlord/manager/MaterialsManager.java b/LandLord-latest/src/main/java/biz/princeps/landlord/manager/MaterialsManager.java index 55c2acea..d5703a1b 100644 --- a/LandLord-latest/src/main/java/biz/princeps/landlord/manager/MaterialsManager.java +++ b/LandLord-latest/src/main/java/biz/princeps/landlord/manager/MaterialsManager.java @@ -20,7 +20,6 @@ public class MaterialsManager implements IMaterialsManager { private final ILandLord plugin; - private static final Gson GSON = new Gson(); public MaterialsManager(ILandLord plugin) { this.plugin = plugin; @@ -55,22 +54,21 @@ public ItemStack getPlayerHead(UUID owner) { } @Override - public ItemStack getPlayerHead(UUID owner, String texture) { - return getPlayerHead(texture); + public ItemStack getPlayerHead(UUID owner, String url) { + return getPlayerHead(url); } @Override - public ItemStack getPlayerHead(OfflinePlayer owner, String texture) { - return getPlayerHead(texture); + public ItemStack getPlayerHead(OfflinePlayer owner, String url) { + return getPlayerHead(url); } @Override - public ItemStack getPlayerHead(String texture) { + public ItemStack getPlayerHead(String url) { PlayerProfile profile = Bukkit.createProfile(UUID.randomUUID()); PlayerTextures textures = profile.getTextures(); - Skulls.Profile parsed = GSON.fromJson(new String(Base64.getDecoder().decode(texture)), Skulls.Profile.class); try { - textures.setSkin(new URL(parsed.textures().SKIN().url())); + textures.setSkin(new URL(url)); } catch (MalformedURLException e) { throw new RuntimeException(e); } From f5ae86a8f6653e089db0a6ff16184c694f272ff9 Mon Sep 17 00:00:00 2001 From: Lilly <46890129+RainbowDashLabs@users.noreply.github.com> Date: Tue, 8 Oct 2024 14:58:09 +0200 Subject: [PATCH 4/4] Bump to java 21 --- .github/workflows/publish_to_nexus.yml | 4 ++-- .github/workflows/verify.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish_to_nexus.yml b/.github/workflows/publish_to_nexus.yml index 5c4ac5f2..104cbf48 100644 --- a/.github/workflows/publish_to_nexus.yml +++ b/.github/workflows/publish_to_nexus.yml @@ -16,11 +16,11 @@ jobs: steps: - uses: actions/checkout@v3.0.2 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v3.3.0 with: distribution: temurin - java-version: 17 + java-version: 21 - name: Build with Gradle run: ./gradlew --build-cache build - name: Test with Gradle diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 4e4d80fa..ad08fffd 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -11,11 +11,11 @@ jobs: steps: - uses: actions/checkout@v3.0.2 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v3.3.0 with: distribution: temurin - java-version: 17 + java-version: 21 - name: Build with Gradle run: ./gradlew --build-cache build - name: Test with Gradle