Fix Chunk.Key computations
This commit is contained in:
parent
033659bb6c
commit
4eb2b45bfa
5 changed files with 26 additions and 20 deletions
|
@ -1,10 +1,12 @@
|
||||||
package space.blokk.world
|
package space.blokk.world
|
||||||
|
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.CoroutineName
|
||||||
|
import kotlinx.coroutines.Job
|
||||||
|
import kotlinx.coroutines.SupervisorJob
|
||||||
import space.blokk.Blokk
|
import space.blokk.Blokk
|
||||||
import space.blokk.player.Player
|
import space.blokk.player.Player
|
||||||
import kotlin.coroutines.CoroutineContext
|
import kotlin.coroutines.CoroutineContext
|
||||||
import kotlin.math.abs
|
import kotlin.math.floor
|
||||||
|
|
||||||
abstract class Chunk(
|
abstract class Chunk(
|
||||||
val world: World,
|
val world: World,
|
||||||
|
@ -17,11 +19,13 @@ abstract class Chunk(
|
||||||
/**
|
/**
|
||||||
* Returns the key for the chunk containing the voxel at [location].
|
* Returns the key for the chunk containing the voxel at [location].
|
||||||
*/
|
*/
|
||||||
fun from(location: VoxelLocation) =
|
fun from(location: VoxelLocation) = Key(
|
||||||
Key(location.x / LENGTH, location.z / LENGTH)
|
floor(location.x.toFloat() / LENGTH).toInt(),
|
||||||
|
floor(location.z.toFloat() / LENGTH).toInt()
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun translateWorldToChunk(x: Int, z: Int) = Pair(abs(x - (this.x * LENGTH)), abs(z - (this.z * LENGTH)))
|
fun translateWorldToChunk(x: Int, z: Int) = Pair(Math.floorMod(x, LENGTH), Math.floorMod(z, LENGTH))
|
||||||
fun translateChunkToWorld(x: Int, z: Int) =
|
fun translateChunkToWorld(x: Int, z: Int) =
|
||||||
Pair(this.x * LENGTH + x, this.z * LENGTH + z)
|
Pair(this.x * LENGTH + x, this.z * LENGTH + z)
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ data class VoxelLocation(val x: Int, val y: UByte, val z: Int) {
|
||||||
*
|
*
|
||||||
* Example: `VoxelLocation(x = 1, y = 2, z = 3)` becomes `Location(x = 1.5, y = 2.5, z = 3.5)`.
|
* Example: `VoxelLocation(x = 1, y = 2, z = 3)` becomes `Location(x = 1.5, y = 2.5, z = 3.5)`.
|
||||||
*/
|
*/
|
||||||
fun getCenterLocation(): Location = Location(x.toDouble() + 0.5, y.toDouble() + 0.5, z.toDouble() + 0.5)
|
fun atCenter(): Location = Location(x.toDouble() + 0.5, y.toDouble() + 0.5, z.toDouble() + 0.5)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts this [VoxelLocation] to a [Location] by converting [x], [y] and [z] to a double using [Int.toDouble]
|
* Converts this [VoxelLocation] to a [Location] by converting [x], [y] and [z] to a double using [Int.toDouble]
|
||||||
|
@ -24,7 +24,7 @@ data class VoxelLocation(val x: Int, val y: UByte, val z: Int) {
|
||||||
*
|
*
|
||||||
* Example: `VoxelLocation(x = 1, y = 2, z = 3)` becomes `Location(x = 1.5, y = 2, z = 3.5)`.
|
* Example: `VoxelLocation(x = 1, y = 2, z = 3)` becomes `Location(x = 1.5, y = 2, z = 3.5)`.
|
||||||
*/
|
*/
|
||||||
fun getTopCenterLocation(): Location = Location(x.toDouble() + 0.5, y.toDouble(), z.toDouble() + 0.5)
|
fun atTopCenter(): Location = Location(x.toDouble() + 0.5, y.toDouble(), z.toDouble() + 0.5)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return A new [VoxelLocation] with the maximum x, y and z values of a and b.
|
* @return A new [VoxelLocation] with the maximum x, y and z values of a and b.
|
||||||
|
|
|
@ -6,12 +6,13 @@ import space.blokk.event.EventHandler
|
||||||
import space.blokk.event.Listener
|
import space.blokk.event.Listener
|
||||||
import space.blokk.net.event.SessionAfterLoginEvent
|
import space.blokk.net.event.SessionAfterLoginEvent
|
||||||
import space.blokk.plugin.Plugin
|
import space.blokk.plugin.Plugin
|
||||||
import space.blokk.world.*
|
|
||||||
import space.blokk.testplugin.anvil.AnvilWorld
|
import space.blokk.testplugin.anvil.AnvilWorld
|
||||||
import space.blokk.world.block.Dirt
|
import space.blokk.world.Dimension
|
||||||
import space.blokk.world.block.GrassBlock
|
import space.blokk.world.VoxelLocation
|
||||||
|
import space.blokk.world.WorldAndLocationWithRotation
|
||||||
|
import space.blokk.world.block.CraftingTable
|
||||||
import space.blokk.world.block.GreenWool
|
import space.blokk.world.block.GreenWool
|
||||||
import space.blokk.world.block.SnowBlock
|
import space.blokk.world.block.RedWool
|
||||||
|
|
||||||
class TestPlugin: Plugin("Test", "1.0.0") {
|
class TestPlugin: Plugin("Test", "1.0.0") {
|
||||||
override fun onEnable() {
|
override fun onEnable() {
|
||||||
|
@ -25,19 +26,21 @@ class TestPlugin: Plugin("Test", "1.0.0") {
|
||||||
Blokk.dimensionRegistry.register(dimension)
|
Blokk.dimensionRegistry.register(dimension)
|
||||||
|
|
||||||
val world = AnvilWorld(dimension, true)
|
val world = AnvilWorld(dimension, true)
|
||||||
world.getVoxelsInCube(VoxelLocation(100, 0, 100), VoxelLocation(-100, 0, -100)).forEach {
|
world.getVoxelsInCube(VoxelLocation(16, 0, 16), VoxelLocation(-16, 0, -16)).forEach {
|
||||||
it.block = GreenWool()
|
it.block = if (it.location.x % 16 == 0 || it.location.z % 16 == 0) GreenWool() else RedWool()
|
||||||
}
|
}
|
||||||
|
|
||||||
world.getVoxel(VoxelLocation(0, 10, 0)).block = Dirt()
|
world.getVoxel(VoxelLocation(-1, 2, -1)).block = CraftingTable()
|
||||||
world.getVoxel(VoxelLocation(10, 4, 22)).block = GrassBlock()
|
|
||||||
world.getVoxel(VoxelLocation(40, 3, -32)).block = SnowBlock()
|
|
||||||
|
|
||||||
Blokk.sessions.registerListener(object : Listener {
|
Blokk.sessions.registerListener(object : Listener {
|
||||||
@EventHandler
|
@EventHandler
|
||||||
fun onSessionAfterLogin(event: SessionAfterLoginEvent) {
|
fun onSessionAfterLogin(event: SessionAfterLoginEvent) {
|
||||||
event.initialWorldAndLocation =
|
event.canFly = true
|
||||||
WorldAndLocationWithRotation(world, LocationWithRotation(0.0, 4.0, 0.0, 0f, 0f))
|
event.flyingSpeed = 2.0f
|
||||||
|
event.initialWorldAndLocation = WorldAndLocationWithRotation(
|
||||||
|
world,
|
||||||
|
VoxelLocation(0, 2, 0).atTopCenter().withRotation(0f, 0f)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,6 @@ package space.blokk.testplugin.anvil
|
||||||
import space.blokk.world.Chunk
|
import space.blokk.world.Chunk
|
||||||
import space.blokk.world.Voxel
|
import space.blokk.world.Voxel
|
||||||
import space.blokk.world.VoxelLocation
|
import space.blokk.world.VoxelLocation
|
||||||
import space.blokk.world.block.Air
|
|
||||||
import space.blokk.world.block.Block
|
import space.blokk.world.block.Block
|
||||||
|
|
||||||
class AnvilVoxel(
|
class AnvilVoxel(
|
||||||
|
|
|
@ -6,8 +6,8 @@ import com.google.common.cache.LoadingCache
|
||||||
import space.blokk.entity.Entity
|
import space.blokk.entity.Entity
|
||||||
import space.blokk.event.EventTargetGroup
|
import space.blokk.event.EventTargetGroup
|
||||||
import space.blokk.world.Chunk
|
import space.blokk.world.Chunk
|
||||||
import space.blokk.world.World
|
|
||||||
import space.blokk.world.Dimension
|
import space.blokk.world.Dimension
|
||||||
|
import space.blokk.world.World
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class AnvilWorld(
|
class AnvilWorld(
|
||||||
|
|
Reference in a new issue