From bef476a6eabfce2980d9286927b6fc71de47ebaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Sat, 26 Jul 2025 13:15:48 +0200 Subject: [PATCH] fancynpcs: Fix placeholder skins not refreshing (#89) * fancynpcs: fix placeholder skins not refreshing * fancynpcs: fix comment not being generated for `npc_update_interval` option * fancynpcs: apply requested changes --- .../java/de/oliver/fancynpcs/FancyNpcs.java | 44 ++++++++++++------- .../oliver/fancynpcs/FancyNpcsConfigImpl.java | 2 +- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/FancyNpcs.java b/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/FancyNpcs.java index 2e209312..df3d85f3 100644 --- a/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/FancyNpcs.java +++ b/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/FancyNpcs.java @@ -298,25 +298,37 @@ public class FancyNpcs extends JavaPlugin implements FancyNpcsPlugin { int npcUpdateInterval = config.getNpcUpdateInterval(); npcThread.scheduleAtFixedRate(() -> { - List npcs = new ArrayList<>(npcManager.getAllNpcs()); - for (Npc npc : npcs) { - String skinID = npc.getData().getSkinData().getIdentifier(); - boolean skinUpdated = npc.getData().getSkinData() != null && - !skinID.isEmpty() && - SkinUtils.isPlaceholder(skinID); + final List npcs = new ArrayList<>(npcManager.getAllNpcs()); + for (final Npc npc : npcs) { + try { + boolean shouldUpdate = false; - boolean displayNameUpdated = npc.getData().getDisplayName() != null && - !npc.getData().getDisplayName().isEmpty() && - SkinUtils.isPlaceholder(npc.getData().getDisplayName()); + if (npc.getData().getDisplayName() != null && !npc.getData().getDisplayName().isBlank() && SkinUtils.isPlaceholder(npc.getData().getDisplayName())) { + shouldUpdate = true; + } - if (skinUpdated || displayNameUpdated) { - SkinData skinData = skinManager.getByIdentifier(skinID, npc.getData().getSkinData().getVariant()); - skinData.setIdentifier(skinID); - npc.getData().setSkinData(skinData); + if (npc.getData().getSkinData() != null) { + final String skinID = npc.getData().getSkinData().getIdentifier(); + if (!skinID.isEmpty() && SkinUtils.isPlaceholder(skinID)) { + final SkinData skinData = skinManager.getByIdentifier(skinID, npc.getData().getSkinData().getVariant()); + skinData.setIdentifier(skinID); + npc.getData().setSkinData(skinData); + shouldUpdate = true; + } + } - npc.removeForAll(); - npc.create(); - npc.spawnForAll(); + if (shouldUpdate) { + npc.removeForAll(); + npc.create(); + npc.spawnForAll(); + } + } catch (final Throwable thr) { + fancyLogger.error( + "An error occurred while updating '" + npc.getData().getName() + "' NPC." + + System.lineSeparator() + " (1) " + thr.getClass().getName() + ": " + thr.getMessage() + + (thr.getCause() != null ? System.lineSeparator() + " (2) " + thr.getCause().getClass().getName() + ": " + thr.getCause().getMessage() : "") + ); + fancyLogger.error(thr); } } }, 30, npcUpdateInterval, TimeUnit.SECONDS); diff --git a/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/FancyNpcsConfigImpl.java b/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/FancyNpcsConfigImpl.java index 52bbf8cc..c96f0486 100644 --- a/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/FancyNpcsConfigImpl.java +++ b/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/FancyNpcsConfigImpl.java @@ -116,7 +116,7 @@ public class FancyNpcsConfigImpl implements FancyNpcsConfig { config.setInlineComments("autosave_interval", List.of("The interval at which autosave is performed in minutes.")); npcUpdateInterval = (int) ConfigHelper.getOrDefault(config, "npc_update_interval", 60); - config.setInlineComments("npc_update_skin_interval", List.of("The interval at which the NPC is updated (in seconds). Only if the skin or displayName is a placeholder.")); + config.setInlineComments("npc_update_interval", List.of("The interval at which the NPC is updated (in seconds). Only if the skin or displayName is a placeholder.")); npcUpdateVisibilityInterval = (int) ConfigHelper.getOrDefault(config, "npc_update_visibility_interval", 20); config.setInlineComments("npc_update_visibility_interval", List.of("The interval at which the NPC visibility is updated (in ticks)."));