diff --git a/src/main/java/net/knarcraft/minigames/arena/EditablePropertyType.java b/src/main/java/net/knarcraft/minigames/arena/EditablePropertyType.java new file mode 100644 index 0000000..6f07e87 --- /dev/null +++ b/src/main/java/net/knarcraft/minigames/arena/EditablePropertyType.java @@ -0,0 +1,43 @@ +package net.knarcraft.minigames.arena; + +/** + * The type of one editable property + */ +public enum EditablePropertyType { + + /** + * The property is a location + */ + LOCATION, + + /** + * The property is an arena name + */ + ARENA_NAME, + + /** + * The property is a horizontal velocity + */ + HORIZONTAL_VELOCITY, + + /** + * The property is a vertical velocity (fly speed) + */ + VERTICAL_VELOCITY, + + /** + * The property is a material that specifies a block + */ + BLOCK_TYPE, + + /** + * The property clears a checkpoint + */ + CHECKPOINT_CLEAR, + + /** + * The property is a comma-separated list of materials + */ + MATERIAL_LIST + +} diff --git a/src/main/java/net/knarcraft/minigames/arena/dropper/DropperArenaEditableProperty.java b/src/main/java/net/knarcraft/minigames/arena/dropper/DropperArenaEditableProperty.java index 9e77748..8dc6b5e 100644 --- a/src/main/java/net/knarcraft/minigames/arena/dropper/DropperArenaEditableProperty.java +++ b/src/main/java/net/knarcraft/minigames/arena/dropper/DropperArenaEditableProperty.java @@ -1,5 +1,6 @@ package net.knarcraft.minigames.arena.dropper; +import net.knarcraft.minigames.arena.EditablePropertyType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -13,45 +14,62 @@ public enum DropperArenaEditableProperty { /** * The name of the arena */ - NAME("name", DropperArena::getArenaName), + NAME("name", DropperArena::getArenaName, EditablePropertyType.ARENA_NAME), /** * The arena's spawn location */ - SPAWN_LOCATION("spawnLocation", (arena) -> String.valueOf(arena.getSpawnLocation())), + SPAWN_LOCATION("spawnLocation", (arena) -> String.valueOf(arena.getSpawnLocation()), + EditablePropertyType.LOCATION), /** * The arena's exit location */ - EXIT_LOCATION("exitLocation", (arena) -> String.valueOf(arena.getExitLocation())), + EXIT_LOCATION("exitLocation", (arena) -> String.valueOf(arena.getExitLocation()), + EditablePropertyType.LOCATION), /** * The arena's vertical velocity */ - VERTICAL_VELOCITY("verticalVelocity", (arena) -> String.valueOf(arena.getPlayerVerticalVelocity())), + VERTICAL_VELOCITY("verticalVelocity", (arena) -> String.valueOf(arena.getPlayerVerticalVelocity()), + EditablePropertyType.VERTICAL_VELOCITY), /** * The arena's horizontal velocity */ - HORIZONTAL_VELOCITY("horizontalVelocity", (arena) -> String.valueOf(arena.getPlayerHorizontalVelocity())), + HORIZONTAL_VELOCITY("horizontalVelocity", (arena) -> String.valueOf(arena.getPlayerHorizontalVelocity()), + EditablePropertyType.HORIZONTAL_VELOCITY), /** * The arena's win block type */ - WIN_BLOCK_TYPE("winBlockType", (arena) -> arena.getWinBlockType().toString()), + WIN_BLOCK_TYPE("winBlockType", (arena) -> arena.getWinBlockType().toString(), + EditablePropertyType.BLOCK_TYPE), ; private final @NotNull String argumentString; private final Function currentValueProvider; + private final EditablePropertyType propertyType; /** * Instantiates a new arena editable property * * @param argumentString

The argument string used to specify this property

*/ - DropperArenaEditableProperty(@NotNull String argumentString, Function currentValueProvider) { + DropperArenaEditableProperty(@NotNull String argumentString, Function currentValueProvider, + EditablePropertyType propertyType) { this.argumentString = argumentString; this.currentValueProvider = currentValueProvider; + this.propertyType = propertyType; + } + + /** + * Gets the type of property this editable property represents + * + * @return

The type of this property

+ */ + public EditablePropertyType getPropertyType() { + return this.propertyType; } /** diff --git a/src/main/java/net/knarcraft/minigames/arena/parkour/ParkourArenaEditableProperty.java b/src/main/java/net/knarcraft/minigames/arena/parkour/ParkourArenaEditableProperty.java index 06672c1..8e90c93 100644 --- a/src/main/java/net/knarcraft/minigames/arena/parkour/ParkourArenaEditableProperty.java +++ b/src/main/java/net/knarcraft/minigames/arena/parkour/ParkourArenaEditableProperty.java @@ -1,5 +1,6 @@ package net.knarcraft.minigames.arena.parkour; +import net.knarcraft.minigames.arena.EditablePropertyType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -13,22 +14,25 @@ public enum ParkourArenaEditableProperty { /** * The name of the arena */ - NAME("name", ParkourArena::getArenaName), + NAME("name", ParkourArena::getArenaName, EditablePropertyType.ARENA_NAME), /** * The arena's spawn location */ - SPAWN_LOCATION("spawnLocation", (arena) -> String.valueOf(arena.getSpawnLocation())), + SPAWN_LOCATION("spawnLocation", (arena) -> String.valueOf(arena.getSpawnLocation()), + EditablePropertyType.LOCATION), /** * The arena's exit location */ - EXIT_LOCATION("exitLocation", (arena) -> String.valueOf(arena.getExitLocation())), + EXIT_LOCATION("exitLocation", (arena) -> String.valueOf(arena.getExitLocation()), + EditablePropertyType.LOCATION), /** * The arena's win block type */ - WIN_BLOCK_TYPE("winBlockType", (arena) -> arena.getWinBlockType().toString()), + WIN_BLOCK_TYPE("winBlockType", (arena) -> arena.getWinBlockType().toString(), + EditablePropertyType.BLOCK_TYPE), /** * The arena's win location (overrides the win block type) @@ -39,35 +43,50 @@ public enum ParkourArenaEditableProperty { } else { return "null"; } - }), + }, EditablePropertyType.LOCATION), /** * The arena's check points. Specifically used for adding. */ - CHECKPOINT_ADD("checkpointAdd", (arena) -> String.valueOf(arena.getCheckpoints())), + CHECKPOINT_ADD("checkpointAdd", (arena) -> String.valueOf(arena.getCheckpoints()), + EditablePropertyType.LOCATION), /** * The arena's check points. Specifically used for clearing. */ - CHECKPOINT_CLEAR("checkpointClear", (arena) -> String.valueOf(arena.getCheckpoints())), + CHECKPOINT_CLEAR("checkpointClear", (arena) -> String.valueOf(arena.getCheckpoints()), + EditablePropertyType.CHECKPOINT_CLEAR), /** * The blocks constituting the arena's lethal blocks */ - KILL_PLANE_BLOCKS("killPlaneBlocks", (arena) -> String.valueOf(arena.getKillPlaneBlockNames())), + KILL_PLANE_BLOCKS("killPlaneBlocks", (arena) -> String.valueOf(arena.getKillPlaneBlockNames()), + EditablePropertyType.MATERIAL_LIST), ; private final @NotNull String argumentString; private final Function currentValueProvider; + private final EditablePropertyType propertyType; /** * Instantiates a new arena editable property * * @param argumentString

The argument string used to specify this property

*/ - ParkourArenaEditableProperty(@NotNull String argumentString, Function currentValueProvider) { + ParkourArenaEditableProperty(@NotNull String argumentString, Function currentValueProvider, + EditablePropertyType propertyType) { this.argumentString = argumentString; this.currentValueProvider = currentValueProvider; + this.propertyType = propertyType; + } + + /** + * Gets the type of property this editable property represents + * + * @return

The type of this property

+ */ + public EditablePropertyType getPropertyType() { + return this.propertyType; } /** diff --git a/src/main/java/net/knarcraft/minigames/command/dropper/EditDropperArenaTabCompleter.java b/src/main/java/net/knarcraft/minigames/command/dropper/EditDropperArenaTabCompleter.java index af5161b..2488606 100644 --- a/src/main/java/net/knarcraft/minigames/command/dropper/EditDropperArenaTabCompleter.java +++ b/src/main/java/net/knarcraft/minigames/command/dropper/EditDropperArenaTabCompleter.java @@ -1,5 +1,6 @@ package net.knarcraft.minigames.command.dropper; +import net.knarcraft.minigames.arena.dropper.DropperArenaEditableProperty; import net.knarcraft.minigames.util.TabCompleteHelper; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -25,8 +26,12 @@ public class EditDropperArenaTabCompleter implements TabCompleter { } else if (arguments.length == 2) { return filterMatchingContains(TabCompleteHelper.getDropperArenaProperties(), arguments[1]); } else if (arguments.length == 3) { - //TODO: Tab-complete possible values for the given property - return null; + DropperArenaEditableProperty property = DropperArenaEditableProperty.getFromArgumentString(arguments[1]); + if (property == null) { + return new ArrayList<>(); + } + return filterMatchingContains(TabCompleteHelper.getTabCompleteSuggestions(property.getPropertyType()), + arguments[2]); } else { return new ArrayList<>(); } diff --git a/src/main/java/net/knarcraft/minigames/command/parkour/EditParkourArenaTabCompleter.java b/src/main/java/net/knarcraft/minigames/command/parkour/EditParkourArenaTabCompleter.java index a6f5593..3a0a7f0 100644 --- a/src/main/java/net/knarcraft/minigames/command/parkour/EditParkourArenaTabCompleter.java +++ b/src/main/java/net/knarcraft/minigames/command/parkour/EditParkourArenaTabCompleter.java @@ -1,5 +1,6 @@ package net.knarcraft.minigames.command.parkour; +import net.knarcraft.minigames.arena.parkour.ParkourArenaEditableProperty; import net.knarcraft.minigames.util.TabCompleteHelper; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -25,8 +26,12 @@ public class EditParkourArenaTabCompleter implements TabCompleter { } else if (arguments.length == 2) { return filterMatchingContains(TabCompleteHelper.getParkourArenaProperties(), arguments[1]); } else if (arguments.length == 3) { - //TODO: Tab-complete possible values for the given property - return null; + ParkourArenaEditableProperty property = ParkourArenaEditableProperty.getFromArgumentString(arguments[1]); + if (property == null) { + return new ArrayList<>(); + } + return filterMatchingContains(TabCompleteHelper.getTabCompleteSuggestions(property.getPropertyType()), + arguments[2]); } else { return new ArrayList<>(); } diff --git a/src/main/java/net/knarcraft/minigames/util/TabCompleteHelper.java b/src/main/java/net/knarcraft/minigames/util/TabCompleteHelper.java index 65749d4..fee509a 100644 --- a/src/main/java/net/knarcraft/minigames/util/TabCompleteHelper.java +++ b/src/main/java/net/knarcraft/minigames/util/TabCompleteHelper.java @@ -3,18 +3,24 @@ package net.knarcraft.minigames.util; import net.knarcraft.minigames.MiniGames; import net.knarcraft.minigames.arena.Arena; import net.knarcraft.minigames.arena.ArenaHandler; +import net.knarcraft.minigames.arena.EditablePropertyType; import net.knarcraft.minigames.arena.dropper.DropperArenaEditableProperty; import net.knarcraft.minigames.arena.parkour.ParkourArenaEditableProperty; +import org.bukkit.Material; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * A helper-class for common tab-completions */ public final class TabCompleteHelper { + private static Map> tabCompleteSuggestions; + private TabCompleteHelper() { } @@ -93,4 +99,120 @@ public final class TabCompleteHelper { return configValues; } + /** + * Gets tab-complete suggestions for the given property type + * + * @param propertyType

The property type to get suggestions for

+ * @return

The suggestions produced

+ */ + public static List getTabCompleteSuggestions(EditablePropertyType propertyType) { + if (tabCompleteSuggestions == null) { + tabCompleteSuggestions = new HashMap<>(); + tabCompleteSuggestions.put(EditablePropertyType.LOCATION, getLocationSuggestions()); + tabCompleteSuggestions.put(EditablePropertyType.ARENA_NAME, getNameSuggestions()); + tabCompleteSuggestions.put(EditablePropertyType.HORIZONTAL_VELOCITY, getHorizontalVelocitySuggestions()); + tabCompleteSuggestions.put(EditablePropertyType.VERTICAL_VELOCITY, getVerticalVelocitySuggestions()); + tabCompleteSuggestions.put(EditablePropertyType.BLOCK_TYPE, getBlockTypeSuggestions()); + tabCompleteSuggestions.put(EditablePropertyType.CHECKPOINT_CLEAR, getCheckpointClearSuggestions()); + tabCompleteSuggestions.put(EditablePropertyType.MATERIAL_LIST, getMaterialListSuggestions()); + } + + return tabCompleteSuggestions.get(propertyType); + } + + /** + * Gets suggestions for a list of materials + * + * @return

A list of suggestions

+ */ + private static List getMaterialListSuggestions() { + List suggestions = new ArrayList<>(); + suggestions.add("LAVA,MAGMA_BLOCK"); + suggestions.add("WATER,MAGMA_BLOCK,LAVA,+BUTTONS,+CORALS"); + return suggestions; + } + + /** + * Gets suggestions for checkpointClear + * + * @return

A list of suggestions

+ */ + private static List getCheckpointClearSuggestions() { + List suggestions = new ArrayList<>(); + suggestions.add("true"); + return suggestions; + } + + /** + * Gets suggestions for a block material + * + * @return

A list of suggestions

+ */ + private static List getBlockTypeSuggestions() { + List materials = new ArrayList<>(); + for (Material material : Material.values()) { + if (material.isBlock()) { + materials.add(material.name()); + } + } + return materials; + } + + /** + * Gets suggestions for a vertical velocity + * + * @return

A list of suggestions

+ */ + private static List getVerticalVelocitySuggestions() { + List velocities = new ArrayList<>(); + velocities.add("0.01"); + velocities.add("0.5"); + velocities.add("1"); + velocities.add("3"); + velocities.add("10"); + velocities.add("30"); + velocities.add("75"); + return velocities; + } + + /** + * Gets suggestions for a horizontal velocity + * + * @return

A list of suggestions

+ */ + private static List getHorizontalVelocitySuggestions() { + List velocities = new ArrayList<>(); + velocities.add("0.01"); + velocities.add("0.1"); + velocities.add("0.5"); + velocities.add("1"); + return velocities; + } + + /** + * Gets suggestions for an arena name + * + * @return

A list of suggestions

+ */ + private static List getNameSuggestions() { + List locations = new ArrayList<>(); + locations.add("DropperArena1"); + locations.add("DropperArena2"); + locations.add("ParkourArena1"); + locations.add("ParkourArena2"); + return locations; + } + + /** + * Gets suggestions for a location + * + * @return

A list of suggestions

+ */ + private static List getLocationSuggestions() { + List locations = new ArrayList<>(); + locations.add("here"); + locations.add("x,y,z"); + return locations; + } + }