diff --git a/blockregen-plugin/src/main/java/nl/aurorion/blockregen/compatibility/provider/MythicMobsProvider.java b/blockregen-plugin/src/main/java/nl/aurorion/blockregen/compatibility/provider/MythicMobsProvider.java index 133680b..0bfd482 100644 --- a/blockregen-plugin/src/main/java/nl/aurorion/blockregen/compatibility/provider/MythicMobsProvider.java +++ b/blockregen-plugin/src/main/java/nl/aurorion/blockregen/compatibility/provider/MythicMobsProvider.java @@ -6,10 +6,15 @@ import nl.aurorion.blockregen.BlockRegenPlugin; import nl.aurorion.blockregen.compatibility.CompatibilityProvider; import nl.aurorion.blockregen.drop.ItemProvider; +import org.bukkit.Bukkit; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; +import java.util.List; import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.function.Function; import java.util.stream.Collectors; @@ -30,12 +35,48 @@ public ItemStack createItem(@NotNull String id, @NotNull Function future = new CompletableFuture<>(); + Bukkit.getScheduler().runTask(plugin, () -> future.complete(buildItemStack(mythicItem, parser, amount))); + try { + return future.get(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return null; + } catch (ExecutionException e) { + return null; + } + } + + return buildItemStack(mythicItem, parser, amount); + } + + private ItemStack buildItemStack(MythicItem mythicItem, Function parser, int amount) { BukkitItemStack itemStack = (BukkitItemStack) mythicItem.generateItemStack(amount); - itemStack.setLore(mythicItem.getLore().stream().map(parser).collect(Collectors.toList())); - itemStack.setName(parser.apply(mythicItem.getDisplayName())); + // Get the fully rendered Bukkit ItemStack (with CustomModelData and all MythicMobs metadata intact). + // Modify only name/lore through Bukkit's ItemMeta to avoid wiping CustomModelData, + // which happened when calling BukkitItemStack.setName/setLore directly. + ItemStack bukkitStack = itemStack.getItemStack(); + ItemMeta meta = bukkitStack.getItemMeta(); + if (meta != null) { + if (meta.hasDisplayName()) { + meta.setDisplayName(parser.apply(meta.getDisplayName())); + } + if (meta.hasLore()) { + List lore = meta.getLore(); + if (lore != null) { + meta.setLore(lore.stream().map(parser).collect(Collectors.toList())); + } + } + bukkitStack.setItemMeta(meta); + } - return itemStack.getItemStack(); + return bukkitStack; } @Override