diff --git a/plugins/fancynpcs/fn-api/build.gradle.kts b/plugins/fancynpcs/fn-api/build.gradle.kts index 906fffb3..53b981e2 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.0") 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 8adb9f03..25937559 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().getFeatureFlagConfig().getFeatureFlag("enable-folia-visibility-fix").isEnabled()) { + 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); } 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 d1f0f38d..3f62f30e 100644 --- a/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/FancyNpcs.java +++ b/plugins/fancynpcs/src/main/java/de/oliver/fancynpcs/FancyNpcs.java @@ -82,6 +82,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); public static final FeatureFlag USE_MINECRAFT_USERCACHE_FEATURE_FLAG = new FeatureFlag("use-minecraft-usercache", "Include the content of usercache.json to the username->uuid cache", false); private static FancyNpcs instance; @@ -154,6 +155,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()) { @@ -598,6 +600,7 @@ public class FancyNpcs extends JavaPlugin implements FancyNpcsPlugin { return textConfig; } + @Override public FeatureFlagConfig getFeatureFlagConfig() { return featureFlagConfig; }