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
|
||||
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.CoroutineName
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.SupervisorJob
|
||||
import space.blokk.Blokk
|
||||
import space.blokk.player.Player
|
||||
import kotlin.coroutines.CoroutineContext
|
||||
import kotlin.math.abs
|
||||
import kotlin.math.floor
|
||||
|
||||
abstract class Chunk(
|
||||
val world: World,
|
||||
|
@ -17,11 +19,13 @@ abstract class Chunk(
|
|||
/**
|
||||
* Returns the key for the chunk containing the voxel at [location].
|
||||
*/
|
||||
fun from(location: VoxelLocation) =
|
||||
Key(location.x / LENGTH, location.z / LENGTH)
|
||||
fun from(location: VoxelLocation) = Key(
|
||||
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) =
|
||||
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)`.
|
||||
*/
|
||||
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]
|
||||
|
@ -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)`.
|
||||
*/
|
||||
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.
|
||||
|
|
|
@ -6,12 +6,13 @@ import space.blokk.event.EventHandler
|
|||
import space.blokk.event.Listener
|
||||
import space.blokk.net.event.SessionAfterLoginEvent
|
||||
import space.blokk.plugin.Plugin
|
||||
import space.blokk.world.*
|
||||
import space.blokk.testplugin.anvil.AnvilWorld
|
||||
import space.blokk.world.block.Dirt
|
||||
import space.blokk.world.block.GrassBlock
|
||||
import space.blokk.world.Dimension
|
||||
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.SnowBlock
|
||||
import space.blokk.world.block.RedWool
|
||||
|
||||
class TestPlugin: Plugin("Test", "1.0.0") {
|
||||
override fun onEnable() {
|
||||
|
@ -25,19 +26,21 @@ class TestPlugin: Plugin("Test", "1.0.0") {
|
|||
Blokk.dimensionRegistry.register(dimension)
|
||||
|
||||
val world = AnvilWorld(dimension, true)
|
||||
world.getVoxelsInCube(VoxelLocation(100, 0, 100), VoxelLocation(-100, 0, -100)).forEach {
|
||||
it.block = GreenWool()
|
||||
world.getVoxelsInCube(VoxelLocation(16, 0, 16), VoxelLocation(-16, 0, -16)).forEach {
|
||||
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(10, 4, 22)).block = GrassBlock()
|
||||
world.getVoxel(VoxelLocation(40, 3, -32)).block = SnowBlock()
|
||||
world.getVoxel(VoxelLocation(-1, 2, -1)).block = CraftingTable()
|
||||
|
||||
Blokk.sessions.registerListener(object : Listener {
|
||||
@EventHandler
|
||||
fun onSessionAfterLogin(event: SessionAfterLoginEvent) {
|
||||
event.initialWorldAndLocation =
|
||||
WorldAndLocationWithRotation(world, LocationWithRotation(0.0, 4.0, 0.0, 0f, 0f))
|
||||
event.canFly = true
|
||||
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.Voxel
|
||||
import space.blokk.world.VoxelLocation
|
||||
import space.blokk.world.block.Air
|
||||
import space.blokk.world.block.Block
|
||||
|
||||
class AnvilVoxel(
|
||||
|
|
|
@ -6,8 +6,8 @@ import com.google.common.cache.LoadingCache
|
|||
import space.blokk.entity.Entity
|
||||
import space.blokk.event.EventTargetGroup
|
||||
import space.blokk.world.Chunk
|
||||
import space.blokk.world.World
|
||||
import space.blokk.world.Dimension
|
||||
import space.blokk.world.World
|
||||
import java.util.*
|
||||
|
||||
class AnvilWorld(
|
||||
|
|
Reference in a new issue