diff --git a/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java b/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java index e171016c..2cd9a346 100644 --- a/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java +++ b/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java @@ -3,9 +3,11 @@ package net.coreprotect.bukkit; import java.util.Arrays; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; +import org.bukkit.Art; import org.bukkit.Color; import org.bukkit.DyeColor; import org.bukkit.Material; @@ -22,6 +24,7 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.ItemFrame; import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Painting; import org.bukkit.event.Event; import org.bukkit.event.block.BlockExplodeEvent; import org.bukkit.event.block.SignChangeEvent; @@ -384,6 +387,25 @@ public class BukkitAdapter implements BukkitInterface { return null; } + @Override + public String getPaintingArtKey(Painting painting) { + try { + return painting.getArt().name(); + } + catch (IncompatibleClassChangeError e) { + return painting.getArt().toString(); + } + } + + @Override + public Art getPaintingArt(String name) { + if (name == null || name.isBlank()) { + return null; + } + + return Art.getByName(name.toUpperCase(Locale.ROOT)); + } + @Override public boolean isCrafter(InventoryType type) { return false; diff --git a/src/main/java/net/coreprotect/bukkit/BukkitInterface.java b/src/main/java/net/coreprotect/bukkit/BukkitInterface.java index 8ef18ab5..c22a67ef 100644 --- a/src/main/java/net/coreprotect/bukkit/BukkitInterface.java +++ b/src/main/java/net/coreprotect/bukkit/BukkitInterface.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.bukkit.Art; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; @@ -14,6 +15,7 @@ import org.bukkit.entity.Arrow; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Painting; import org.bukkit.event.Event; import org.bukkit.event.block.BlockExplodeEvent; import org.bukkit.event.block.SignChangeEvent; @@ -498,6 +500,10 @@ public interface BukkitInterface { */ Object getRegistryValue(String key, Object tClass); + String getPaintingArtKey(Painting painting); + + Art getPaintingArt(String name); + /** * Parses a legacy material name. * diff --git a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java index 8597b7c9..ccaf470c 100644 --- a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java +++ b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java @@ -3,8 +3,10 @@ package net.coreprotect.bukkit; import java.util.Arrays; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Set; +import org.bukkit.Art; import org.bukkit.Bukkit; import org.bukkit.ExplosionResult; import org.bukkit.Keyed; @@ -15,6 +17,7 @@ import org.bukkit.Tag; import org.bukkit.block.BlockType; import org.bukkit.block.data.BlockData; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Painting; import org.bukkit.event.Event; import org.bukkit.event.block.BlockExplodeEvent; import org.bukkit.event.entity.EntityExplodeEvent; @@ -194,6 +197,51 @@ public class Bukkit_v1_21 extends Bukkit_v1_20 { return Bukkit.getRegistry((Class) tClass).get(namespacedKey); } + @Override + public String getPaintingArtKey(Painting painting) { + try { + NamespacedKey key = Registry.ART.getKey(painting.getArt()); + if (key != null) { + return normalizePaintingArtKey(key.toString()); + } + } + catch (Exception e) { + } + + return normalizePaintingArtKey(super.getPaintingArtKey(painting)); + } + + @Override + public Art getPaintingArt(String name) { + NamespacedKey key = NamespacedKey.fromString(normalizePaintingArtLookupKey(name)); + if (key != null) { + Art art = Registry.ART.get(key); + if (art != null) { + return art; + } + } + + return super.getPaintingArt(name); + } + + private String normalizePaintingArtKey(String name) { + if (name == null) { + return ""; + } + + String normalized = name.toLowerCase(Locale.ROOT).trim(); + if (normalized.startsWith("minecraft:")) { + return normalized.substring("minecraft:".length()); + } + + return normalized; + } + + private String normalizePaintingArtLookupKey(String name) { + String normalized = normalizePaintingArtKey(name); + return normalized.contains(":") ? normalized : "minecraft:" + normalized; + } + /** * Gets the wolf variant and adds it to the info list. * This functionality is specific to Minecraft 1.21+. diff --git a/src/main/java/net/coreprotect/database/logger/BlockBreakLogger.java b/src/main/java/net/coreprotect/database/logger/BlockBreakLogger.java index e495ee7b..9ffb56f5 100644 --- a/src/main/java/net/coreprotect/database/logger/BlockBreakLogger.java +++ b/src/main/java/net/coreprotect/database/logger/BlockBreakLogger.java @@ -32,6 +32,9 @@ public class BlockBreakLogger { if (blockKey.length() == 0 && checkType != null) { blockKey = checkType.getKey().toString(); } + else if (checkType != null && (checkType == Material.PAINTING || BukkitAdapter.ADAPTER.isItemFrame(checkType))) { + blockKey = checkType.getKey().toString(); + } if (checkType == null && blockKey.length() == 0) { return; diff --git a/src/main/java/net/coreprotect/database/logger/BlockPlaceLogger.java b/src/main/java/net/coreprotect/database/logger/BlockPlaceLogger.java index ed74adc5..d2f715e2 100644 --- a/src/main/java/net/coreprotect/database/logger/BlockPlaceLogger.java +++ b/src/main/java/net/coreprotect/database/logger/BlockPlaceLogger.java @@ -57,6 +57,9 @@ public class BlockPlaceLogger { } blockKey = type.getKey().toString(); } + else if (type != null && (type == Material.PAINTING || BukkitAdapter.ADAPTER.isItemFrame(type))) { + blockKey = type.getKey().toString(); + } if (type != null && (type.equals(Material.AIR) || type.equals(Material.CAVE_AIR)) && BlockTypeUtils.isAir(blockKey)) { return; diff --git a/src/main/java/net/coreprotect/utility/MaterialUtils.java b/src/main/java/net/coreprotect/utility/MaterialUtils.java index 0f686068..c3214ef2 100644 --- a/src/main/java/net/coreprotect/utility/MaterialUtils.java +++ b/src/main/java/net/coreprotect/utility/MaterialUtils.java @@ -184,12 +184,7 @@ public class MaterialUtils extends Queue { } public static String getPaintingArtName(Painting painting) { - try { - return painting.getArt().name(); - } - catch (IncompatibleClassChangeError e) { - return painting.getArt().toString(); - } + return net.coreprotect.bukkit.BukkitAdapter.ADAPTER.getPaintingArtKey(painting); } public static String getArtName(int id) { diff --git a/src/main/java/net/coreprotect/utility/entity/HangingUtil.java b/src/main/java/net/coreprotect/utility/entity/HangingUtil.java index 4ae63485..5a3da9ed 100644 --- a/src/main/java/net/coreprotect/utility/entity/HangingUtil.java +++ b/src/main/java/net/coreprotect/utility/entity/HangingUtil.java @@ -101,7 +101,11 @@ public class HangingUtil { if (faceSet != null && face != null) { if (rowType.equals(Material.PAINTING)) { String name = MaterialUtils.getArtName(rowData); - Art painting = Art.getByName(name.toUpperCase(Locale.ROOT)); + Art painting = BukkitAdapter.ADAPTER.getPaintingArt(name); + if (painting == null) { + return; + } + int height = painting.getBlockHeight(); int width = painting.getBlockWidth(); int paintingX = x;