mirror of
https://github.com/BX-Team/DivineMC.git
synced 2025-12-23 08:49:18 +00:00
new Experimental annotation for config
This commit is contained in:
@@ -9,6 +9,7 @@ import org.apache.logging.log4j.LogManager;
|
|||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
import org.bukkit.configuration.MemoryConfiguration;
|
import org.bukkit.configuration.MemoryConfiguration;
|
||||||
|
import org.bxteam.divinemc.config.annotations.Experimental;
|
||||||
import org.bxteam.divinemc.entity.pathfinding.PathfindTaskRejectPolicy;
|
import org.bxteam.divinemc.entity.pathfinding.PathfindTaskRejectPolicy;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.simpleyaml.configuration.comments.CommentType;
|
import org.simpleyaml.configuration.comments.CommentType;
|
||||||
@@ -17,6 +18,7 @@ import org.simpleyaml.exceptions.InvalidConfigurationException;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
@@ -71,6 +73,7 @@ public class DivineConfig {
|
|||||||
config.options().header(HEADER);
|
config.options().header(HEADER);
|
||||||
|
|
||||||
readConfig(DivineConfig.class, null);
|
readConfig(DivineConfig.class, null);
|
||||||
|
checkExperimentalFeatures();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void readConfig(Class<?> clazz, Object instance) throws IOException {
|
static void readConfig(Class<?> clazz, Object instance) throws IOException {
|
||||||
@@ -188,6 +191,7 @@ public class DivineConfig {
|
|||||||
|
|
||||||
public static class AsyncCategory {
|
public static class AsyncCategory {
|
||||||
// Parallel world ticking settings
|
// Parallel world ticking settings
|
||||||
|
@Experimental("Parallel World Ticking")
|
||||||
public static boolean enableParallelWorldTicking = false;
|
public static boolean enableParallelWorldTicking = false;
|
||||||
public static int parallelThreadCount = 4;
|
public static int parallelThreadCount = 4;
|
||||||
public static boolean logContainerCreationStacktraces = false;
|
public static boolean logContainerCreationStacktraces = false;
|
||||||
@@ -196,6 +200,7 @@ public class DivineConfig {
|
|||||||
public static boolean usePerWorldTpsBar = true;
|
public static boolean usePerWorldTpsBar = true;
|
||||||
|
|
||||||
// Regionized chunk ticking
|
// Regionized chunk ticking
|
||||||
|
@Experimental("Regionized Chunk Ticking")
|
||||||
public static boolean enableRegionizedChunkTicking = false;
|
public static boolean enableRegionizedChunkTicking = false;
|
||||||
public static int regionizedChunkTickingExecutorThreadCount = 4;
|
public static int regionizedChunkTickingExecutorThreadCount = 4;
|
||||||
public static boolean regionizedChunkTickingUseVirtualThreads = false;
|
public static boolean regionizedChunkTickingUseVirtualThreads = false;
|
||||||
@@ -262,8 +267,6 @@ public class DivineConfig {
|
|||||||
LOGGER.warn("Invalid regionized chunk ticking thread count: {}, resetting to default (5)", regionizedChunkTickingExecutorThreadCount);
|
LOGGER.warn("Invalid regionized chunk ticking thread count: {}, resetting to default (5)", regionizedChunkTickingExecutorThreadCount);
|
||||||
regionizedChunkTickingExecutorThreadCount = 5;
|
regionizedChunkTickingExecutorThreadCount = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enableRegionizedChunkTicking) LOGGER.warn("You have enabled Regionized Chunk Ticking. This feature is an experimental, and may not work as expected. Please report any issues you encounter to the BX Team Discord server");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void asyncPathfinding() {
|
private static void asyncPathfinding() {
|
||||||
@@ -572,6 +575,7 @@ public class DivineConfig {
|
|||||||
public static boolean onlyLogThrown = true;
|
public static boolean onlyLogThrown = true;
|
||||||
|
|
||||||
// Raytrace Entity Tracker
|
// Raytrace Entity Tracker
|
||||||
|
@Experimental("Raytrace Entity Tracker")
|
||||||
public static boolean retEnabled = false;
|
public static boolean retEnabled = false;
|
||||||
public static boolean retSkipMarkerArmorStands = true;
|
public static boolean retSkipMarkerArmorStands = true;
|
||||||
public static int retCheckIntervalMs = 10;
|
public static int retCheckIntervalMs = 10;
|
||||||
@@ -690,4 +694,37 @@ public class DivineConfig {
|
|||||||
"Message to send to the client when they are disconnected for not having No Chat Reports");
|
"Message to send to the client when they are disconnected for not having No Chat Reports");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void checkExperimentalFeatures() {
|
||||||
|
List<String> enabledExperimentalFeatures = new ArrayList<>();
|
||||||
|
|
||||||
|
Class<?>[] innerClasses = DivineConfig.class.getDeclaredClasses();
|
||||||
|
for (Class<?> innerClass : innerClasses) {
|
||||||
|
if (Modifier.isStatic(innerClass.getModifiers())) {
|
||||||
|
Field[] fields = innerClass.getDeclaredFields();
|
||||||
|
for (Field field : fields) {
|
||||||
|
if (field.isAnnotationPresent(Experimental.class) &&
|
||||||
|
field.getType() == boolean.class &&
|
||||||
|
Modifier.isStatic(field.getModifiers()) &&
|
||||||
|
Modifier.isPublic(field.getModifiers())) {
|
||||||
|
try {
|
||||||
|
field.setAccessible(true);
|
||||||
|
boolean value = field.getBoolean(null);
|
||||||
|
if (value) {
|
||||||
|
Experimental annotation = field.getAnnotation(Experimental.class);
|
||||||
|
String featureName = annotation.value();
|
||||||
|
enabledExperimentalFeatures.add(featureName);
|
||||||
|
}
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
LOGGER.debug("Failed to access field {}", field.getName(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!enabledExperimentalFeatures.isEmpty()) {
|
||||||
|
LOGGER.warn("You have the following experimental features enabled: [{}]. Please proceed with caution!", String.join(", ", enabledExperimentalFeatures));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package org.bxteam.divinemc.config.annotations;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Target(ElementType.FIELD)
|
||||||
|
public @interface Experimental {
|
||||||
|
String value();
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user