From e8290d819172bb97dec5eda32bffd732059edfb8 Mon Sep 17 00:00:00 2001 From: AnOwlBe Date: Fri, 13 Mar 2026 22:31:10 -0400 Subject: [PATCH 1/7] E --- .../skript/expressions/ExprSkullTexture.java | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 src/main/java/ch/njol/skript/expressions/ExprSkullTexture.java diff --git a/src/main/java/ch/njol/skript/expressions/ExprSkullTexture.java b/src/main/java/ch/njol/skript/expressions/ExprSkullTexture.java new file mode 100644 index 00000000000..cc6ce338d49 --- /dev/null +++ b/src/main/java/ch/njol/skript/expressions/ExprSkullTexture.java @@ -0,0 +1,101 @@ +package ch.njol.skript.expressions; + +import ch.njol.skript.aliases.ItemType; +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Example; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.util.coll.CollectionUtils; + +import com.destroystokyo.paper.profile.ProfileProperty; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.event.Event; +import org.bukkit.inventory.meta.SkullMeta; +import com.destroystokyo.paper.profile.PlayerProfile; +import org.jetbrains.annotations.Nullable; + +@Name("Skull Texture") +@Description("The skull texture for a player head.") +@Example("set the skull texture of {_i} to \"\"") +@Since("2.15") +public class ExprSkullTexture extends SimplePropertyExpression { + + static { + register(ExprSkullTexture.class, String.class, "[the] (skull|head) texture", "itemtypes"); + } + + @Nullable + @Override + public String convert(ItemType item) { + if (!(item.getMaterial() == Material.PLAYER_HEAD)) { + return null; + } + SkullMeta meta = (SkullMeta) item.getItemMeta(); + PlayerProfile profile = meta.getPlayerProfile(); + if (profile == null) { + return null; + } + ProfileProperty texture = profile.getProperties().stream() + .filter(p -> p.getName().equals("textures")) + .findFirst() + .orElse(null); + if (!(texture == null)) { + return texture.getValue(); + } else{ + return null; + } + } + + @Override + public Class @Nullable [] acceptChange(ChangeMode mode) { + return switch (mode) { + case SET -> CollectionUtils.array(String.class); + case DELETE, RESET -> CollectionUtils.array(); + default -> null; + }; + } + + @Override + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { + String value = delta == null ? null : (String) delta[0]; + switch (mode) { + case DELETE, RESET: + for (ItemType item : getExpr().getArray(event)) { + if (item.getMaterial() == Material.PLAYER_HEAD) { + SkullMeta meta = (SkullMeta) item.getItemMeta(); + meta.setPlayerProfile(null); + item.setItemMeta(meta); + } + } + break; + case SET: + for (ItemType item : getExpr().getArray(event)) { + if (item.getMaterial() == Material.PLAYER_HEAD) { + SkullMeta meta = (SkullMeta) item.getItemMeta(); + PlayerProfile playerProfile = Bukkit.createProfile(java.util.UUID.randomUUID()); + playerProfile.setProperty(new ProfileProperty("textures", value)); + meta.setPlayerProfile(playerProfile); + item.setItemMeta(meta); + + } + } + } + + } + + + + @Override + public Class getReturnType() { + return String.class; + } + + @Override + protected String getPropertyName() { + return "skull texture"; + } + +} \ No newline at end of file From ca23a0c2c11925c277a9e24f8a022089332d4936 Mon Sep 17 00:00:00 2001 From: AnOwlBe Date: Sat, 14 Mar 2026 01:56:57 -0400 Subject: [PATCH 2/7] Some Code Convention fixes --- .../skript/expressions/ExprSkullTexture.java | 46 +++++++++---------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprSkullTexture.java b/src/main/java/ch/njol/skript/expressions/ExprSkullTexture.java index cc6ce338d49..bf326c3a6d3 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprSkullTexture.java +++ b/src/main/java/ch/njol/skript/expressions/ExprSkullTexture.java @@ -26,29 +26,6 @@ public class ExprSkullTexture extends SimplePropertyExpression static { register(ExprSkullTexture.class, String.class, "[the] (skull|head) texture", "itemtypes"); } - - @Nullable - @Override - public String convert(ItemType item) { - if (!(item.getMaterial() == Material.PLAYER_HEAD)) { - return null; - } - SkullMeta meta = (SkullMeta) item.getItemMeta(); - PlayerProfile profile = meta.getPlayerProfile(); - if (profile == null) { - return null; - } - ProfileProperty texture = profile.getProperties().stream() - .filter(p -> p.getName().equals("textures")) - .findFirst() - .orElse(null); - if (!(texture == null)) { - return texture.getValue(); - } else{ - return null; - } - } - @Override public Class @Nullable [] acceptChange(ChangeMode mode) { return switch (mode) { @@ -57,7 +34,6 @@ public String convert(ItemType item) { default -> null; }; } - @Override public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { String value = delta == null ? null : (String) delta[0]; @@ -86,7 +62,27 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { } - + @Nullable + @Override + public String convert(ItemType item) { + if (!(item.getMaterial() == Material.PLAYER_HEAD)) { + return null; + } + SkullMeta meta = (SkullMeta) item.getItemMeta(); + PlayerProfile profile = meta.getPlayerProfile(); + if (profile == null) { + return null; + } + ProfileProperty texture = profile.getProperties().stream() + .filter(p -> p.getName().equals("textures")) + .findFirst() + .orElse(null); + if (!(texture == null)) { + return texture.getValue(); + } else{ + return null; + } + } @Override public Class getReturnType() { From d6cd7902c0f21c315b720505adb3c4a0c6c076d7 Mon Sep 17 00:00:00 2001 From: AnOwlBe Date: Thu, 23 Apr 2026 14:42:35 -0400 Subject: [PATCH 3/7] Fixed some things changed to use 2.15's syntaxRegistry --- .../expressions/ExprSkullTexture.java | 46 ++++++++++++------- 1 file changed, 30 insertions(+), 16 deletions(-) rename src/main/java/{ch/njol/skript => org/skriptlang/skript/bukkit/misc/elements}/expressions/ExprSkullTexture.java (61%) diff --git a/src/main/java/ch/njol/skript/expressions/ExprSkullTexture.java b/src/main/java/org/skriptlang/skript/bukkit/misc/elements/expressions/ExprSkullTexture.java similarity index 61% rename from src/main/java/ch/njol/skript/expressions/ExprSkullTexture.java rename to src/main/java/org/skriptlang/skript/bukkit/misc/elements/expressions/ExprSkullTexture.java index bf326c3a6d3..7fffa1d1a9a 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprSkullTexture.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/elements/expressions/ExprSkullTexture.java @@ -1,4 +1,4 @@ -package ch.njol.skript.expressions; +package org.skriptlang.skript.bukkit.misc.elements.expressions; import ch.njol.skript.aliases.ItemType; import ch.njol.skript.classes.Changer.ChangeMode; @@ -16,16 +16,25 @@ import org.bukkit.inventory.meta.SkullMeta; import com.destroystokyo.paper.profile.PlayerProfile; import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.registration.SyntaxInfo; +import org.skriptlang.skript.registration.SyntaxRegistry; + +import java.util.UUID; @Name("Skull Texture") -@Description("The skull texture for a player head.") -@Example("set the skull texture of {_i} to \"\"") -@Since("2.15") +@Description("The skull texture of a player head.") +@Example("set the skull texture of {_i} to \"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTM4NmRmZDc0Y2JhZmJkMWRiZTQ3OWY1ZTAzNzRjMDliZjJlYjRlMzg2NjExZmM0ZmM2OTlmMDJlY2E0ZGQyYyJ9fX0=\"") +@Since("INSERT VERSION") public class ExprSkullTexture extends SimplePropertyExpression { - static { - register(ExprSkullTexture.class, String.class, "[the] (skull|head) texture", "itemtypes"); + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register(SyntaxRegistry.EXPRESSION, SyntaxInfo.Expression.builder(ExprSkullTexture.class, String.class) + .supplier(ExprSkullTexture::new) + .priority(SyntaxInfo.SIMPLE) + .addPattern("[the] (skull|head)[ ]texture [of] %itemtypes%") + .build()); } + @Override public Class @Nullable [] acceptChange(ChangeMode mode) { return switch (mode) { @@ -34,29 +43,35 @@ public class ExprSkullTexture extends SimplePropertyExpression default -> null; }; } + @Override public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { String value = delta == null ? null : (String) delta[0]; switch (mode) { case DELETE, RESET: for (ItemType item : getExpr().getArray(event)) { - if (item.getMaterial() == Material.PLAYER_HEAD) { + if (item.getMaterial() == Material.PLAYER_HEAD) + if (item.getMaterial() != Material.PLAYER_HEAD) { + continue; + } SkullMeta meta = (SkullMeta) item.getItemMeta(); meta.setPlayerProfile(null); item.setItemMeta(meta); - } + } break; case SET: for (ItemType item : getExpr().getArray(event)) { if (item.getMaterial() == Material.PLAYER_HEAD) { - SkullMeta meta = (SkullMeta) item.getItemMeta(); - PlayerProfile playerProfile = Bukkit.createProfile(java.util.UUID.randomUUID()); - playerProfile.setProperty(new ProfileProperty("textures", value)); - meta.setPlayerProfile(playerProfile); - item.setItemMeta(meta); - + continue; } + SkullMeta meta = (SkullMeta) item.getItemMeta(); + PlayerProfile playerProfile = Bukkit.createProfile(UUID.randomUUID()); + playerProfile.setProperty(new ProfileProperty("textures", value)); + meta.setPlayerProfile(playerProfile); + item.setItemMeta(meta); + + } } @@ -74,7 +89,7 @@ public String convert(ItemType item) { return null; } ProfileProperty texture = profile.getProperties().stream() - .filter(p -> p.getName().equals("textures")) + .filter(property -> property.getName().equals("textures")) .findFirst() .orElse(null); if (!(texture == null)) { @@ -93,5 +108,4 @@ public Class getReturnType() { protected String getPropertyName() { return "skull texture"; } - } \ No newline at end of file From 0a64ffd2a3121f3ce9e329c713bd3de1ec1bb4cf Mon Sep 17 00:00:00 2001 From: AnOwlBe Date: Mon, 27 Apr 2026 22:18:36 -0400 Subject: [PATCH 4/7] Small changes --- .../misc/elements/expressions/ExprSkullTexture.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/elements/expressions/ExprSkullTexture.java b/src/main/java/org/skriptlang/skript/bukkit/misc/elements/expressions/ExprSkullTexture.java index 7fffa1d1a9a..f0d75f76cf9 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/elements/expressions/ExprSkullTexture.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/elements/expressions/ExprSkullTexture.java @@ -62,7 +62,7 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { break; case SET: for (ItemType item : getExpr().getArray(event)) { - if (item.getMaterial() == Material.PLAYER_HEAD) { + if (item.getMaterial() != Material.PLAYER_HEAD) { continue; } SkullMeta meta = (SkullMeta) item.getItemMeta(); @@ -77,10 +77,10 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { } - @Nullable + @Override - public String convert(ItemType item) { - if (!(item.getMaterial() == Material.PLAYER_HEAD)) { + public @Nullable String convert(ItemType item) { + if (item.getMaterial() != Material.PLAYER_HEAD) { return null; } SkullMeta meta = (SkullMeta) item.getItemMeta(); From 0f3b83f70830fa141a1e39e804a67c1ce00ebc67 Mon Sep 17 00:00:00 2001 From: AnOwlBe Date: Tue, 28 Apr 2026 00:01:36 -0400 Subject: [PATCH 5/7] Fixes --- .../skript/bukkit/misc/MiscModule.java | 3 ++- .../expressions/ExprSkullTexture.java | 24 ++++++++----------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/MiscModule.java b/src/main/java/org/skriptlang/skript/bukkit/misc/MiscModule.java index e778d8681be..e7b3a51ebbe 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/MiscModule.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/MiscModule.java @@ -22,7 +22,8 @@ protected void loadSelf(SkriptAddon addon) { ExprQuaternionAxisAngle::register, ExprRotate::register, ExprTextOf::register, - ExprWithYawPitch::register + ExprWithYawPitch::register, + ExprSkullTexture::register ); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/elements/expressions/ExprSkullTexture.java b/src/main/java/org/skriptlang/skript/bukkit/misc/elements/expressions/ExprSkullTexture.java index f0d75f76cf9..9b93c98bac9 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/elements/expressions/ExprSkullTexture.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/elements/expressions/ExprSkullTexture.java @@ -28,7 +28,8 @@ public class ExprSkullTexture extends SimplePropertyExpression { public static void register(SyntaxRegistry syntaxRegistry) { - syntaxRegistry.register(SyntaxRegistry.EXPRESSION, SyntaxInfo.Expression.builder(ExprSkullTexture.class, String.class) + syntaxRegistry.register(SyntaxRegistry.EXPRESSION, + infoBuilder(ExprSkullTexture.class, String.class, "skull texture", "itemtypes", false) .supplier(ExprSkullTexture::new) .priority(SyntaxInfo.SIMPLE) .addPattern("[the] (skull|head)[ ]texture [of] %itemtypes%") @@ -50,13 +51,12 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { switch (mode) { case DELETE, RESET: for (ItemType item : getExpr().getArray(event)) { - if (item.getMaterial() == Material.PLAYER_HEAD) - if (item.getMaterial() != Material.PLAYER_HEAD) { - continue; - } - SkullMeta meta = (SkullMeta) item.getItemMeta(); - meta.setPlayerProfile(null); - item.setItemMeta(meta); + if (item.getMaterial() != Material.PLAYER_HEAD) { + continue; + } + SkullMeta meta = (SkullMeta) item.getItemMeta(); + meta.setPlayerProfile(null); + item.setItemMeta(meta); } break; @@ -70,14 +70,10 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { playerProfile.setProperty(new ProfileProperty("textures", value)); meta.setPlayerProfile(playerProfile); item.setItemMeta(meta); - - } } - } - @Override public @Nullable String convert(ItemType item) { if (item.getMaterial() != Material.PLAYER_HEAD) { @@ -94,7 +90,7 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { .orElse(null); if (!(texture == null)) { return texture.getValue(); - } else{ + } else { return null; } } @@ -108,4 +104,4 @@ public Class getReturnType() { protected String getPropertyName() { return "skull texture"; } -} \ No newline at end of file +} From 971e50af77a4b7a273b9b21a85350bd706b4321a Mon Sep 17 00:00:00 2001 From: AnOwlBe Date: Wed, 29 Apr 2026 00:20:44 -0400 Subject: [PATCH 6/7] Small changes --- .../misc/elements/expressions/ExprSkullTexture.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/elements/expressions/ExprSkullTexture.java b/src/main/java/org/skriptlang/skript/bukkit/misc/elements/expressions/ExprSkullTexture.java index 9b93c98bac9..b813c045cf0 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/elements/expressions/ExprSkullTexture.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/elements/expressions/ExprSkullTexture.java @@ -22,7 +22,13 @@ import java.util.UUID; @Name("Skull Texture") -@Description("The skull texture of a player head.") +@Description(""" + The skull texture of a player head. + Allows you to give a skull a custom texture (e.g. instead of it being a Steve head, it's Notch's head). + For the %string% you input a base64 string (think of it like the ID/texture so Minecraft knows what the head should look like). + (The most common place to get a base64 string is https://minecraft-heads.com) + Resetting the texture of a skull will make it look like a Steve/Alex head. + """) @Example("set the skull texture of {_i} to \"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTM4NmRmZDc0Y2JhZmJkMWRiZTQ3OWY1ZTAzNzRjMDliZjJlYjRlMzg2NjExZmM0ZmM2OTlmMDJlY2E0ZGQyYyJ9fX0=\"") @Since("INSERT VERSION") public class ExprSkullTexture extends SimplePropertyExpression { @@ -32,7 +38,7 @@ public static void register(SyntaxRegistry syntaxRegistry) { infoBuilder(ExprSkullTexture.class, String.class, "skull texture", "itemtypes", false) .supplier(ExprSkullTexture::new) .priority(SyntaxInfo.SIMPLE) - .addPattern("[the] (skull|head)[ ]texture [of] %itemtypes%") + .addPattern("[the] (skull|head) texture [of] %itemtypes%") .build()); } @@ -57,7 +63,6 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { SkullMeta meta = (SkullMeta) item.getItemMeta(); meta.setPlayerProfile(null); item.setItemMeta(meta); - } break; case SET: From 8e41b0a4b8e12200b5f1417c819231f573a7410b Mon Sep 17 00:00:00 2001 From: AnOwlBe Date: Wed, 29 Apr 2026 01:14:35 -0400 Subject: [PATCH 7/7] Adds tests --- .../skript/tests/syntaxes/expressions/ExprSkullTexture.sk | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprSkullTexture.sk diff --git a/src/test/skript/tests/syntaxes/expressions/ExprSkullTexture.sk b/src/test/skript/tests/syntaxes/expressions/ExprSkullTexture.sk new file mode 100644 index 00000000000..4f01c73b30d --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprSkullTexture.sk @@ -0,0 +1,6 @@ +test "skull texture": + set {_head} to player head + set skull texture of {_head} to "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTM4NmRmZDc0Y2JhZmJkMWRiZTQ3OWY1ZTAzNzRjMDliZjJlYjRlMzg2NjExZmM0ZmM2OTlmMDJlY2E0ZGQyYyJ9fX0=" + assert skull texture of {_head} is "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTM4NmRmZDc0Y2JhZmJkMWRiZTQ3OWY1ZTAzNzRjMDliZjJlYjRlMzg2NjExZmM0ZmM2OTlmMDJlY2E0ZGQyYyJ9fX0=" with "skull texture should be set" + reset skull texture of {_head} + assert skull texture of {_head} is not set with "skull texture should be reset" \ No newline at end of file