diff --git a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdGenerate.kt b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdGenerate.kt index a42df39..7f20270 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdGenerate.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdGenerate.kt @@ -41,36 +41,40 @@ class CmdGenerate(private val chunkmaster: Chunkmaster) : Subcommand { */ override fun execute(sender: CommandSender, args: List): Boolean { var worldName = "" - var blockRadius = -1 + var blockRadius: Pair = Pair(-1, 0) var shape = "square" if (sender is Player) { worldName = sender.world.name } if (args.isEmpty()) { - if (sender is Player) { - return createTask(sender, worldName, blockRadius, shape) + return if (sender is Player) { + createTask(sender, worldName, blockRadius.first, blockRadius.second, shape) } else { sender.sendMessage(chunkmaster.langManager.getLocalized("WORLD_NAME_REQUIRED")) - return false + false } } - if (args[0].toIntOrNull() != null && sender.server.worlds.find { it.name == args[0] } == null) { + + var parsedRadius = parseRadius(args[0]) + + if (parsedRadius != null && sender.server.worlds.find { it.name == args[0] } == null) { if (sender !is Player) { sender.sendMessage(chunkmaster.langManager.getLocalized("WORLD_NAME_REQUIRED")) return false } - blockRadius = args[0].toInt() + blockRadius = parsedRadius } else { worldName = args[0] } if (args.size == 1) { - return createTask(sender, worldName, blockRadius, shape) + return createTask(sender, worldName, blockRadius.first, blockRadius.second, shape) } + parsedRadius = parseRadius(args[1]) when { - args[1].toIntOrNull() != null -> blockRadius = args[1].toInt() + parsedRadius != null -> blockRadius = parsedRadius args[1] in shapes -> shape = args[1] else -> { sender.sendMessage(chunkmaster.langManager.getLocalized("INVALID_ARGUMENT", 2, args[1])) @@ -78,7 +82,7 @@ class CmdGenerate(private val chunkmaster: Chunkmaster) : Subcommand { } } if (args.size == 2) { - return createTask(sender, worldName, blockRadius, shape) + return createTask(sender, worldName, blockRadius.first, blockRadius.second, shape) } if (args[2] in shapes) { shape = args[2] @@ -87,24 +91,29 @@ class CmdGenerate(private val chunkmaster: Chunkmaster) : Subcommand { return false } - return createTask(sender, worldName, blockRadius, shape) + return createTask(sender, worldName, blockRadius.first, blockRadius.second, shape) } /** * Creates the task with the given arguments. */ - private fun createTask(sender: CommandSender, worldName: String, blockRadius: Int, shape: String): Boolean { + private fun createTask(sender: CommandSender, worldName: String, blockRadius: Int, startRadius: Int, shape: String): Boolean { val world = chunkmaster.server.getWorld(worldName) val allTasks = chunkmaster.generationManager.allTasks + return if (world != null && (allTasks.find { it.generationTask.world == world }) == null) { - chunkmaster.generationManager.addTask(world, if (blockRadius > 0) blockRadius / 16 else -1, shape) + chunkmaster.generationManager.addTask(world, if (blockRadius > 0) blockRadius / 16 else -1, shape, startRadius/16) sender.sendMessage( chunkmaster.langManager .getLocalized( "TASK_CREATION_SUCCESS", worldName, if (blockRadius > 0) { - chunkmaster.langManager.getLocalized("TASK_UNIT_RADIUS", blockRadius) + chunkmaster.langManager.getLocalized("TASK_UNIT_RADIUS", blockRadius) + if (startRadius > 0) { + chunkmaster.langManager.getLocalized("TASK_CREATION_STARTING_AT", startRadius) + } else { + "" + } } else { chunkmaster.langManager.getLocalized("TASK_UNIT_WORLDBORDER") }, @@ -120,4 +129,26 @@ class CmdGenerate(private val chunkmaster: Chunkmaster) : Subcommand { return false } } + + /** + * Tries to parse a radius that can also be a range + */ + private fun parseRadius(arg: String): Pair? { + val radiusRegex = Regex("^(\\d+)(-(\\d+))?\$") + val matches = radiusRegex.matchEntire(arg) + + if (matches != null) { + val firstRadius = matches.groupValues[1].toInt() + var radius = Pair(firstRadius, firstRadius) + + if (matches.groupValues.size >2) { + radius = Pair(matches.groupValues[3].toInt(), firstRadius) + } + if (radius.first < radius.second) { + return null + } + return radius + } + return null + } } \ No newline at end of file diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationManager.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationManager.kt index c804fed..35efdd4 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationManager.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationManager.kt @@ -5,6 +5,7 @@ import net.trivernis.chunkmaster.lib.generation.taskentry.PausedTaskEntry import net.trivernis.chunkmaster.lib.generation.taskentry.RunningTaskEntry import net.trivernis.chunkmaster.lib.generation.taskentry.TaskEntry import net.trivernis.chunkmaster.lib.shapes.Circle +import net.trivernis.chunkmaster.lib.shapes.Shape import net.trivernis.chunkmaster.lib.shapes.Square import org.bukkit.Server import org.bukkit.World @@ -58,18 +59,31 @@ class GenerationManager(private val chunkmaster: Chunkmaster, private val server /** * Adds a generation task */ - fun addTask(world: World, radius: Int = -1, shape: String = "square"): Int { + fun addTask(world: World, radius: Int = -1, shape: String = "square", startRadius: Int = 0): Int { val foundTask = allTasks.find { it.generationTask.world == world } if (foundTask == null) { val center = worldProperties.getWorldCenter(world.name).join() + val centerChunk = if (center == null) { ChunkCoordinates(world.spawnLocation.chunk.x, world.spawnLocation.chunk.z) } else { ChunkCoordinates(center.first, center.second) } - val generationTask = createGenerationTask(world, centerChunk, centerChunk, radius, shape, null) + val shapeInstance = stringToShape(shape, centerChunk, centerChunk, radius) + var startCoordinates = Pair(centerChunk.x, centerChunk.z) + + if (startRadius > 0) { + println(startRadius) + + while (shapeInstance.currentRadius() != startRadius) { + startCoordinates = shapeInstance.next() + println(shapeInstance.currentRadius()) + } + } + + val generationTask = createGenerationTask(world, centerChunk, ChunkCoordinates(startCoordinates.first, startCoordinates.second), radius, shape, null) val id = generationTasks.addGenerationTask(world.name, centerChunk, radius, shape).join() generationTask.onEndReached { @@ -364,11 +378,7 @@ class GenerationManager(private val chunkmaster: Chunkmaster, private val server shapeName: String, pendingChunks: List? ): GenerationTask { - val shape = when (shapeName) { - "circle" -> Circle(Pair(center.x, center.z), Pair(start.x, start.z), radius) - "square" -> Square(Pair(center.x, center.z), Pair(start.x, start.z), radius) - else -> Square(Pair(center.x, center.z), Pair(start.x, start.z), radius) - } + val shape = stringToShape(shapeName, center, start, radius) return DefaultGenerationTask( chunkmaster, @@ -380,4 +390,18 @@ class GenerationManager(private val chunkmaster: Chunkmaster, private val server TaskState.GENERATING ) } + + private fun stringToShape( + shapeName: String, + center: ChunkCoordinates, + start: ChunkCoordinates, + radius: Int + ): Shape { + val shape = when (shapeName) { + "circle" -> Circle(Pair(center.x, center.z), Pair(start.x, start.z), radius) + "square" -> Square(Pair(center.x, center.z), Pair(start.x, start.z), radius) + else -> Square(Pair(center.x, center.z), Pair(start.x, start.z), radius) + } + return shape + } } \ No newline at end of file diff --git a/src/main/resources/i18n/DEFAULT.i18n.properties b/src/main/resources/i18n/DEFAULT.i18n.properties index 30ffa10..adf3745 100644 --- a/src/main/resources/i18n/DEFAULT.i18n.properties +++ b/src/main/resources/i18n/DEFAULT.i18n.properties @@ -12,7 +12,8 @@ TASK_SAVE_FAILED = §cException when saving tasks: %s WORLD_NAME_REQUIRED = §cYou need to provide a world name! WORLD_NOT_FOUND = §cWorld §2%s §cnot found! TASK_ALREADY_EXISTS = §cA task for '%s' already exists! -TASK_CREATION_SUCCESS = §9Generation Task for world §2%s§9 §2%s§9 and shape %s successfully created! +TASK_CREATION_SUCCESS = §9Generation Task for world §2%s§r §2%s§r and shape §2%s§r successfully created! +TASK_CREATION_STARTING_AT = starting at radius §2%s§r TASK_UNIT_WORLDBORDER = until world border TASK_UNIT_RADIUS = with a radius of %s TASK_ID_REQUIRED = §cYou need to provide a task id!