From f71c783163847b8f94808c4aad133d447c38a049 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 6 Oct 2025 21:31:42 +0200 Subject: [PATCH 1/2] fancynpcs: Always respawn npcs with a delay when using Folia --- .../src/main/java/de/oliver/fancynpcs/api/Npc.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/Npc.java b/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/Npc.java index 124fda95..d10f165b 100644 --- a/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/Npc.java +++ b/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/Npc.java @@ -1,6 +1,7 @@ package de.oliver.fancynpcs.api; import de.oliver.fancylib.RandomUtils; +import de.oliver.fancylib.serverSoftware.ServerSoftware; import de.oliver.fancylib.translations.Translator; import de.oliver.fancynpcs.api.actions.ActionTrigger; import de.oliver.fancynpcs.api.actions.NpcAction; @@ -18,6 +19,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; public abstract class Npc { @@ -110,6 +112,15 @@ public abstract class Npc { if (shouldBeVisible && !wasVisible) { spawn(player); + + // Respawn the npc to fix visibility issues on Folia + if (ServerSoftware.isFolia()) { + FancyNpcsPlugin.get().getNpcThread().schedule(() -> { + remove(player); + spawn(player); + }, 100, TimeUnit.MILLISECONDS); + } + } else if (!shouldBeVisible && wasVisible) { remove(player); } @@ -185,7 +196,7 @@ public abstract class Npc { // actions ActionExecutor.execute(actionTrigger, this, player); - + if (actionTrigger == ActionTrigger.LEFT_CLICK || actionTrigger == ActionTrigger.RIGHT_CLICK) { ActionExecutor.execute(ActionTrigger.ANY_CLICK, this, player); } From 540b3ad738847218aff6939a785b4d67c4153e8a Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 18 Nov 2025 11:32:06 +0100 Subject: [PATCH 2/2] fancynpcs: Add enable-folia-visibility-fix fflag --- plugins/fancynpcs/fn-api/build.gradle.kts | 1 + .../main/java/de/oliver/fancynpcs/api/FancyNpcsPlugin.java | 7 +++++-- .../fn-api/src/main/java/de/oliver/fancynpcs/api/Npc.java | 2 +- .../src/main/java/de/oliver/fancynpcs/FancyNpcs.java | 3 +++ 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/plugins/fancynpcs/fn-api/build.gradle.kts b/plugins/fancynpcs/fn-api/build.gradle.kts index c5a2ee3f..ba5b27d6 100644 --- a/plugins/fancynpcs/fn-api/build.gradle.kts +++ b/plugins/fancynpcs/fn-api/build.gradle.kts @@ -10,6 +10,7 @@ dependencies { compileOnly("io.papermc.paper:paper-api:$minecraftVersion-R0.1-SNAPSHOT") compileOnly(project(":libraries:common")) + compileOnly(project(":libraries:config")) compileOnly("de.oliver.FancyAnalytics:logger:0.0.8") implementation("org.lushplugins:ChatColorHandler:6.0.2") diff --git a/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/FancyNpcsPlugin.java b/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/FancyNpcsPlugin.java index a582a1a9..58664baf 100644 --- a/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/FancyNpcsPlugin.java +++ b/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/FancyNpcsPlugin.java @@ -1,5 +1,6 @@ package de.oliver.fancynpcs.api; +import com.fancyinnovations.config.featureflags.FeatureFlagConfig; import de.oliver.fancyanalytics.logger.ExtendedFancyLogger; import de.oliver.fancylib.serverSoftware.schedulers.FancyScheduler; import de.oliver.fancylib.translations.Translator; @@ -32,8 +33,8 @@ public interface FancyNpcsPlugin { ScheduledExecutorService getNpcThread(); /** - * Creates a new thread with the given name and runnable. - * Warning: Do not use this method, it is for internal use only. + * Creates a new thread with the given name and runnable. + * Warning: Do not use this method, it is for internal use only. */ @ApiStatus.Internal Thread newThread(String name, Runnable runnable); @@ -44,6 +45,8 @@ public interface FancyNpcsPlugin { FancyNpcsConfig getFancyNpcConfig(); + FeatureFlagConfig getFeatureFlagConfig(); + NpcManager getNpcManager(); AttributeManager getAttributeManager(); diff --git a/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/Npc.java b/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/Npc.java index d10f165b..dcc5afee 100644 --- a/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/Npc.java +++ b/plugins/fancynpcs/fn-api/src/main/java/de/oliver/fancynpcs/api/Npc.java @@ -114,7 +114,7 @@ public abstract class Npc { spawn(player); // Respawn the npc to fix visibility issues on Folia - if (ServerSoftware.isFolia()) { + if (ServerSoftware.isFolia() && FancyNpcsPlugin.get().getFeatureFlagConfig().getFeatureFlag("enable-folia-visibility-fix").isEnabled()) { FancyNpcsPlugin.get().getNpcThread().schedule(() -> { remove(player); spawn(player); 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 2ff1b8ef..0c1c11b1 100644 --- a/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/FancyNpcs.java +++ b/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/FancyNpcs.java @@ -81,6 +81,7 @@ public class FancyNpcs extends JavaPlugin implements FancyNpcsPlugin { public static final FeatureFlag PLAYER_NPCS_FEATURE_FLAG = new FeatureFlag("player-npcs", "Every player can only manage the npcs they have created", false); public static final FeatureFlag USE_NATIVE_THREADS_FEATURE_FLAG = new FeatureFlag("use-native-threads", "Use native threads instead of virtual threads.", false); public static final FeatureFlag ENABLE_DEBUG_MODE_FEATURE_FLAG = new FeatureFlag("enable-debug-mode", "Enable debug mode", false); + public static final FeatureFlag ENABLE_FOLIA_VISIBILITY_FIX_FEATURE_FLAG = new FeatureFlag("enable-folia-visibility-fix", "When enabled, all npcs will respawn after 100ms when they should spawn", false); private static FancyNpcs instance; private final ExtendedFancyLogger fancyLogger; @@ -152,6 +153,7 @@ public class FancyNpcs extends JavaPlugin implements FancyNpcsPlugin { featureFlagConfig.addFeatureFlag(PLAYER_NPCS_FEATURE_FLAG); featureFlagConfig.addFeatureFlag(USE_NATIVE_THREADS_FEATURE_FLAG); featureFlagConfig.addFeatureFlag(ENABLE_DEBUG_MODE_FEATURE_FLAG); + featureFlagConfig.addFeatureFlag(ENABLE_FOLIA_VISIBILITY_FIX_FEATURE_FLAG); featureFlagConfig.load(); if (ENABLE_DEBUG_MODE_FEATURE_FLAG.isEnabled()) { @@ -595,6 +597,7 @@ public class FancyNpcs extends JavaPlugin implements FancyNpcsPlugin { return textConfig; } + @Override public FeatureFlagConfig getFeatureFlagConfig() { return featureFlagConfig; }