Archived
1
0
Fork 0

Fix Chunk.Key computations

This commit is contained in:
Moritz Ruth 2020-12-21 15:40:30 +01:00
parent 033659bb6c
commit 4eb2b45bfa
5 changed files with 26 additions and 20 deletions

View file

@ -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)

View file

@ -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.

View file

@ -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)
)
}
})
}

View file

@ -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(

View file

@ -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(