diff --git a/src/main/java/net/knarcraft/minigames/arena/Arena.java b/src/main/java/net/knarcraft/minigames/arena/Arena.java deleted file mode 100644 index 880a97c..0000000 --- a/src/main/java/net/knarcraft/minigames/arena/Arena.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.knarcraft.minigames.arena; - -import org.jetbrains.annotations.NotNull; - -import java.util.UUID; - -/** - * An interface describing all arenas - */ -public interface Arena { - - /** - * Gets the id of this arena - * - * @return
This arena's identifier
- */ - @NotNull UUID getArenaId(); - - /** - * Gets the name of this arena - * - * @returnThe name of this arena
- */ - @NotNull String getArenaName(); - - /** - * Gets this arena's sanitized name - * - * @returnThis arena's sanitized name
- */ - @NotNull String getArenaNameSanitized(); - -} diff --git a/src/main/java/net/knarcraft/minigames/arena/ArenaGameMode.java b/src/main/java/net/knarcraft/minigames/arena/ArenaGameMode.java index cc1130a..ebfdfdc 100644 --- a/src/main/java/net/knarcraft/minigames/arena/ArenaGameMode.java +++ b/src/main/java/net/knarcraft/minigames/arena/ArenaGameMode.java @@ -1,4 +1,8 @@ package net.knarcraft.minigames.arena; +/** + * An interface describing any arena game-mode + */ public interface ArenaGameMode { + } diff --git a/src/main/java/net/knarcraft/minigames/arena/dropper/DropperArena.java b/src/main/java/net/knarcraft/minigames/arena/dropper/DropperArena.java index 037e234..b2608d3 100644 --- a/src/main/java/net/knarcraft/minigames/arena/dropper/DropperArena.java +++ b/src/main/java/net/knarcraft/minigames/arena/dropper/DropperArena.java @@ -1,7 +1,6 @@ package net.knarcraft.minigames.arena.dropper; import net.knarcraft.minigames.MiniGames; -import net.knarcraft.minigames.arena.Arena; import net.knarcraft.minigames.arena.ArenaGameMode; import net.knarcraft.minigames.arena.ArenaRecordsRegistry; import net.knarcraft.minigames.config.DropperConfiguration; @@ -20,7 +19,7 @@ import static net.knarcraft.minigames.util.InputValidationHelper.isInvalid; /** * A representation of one dropper arena */ -public class DropperArena implements Arena { +public class DropperArena { /** * An unique and persistent identifier for this arena @@ -134,12 +133,20 @@ public class DropperArena implements Arena { return this.dropperArenaData; } - @Override + /** + * Gets the id of this arena + * + * @returnThis arena's identifier
+ */ public @NotNull UUID getArenaId() { return this.arenaId; } - @Override + /** + * Gets the name of this arena + * + * @returnThe name of this arena
+ */ public @NotNull String getArenaName() { return this.arenaName; } @@ -196,7 +203,11 @@ public class DropperArena implements Arena { return this.winBlockType; } - @Override + /** + * Gets this arena's sanitized name + * + * @returnThis arena's sanitized name
+ */ public @NotNull String getArenaNameSanitized() { return StringSanitizer.sanitizeArenaName(this.getArenaName()); } diff --git a/src/main/java/net/knarcraft/minigames/arena/dropper/DropperArenaGroup.java b/src/main/java/net/knarcraft/minigames/arena/dropper/DropperArenaGroup.java index b06f222..190bceb 100644 --- a/src/main/java/net/knarcraft/minigames/arena/dropper/DropperArenaGroup.java +++ b/src/main/java/net/knarcraft/minigames/arena/dropper/DropperArenaGroup.java @@ -114,7 +114,7 @@ public class DropperArenaGroup extends ArenaGroup { String name = (String) data.get("groupName"); ListThe location players spawn in when entering the arena
* @param exitLocationThe location the players are teleported to when exiting the arena, or null
* @param winBlockTypeThe material of the block players have to hit to win this parkour arena
+ * @param winLocationThe location a player has to reach to win this arena
* @param parkourArenaDataThe arena data keeping track of which players have done what in this arena
* @param arenaHandlerThe arena handler used for saving any changes
*/ public ParkourArena(@NotNull UUID arenaId, @NotNull String arenaName, @NotNull Location spawnLocation, - @Nullable Location exitLocation, @NotNull Material winBlockType, - @Nullable SetThe names of the types of blocks that cause a loss
+ */ + public @Nullable SetThe blocks that will cause players to lose
- * @returnTrue if successfully changed
+ * @param killPlaneBlockNamesThe names of the blocks that will cause players to lose
*/ - public boolean setKillPlaneBlocks(@NotNull SetThe set all parsed materials should be added to
- * @param materialNameThe material name that might be a material tag
- * @returnTrue if a tag was found
- */ - protected boolean parseMaterialTag(@NotNull SetThe arena groups to save
- * @throws IOExceptionIf unable to write to the file
- */ - public static void saveDropperArenaGroups(@NotNull SetThe loaded arena groups
- */ - public static @NotNull SetThe arenas to save
- * @throws IOExceptionIf unable to write to the file
- */ - public static void saveDropperArenas(@NotNull MapThe arenas to save
- * @throws IOExceptionIf unable to write to the file
- */ - public static void saveParkourArenas(@NotNull MapThe loaded arenas, or null if the arenas configuration section is missing.
- */ - public static @NotNull MapThe configuration section containing arena data
- * @returnThe loaded arena, or null if invalid
- */ - private static @Nullable DropperArena loadDropperArena(@NotNull ConfigurationSection configurationSection) { - UUID arenaId = ((SerializableUUID) configurationSection.get(DropperArenaStorageKey.ID.getKey(), - new SerializableUUID(UUID.randomUUID()))).getRawValue(); - String arenaName = configurationSection.getString(DropperArenaStorageKey.NAME.getKey()); - Location spawnLocation = (Location) configurationSection.get(DropperArenaStorageKey.SPAWN_LOCATION.getKey()); - Location exitLocation = (Location) configurationSection.get(DropperArenaStorageKey.EXIT_LOCATION.getKey()); - double verticalVelocity = configurationSection.getDouble(DropperArenaStorageKey.PLAYER_VERTICAL_VELOCITY.getKey()); - float horizontalVelocity = sanitizeHorizontalVelocity((float) configurationSection.getDouble( - DropperArenaStorageKey.PLAYER_HORIZONTAL_VELOCITY.getKey())); - SerializableMaterial winBlockType = (SerializableMaterial) configurationSection.get( - DropperArenaStorageKey.WIN_BLOCK_TYPE.getKey()); - - if (arenaName == null || spawnLocation == null) { - MiniGames.log(Level.SEVERE, "Could not load the arena at configuration " + - "section " + configurationSection.getName() + ". Please check the arenas storage file for issues."); - return null; - } - if (winBlockType == null) { - winBlockType = new SerializableMaterial(Material.WATER); - } - - DropperArenaData arenaData = loadDropperArenaData(arenaId); - if (arenaData == null) { - MiniGames.log(Level.SEVERE, "Unable to load arena data for " + arenaId); - - MapThe arena data to store
- */ - public static void saveParkourArenaData(@NotNull ParkourArenaData arenaData) throws IOException { - YamlConfiguration configuration = new YamlConfiguration(); - configuration.set(ParkourArenaStorageKey.DATA.getKey(), arenaData); - - configuration.save(getParkourArenaDataFile(arenaData.getArenaId())); - } - - /** - * Stores the given arena data to a file - * - * @param arenaDataThe arena data to store
- */ - public static void saveDropperArenaData(@NotNull DropperArenaData arenaData) throws IOException { - YamlConfiguration configuration = new YamlConfiguration(); - configuration.set(DropperArenaStorageKey.DATA.getKey(), arenaData); - - configuration.save(getDropperArenaDataFile(arenaData.getArenaId())); - } - - /** - * Loads arena data for the given arena id - * - * @param arenaIdThe id of the arena to get data for
- * @returnThe loaded arena data
- */ - private static @Nullable DropperArenaData loadDropperArenaData(@NotNull UUID arenaId) { - File arenaDataFile = getDropperArenaDataFile(arenaId); - YamlConfiguration configuration = YamlConfiguration.loadConfiguration(arenaDataFile); - return (DropperArenaData) configuration.get(DropperArenaStorageKey.DATA.getKey()); - } - - /** - * Loads arena data for the given arena id - * - * @param arenaIdThe id of the arena to get data for
- * @returnThe loaded arena data
- */ - private static @Nullable ParkourArenaData loadParkourArenaData(@NotNull UUID arenaId) { - File arenaDataFile = getParkourArenaDataFile(arenaId); - YamlConfiguration configuration = YamlConfiguration.loadConfiguration(arenaDataFile); - return (ParkourArenaData) configuration.get(ParkourArenaStorageKey.DATA.getKey()); - } - - /** - * Removes data for the arena with the given id - * - * @param arenaIdThe id of the arena to remove data for
- * @returnTrue if the data was successfully removed
- */ - public static boolean removeDropperArenaData(@NotNull UUID arenaId) { - return getDropperArenaDataFile(arenaId).delete(); - } - - /** - * Removes data for the arena with the given id - * - * @param arenaIdThe id of the arena to remove data for
- * @returnTrue if the data was successfully removed
- */ - public static boolean removeParkourArenaData(@NotNull UUID arenaId) { - return getParkourArenaDataFile(arenaId).delete(); - } - - /** - * Gets the file used to store the given arena id's data - * - * @param arenaIdThe id of the arena to get a data file for
- * @returnThe file the arena's data is/should be stored in
- */ - private static @NotNull File getDropperArenaDataFile(@NotNull UUID arenaId) { - return getArenaDataFile(dropperArenaDataFolder, arenaId); - } - - /** - * Gets the file used to store the given arena id's data - * - * @param arenaIdThe id of the arena to get a data file for
- * @returnThe file the arena's data is/should be stored in
- */ - private static @NotNull File getParkourArenaDataFile(@NotNull UUID arenaId) { - return getArenaDataFile(parkourArenaDataFolder, arenaId); - } - /** * Gets the file used to store the given arena id's data * @@ -307,7 +20,7 @@ public final class ArenaStorageHelper { * @param arenaIdThe id of the arena to get a data file for
* @returnThe file the arena's data is/should be stored in
*/ - private static @NotNull File getArenaDataFile(File root, @NotNull UUID arenaId) { + static @NotNull File getArenaDataFile(File root, @NotNull UUID arenaId) { File arenaDataFile = new File(root, arenaId + ".yml"); if (!root.exists() && !root.mkdirs()) { MiniGames.log(Level.SEVERE, "Unable to create the arena data directories"); @@ -315,20 +28,4 @@ public final class ArenaStorageHelper { return arenaDataFile; } - /** - * Sanitizes the given horizontal velocity to make sure it doesn't leave its bounds - * - * @param horizontalVelocityThe horizontal velocity to sanitize
- * @returnThe sanitized horizontal velocity
- */ - private static float sanitizeHorizontalVelocity(float horizontalVelocity) { - if (horizontalVelocity < -1) { - return -1; - } else if (horizontalVelocity > 1) { - return 1; - } else { - return horizontalVelocity; - } - } - } diff --git a/src/main/java/net/knarcraft/minigames/util/DropperArenaStorageHelper.java b/src/main/java/net/knarcraft/minigames/util/DropperArenaStorageHelper.java new file mode 100644 index 0000000..b158669 --- /dev/null +++ b/src/main/java/net/knarcraft/minigames/util/DropperArenaStorageHelper.java @@ -0,0 +1,257 @@ +package net.knarcraft.minigames.util; + +import net.knarcraft.minigames.MiniGames; +import net.knarcraft.minigames.arena.ArenaGameMode; +import net.knarcraft.minigames.arena.ArenaRecordsRegistry; +import net.knarcraft.minigames.arena.dropper.DropperArena; +import net.knarcraft.minigames.arena.dropper.DropperArenaData; +import net.knarcraft.minigames.arena.dropper.DropperArenaGameMode; +import net.knarcraft.minigames.arena.dropper.DropperArenaGroup; +import net.knarcraft.minigames.arena.dropper.DropperArenaRecordsRegistry; +import net.knarcraft.minigames.arena.dropper.DropperArenaStorageKey; +import net.knarcraft.minigames.container.SerializableMaterial; +import net.knarcraft.minigames.container.SerializableUUID; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.logging.Level; + +import static net.knarcraft.minigames.util.ArenaStorageHelper.getArenaDataFile; + +/** + * A helper class for saving and loading arenas + */ +public final class DropperArenaStorageHelper { + + private final static File dataFolder = MiniGames.getInstance().getDataFolder(); + private final static String dropperArenasConfigurationSection = "dropperArenas"; + private final static String dropperGroupsConfigurationSection = "dropperGroups"; + private static final File dropperArenaFile = new File(dataFolder, "dropper_arenas.yml"); + private static final File dropperGroupFile = new File(dataFolder, "dropper_groups.yml"); + private static final File dropperArenaDataFolder = new File(dataFolder, "dropper_arena_data"); + + private DropperArenaStorageHelper() { + + } + + /** + * Saves the given dropper arena groups + * + * @param arenaGroupsThe arena groups to save
+ * @throws IOExceptionIf unable to write to the file
+ */ + public static void saveDropperArenaGroups(@NotNull SetThe loaded arena groups
+ */ + public static @NotNull SetThe arenas to save
+ * @throws IOExceptionIf unable to write to the file
+ */ + public static void saveDropperArenas(@NotNull MapThe loaded arenas, or null if the arenas configuration section is missing.
+ */ + public static @NotNull MapThe configuration section containing arena data
+ * @returnThe loaded arena, or null if invalid
+ */ + private static @Nullable DropperArena loadDropperArena(@NotNull ConfigurationSection configurationSection) { + UUID arenaId = ((SerializableUUID) configurationSection.get(DropperArenaStorageKey.ID.getKey(), + new SerializableUUID(UUID.randomUUID()))).getRawValue(); + String arenaName = configurationSection.getString(DropperArenaStorageKey.NAME.getKey()); + Location spawnLocation = (Location) configurationSection.get(DropperArenaStorageKey.SPAWN_LOCATION.getKey()); + Location exitLocation = (Location) configurationSection.get(DropperArenaStorageKey.EXIT_LOCATION.getKey()); + double verticalVelocity = configurationSection.getDouble(DropperArenaStorageKey.PLAYER_VERTICAL_VELOCITY.getKey()); + float horizontalVelocity = sanitizeHorizontalVelocity((float) configurationSection.getDouble( + DropperArenaStorageKey.PLAYER_HORIZONTAL_VELOCITY.getKey())); + SerializableMaterial winBlockType = (SerializableMaterial) configurationSection.get( + DropperArenaStorageKey.WIN_BLOCK_TYPE.getKey()); + + if (arenaName == null || spawnLocation == null) { + MiniGames.log(Level.SEVERE, "Could not load the arena at configuration " + + "section " + configurationSection.getName() + ". Please check the dropper_arenas storage file for issues."); + return null; + } + if (winBlockType == null) { + winBlockType = new SerializableMaterial(Material.WATER); + } + + // Generate new, empty arena data if not available + DropperArenaData arenaData = loadDropperArenaData(arenaId); + if (arenaData == null) { + MiniGames.log(Level.SEVERE, "Unable to load arena data for dropper arena" + arenaId); + arenaData = getEmptyDropperData(arenaId); + } + + return new DropperArena(arenaId, arenaName, spawnLocation, exitLocation, verticalVelocity, horizontalVelocity, + winBlockType.getRawValue(), arenaData, MiniGames.getInstance().getDropperArenaHandler()); + } + + /** + * Gets empty dropper data + * + * @param arenaIdThe id to get parkour data for
+ * @returnEmpty parkour data
+ */ + private static @NotNull DropperArenaData getEmptyDropperData(@NotNull UUID arenaId) { + MapThe arena data to store
+ */ + public static void saveDropperArenaData(@NotNull DropperArenaData arenaData) throws IOException { + YamlConfiguration configuration = new YamlConfiguration(); + configuration.set(DropperArenaStorageKey.DATA.getKey(), arenaData); + + configuration.save(getDropperArenaDataFile(arenaData.getArenaId())); + } + + /** + * Loads arena data for the given arena id + * + * @param arenaIdThe id of the arena to get data for
+ * @returnThe loaded arena data
+ */ + private static @Nullable DropperArenaData loadDropperArenaData(@NotNull UUID arenaId) { + File arenaDataFile = getDropperArenaDataFile(arenaId); + YamlConfiguration configuration = YamlConfiguration.loadConfiguration(arenaDataFile); + return (DropperArenaData) configuration.get(DropperArenaStorageKey.DATA.getKey()); + } + + /** + * Removes data for the arena with the given id + * + * @param arenaIdThe id of the arena to remove data for
+ * @returnTrue if the data was successfully removed
+ */ + public static boolean removeDropperArenaData(@NotNull UUID arenaId) { + return getDropperArenaDataFile(arenaId).delete(); + } + + /** + * Gets the file used to store the given arena id's data + * + * @param arenaIdThe id of the arena to get a data file for
+ * @returnThe file the arena's data is/should be stored in
+ */ + private static @NotNull File getDropperArenaDataFile(@NotNull UUID arenaId) { + return getArenaDataFile(dropperArenaDataFolder, arenaId); + } + + /** + * Sanitizes the given horizontal velocity to make sure it doesn't leave its bounds + * + * @param horizontalVelocityThe horizontal velocity to sanitize
+ * @returnThe sanitized horizontal velocity
+ */ + private static float sanitizeHorizontalVelocity(float horizontalVelocity) { + if (horizontalVelocity < -1) { + return -1; + } else if (horizontalVelocity > 1) { + return 1; + } else { + return horizontalVelocity; + } + } + +} diff --git a/src/main/java/net/knarcraft/minigames/util/MaterialHelper.java b/src/main/java/net/knarcraft/minigames/util/MaterialHelper.java new file mode 100644 index 0000000..821ba9a --- /dev/null +++ b/src/main/java/net/knarcraft/minigames/util/MaterialHelper.java @@ -0,0 +1,76 @@ +package net.knarcraft.minigames.util; + +import net.knarcraft.minigames.MiniGames; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.Tag; +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.logging.Level; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * A helper class for dealing with and parsing materials + */ +public final class MaterialHelper { + + private MaterialHelper() { + + } + + /** + * Loads the materials specified in the block whitelist + */ + public static @NotNull SetThe set all parsed materials should be added to
+ * @param materialNameThe material name that might be a material tag
+ * @returnTrue if a tag was found
+ */ + private static boolean parseMaterialTag(@NotNull SetThe arena groups to save
+ * @throws IOExceptionIf unable to write to the file
+ */ + public static void saveParkourArenaGroups(@NotNull SetThe loaded arena groups
+ */ + public static @NotNull SetThe arenas to save
+ * @throws IOExceptionIf unable to write to the file
+ */ + public static void saveParkourArenas(@NotNull MapThe loaded arenas, or null if the arenas configuration section is missing.
+ */ + public static @NotNull MapThe configuration section containing arena data
+ * @returnThe loaded arena, or null if invalid
+ */ + @SuppressWarnings("unchecked") + private static @Nullable ParkourArena loadParkourArena(@NotNull ConfigurationSection configurationSection) { + UUID arenaId = ((SerializableUUID) configurationSection.get(ParkourArenaStorageKey.ID.getKey(), + new SerializableUUID(UUID.randomUUID()))).getRawValue(); + String arenaName = configurationSection.getString(ParkourArenaStorageKey.NAME.getKey()); + Location spawnLocation = (Location) configurationSection.get(ParkourArenaStorageKey.SPAWN_LOCATION.getKey()); + Location exitLocation = (Location) configurationSection.get(ParkourArenaStorageKey.EXIT_LOCATION.getKey()); + Location winLocation = (Location) configurationSection.get(ParkourArenaStorageKey.WIN_LOCATION.getKey()); + SerializableMaterial winBlockType = (SerializableMaterial) configurationSection.get( + ParkourArenaStorageKey.WIN_BLOCK_TYPE.getKey()); + List> killPlaneBlockNames = configurationSection.getList(ParkourArenaStorageKey.KILL_PLANE_BLOCKS.getKey()); + ListThe id to get parkour data for
+ * @returnEmpty parkour data
+ */ + private static @NotNull ParkourArenaData getEmptyParkourData(@NotNull UUID arenaId) { + MapThe arena data to store
+ */ + public static void saveParkourArenaData(@NotNull ParkourArenaData arenaData) throws IOException { + YamlConfiguration configuration = new YamlConfiguration(); + configuration.set(ParkourArenaStorageKey.DATA.getKey(), arenaData); + + configuration.save(getParkourArenaDataFile(arenaData.getArenaId())); + } + + /** + * Loads arena data for the given arena id + * + * @param arenaIdThe id of the arena to get data for
+ * @returnThe loaded arena data
+ */ + private static @Nullable ParkourArenaData loadParkourArenaData(@NotNull UUID arenaId) { + File arenaDataFile = getParkourArenaDataFile(arenaId); + YamlConfiguration configuration = YamlConfiguration.loadConfiguration(arenaDataFile); + return (ParkourArenaData) configuration.get(ParkourArenaStorageKey.DATA.getKey()); + } + + /** + * Removes data for the arena with the given id + * + * @param arenaIdThe id of the arena to remove data for
+ * @returnTrue if the data was successfully removed
+ */ + public static boolean removeParkourArenaData(@NotNull UUID arenaId) { + return getParkourArenaDataFile(arenaId).delete(); + } + + /** + * Gets the file used to store the given arena id's data + * + * @param arenaIdThe id of the arena to get a data file for
+ * @returnThe file the arena's data is/should be stored in
+ */ + private static @NotNull File getParkourArenaDataFile(@NotNull UUID arenaId) { + return getArenaDataFile(parkourArenaDataFolder, arenaId); + } + +}