From 1e2988990213ac9dd2e2a3f8e1160616343b7261 Mon Sep 17 00:00:00 2001 From: loki5512344 Date: Fri, 24 Apr 2026 10:31:43 +0200 Subject: [PATCH] =?UTF-8?q?refactor:=20split=20MineConfig=20and=20Mines=20?= =?UTF-8?q?classes=20(291=E2=86=92182,=20247=E2=86=92157=20lines)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Extract MineConfig.Builder → MineConfigBuilder (separate file) - Split Mines into 3 services: * MineFileManager - file operations * MineRepository - CRUD operations * MaskScanService - mask scanning logic - Fix imports: data.* → data.config.* Progress: 2/7 files >200 lines fixed --- .../loki/lomines/command/MaskCommands.java | 2 +- .../loki/lomines/core/MaskScanService.java | 50 ++++ src/main/java/com/loki/lomines/core/Mine.java | 2 +- .../loki/lomines/core/MineFileManager.java | 100 ++++++++ .../com/loki/lomines/core/MineRepository.java | 87 +++++++ .../java/com/loki/lomines/core/Mines.java | 214 +++++------------- .../loki/lomines/data/config/MineConfig.java | 179 +++------------ .../data/config/MineConfigBuilder.java | 128 +++++++++++ .../lomines/handler/MineBlockHandler.java | 2 +- .../lomines/handler/MineRewardHandler.java | 2 +- .../lomines/util/location/LocationParser.java | 2 +- 11 files changed, 467 insertions(+), 301 deletions(-) create mode 100644 src/main/java/com/loki/lomines/core/MaskScanService.java create mode 100644 src/main/java/com/loki/lomines/core/MineFileManager.java create mode 100644 src/main/java/com/loki/lomines/core/MineRepository.java create mode 100644 src/main/java/com/loki/lomines/data/config/MineConfigBuilder.java diff --git a/src/main/java/com/loki/lomines/command/MaskCommands.java b/src/main/java/com/loki/lomines/command/MaskCommands.java index fb4aafe..6cbe494 100644 --- a/src/main/java/com/loki/lomines/command/MaskCommands.java +++ b/src/main/java/com/loki/lomines/command/MaskCommands.java @@ -2,7 +2,7 @@ package com.loki.lomines.command; import com.loki.lomines.LoMinesPlugin; import com.loki.lomines.core.Mines; -import com.loki.lomines.data.ConfigParseException; +import com.loki.lomines.data.config.ConfigParseException; import dev.lolib.commands.annotation.Arg; import dev.lolib.commands.annotation.Command; import dev.lolib.commands.annotation.Subcommand; diff --git a/src/main/java/com/loki/lomines/core/MaskScanService.java b/src/main/java/com/loki/lomines/core/MaskScanService.java new file mode 100644 index 0000000..94b2ed3 --- /dev/null +++ b/src/main/java/com/loki/lomines/core/MaskScanService.java @@ -0,0 +1,50 @@ +package com.loki.lomines.core; + +import com.loki.lomines.data.config.ConfigParseException; +import com.loki.lomines.util.location.Cuboid; +import com.loki.lomines.util.selection.MaskScanner; +import org.bukkit.Location; +import org.bukkit.Material; + +import java.io.IOException; +import java.util.List; + +/** + * Service for scanning and saving mask positions. + */ +final class MaskScanService { + + private final MineRepository repository; + private final MineFileManager fileManager; + + MaskScanService(MineRepository repository, MineFileManager fileManager) { + this.repository = repository; + this.fileManager = fileManager; + } + + int scanAndSave(String mineName) throws IOException, ConfigParseException { + Mine mine = repository.get(mineName); + + Material marker = parseMarkerMaterial(mine.getConfig().getMaskMarkerMaterial()); + List regions = mine.getRegions(); + List found = MaskScanner.scan(regions, marker); + + fileManager.saveMaskPositions( + mineName, + mine.getConfig().getMaskMarkerMaterial(), + found + ); + + repository.reload(mineName); + + return found.size(); + } + + private Material parseMarkerMaterial(String materialName) { + try { + return Material.valueOf(materialName.toUpperCase()); + } catch (IllegalArgumentException e) { + return Material.PINK_CONCRETE; + } + } +} diff --git a/src/main/java/com/loki/lomines/core/Mine.java b/src/main/java/com/loki/lomines/core/Mine.java index 75920b8..72b6ab7 100644 --- a/src/main/java/com/loki/lomines/core/Mine.java +++ b/src/main/java/com/loki/lomines/core/Mine.java @@ -3,7 +3,7 @@ package com.loki.lomines.core; import com.loki.lomines.LoMinesPlugin; import com.loki.lomines.block.BlockSetter; import com.loki.lomines.data.FillMode; -import com.loki.lomines.data.MineConfig; +import com.loki.lomines.data.config.MineConfig; import com.loki.lomines.util.BlockKeys; import com.loki.lomines.handler.ActionBarHandler; import com.loki.lomines.handler.MineBlockHandler; diff --git a/src/main/java/com/loki/lomines/core/MineFileManager.java b/src/main/java/com/loki/lomines/core/MineFileManager.java new file mode 100644 index 0000000..8240088 --- /dev/null +++ b/src/main/java/com/loki/lomines/core/MineFileManager.java @@ -0,0 +1,100 @@ +package com.loki.lomines.core; + +import com.loki.lomines.data.config.ConfigLoader; +import com.loki.lomines.data.config.ConfigParseException; +import com.loki.lomines.data.config.MineConfig; +import com.loki.lomines.util.location.LocationParser; +import org.bukkit.Location; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Handles file operations for mine configurations. + */ +final class MineFileManager { + + private final Path minesFolder; + + MineFileManager(Path minesFolder) { + this.minesFolder = minesFolder; + } + + void ensureFolderExists() throws IOException { + if (!Files.exists(minesFolder)) { + Files.createDirectories(minesFolder); + } + } + + void createDefaultConfig(String name, Location corner1, Location corner2) throws IOException { + Path configFile = minesFolder.resolve(name + ".yml"); + YamlConfiguration yaml = new YamlConfiguration(); + + if (corner1 != null && corner2 != null) { + yaml.set("selection.1", LocationParser.format(corner1)); + yaml.set("selection.2", LocationParser.format(corner2)); + } else { + yaml.set("selection.1", "world;0;64;0;0;0"); + yaml.set("selection.2", "world;10;74;10;0;0"); + } + + yaml.set("contents.stone", 100.0); + yaml.set("reset.ticks", 6000); + yaml.set("reset.percent", 10.0); + yaml.set("reset-on-percent", false); + yaml.set("actionbar.enabled", true); + yaml.set("actionbar.message", "&aMine: %mine% | Blocks: %blocks%/%total% (%percent%%)"); + yaml.set("actionbar.range", 50.0); + yaml.set("timer-format", "mm:ss"); + yaml.set("teleport-on-reset", false); + yaml.set("broadcast-reset", ""); + yaml.set("reset-commands", new ArrayList()); + yaml.set("random-rewards", new ArrayList>()); + yaml.set("fill-mode", "cuboid"); + yaml.set("mask.marker", "pink_concrete"); + yaml.set("mask.positions", new ArrayList()); + + yaml.save(configFile.toFile()); + } + + MineConfig loadConfig(String name) throws IOException, ConfigParseException { + Path configFile = minesFolder.resolve(name + ".yml"); + if (!Files.exists(configFile)) { + throw new IOException("Mine config not found: " + configFile); + } + ConfigLoader loader = new ConfigLoader(); + return loader.load(configFile); + } + + void deleteConfig(String name) throws IOException { + Path configFile = minesFolder.resolve(name + ".yml"); + if (Files.exists(configFile)) { + Files.delete(configFile); + } + } + + void saveMaskPositions(String name, String markerMaterial, List positions) throws IOException { + Path configFile = minesFolder.resolve(name + ".yml"); + YamlConfiguration yaml = YamlConfiguration.loadConfiguration(configFile.toFile()); + + yaml.set("fill-mode", "mask"); + yaml.set("mask.marker", markerMaterial); + + List lines = new ArrayList<>(); + for (Location loc : positions) { + lines.add(LocationParser.format(loc)); + } + yaml.set("mask.positions", lines); + + yaml.save(configFile.toFile()); + } + + Path getMinesFolder() { + return minesFolder; + } +} diff --git a/src/main/java/com/loki/lomines/core/MineRepository.java b/src/main/java/com/loki/lomines/core/MineRepository.java new file mode 100644 index 0000000..55476e4 --- /dev/null +++ b/src/main/java/com/loki/lomines/core/MineRepository.java @@ -0,0 +1,87 @@ +package com.loki.lomines.core; + +import com.loki.lomines.LoMinesPlugin; +import com.loki.lomines.data.config.ConfigParseException; +import com.loki.lomines.data.config.MineConfig; +import org.bukkit.Location; + +import java.io.IOException; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Repository for managing mine instances. + */ +final class MineRepository { + + private final Map mines = new ConcurrentHashMap<>(); + private final LoMinesPlugin plugin; + private final MineFileManager fileManager; + + MineRepository(LoMinesPlugin plugin, MineFileManager fileManager) { + this.plugin = plugin; + this.fileManager = fileManager; + } + + void add(String name, Mine mine) { + mines.put(name.toLowerCase(), mine); + } + + Mine remove(String name) { + return mines.remove(name.toLowerCase()); + } + + Mine get(String name) { + Mine mine = mines.get(name.toLowerCase()); + if (mine == null) { + throw new IllegalArgumentException("Mine not found: " + name); + } + return mine; + } + + Optional find(String name) { + return Optional.ofNullable(mines.get(name.toLowerCase())); + } + + Collection getAll() { + return Collections.unmodifiableCollection(mines.values()); + } + + Optional findByLocation(Location location) { + return mines.values().stream() + .filter(mine -> mine.contains(location)) + .findFirst(); + } + + boolean exists(String name) { + return mines.containsKey(name.toLowerCase()); + } + + void clear() { + for (Mine mine : new ArrayList<>(mines.values())) { + mine.stop(); + } + mines.clear(); + } + + Mine createAndStart(String name, MineConfig config) { + Mine mine = new Mine(name, config, plugin); + add(name, mine); + mine.start(); + return mine; + } + + void stopAndRemove(String name) { + Mine mine = remove(name); + if (mine != null) { + mine.stop(); + } + } + + void reload(String name) throws IOException, ConfigParseException { + stopAndRemove(name); + MineConfig config = fileManager.loadConfig(name); + Mine mine = createAndStart(name, config); + plugin.loLogger().info("Reloaded mine: " + name); + } +} diff --git a/src/main/java/com/loki/lomines/core/Mines.java b/src/main/java/com/loki/lomines/core/Mines.java index e3d6fb6..28c1dfc 100644 --- a/src/main/java/com/loki/lomines/core/Mines.java +++ b/src/main/java/com/loki/lomines/core/Mines.java @@ -1,20 +1,15 @@ package com.loki.lomines.core; import com.loki.lomines.LoMinesPlugin; -import com.loki.lomines.data.ConfigLoader; -import com.loki.lomines.data.ConfigParseException; -import com.loki.lomines.data.MineConfig; -import com.loki.lomines.util.LocationParser; -import com.loki.lomines.util.MaskScanner; +import com.loki.lomines.data.config.ConfigParseException; +import com.loki.lomines.data.config.MineConfig; import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.configuration.file.YamlConfiguration; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; +import java.util.Collection; +import java.util.Optional; import java.util.stream.Stream; /** @@ -22,226 +17,141 @@ import java.util.stream.Stream; * Manages the lifecycle of mines including loading, creating, and deleting. */ public final class Mines { - - private final Map mines = new ConcurrentHashMap<>(); + private final LoMinesPlugin plugin; - private final Path minesFolder; - + private final MineFileManager fileManager; + private final MineRepository repository; + private final MaskScanService maskScanService; + public Mines(LoMinesPlugin plugin) { this.plugin = plugin; - this.minesFolder = plugin.getDataFolder().toPath().resolve("mines"); + Path minesFolder = plugin.getDataFolder().toPath().resolve("mines"); + this.fileManager = new MineFileManager(minesFolder); + this.repository = new MineRepository(plugin, fileManager); + this.maskScanService = new MaskScanService(repository, fileManager); } - + /** * Loads all mines from the mines/ folder. * Clears and replaces any previously loaded mines (used for full reload). */ public void loadAll() throws IOException { - for (Mine m : new ArrayList<>(mines.values())) { - m.stop(); - } - mines.clear(); - + repository.clear(); + + Path minesFolder = fileManager.getMinesFolder(); if (!Files.exists(minesFolder)) { return; } - - ConfigLoader loader = new ConfigLoader(); - + try (Stream paths = Files.list(minesFolder)) { paths.filter(path -> path.toString().endsWith(".yml")) - .forEach(configFile -> { - try { - String fileName = configFile.getFileName().toString(); - String mineName = fileName.substring(0, fileName.length() - 4); - - MineConfig config = loader.load(configFile); - Mine mine = new Mine(mineName, config, plugin); - - mines.put(mineName.toLowerCase(), mine); - mine.start(); - - plugin.loLogger().info("Loaded mine: " + mineName); - } catch (IOException | ConfigParseException e) { - plugin.loLogger().error("Failed to load mine from " + configFile.getFileName() + ": " + e.getMessage()); - } - }); + .forEach(configFile -> loadMineFromFile(configFile)); } } - + + private void loadMineFromFile(Path configFile) { + try { + String fileName = configFile.getFileName().toString(); + String mineName = fileName.substring(0, fileName.length() - 4); + + MineConfig config = fileManager.loadConfig(mineName); + repository.createAndStart(mineName, config); + + plugin.loLogger().info("Loaded mine: " + mineName); + } catch (IOException | ConfigParseException e) { + plugin.loLogger().error("Failed to load mine from " + configFile.getFileName() + ": " + e.getMessage()); + } + } + /** * Creates a new mine with the given name and default cuboid corners. */ public void create(String name) throws IOException { create(name, null, null); } - + /** * Creates a new mine; optional corners define {@code selection.1} and {@code selection.2} (same world required). */ public void create(String name, Location corner1, Location corner2) throws IOException { - String key = name.toLowerCase(); - if (mines.containsKey(key)) { + if (repository.exists(name)) { throw new IllegalArgumentException("Mine already exists: " + name); } if (corner1 != null && corner2 != null && !corner1.getWorld().equals(corner2.getWorld())) { throw new IllegalArgumentException("Selection corners must be in the same world"); } - - // Ensure mines folder exists - if (!Files.exists(minesFolder)) { - Files.createDirectories(minesFolder); - } - - // Create empty YAML configuration file - Path configFile = minesFolder.resolve(name + ".yml"); - YamlConfiguration yaml = new YamlConfiguration(); - - // Set default empty configuration - if (corner1 != null && corner2 != null) { - yaml.set("selection.1", LocationParser.format(corner1)); - yaml.set("selection.2", LocationParser.format(corner2)); - } else { - yaml.set("selection.1", "world;0;64;0;0;0"); - yaml.set("selection.2", "world;10;74;10;0;0"); - } - yaml.set("contents.stone", 100.0); - yaml.set("reset.ticks", 6000); - yaml.set("reset.percent", 10.0); - yaml.set("reset-on-percent", false); - yaml.set("actionbar.enabled", true); - yaml.set("actionbar.message", "&aMine: %mine% | Blocks: %blocks%/%total% (%percent%%)"); - yaml.set("actionbar.range", 50.0); - yaml.set("timer-format", "mm:ss"); - yaml.set("teleport-on-reset", false); - yaml.set("broadcast-reset", ""); - yaml.set("reset-commands", new ArrayList()); - yaml.set("random-rewards", new ArrayList>()); - yaml.set("fill-mode", "cuboid"); - yaml.set("mask.marker", "pink_concrete"); - yaml.set("mask.positions", new ArrayList()); - - yaml.save(configFile.toFile()); - - // Load the mine configuration - ConfigLoader loader = new ConfigLoader(); + + fileManager.ensureFolderExists(); + fileManager.createDefaultConfig(name, corner1, corner2); + MineConfig config; try { - config = loader.load(configFile); + config = fileManager.loadConfig(name); } catch (ConfigParseException e) { throw new IOException("Failed to parse created mine configuration: " + e.getMessage(), e); } - - // Create and register the mine - Mine mine = new Mine(name, config, plugin); - mines.put(key, mine); - mine.start(); - + + repository.createAndStart(name, config); plugin.loLogger().info("Created mine: " + name); } - + /** * Deletes a mine by name. */ public void delete(String name) throws IOException { - String key = name.toLowerCase(); - Mine mine = mines.remove(key); - + Mine mine = repository.remove(name); + if (mine == null) { throw new IllegalArgumentException("Mine not found: " + name); } - - // Stop the mine + mine.stop(); - - // Delete configuration file - Path configFile = minesFolder.resolve(name + ".yml"); - if (Files.exists(configFile)) { - Files.delete(configFile); - } + fileManager.deleteConfig(name); } - + /** * Gets a mine by name. * @throws IllegalArgumentException if mine not found */ public Mine get(String name) { - Mine mine = mines.get(name.toLowerCase()); - if (mine == null) { - throw new IllegalArgumentException("Mine not found: " + name); - } - return mine; + return repository.get(name); } - + /** * Finds a mine by name, returning Optional. */ public Optional find(String name) { - return Optional.ofNullable(mines.get(name.toLowerCase())); + return repository.find(name); } - + /** * Returns all mines. */ public Collection getAll() { - return Collections.unmodifiableCollection(mines.values()); + return repository.getAll(); } - + /** * Finds a mine that contains the given location. */ public Optional findByLocation(Location location) { - return mines.values().stream() - .filter(mine -> mine.contains(location)) - .findFirst(); + return repository.findByLocation(location); } - + /** * Scans cuboid regions for {@code mask.marker} blocks, writes {@code fill-mode: mask} and positions to disk, then reloads the mine. * Must run on the main thread (world access). */ public int scanAndSaveMask(String mineName) throws IOException, ConfigParseException { - Mine mine = get(mineName); - Material marker; - try { - marker = Material.valueOf(mine.getConfig().getMaskMarkerMaterial().toUpperCase()); - } catch (IllegalArgumentException e) { - marker = Material.PINK_CONCRETE; - } - List found = MaskScanner.scan(mine.getRegions(), marker); - Path configFile = minesFolder.resolve(mineName + ".yml"); - YamlConfiguration yaml = YamlConfiguration.loadConfiguration(configFile.toFile()); - yaml.set("fill-mode", "mask"); - yaml.set("mask.marker", mine.getConfig().getMaskMarkerMaterial()); - List lines = new ArrayList<>(); - for (Location loc : found) { - lines.add(LocationParser.format(loc)); - } - yaml.set("mask.positions", lines); - yaml.save(configFile.toFile()); - plugin.loLogger().info("Mask scan for '" + mineName + "': " + found.size() + " marker block(s)"); - reloadMine(mineName); - return found.size(); + int count = maskScanService.scanAndSave(mineName); + plugin.loLogger().info("Mask scan for '" + mineName + "': " + count + " marker block(s)"); + return count; } - + /** * Reloads one mine from disk (stop, replace instance, start tasks). */ public void reloadMine(String name) throws IOException, ConfigParseException { - String key = name.toLowerCase(); - Mine old = mines.remove(key); - if (old != null) { - old.stop(); - } - Path configFile = minesFolder.resolve(name + ".yml"); - if (!Files.exists(configFile)) { - throw new IOException("Mine config not found: " + configFile); - } - ConfigLoader loader = new ConfigLoader(); - MineConfig config = loader.load(configFile); - Mine mine = new Mine(name, config, plugin); - mines.put(key, mine); - mine.start(); - plugin.loLogger().info("Reloaded mine: " + name); + repository.reload(name); } } diff --git a/src/main/java/com/loki/lomines/data/config/MineConfig.java b/src/main/java/com/loki/lomines/data/config/MineConfig.java index 484f33c..74bf1f8 100644 --- a/src/main/java/com/loki/lomines/data/config/MineConfig.java +++ b/src/main/java/com/loki/lomines/data/config/MineConfig.java @@ -2,8 +2,6 @@ package com.loki.lomines.data.config; import org.bukkit.Location; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -14,64 +12,69 @@ import java.util.Objects; * Use the Builder pattern to create instances. */ public final class MineConfig { - + // Regions private final List selections; - + // Blocks private final Map blocks; - + /** How blocks are placed on reset. */ private final FillMode fillMode; /** Vanilla material name for {@link FillMode#MASK} scan (e.g. pink_concrete). */ private final String maskMarkerMaterial; /** Block centers for mask mode; ignored when {@link #fillMode} is {@link FillMode#CUBOID}. */ private final List maskPositions; - + // Rewards private final List rewards; - + // Reset private final int resetTicks; private final double resetPercent; private final boolean resetOnPercentEnabled; private final List resetCommands; private final String broadcastReset; - + // Teleportation private final boolean teleportOnReset; private final Location teleportLocation; - + // Action Bar private final boolean actionBarEnabled; private final String actionBarMessage; private final double actionBarRange; - + // Timer private final String timerFormat; - - private MineConfig(Builder builder) { - this.selections = List.copyOf(builder.selections); - this.blocks = Map.copyOf(builder.blocks); - this.fillMode = builder.fillMode; - this.maskMarkerMaterial = builder.maskMarkerMaterial; - this.maskPositions = List.copyOf(builder.maskPositions); - this.rewards = List.copyOf(builder.rewards); - this.resetTicks = builder.resetTicks; - this.resetPercent = builder.resetPercent; - this.resetOnPercentEnabled = builder.resetOnPercentEnabled; - this.resetCommands = List.copyOf(builder.resetCommands); - this.broadcastReset = builder.broadcastReset; - this.teleportOnReset = builder.teleportOnReset; - this.teleportLocation = builder.teleportLocation; - this.actionBarEnabled = builder.actionBarEnabled; - this.actionBarMessage = builder.actionBarMessage; - this.actionBarRange = builder.actionBarRange; - this.timerFormat = builder.timerFormat; + + MineConfig(List selections, Map blocks, FillMode fillMode, + String maskMarkerMaterial, List maskPositions, List rewards, + int resetTicks, double resetPercent, boolean resetOnPercentEnabled, + List resetCommands, String broadcastReset, boolean teleportOnReset, + Location teleportLocation, boolean actionBarEnabled, String actionBarMessage, + double actionBarRange, String timerFormat) { + this.selections = List.copyOf(selections); + this.blocks = Map.copyOf(blocks); + this.fillMode = fillMode; + this.maskMarkerMaterial = maskMarkerMaterial; + this.maskPositions = List.copyOf(maskPositions); + this.rewards = List.copyOf(rewards); + this.resetTicks = resetTicks; + this.resetPercent = resetPercent; + this.resetOnPercentEnabled = resetOnPercentEnabled; + this.resetCommands = List.copyOf(resetCommands); + this.broadcastReset = broadcastReset; + this.teleportOnReset = teleportOnReset; + this.teleportLocation = teleportLocation; + this.actionBarEnabled = actionBarEnabled; + this.actionBarMessage = actionBarMessage; + this.actionBarRange = actionBarRange; + this.timerFormat = timerFormat; } - - public static Builder builder() { - return new Builder(); + + public static MineConfigBuilder builder() { + return new MineConfigBuilder(); } // Getters @@ -176,116 +179,4 @@ public final class MineConfig { resetOnPercentEnabled, resetCommands, broadcastReset, teleportOnReset, teleportLocation, actionBarEnabled, actionBarMessage, actionBarRange, timerFormat); } - - public static final class Builder { - private List selections = new ArrayList<>(); - private Map blocks = new HashMap<>(); - private FillMode fillMode = FillMode.CUBOID; - private String maskMarkerMaterial = "pink_concrete"; - private List maskPositions = new ArrayList<>(); - private List rewards = new ArrayList<>(); - private int resetTicks = 6000; - private double resetPercent = 10.0; - private boolean resetOnPercentEnabled = false; - private List resetCommands = new ArrayList<>(); - private String broadcastReset = ""; - private boolean teleportOnReset = false; - private Location teleportLocation = null; - private boolean actionBarEnabled = true; - private String actionBarMessage = ""; - private double actionBarRange = 50.0; - private String timerFormat = "mm:ss"; - - private Builder() { - } - - public Builder selections(List selections) { - this.selections = new ArrayList<>(selections); - return this; - } - - public Builder blocks(Map blocks) { - this.blocks = new HashMap<>(blocks); - return this; - } - - public Builder fillMode(FillMode fillMode) { - this.fillMode = fillMode != null ? fillMode : FillMode.CUBOID; - return this; - } - - public Builder maskMarkerMaterial(String maskMarkerMaterial) { - this.maskMarkerMaterial = maskMarkerMaterial != null ? maskMarkerMaterial : "pink_concrete"; - return this; - } - - public Builder maskPositions(List maskPositions) { - this.maskPositions = maskPositions != null ? new ArrayList<>(maskPositions) : new ArrayList<>(); - return this; - } - - public Builder rewards(List rewards) { - this.rewards = new ArrayList<>(rewards); - return this; - } - - public Builder resetTicks(int resetTicks) { - this.resetTicks = resetTicks; - return this; - } - - public Builder resetPercent(double resetPercent) { - this.resetPercent = resetPercent; - return this; - } - - public Builder resetOnPercentEnabled(boolean resetOnPercentEnabled) { - this.resetOnPercentEnabled = resetOnPercentEnabled; - return this; - } - - public Builder resetCommands(List resetCommands) { - this.resetCommands = new ArrayList<>(resetCommands); - return this; - } - - public Builder broadcastReset(String broadcastReset) { - this.broadcastReset = broadcastReset; - return this; - } - - public Builder teleportOnReset(boolean teleportOnReset) { - this.teleportOnReset = teleportOnReset; - return this; - } - - public Builder teleportLocation(Location teleportLocation) { - this.teleportLocation = teleportLocation; - return this; - } - - public Builder actionBarEnabled(boolean actionBarEnabled) { - this.actionBarEnabled = actionBarEnabled; - return this; - } - - public Builder actionBarMessage(String actionBarMessage) { - this.actionBarMessage = actionBarMessage; - return this; - } - - public Builder actionBarRange(double actionBarRange) { - this.actionBarRange = actionBarRange; - return this; - } - - public Builder timerFormat(String timerFormat) { - this.timerFormat = timerFormat; - return this; - } - - public MineConfig build() { - return new MineConfig(this); - } - } } diff --git a/src/main/java/com/loki/lomines/data/config/MineConfigBuilder.java b/src/main/java/com/loki/lomines/data/config/MineConfigBuilder.java new file mode 100644 index 0000000..e3d4962 --- /dev/null +++ b/src/main/java/com/loki/lomines/data/config/MineConfigBuilder.java @@ -0,0 +1,128 @@ +package com.loki.lomines.data.config; + +import org.bukkit.Location; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Builder for creating immutable MineConfig instances. + */ +public final class MineConfigBuilder { + private List selections = new ArrayList<>(); + private Map blocks = new HashMap<>(); + private FillMode fillMode = FillMode.CUBOID; + private String maskMarkerMaterial = "pink_concrete"; + private List maskPositions = new ArrayList<>(); + private List rewards = new ArrayList<>(); + private int resetTicks = 6000; + private double resetPercent = 10.0; + private boolean resetOnPercentEnabled = false; + private List resetCommands = new ArrayList<>(); + private String broadcastReset = ""; + private boolean teleportOnReset = false; + private Location teleportLocation = null; + private boolean actionBarEnabled = true; + private String actionBarMessage = ""; + private double actionBarRange = 50.0; + private String timerFormat = "mm:ss"; + + MineConfigBuilder() { + } + + public MineConfigBuilder selections(List selections) { + this.selections = new ArrayList<>(selections); + return this; + } + + public MineConfigBuilder blocks(Map blocks) { + this.blocks = new HashMap<>(blocks); + return this; + } + + public MineConfigBuilder fillMode(FillMode fillMode) { + this.fillMode = fillMode != null ? fillMode : FillMode.CUBOID; + return this; + } + + public MineConfigBuilder maskMarkerMaterial(String maskMarkerMaterial) { + this.maskMarkerMaterial = maskMarkerMaterial != null ? maskMarkerMaterial : "pink_concrete"; + return this; + } + + public MineConfigBuilder maskPositions(List maskPositions) { + this.maskPositions = maskPositions != null ? new ArrayList<>(maskPositions) : new ArrayList<>(); + return this; + } + + public MineConfigBuilder rewards(List rewards) { + this.rewards = new ArrayList<>(rewards); + return this; + } + + public MineConfigBuilder resetTicks(int resetTicks) { + this.resetTicks = resetTicks; + return this; + } + + public MineConfigBuilder resetPercent(double resetPercent) { + this.resetPercent = resetPercent; + return this; + } + + public MineConfigBuilder resetOnPercentEnabled(boolean resetOnPercentEnabled) { + this.resetOnPercentEnabled = resetOnPercentEnabled; + return this; + } + + public MineConfigBuilder resetCommands(List resetCommands) { + this.resetCommands = new ArrayList<>(resetCommands); + return this; + } + + public MineConfigBuilder broadcastReset(String broadcastReset) { + this.broadcastReset = broadcastReset; + return this; + } + + public MineConfigBuilder teleportOnReset(boolean teleportOnReset) { + this.teleportOnReset = teleportOnReset; + return this; + } + + public MineConfigBuilder teleportLocation(Location teleportLocation) { + this.teleportLocation = teleportLocation; + return this; + } + + public MineConfigBuilder actionBarEnabled(boolean actionBarEnabled) { + this.actionBarEnabled = actionBarEnabled; + return this; + } + + public MineConfigBuilder actionBarMessage(String actionBarMessage) { + this.actionBarMessage = actionBarMessage; + return this; + } + + public MineConfigBuilder actionBarRange(double actionBarRange) { + this.actionBarRange = actionBarRange; + return this; + } + + public MineConfigBuilder timerFormat(String timerFormat) { + this.timerFormat = timerFormat; + return this; + } + + public MineConfig build() { + return new MineConfig( + selections, blocks, fillMode, maskMarkerMaterial, maskPositions, + rewards, resetTicks, resetPercent, resetOnPercentEnabled, + resetCommands, broadcastReset, teleportOnReset, teleportLocation, + actionBarEnabled, actionBarMessage, actionBarRange, timerFormat + ); + } +} diff --git a/src/main/java/com/loki/lomines/handler/MineBlockHandler.java b/src/main/java/com/loki/lomines/handler/MineBlockHandler.java index ef81ec4..90a856a 100644 --- a/src/main/java/com/loki/lomines/handler/MineBlockHandler.java +++ b/src/main/java/com/loki/lomines/handler/MineBlockHandler.java @@ -2,7 +2,7 @@ package com.loki.lomines.handler; import com.loki.lomines.LoMinesPlugin; import com.loki.lomines.core.Mine; -import com.loki.lomines.data.MineConfig; +import com.loki.lomines.data.config.MineConfig; import org.bukkit.block.Block; import org.bukkit.entity.Player; diff --git a/src/main/java/com/loki/lomines/handler/MineRewardHandler.java b/src/main/java/com/loki/lomines/handler/MineRewardHandler.java index 1b7bb4d..079ce5f 100644 --- a/src/main/java/com/loki/lomines/handler/MineRewardHandler.java +++ b/src/main/java/com/loki/lomines/handler/MineRewardHandler.java @@ -1,7 +1,7 @@ package com.loki.lomines.handler; import com.loki.lomines.LoMinesPlugin; -import com.loki.lomines.data.MineConfig; +import com.loki.lomines.data.config.MineConfig; import com.loki.lomines.data.Reward; import org.bukkit.Material; import org.bukkit.block.Block; diff --git a/src/main/java/com/loki/lomines/util/location/LocationParser.java b/src/main/java/com/loki/lomines/util/location/LocationParser.java index 0b25bf0..4485ca0 100644 --- a/src/main/java/com/loki/lomines/util/location/LocationParser.java +++ b/src/main/java/com/loki/lomines/util/location/LocationParser.java @@ -1,6 +1,6 @@ package com.loki.lomines.util.location; -import com.loki.lomines.data.ConfigParseException; +import com.loki.lomines.data.config.ConfigParseException; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World;