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

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)`. * 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.

View file

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

View file

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

View file

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