diff --git a/build.gradle b/build.gradle index 31057c0..2887247 100644 --- a/build.gradle +++ b/build.gradle @@ -22,7 +22,7 @@ idea { } group "net.trivernis" -version "0.15-beta" +version "0.16-beta" sourceCompatibility = 1.8 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 541d951..b9f16d6 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationManager.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationManager.kt @@ -2,6 +2,8 @@ package net.trivernis.chunkmaster.lib.generation import io.papermc.lib.PaperLib import net.trivernis.chunkmaster.Chunkmaster +import net.trivernis.chunkmaster.lib.shapes.Circle +import net.trivernis.chunkmaster.lib.shapes.Spiral import org.bukkit.Chunk import org.bukkit.Server import org.bukkit.World @@ -339,10 +341,11 @@ class GenerationManager(private val chunkmaster: Chunkmaster, private val server start: ChunkCoordinates, stopAfter: Int ): GenerationTask { + val shape = Spiral(Pair(center.x, center.z), Pair(center.x, center.z)) return if (PaperLib.isPaper()) { - GenerationTaskPaper(chunkmaster, world, center, start, stopAfter) + GenerationTaskPaper(chunkmaster, world, center, start, stopAfter, shape) } else { - GenerationTaskSpigot(chunkmaster, world, center, start, stopAfter) + GenerationTaskSpigot(chunkmaster, world, center, start, stopAfter, shape) } } } \ No newline at end of file diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTask.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTask.kt index 8207e31..e631fe1 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTask.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTask.kt @@ -1,8 +1,9 @@ package net.trivernis.chunkmaster.lib.generation import net.trivernis.chunkmaster.Chunkmaster -import net.trivernis.chunkmaster.lib.Spiral +import net.trivernis.chunkmaster.lib.shapes.Spiral import net.trivernis.chunkmaster.lib.dynmap.* +import net.trivernis.chunkmaster.lib.shapes.Shape import org.bukkit.Chunk import org.bukkit.World import kotlin.math.* @@ -10,7 +11,7 @@ import kotlin.math.* /** * Interface for generation tasks. */ -abstract class GenerationTask(plugin: Chunkmaster, private val centerChunk: ChunkCoordinates, startChunk: ChunkCoordinates) : +abstract class GenerationTask(plugin: Chunkmaster, private val centerChunk: ChunkCoordinates, startChunk: ChunkCoordinates, protected val shape: Shape) : Runnable { abstract val stopAfter: Int @@ -18,8 +19,6 @@ abstract class GenerationTask(plugin: Chunkmaster, private val centerChunk: Chun abstract val count: Int abstract var endReached: Boolean - protected val spiral: Spiral = - Spiral(Pair(centerChunk.x, centerChunk.z), Pair(startChunk.x, startChunk.z)) protected val loadedChunks: HashSet = HashSet() var lastChunkCoords = ChunkCoordinates(startChunk.x, startChunk.z) protected set @@ -40,7 +39,7 @@ abstract class GenerationTask(plugin: Chunkmaster, private val centerChunk: Chun private val markerAreaStyle = MarkerStyle(null, LineStyle(2, 1.0, 0x0022FF), FillStyle(.0, 0)) private val markerAreaId = "chunkmaster_genarea" private val markerAreaName = "Chunkmaster Generation Area" - private val markerLastStyle = MarkerStyle(null, LineStyle(2, 1.0, 0x0077FF), FillStyle(.0, 0)) + private val markerLastStyle = MarkerStyle(null, LineStyle(2, 1.0, 0x0077FF), FillStyle(.5, 0x0077FF)) private val markerLastId = "chunkmaster_lastchunk" private val markerLastName = "Chunkmaster Last Chunk" private val ignoreWorldborder = plugin.config.getBoolean("generation.ignore-worldborder") @@ -50,7 +49,7 @@ abstract class GenerationTask(plugin: Chunkmaster, private val centerChunk: Chun val nextChunkCoordinates: ChunkCoordinates get() { - val nextChunkCoords = spiral.next() + val nextChunkCoords = shape.next() return ChunkCoordinates(nextChunkCoords.first, nextChunkCoords.second) } diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTaskPaper.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTaskPaper.kt index 3f19cb1..bde3821 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTaskPaper.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTaskPaper.kt @@ -1,6 +1,7 @@ package net.trivernis.chunkmaster.lib.generation import net.trivernis.chunkmaster.Chunkmaster +import net.trivernis.chunkmaster.lib.shapes.Shape import org.bukkit.Chunk import org.bukkit.World import java.util.concurrent.CompletableFuture @@ -8,8 +9,9 @@ import java.util.concurrent.CompletableFuture class GenerationTaskPaper( private val plugin: Chunkmaster, override val world: World, centerChunk: ChunkCoordinates, private val startChunk: ChunkCoordinates, - override val stopAfter: Int = -1 -) : GenerationTask(plugin, centerChunk, startChunk) { + override val stopAfter: Int = -1, + shape: Shape +) : GenerationTask(plugin, centerChunk, startChunk, shape) { private val maxPendingChunks = plugin.config.getInt("generation.max-pending-chunks") @@ -59,7 +61,7 @@ class GenerationTaskPaper( } } lastChunkCoords = chunk - count = spiral.count // set the count to the more accurate spiral count + count = shape.count // set the count to the more accurate spiral count } } checkChunksLoaded() diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTaskSpigot.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTaskSpigot.kt index c82d3bb..c0c9561 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTaskSpigot.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTaskSpigot.kt @@ -1,14 +1,16 @@ package net.trivernis.chunkmaster.lib.generation import net.trivernis.chunkmaster.Chunkmaster +import net.trivernis.chunkmaster.lib.shapes.Shape import org.bukkit.World import java.lang.Exception class GenerationTaskSpigot( private val plugin: Chunkmaster, override val world: World, centerChunk: ChunkCoordinates, private val startChunk: ChunkCoordinates, - override val stopAfter: Int = -1 -) : GenerationTask(plugin, centerChunk, startChunk) { + override val stopAfter: Int = -1, + shape: Shape +) : GenerationTask(plugin, centerChunk, startChunk, shape) { override var count = 0 @@ -48,7 +50,7 @@ class GenerationTaskSpigot( loadedChunks.add(chunkInstance) } lastChunkCoords = chunk - count = spiral.count // set the count to the more accurate spiral count + count = shape.count // set the count to the more accurate spiral count } } } diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Circle.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Circle.kt new file mode 100644 index 0000000..6560866 --- /dev/null +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Circle.kt @@ -0,0 +1,86 @@ +package net.trivernis.chunkmaster.lib.shapes + +import java.util.* +import kotlin.collections.ArrayList +import kotlin.collections.HashSet +import kotlin.system.exitProcess + +class Circle(center: Pair, start: Pair): Shape(center, start) { + var r = 0 + private set + private var coords = Stack>() + + override fun next(): Pair { + if (count == 0 && currentPos != center) { + val tmpCircle = Circle(center, center) + while (tmpCircle.next() != currentPos); + this.count = tmpCircle.count + this.r = tmpCircle.r + } + if (count == 0) { + count++ + return center + } + if (coords.isEmpty()) { + r++ + val tmpCoords = HashSet>() + tmpCoords.addAll(getCircleCoordinates((r*2)-1).map { Pair(it.first / 2, it.second / 2) }) + tmpCoords.addAll(getCircleCoordinates(r)) + coords.addAll(tmpCoords) + } + count++ + val coord = coords.pop() + currentPos = Pair(coord.first + center.first, coord.second + center.second) + return currentPos + } + + /** + * Returns the int coordinates for a circle + * @param r - the radius + */ + private fun getCircleCoordinates(r: Int): HashSet> { + val coords = ArrayList>() + val segCoords = getSegment(r) + coords.addAll(segCoords) + for (step in 0..7) { + for (pos in segCoords) { + coords.add(when (step) { + 0 -> pos + 1 -> Pair(pos.second, pos.first) + 2 -> Pair(pos.first, -pos.second) + 3 -> Pair(-pos.second, pos.first) + 4 -> Pair(-pos.first, -pos.second) + 5 -> Pair(-pos.second, -pos.first) + 6 -> Pair(-pos.first, pos.second) + 7 -> Pair(pos.second, -pos.first) + else -> pos + }) + } + } + + val set = HashSet>() + set.addAll(coords) + return set + } + + /** + * Returns the int coordinates for a circles segment + * @param r - the radius + */ + private fun getSegment(r: Int): ArrayList> { + var d = -r + var x = r + var y = 0 + val coords = ArrayList>() + while (y <= x) { + coords.add(Pair(x, y)) + d += 2 * y + 1 + y += 1 + if (d > 0) { + x -= 1 + d -= 2 * x + } + } + return coords + } +} \ No newline at end of file diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Shape.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Shape.kt new file mode 100644 index 0000000..0c5c365 --- /dev/null +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Shape.kt @@ -0,0 +1,11 @@ +package net.trivernis.chunkmaster.lib.shapes + +abstract class Shape(protected val center: Pair, start: Pair) { + protected var currentPos = start + var count = 0 + + /** + * Returns the next value + */ + abstract fun next(): Pair +} \ No newline at end of file diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/Spiral.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Spiral.kt similarity index 88% rename from src/main/kotlin/net/trivernis/chunkmaster/lib/Spiral.kt rename to src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Spiral.kt index 15b063f..8a70f5b 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/Spiral.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Spiral.kt @@ -1,16 +1,14 @@ -package net.trivernis.chunkmaster.lib +package net.trivernis.chunkmaster.lib.shapes import kotlin.math.abs -class Spiral(private val center: Pair, start: Pair) { - private var currentPos = start +class Spiral(center: Pair, start: Pair): Shape(center, start) { private var direction = 0 - var count = 0 /** * Returns the next value in the spiral */ - fun next(): Pair { + override fun next(): Pair { if (count == 0 && currentPos != center) { // simulate the spiral to get the correct direction // TODO: Improve performance of this workaround (replace it with acutal stuff) diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 8bf099a..196281a 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ main: net.trivernis.chunkmaster.Chunkmaster name: Chunkmaster -version: '0.15-beta' +version: '0.16-beta' description: Chunk commands plugin. author: Trivernis website: trivernis.net