// Path: src/main/java/com/endercrest/voidspawn/options/IntegerOption.java
// public class IntegerOption extends BaseOption<Integer> {
//     public IntegerOption(@NotNull OptionIdentifier<Integer> identifier) {
//         super(identifier);
//     }
// 
//     public IntegerOption(@NotNull OptionIdentifier<Integer> identifier, Integer defaultValue) {
//         super(identifier, defaultValue);
//     }
// 
//     @Override
//     public Optional<Integer> getLoadedValue(@NotNull World world) {
//         String value = ConfigManager.getInstance().getOption(world.getName(), getIdentifier());
//         if (value == null)
//             return Optional.empty();
// 
//         try {
//             return Optional.of(Integer.parseInt(value));
//         } catch (NumberFormatException e) {
//             return Optional.empty();
//         }
//     }
// 
//     @Override
//     public void setValue(@NotNull World world, String value) {
//         if (value == null) {
//             super.setValue(world, (String) null);
//             return;
//         }
// 
//         try {
//             Integer.parseInt(value); // Check if number
//             super.setValue(world, value);
//         } catch (NumberFormatException e) {
//             throw new IllegalArgumentException("Must be a number");
//         }
//     }
// 
//     @Override
//     public void setValue(@NotNull World world, String[] args) throws IllegalArgumentException {
//         setValue(world, String.join(" ", args));
//     }
// 
//     @Override
//     public List<String> getOptions() {
//         return null;
//     }
// }
// 
// Path: src/main/java/com/endercrest/voidspawn/options/OptionIdentifier.java
// public class OptionIdentifier<T> {
//     private final Class<T> type;
//     private final String name;
//     private final String description;
// 
//     public OptionIdentifier(Class<T> type, String name, String description) {
//         this.type = type;
//         this.name = name;
//         this.description = description;
//     }
// 
//     public Class<T> getType() {
//         return type;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// }
// 
// Path: src/main/java/com/endercrest/voidspawn/options/container/BasicOptionContainer.java
// public abstract class BasicOptionContainer implements OptionContainer {
//     private final Map<String, Option<?>> options = new HashMap<>();
// 
//     protected void attachOption(Option<?> option) {
//         options.put(option.getIdentifier().getName(), option);
//     }
// 
//     protected void detachOption(@NotNull OptionIdentifier<?> identifier) {
//         options.remove(identifier.getName());
//     }
// 
//     @SuppressWarnings("unchecked")
//     @Override
//     public @NotNull <T> Option<T> getOption(OptionIdentifier<T> identifier) {
//         Option<?> option = options.get(identifier.getName());
//         if (option == null || option.getType() != identifier.getType()) {
//             return new EmptyOption<>(identifier);
//         }
//         return (Option<T>) option;
//     }
// 
//     @Override
//     public @Nullable Option<?> getOption(String name) {
//         return options.get(name);
//     }
// 
//     @Override
//     public Collection<Option<?>> getOptions() {
//         return options.values();
//     }
// }


import com.endercrest.voidspawn.options.IntegerOption;
import com.endercrest.voidspawn.options.OptionIdentifier;
import com.endercrest.voidspawn.options.container.BasicOptionContainer;
package com.endercrest.voidspawn.detectors;


public abstract class BaseDetector extends BasicOptionContainer implements Detector {
    public static final OptionIdentifier<Integer> OPTION_VOID = new OptionIdentifier<>(Integer.class, "void_height", "The height to detect at (default just below the void)");

    public BaseDetector() {
// Path: src/main/java/com/endercrest/voidspawn/options/IntegerOption.java
// public class IntegerOption extends BaseOption<Integer> {
//     public IntegerOption(@NotNull OptionIdentifier<Integer> identifier) {
//         super(identifier);
//     }
// 
//     public IntegerOption(@NotNull OptionIdentifier<Integer> identifier, Integer defaultValue) {
//         super(identifier, defaultValue);
//     }
// 
//     @Override
//     public Optional<Integer> getLoadedValue(@NotNull World world) {
//         String value = ConfigManager.getInstance().getOption(world.getName(), getIdentifier());
//         if (value == null)
//             return Optional.empty();
// 
//         try {
//             return Optional.of(Integer.parseInt(value));
//         } catch (NumberFormatException e) {
//             return Optional.empty();
//         }
//     }
// 
//     @Override
//     public void setValue(@NotNull World world, String value) {
//         if (value == null) {
//             super.setValue(world, (String) null);
//             return;
//         }
// 
//         try {
//             Integer.parseInt(value); // Check if number
//             super.setValue(world, value);
//         } catch (NumberFormatException e) {
//             throw new IllegalArgumentException("Must be a number");
//         }
//     }
// 
//     @Override
//     public void setValue(@NotNull World world, String[] args) throws IllegalArgumentException {
//         setValue(world, String.join(" ", args));
//     }
// 
//     @Override
//     public List<String> getOptions() {
//         return null;
//     }
// }
// 
// Path: src/main/java/com/endercrest/voidspawn/options/OptionIdentifier.java
// public class OptionIdentifier<T> {
//     private final Class<T> type;
//     private final String name;
//     private final String description;
// 
//     public OptionIdentifier(Class<T> type, String name, String description) {
//         this.type = type;
//         this.name = name;
//         this.description = description;
//     }
// 
//     public Class<T> getType() {
//         return type;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// }
// 
// Path: src/main/java/com/endercrest/voidspawn/options/container/BasicOptionContainer.java
// public abstract class BasicOptionContainer implements OptionContainer {
//     private final Map<String, Option<?>> options = new HashMap<>();
// 
//     protected void attachOption(Option<?> option) {
//         options.put(option.getIdentifier().getName(), option);
//     }
// 
//     protected void detachOption(@NotNull OptionIdentifier<?> identifier) {
//         options.remove(identifier.getName());
//     }
// 
//     @SuppressWarnings("unchecked")
//     @Override
//     public @NotNull <T> Option<T> getOption(OptionIdentifier<T> identifier) {
//         Option<?> option = options.get(identifier.getName());
//         if (option == null || option.getType() != identifier.getType()) {
//             return new EmptyOption<>(identifier);
//         }
//         return (Option<T>) option;
//     }
// 
//     @Override
//     public @Nullable Option<?> getOption(String name) {
//         return options.get(name);
//     }
// 
//     @Override
//     public Collection<Option<?>> getOptions() {
//         return options.values();
//     }
// }


// Path: src/main/java/com/endercrest/voidspawn/detectors/BaseDetector.java
import com.endercrest.voidspawn.options.IntegerOption;
import com.endercrest.voidspawn.options.OptionIdentifier;
import com.endercrest.voidspawn.options.container.BasicOptionContainer;

package com.endercrest.voidspawn.detectors;


public abstract class BaseDetector extends BasicOptionContainer implements Detector {
    public static final OptionIdentifier<Integer> OPTION_VOID = new OptionIdentifier<>(Integer.class, "void_height", "The height to detect at (default just below the void)");

    public BaseDetector() {
        attachOption(new IntegerOption(OPTION_VOID));