Improved painting variant handling

This commit is contained in:
Intelli committed 2026-04-24 14:10:02 -06:00
1 parent eaae2afaf8
commit cce8c9eb51
7 files changed
+88 -7

No files matched your search

@@ -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;
@@ -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.
*
@@ -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+.
@@ -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;
@@ -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;
@@ -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) {
@@ -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;