// Path: src/main/java/com/endercrest/voidspawn/TeleportResult.java
// public enum TeleportResult {
//     SUCCESS("", false),
//     INVALID_WORLD("Invalid world", true),
//     MISSING_ISLAND_DEPEND("Missing skyblock plugin dependency", true),
//     MISSING_ISLAND("No island found", false),
//     INCOMPLETE_MODE("Mode has not been setup completely", true),
//     FAILED_COMMAND("Command failed", true),
//     MODE_DISABLED("The current mode is disabled!", true);
// 
//     private final String message;
//     private final boolean error;
// 
//     TeleportResult(String message, boolean error) {
//         this.message = message;
//         this.error = error;
//     }
// 
//     public String getMessage() {
//         return message;
//     }
// 
//     public Boolean isError() {
//         return error;
//     }
// }
// 
// Path: src/main/java/com/endercrest/voidspawn/options/BooleanOption.java
// public class BooleanOption extends BaseOption<Boolean> {
//     private static final List<String> options = Collections.unmodifiableList(new ArrayList<String>() {{
//         add("true");
//         add("false");
//     }});
// 
//     public BooleanOption(OptionIdentifier<Boolean> identifier) {
//         super(identifier);
//     }
// 
//     public BooleanOption(OptionIdentifier<Boolean> identifier, Boolean defaultValue) {
//         super(identifier, defaultValue);
//     }
// 
//     @Override
//     public Optional<Boolean> getLoadedValue(@NotNull World world) {
//         String value = ConfigManager.getInstance().getOption(world.getName(), getIdentifier());
//         if (value == null)
//             return Optional.empty();
// 
//         if (options.contains(value)) {
//             return Optional.of(Boolean.valueOf(value));
//         }
//         return Optional.empty();
//     }
// 
//     @Override
//     public void setValue(@NotNull World world, String[] args) throws IllegalArgumentException {
//         setValue(world, String.join(" ", args));
//     }
// 
//     @Override
//     public List<String> getOptions() {
//         return options;
//     }
// }
// 
// 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/modes/status/Status.java
// public class Status {
//     private final Type type;
//     private final String message;
// 
//     public Status(Type type, String message) {
//         this.type = type;
//         this.message = message;
//     }
// 
//     public Type getType() {
//         return type;
//     }
// 
//     public String getMessage() {
//         return message;
//     }
// 
//     public enum Type {
//         COMPLETE("[&a+&f]"),
//         INCOMPLETE("[&cx&f]"),
//         INFO("[&b@&f]"),
//         UNSET("[&7-&f]");
// 
//         private String symbol;
// 
//         Type(String symbol) {
//             this.symbol = symbol;
//         }
// 
//         public String getSymbol() {
//             return symbol;
//         }
//     }
// }


import com.endercrest.voidspawn.TeleportResult;
import com.endercrest.voidspawn.options.BooleanOption;
import com.endercrest.voidspawn.options.IntegerOption;
import com.endercrest.voidspawn.options.OptionIdentifier;
import com.endercrest.voidspawn.modes.status.Status;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import java.util.Optional;
package com.endercrest.voidspawn.modes;



public class LooperMode extends BaseMode {
    public static final OptionIdentifier<Integer> OPTION_VERTICAL_OFFSET = new OptionIdentifier<>(Integer.class, "vertical_offset", "The offset from the top of world to teleport the player");
    public static final OptionIdentifier<Boolean> OPTION_KEEP_VELOCITY = new OptionIdentifier<>(Boolean.class, "keep_velocity", "Whether the players velocity should be maintained after being teleported");

    public LooperMode() {
        attachOption(new IntegerOption(OPTION_VERTICAL_OFFSET));
        attachOption(new BooleanOption(OPTION_KEEP_VELOCITY, true));
    }

    @Override
// Path: src/main/java/com/endercrest/voidspawn/TeleportResult.java
// public enum TeleportResult {
//     SUCCESS("", false),
//     INVALID_WORLD("Invalid world", true),
//     MISSING_ISLAND_DEPEND("Missing skyblock plugin dependency", true),
//     MISSING_ISLAND("No island found", false),
//     INCOMPLETE_MODE("Mode has not been setup completely", true),
//     FAILED_COMMAND("Command failed", true),
//     MODE_DISABLED("The current mode is disabled!", true);
// 
//     private final String message;
//     private final boolean error;
// 
//     TeleportResult(String message, boolean error) {
//         this.message = message;
//         this.error = error;
//     }
// 
//     public String getMessage() {
//         return message;
//     }
// 
//     public Boolean isError() {
//         return error;
//     }
// }
// 
// Path: src/main/java/com/endercrest/voidspawn/options/BooleanOption.java
// public class BooleanOption extends BaseOption<Boolean> {
//     private static final List<String> options = Collections.unmodifiableList(new ArrayList<String>() {{
//         add("true");
//         add("false");
//     }});
// 
//     public BooleanOption(OptionIdentifier<Boolean> identifier) {
//         super(identifier);
//     }
// 
//     public BooleanOption(OptionIdentifier<Boolean> identifier, Boolean defaultValue) {
//         super(identifier, defaultValue);
//     }
// 
//     @Override
//     public Optional<Boolean> getLoadedValue(@NotNull World world) {
//         String value = ConfigManager.getInstance().getOption(world.getName(), getIdentifier());
//         if (value == null)
//             return Optional.empty();
// 
//         if (options.contains(value)) {
//             return Optional.of(Boolean.valueOf(value));
//         }
//         return Optional.empty();
//     }
// 
//     @Override
//     public void setValue(@NotNull World world, String[] args) throws IllegalArgumentException {
//         setValue(world, String.join(" ", args));
//     }
// 
//     @Override
//     public List<String> getOptions() {
//         return options;
//     }
// }
// 
// 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/modes/status/Status.java
// public class Status {
//     private final Type type;
//     private final String message;
// 
//     public Status(Type type, String message) {
//         this.type = type;
//         this.message = message;
//     }
// 
//     public Type getType() {
//         return type;
//     }
// 
//     public String getMessage() {
//         return message;
//     }
// 
//     public enum Type {
//         COMPLETE("[&a+&f]"),
//         INCOMPLETE("[&cx&f]"),
//         INFO("[&b@&f]"),
//         UNSET("[&7-&f]");
// 
//         private String symbol;
// 
//         Type(String symbol) {
//             this.symbol = symbol;
//         }
// 
//         public String getSymbol() {
//             return symbol;
//         }
//     }
// }


// Path: src/main/java/com/endercrest/voidspawn/modes/LooperMode.java
import com.endercrest.voidspawn.TeleportResult;
import com.endercrest.voidspawn.options.BooleanOption;
import com.endercrest.voidspawn.options.IntegerOption;
import com.endercrest.voidspawn.options.OptionIdentifier;
import com.endercrest.voidspawn.modes.status.Status;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import java.util.Optional;

package com.endercrest.voidspawn.modes;



public class LooperMode extends BaseMode {
    public static final OptionIdentifier<Integer> OPTION_VERTICAL_OFFSET = new OptionIdentifier<>(Integer.class, "vertical_offset", "The offset from the top of world to teleport the player");
    public static final OptionIdentifier<Boolean> OPTION_KEEP_VELOCITY = new OptionIdentifier<>(Boolean.class, "keep_velocity", "Whether the players velocity should be maintained after being teleported");

    public LooperMode() {
        attachOption(new IntegerOption(OPTION_VERTICAL_OFFSET));
        attachOption(new BooleanOption(OPTION_KEEP_VELOCITY, true));
    }

    @Override
    public TeleportResult onActivate(Player player, String worldName) {