mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-16 19:05:02 -04:00
wip: fluid, entity, block raycasting
This commit is contained in:
parent
8271827750
commit
caf75b323b
@ -33,8 +33,9 @@ import de.bixilon.minosoft.data.registries.registry.ResourceLocationDeserializer
|
|||||||
import de.bixilon.minosoft.data.registries.versions.Registries
|
import de.bixilon.minosoft.data.registries.versions.Registries
|
||||||
import de.bixilon.minosoft.data.text.RGBColor
|
import de.bixilon.minosoft.data.text.RGBColor
|
||||||
import de.bixilon.minosoft.gui.rendering.TintColorCalculator
|
import de.bixilon.minosoft.gui.rendering.TintColorCalculator
|
||||||
|
import de.bixilon.minosoft.gui.rendering.chunk.VoxelShape
|
||||||
import de.bixilon.minosoft.gui.rendering.chunk.models.renderable.BlockLikeRenderer
|
import de.bixilon.minosoft.gui.rendering.chunk.models.renderable.BlockLikeRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit
|
||||||
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
||||||
import glm_.vec3.Vec3i
|
import glm_.vec3.Vec3i
|
||||||
import kotlin.random.Random
|
import kotlin.random.Random
|
||||||
@ -111,6 +112,10 @@ open class Block(
|
|||||||
|
|
||||||
open fun onEntityCollision(connection: PlayConnection, entity: Entity, blockState: BlockState, blockPosition: Vec3i) {}
|
open fun onEntityCollision(connection: PlayConnection, entity: Entity, blockState: BlockState, blockPosition: Vec3i) {}
|
||||||
|
|
||||||
|
open fun getOutlineShape(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i): VoxelShape {
|
||||||
|
return blockState.outlineShape
|
||||||
|
}
|
||||||
|
|
||||||
companion object : ResourceLocationDeserializer<Block> {
|
companion object : ResourceLocationDeserializer<Block> {
|
||||||
private val CONSTRUCTORS: Map<String, (resourceLocation: ResourceLocation, registries: Registries, data: JsonObject) -> Block> = mapOf(
|
private val CONSTRUCTORS: Map<String, (resourceLocation: ResourceLocation, registries: Registries, data: JsonObject) -> Block> = mapOf(
|
||||||
"FluidBlock" to { resourceLocation, registries, data -> FluidBlock(resourceLocation, registries, data) },
|
"FluidBlock" to { resourceLocation, registries, data -> FluidBlock(resourceLocation, registries, data) },
|
||||||
|
@ -22,7 +22,7 @@ import de.bixilon.minosoft.data.registries.blocks.BlockUsages
|
|||||||
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
|
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
|
||||||
import de.bixilon.minosoft.data.registries.items.tools.ShovelItem
|
import de.bixilon.minosoft.data.registries.items.tools.ShovelItem
|
||||||
import de.bixilon.minosoft.data.registries.versions.Registries
|
import de.bixilon.minosoft.data.registries.versions.Registries
|
||||||
import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit
|
||||||
import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.campfire.CampfireSmokeParticle
|
import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.campfire.CampfireSmokeParticle
|
||||||
import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.fire.SmokeParticle
|
import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.fire.SmokeParticle
|
||||||
import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.lava.LavaParticle
|
import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.lava.LavaParticle
|
||||||
|
@ -22,7 +22,7 @@ import de.bixilon.minosoft.data.registries.blocks.BlockUsages
|
|||||||
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
|
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
|
||||||
import de.bixilon.minosoft.data.registries.materials.DefaultMaterials
|
import de.bixilon.minosoft.data.registries.materials.DefaultMaterials
|
||||||
import de.bixilon.minosoft.data.registries.versions.Registries
|
import de.bixilon.minosoft.data.registries.versions.Registries
|
||||||
import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit
|
||||||
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
||||||
import glm_.vec3.Vec3i
|
import glm_.vec3.Vec3i
|
||||||
|
|
||||||
|
@ -18,9 +18,13 @@ import de.bixilon.minosoft.data.registries.ResourceLocation
|
|||||||
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
||||||
import de.bixilon.minosoft.data.registries.fluid.Fluid
|
import de.bixilon.minosoft.data.registries.fluid.Fluid
|
||||||
import de.bixilon.minosoft.data.registries.versions.Registries
|
import de.bixilon.minosoft.data.registries.versions.Registries
|
||||||
|
import de.bixilon.minosoft.gui.rendering.chunk.VoxelShape
|
||||||
|
import de.bixilon.minosoft.gui.rendering.chunk.models.AABB
|
||||||
import de.bixilon.minosoft.gui.rendering.chunk.models.renderable.BlockLikeRenderer
|
import de.bixilon.minosoft.gui.rendering.chunk.models.renderable.BlockLikeRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.chunk.models.renderable.FluidRenderer
|
import de.bixilon.minosoft.gui.rendering.chunk.models.renderable.FluidRenderer
|
||||||
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.EMPTY
|
||||||
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
||||||
|
import glm_.vec3.Vec3
|
||||||
import glm_.vec3.Vec3i
|
import glm_.vec3.Vec3i
|
||||||
import kotlin.random.Random
|
import kotlin.random.Random
|
||||||
|
|
||||||
@ -38,6 +42,10 @@ open class FluidBlock(resourceLocation: ResourceLocation, registries: Registries
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getOutlineShape(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i): VoxelShape {
|
||||||
|
return VoxelShape(mutableListOf(AABB(Vec3.EMPTY, Vec3(1.0f, fluid.getHeight(blockState), 1.0f))))
|
||||||
|
}
|
||||||
|
|
||||||
override fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) {
|
override fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) {
|
||||||
super.randomTick(connection, blockState, blockPosition, random)
|
super.randomTick(connection, blockState, blockPosition, random)
|
||||||
// ToDO
|
// ToDO
|
||||||
|
@ -20,7 +20,7 @@ import de.bixilon.minosoft.data.registries.ResourceLocation
|
|||||||
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
||||||
import de.bixilon.minosoft.data.registries.blocks.BlockUsages
|
import de.bixilon.minosoft.data.registries.blocks.BlockUsages
|
||||||
import de.bixilon.minosoft.data.registries.versions.Registries
|
import de.bixilon.minosoft.data.registries.versions.Registries
|
||||||
import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit
|
||||||
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
||||||
import glm_.vec3.Vec3i
|
import glm_.vec3.Vec3i
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ import de.bixilon.minosoft.data.registries.blocks.BlockState
|
|||||||
import de.bixilon.minosoft.data.registries.blocks.BlockUsages
|
import de.bixilon.minosoft.data.registries.blocks.BlockUsages
|
||||||
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
|
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
|
||||||
import de.bixilon.minosoft.data.registries.versions.Registries
|
import de.bixilon.minosoft.data.registries.versions.Registries
|
||||||
import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit
|
||||||
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
||||||
import glm_.vec3.Vec3i
|
import glm_.vec3.Vec3i
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ import de.bixilon.minosoft.data.registries.blocks.BlockState
|
|||||||
import de.bixilon.minosoft.data.registries.blocks.BlockUsages
|
import de.bixilon.minosoft.data.registries.blocks.BlockUsages
|
||||||
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
|
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
|
||||||
import de.bixilon.minosoft.data.registries.versions.Registries
|
import de.bixilon.minosoft.data.registries.versions.Registries
|
||||||
import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit
|
||||||
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
||||||
import glm_.vec3.Vec3i
|
import glm_.vec3.Vec3i
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
|
|||||||
import de.bixilon.minosoft.data.registries.particle.data.DustParticleData
|
import de.bixilon.minosoft.data.registries.particle.data.DustParticleData
|
||||||
import de.bixilon.minosoft.data.registries.versions.Registries
|
import de.bixilon.minosoft.data.registries.versions.Registries
|
||||||
import de.bixilon.minosoft.data.text.Colors
|
import de.bixilon.minosoft.data.text.Colors
|
||||||
import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit
|
||||||
import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.dust.DustParticle
|
import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.dust.DustParticle
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.EMPTY
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.EMPTY
|
||||||
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
||||||
|
@ -18,16 +18,15 @@ import de.bixilon.minosoft.data.abilities.Gamemodes
|
|||||||
import de.bixilon.minosoft.data.inventory.ItemStack
|
import de.bixilon.minosoft.data.inventory.ItemStack
|
||||||
import de.bixilon.minosoft.data.player.Hands
|
import de.bixilon.minosoft.data.player.Hands
|
||||||
import de.bixilon.minosoft.data.registries.ResourceLocation
|
import de.bixilon.minosoft.data.registries.ResourceLocation
|
||||||
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
|
||||||
import de.bixilon.minosoft.data.registries.blocks.BlockUsages
|
import de.bixilon.minosoft.data.registries.blocks.BlockUsages
|
||||||
import de.bixilon.minosoft.data.registries.blocks.types.Block
|
import de.bixilon.minosoft.data.registries.blocks.types.Block
|
||||||
import de.bixilon.minosoft.data.registries.versions.Registries
|
import de.bixilon.minosoft.data.registries.versions.Registries
|
||||||
import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit
|
||||||
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus
|
||||||
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
||||||
import de.bixilon.minosoft.protocol.packets.c2s.play.BlockPlaceC2SP
|
import de.bixilon.minosoft.protocol.packets.c2s.play.BlockPlaceC2SP
|
||||||
import glm_.vec3.Vec3
|
import glm_.vec3.Vec3
|
||||||
import glm_.vec3.Vec3i
|
|
||||||
|
|
||||||
open class BlockItem(
|
open class BlockItem(
|
||||||
resourceLocation: ResourceLocation,
|
resourceLocation: ResourceLocation,
|
||||||
@ -36,11 +35,15 @@ open class BlockItem(
|
|||||||
) : Item(resourceLocation, registries, data) {
|
) : Item(resourceLocation, registries, data) {
|
||||||
val block: Block = registries.blockRegistry[data["block"].asInt]
|
val block: Block = registries.blockRegistry[data["block"].asInt]
|
||||||
|
|
||||||
override fun use(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, raycastHit: RaycastHit, hands: Hands, itemStack: ItemStack): BlockUsages {
|
override fun use(connection: PlayConnection, raycastHit: RaycastHit, hands: Hands, itemStack: ItemStack): BlockUsages {
|
||||||
if (!connection.player.gamemode.canBuild) {
|
if (!connection.player.gamemode.canBuild) {
|
||||||
return BlockUsages.PASS
|
return BlockUsages.PASS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (raycastHit !is BlockRaycastHit) {
|
||||||
|
return super.use(connection, raycastHit, hands, itemStack)
|
||||||
|
}
|
||||||
|
|
||||||
val placePosition = raycastHit.blockPosition + raycastHit.hitDirection
|
val placePosition = raycastHit.blockPosition + raycastHit.hitDirection
|
||||||
if (!connection.world.isPositionChangeable(placePosition)) {
|
if (!connection.world.isPositionChangeable(placePosition)) {
|
||||||
return BlockUsages.PASS
|
return BlockUsages.PASS
|
||||||
|
@ -27,9 +27,8 @@ import de.bixilon.minosoft.data.registries.registry.RegistryItem
|
|||||||
import de.bixilon.minosoft.data.registries.registry.ResourceLocationDeserializer
|
import de.bixilon.minosoft.data.registries.registry.ResourceLocationDeserializer
|
||||||
import de.bixilon.minosoft.data.registries.registry.Translatable
|
import de.bixilon.minosoft.data.registries.registry.Translatable
|
||||||
import de.bixilon.minosoft.data.registries.versions.Registries
|
import de.bixilon.minosoft.data.registries.versions.Registries
|
||||||
import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit
|
||||||
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
||||||
import glm_.vec3.Vec3i
|
|
||||||
|
|
||||||
open class Item(
|
open class Item(
|
||||||
override val resourceLocation: ResourceLocation,
|
override val resourceLocation: ResourceLocation,
|
||||||
@ -51,7 +50,7 @@ open class Item(
|
|||||||
return 1.0f
|
return 1.0f
|
||||||
}
|
}
|
||||||
|
|
||||||
open fun use(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, raycastHit: RaycastHit, hands: Hands, itemStack: ItemStack): BlockUsages {
|
open fun use(connection: PlayConnection, raycastHit: RaycastHit, hands: Hands, itemStack: ItemStack): BlockUsages {
|
||||||
return BlockUsages.PASS
|
return BlockUsages.PASS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,14 +18,13 @@ import de.bixilon.minosoft.Minosoft
|
|||||||
import de.bixilon.minosoft.data.inventory.ItemStack
|
import de.bixilon.minosoft.data.inventory.ItemStack
|
||||||
import de.bixilon.minosoft.data.player.Hands
|
import de.bixilon.minosoft.data.player.Hands
|
||||||
import de.bixilon.minosoft.data.registries.ResourceLocation
|
import de.bixilon.minosoft.data.registries.ResourceLocation
|
||||||
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
|
||||||
import de.bixilon.minosoft.data.registries.blocks.BlockUsages
|
import de.bixilon.minosoft.data.registries.blocks.BlockUsages
|
||||||
import de.bixilon.minosoft.data.registries.blocks.types.Block
|
import de.bixilon.minosoft.data.registries.blocks.types.Block
|
||||||
import de.bixilon.minosoft.data.registries.versions.Registries
|
import de.bixilon.minosoft.data.registries.versions.Registries
|
||||||
import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit
|
||||||
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit
|
||||||
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
||||||
import de.bixilon.minosoft.util.KUtil.asResourceLocation
|
import de.bixilon.minosoft.util.KUtil.asResourceLocation
|
||||||
import glm_.vec3.Vec3i
|
|
||||||
|
|
||||||
open class AxeItem(
|
open class AxeItem(
|
||||||
resourceLocation: ResourceLocation,
|
resourceLocation: ResourceLocation,
|
||||||
@ -41,12 +40,15 @@ open class AxeItem(
|
|||||||
entries.toMap()
|
entries.toMap()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun use(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, raycastHit: RaycastHit, hands: Hands, itemStack: ItemStack): BlockUsages {
|
override fun use(connection: PlayConnection, raycastHit: RaycastHit, hands: Hands, itemStack: ItemStack): BlockUsages {
|
||||||
if (!Minosoft.config.config.game.controls.enableStripping) {
|
if (!Minosoft.config.config.game.controls.enableStripping) {
|
||||||
return BlockUsages.CONSUME
|
return BlockUsages.CONSUME
|
||||||
}
|
}
|
||||||
|
if (raycastHit !is BlockRaycastHit) {
|
||||||
|
return super.use(connection, raycastHit, hands, itemStack)
|
||||||
|
}
|
||||||
|
|
||||||
return super.interactWithTool(connection, blockPosition, strippableBlocks?.get(blockState.block)?.withProperties(blockState.properties))
|
return super.interactWithTool(connection, raycastHit.blockPosition, strippableBlocks?.get(raycastHit.blockState.block)?.withProperties(raycastHit.blockState.properties))
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
@ -23,11 +23,11 @@ import de.bixilon.minosoft.data.registries.blocks.BlockState
|
|||||||
import de.bixilon.minosoft.data.registries.blocks.BlockUsages
|
import de.bixilon.minosoft.data.registries.blocks.BlockUsages
|
||||||
import de.bixilon.minosoft.data.registries.blocks.types.Block
|
import de.bixilon.minosoft.data.registries.blocks.types.Block
|
||||||
import de.bixilon.minosoft.data.registries.versions.Registries
|
import de.bixilon.minosoft.data.registries.versions.Registries
|
||||||
import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit
|
||||||
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus
|
||||||
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
||||||
import de.bixilon.minosoft.util.KUtil.asResourceLocation
|
import de.bixilon.minosoft.util.KUtil.asResourceLocation
|
||||||
import glm_.vec3.Vec3i
|
|
||||||
|
|
||||||
open class HoeItem(
|
open class HoeItem(
|
||||||
resourceLocation: ResourceLocation,
|
resourceLocation: ResourceLocation,
|
||||||
@ -43,16 +43,19 @@ open class HoeItem(
|
|||||||
entries.toMap()
|
entries.toMap()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun use(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, raycastHit: RaycastHit, hands: Hands, itemStack: ItemStack): BlockUsages {
|
override fun use(connection: PlayConnection, raycastHit: RaycastHit, hands: Hands, itemStack: ItemStack): BlockUsages {
|
||||||
if (!Minosoft.config.config.game.controls.enableTilling) {
|
if (!Minosoft.config.config.game.controls.enableTilling) {
|
||||||
return BlockUsages.CONSUME
|
return BlockUsages.CONSUME
|
||||||
}
|
}
|
||||||
|
if (raycastHit !is BlockRaycastHit) {
|
||||||
|
return super.use(connection, raycastHit, hands, itemStack)
|
||||||
|
}
|
||||||
|
|
||||||
if (connection.world[blockPosition + Directions.UP] != null) {
|
if (connection.world[raycastHit.blockPosition + Directions.UP] != null) {
|
||||||
return BlockUsages.PASS
|
return BlockUsages.PASS
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.interactWithTool(connection, blockPosition, tillableBlockStates?.get(blockState.block))
|
return super.interactWithTool(connection, raycastHit.blockPosition, tillableBlockStates?.get(raycastHit.blockState.block))
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
@ -23,11 +23,11 @@ import de.bixilon.minosoft.data.registries.blocks.BlockState
|
|||||||
import de.bixilon.minosoft.data.registries.blocks.BlockUsages
|
import de.bixilon.minosoft.data.registries.blocks.BlockUsages
|
||||||
import de.bixilon.minosoft.data.registries.blocks.types.Block
|
import de.bixilon.minosoft.data.registries.blocks.types.Block
|
||||||
import de.bixilon.minosoft.data.registries.versions.Registries
|
import de.bixilon.minosoft.data.registries.versions.Registries
|
||||||
import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit
|
||||||
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus
|
||||||
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
||||||
import de.bixilon.minosoft.util.KUtil.asResourceLocation
|
import de.bixilon.minosoft.util.KUtil.asResourceLocation
|
||||||
import glm_.vec3.Vec3i
|
|
||||||
|
|
||||||
open class ShovelItem(
|
open class ShovelItem(
|
||||||
resourceLocation: ResourceLocation,
|
resourceLocation: ResourceLocation,
|
||||||
@ -44,16 +44,19 @@ open class ShovelItem(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun use(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, raycastHit: RaycastHit, hands: Hands, itemStack: ItemStack): BlockUsages {
|
override fun use(connection: PlayConnection, raycastHit: RaycastHit, hands: Hands, itemStack: ItemStack): BlockUsages {
|
||||||
if (!Minosoft.config.config.game.controls.enableFlattening) {
|
if (!Minosoft.config.config.game.controls.enableFlattening) {
|
||||||
return BlockUsages.CONSUME
|
return BlockUsages.CONSUME
|
||||||
}
|
}
|
||||||
|
if (raycastHit !is BlockRaycastHit) {
|
||||||
|
return super.use(connection, raycastHit, hands, itemStack)
|
||||||
|
}
|
||||||
|
|
||||||
if (connection.world[blockPosition + Directions.UP] != null) {
|
if (connection.world[raycastHit.blockPosition + Directions.UP] != null) {
|
||||||
return BlockUsages.PASS
|
return BlockUsages.PASS
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.interactWithTool(connection, blockPosition, flattenableBlockStates?.get(blockState.block))
|
return super.interactWithTool(connection, raycastHit.blockPosition, flattenableBlockStates?.get(raycastHit.blockState.block))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -35,7 +35,6 @@ import java.util.Base64;
|
|||||||
public class GUITools {
|
public class GUITools {
|
||||||
public static final Image MINOSOFT_LOGO = new Image(GUITools.class.getResourceAsStream("/assets/minosoft/textures/icons/window_icon.png"));
|
public static final Image MINOSOFT_LOGO = new Image(GUITools.class.getResourceAsStream("/assets/minosoft/textures/icons/window_icon.png"));
|
||||||
public static final ObservableList<Version> VERSIONS = FXCollections.observableArrayList();
|
public static final ObservableList<Version> VERSIONS = FXCollections.observableArrayList();
|
||||||
public static final JFXComboBox<Version> VERSION_COMBO_BOX = new JFXComboBox<>(VERSIONS);
|
|
||||||
|
|
||||||
static {
|
static {
|
||||||
VERSIONS.add(Versions.AUTOMATIC_VERSION);
|
VERSIONS.add(Versions.AUTOMATIC_VERSION);
|
||||||
@ -49,6 +48,8 @@ public class GUITools {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final JFXComboBox<Version> VERSION_COMBO_BOX = new JFXComboBox<>(VERSIONS);
|
||||||
|
|
||||||
public static Image getImageFromBase64(String base64) {
|
public static Image getImageFromBase64(String base64) {
|
||||||
if (base64 == null) {
|
if (base64 == null) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -21,11 +21,13 @@ import de.bixilon.minosoft.gui.rendering.RenderConstants
|
|||||||
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
||||||
import de.bixilon.minosoft.gui.rendering.Renderer
|
import de.bixilon.minosoft.gui.rendering.Renderer
|
||||||
import de.bixilon.minosoft.gui.rendering.RendererBuilder
|
import de.bixilon.minosoft.gui.rendering.RendererBuilder
|
||||||
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions
|
import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.getWorldOffset
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.getWorldOffset
|
||||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3d
|
import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3d
|
||||||
import de.bixilon.minosoft.gui.rendering.util.mesh.LineMesh
|
import de.bixilon.minosoft.gui.rendering.util.mesh.LineMesh
|
||||||
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
||||||
|
import de.bixilon.minosoft.util.KUtil.nullCast
|
||||||
import glm_.vec3.Vec3i
|
import glm_.vec3.Vec3i
|
||||||
|
|
||||||
class BlockOutlineRenderer(
|
class BlockOutlineRenderer(
|
||||||
@ -56,7 +58,7 @@ class BlockOutlineRenderer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun draw() {
|
override fun draw() {
|
||||||
val raycastHit = renderWindow.inputHandler.camera.getTargetBlock()
|
val raycastHit = renderWindow.inputHandler.camera.target?.nullCast<BlockRaycastHit>()
|
||||||
|
|
||||||
var currentMesh = currentMesh
|
var currentMesh = currentMesh
|
||||||
|
|
||||||
|
@ -18,14 +18,19 @@ import de.bixilon.minosoft.data.registries.ResourceLocation
|
|||||||
import de.bixilon.minosoft.gui.rendering.hud.HUDElementProperties
|
import de.bixilon.minosoft.gui.rendering.hud.HUDElementProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.hud.HUDRenderBuilder
|
import de.bixilon.minosoft.gui.rendering.hud.HUDRenderBuilder
|
||||||
import de.bixilon.minosoft.gui.rendering.hud.HUDRenderer
|
import de.bixilon.minosoft.gui.rendering.hud.HUDRenderer
|
||||||
|
import de.bixilon.minosoft.gui.rendering.hud.nodes.primitive.LabelNode
|
||||||
import de.bixilon.minosoft.gui.rendering.hud.nodes.properties.NodeAlignment
|
import de.bixilon.minosoft.gui.rendering.hud.nodes.properties.NodeAlignment
|
||||||
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit
|
||||||
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.EntityRaycastHit
|
||||||
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.FluidRaycastHit
|
||||||
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit
|
||||||
import de.bixilon.minosoft.gui.rendering.modding.events.ResizeWindowEvent
|
import de.bixilon.minosoft.gui.rendering.modding.events.ResizeWindowEvent
|
||||||
import de.bixilon.minosoft.modding.event.CallbackEventInvoker
|
import de.bixilon.minosoft.modding.event.CallbackEventInvoker
|
||||||
import de.bixilon.minosoft.modding.loading.ModLoader
|
import de.bixilon.minosoft.modding.loading.ModLoader
|
||||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||||
import de.bixilon.minosoft.util.GitInfo
|
import de.bixilon.minosoft.util.GitInfo
|
||||||
import de.bixilon.minosoft.util.SystemInformation
|
import de.bixilon.minosoft.util.SystemInformation
|
||||||
import de.bixilon.minosoft.util.UnitFormatter
|
import de.bixilon.minosoft.util.UnitFormatter.formatBytes
|
||||||
import glm_.vec2.Vec2
|
import glm_.vec2.Vec2
|
||||||
import org.lwjgl.opengl.GL11.*
|
import org.lwjgl.opengl.GL11.*
|
||||||
|
|
||||||
@ -73,8 +78,25 @@ class HUDSystemDebugNode(hudRenderer: HUDRenderer) : DebugScreenNode(hudRenderer
|
|||||||
text()
|
text()
|
||||||
}
|
}
|
||||||
|
|
||||||
private val targetPosition = text("TBA")
|
private val target = text("TBA")
|
||||||
private val targetBlockState = text("TBA")
|
|
||||||
|
init {
|
||||||
|
text()
|
||||||
|
}
|
||||||
|
|
||||||
|
private val targetBlock = text()
|
||||||
|
|
||||||
|
init {
|
||||||
|
text()
|
||||||
|
}
|
||||||
|
|
||||||
|
private val targetFluid = text()
|
||||||
|
|
||||||
|
init {
|
||||||
|
text()
|
||||||
|
}
|
||||||
|
|
||||||
|
private val targetEntity = text()
|
||||||
|
|
||||||
override fun init() {
|
override fun init() {
|
||||||
gpuText.sText = "GPU: " + (glGetString(GL_RENDERER) ?: "unknown")
|
gpuText.sText = "GPU: " + (glGetString(GL_RENDERER) ?: "unknown")
|
||||||
@ -92,17 +114,36 @@ class HUDSystemDebugNode(hudRenderer: HUDRenderer) : DebugScreenNode(hudRenderer
|
|||||||
memoryText.sText = "Memory: ${getUsedMemoryPercent()}% ${getFormattedUsedMemory()}/${SystemInformation.MAX_MEMORY_TEXT}"
|
memoryText.sText = "Memory: ${getUsedMemoryPercent()}% ${getFormattedUsedMemory()}/${SystemInformation.MAX_MEMORY_TEXT}"
|
||||||
allocatedMemoryText.sText = "Allocated: ${getAllocatedMemoryPercent()}% ${getFormattedAllocatedMemory()}"
|
allocatedMemoryText.sText = "Allocated: ${getAllocatedMemoryPercent()}% ${getFormattedAllocatedMemory()}"
|
||||||
|
|
||||||
gpuMemoryText.sText = "VRAM: ${UnitFormatter.formatBytes(hudRenderer.renderWindow.renderSystem.usedVRAM)} / ${UnitFormatter.formatBytes(hudRenderer.renderWindow.renderSystem.availableVRAM)} | ${UnitFormatter.formatBytes(hudRenderer.renderWindow.renderSystem.maximumVRAM)}"
|
gpuMemoryText.sText = "VRAM: ${hudRenderer.renderWindow.renderSystem.usedVRAM.formatBytes()} / ${hudRenderer.renderWindow.renderSystem.availableVRAM.formatBytes()} | ${hudRenderer.renderWindow.renderSystem.maximumVRAM.formatBytes()}"
|
||||||
|
|
||||||
val rayCastHit = hudRenderer.renderWindow.inputHandler.camera.getTargetBlock()
|
|
||||||
if (rayCastHit == null) {
|
val target = hudRenderer.renderWindow.inputHandler.camera.target
|
||||||
targetPosition.sText = ""
|
|
||||||
targetBlockState.sText = ""
|
val targetClass = target?.let { it::class.java }
|
||||||
} else {
|
this.target.sText = target?.let {
|
||||||
targetPosition.sText = "Target block: ${rayCastHit.blockPosition}"
|
val targetType = when (targetClass) {
|
||||||
targetBlockState.sText = rayCastHit.blockState.toString()
|
FluidRaycastHit::class.java -> "Fluid"
|
||||||
|
BlockRaycastHit::class.java -> "Block"
|
||||||
|
EntityRaycastHit::class.java -> "Entity"
|
||||||
|
else -> "Unknown"
|
||||||
|
}
|
||||||
|
"Target: $targetType: $it"
|
||||||
|
} ?: "No target!"
|
||||||
|
|
||||||
|
if (target != null) {
|
||||||
|
fun addTarget(labelNode: LabelNode, raycastHit: RaycastHit?, name: String) {
|
||||||
|
labelNode.sText = if (raycastHit != null && targetClass != raycastHit::class.java) {
|
||||||
|
"$name target: $raycastHit"
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val camera = hudRenderer.renderWindow.inputHandler.camera
|
||||||
|
addTarget(this.targetBlock, camera.blockTarget, "Block")
|
||||||
|
addTarget(this.targetFluid, camera.fluidTarget, "Fluid")
|
||||||
|
addTarget(this.targetEntity, camera.entityTarget, "Entity")
|
||||||
}
|
}
|
||||||
|
|
||||||
lastPrepareTime = System.currentTimeMillis()
|
lastPrepareTime = System.currentTimeMillis()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,7 +152,7 @@ class HUDSystemDebugNode(hudRenderer: HUDRenderer) : DebugScreenNode(hudRenderer
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getFormattedUsedMemory(): String {
|
private fun getFormattedUsedMemory(): String {
|
||||||
return UnitFormatter.formatBytes(getUsedMemory())
|
return getUsedMemory().formatBytes()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getAllocatedMemory(): Long {
|
private fun getAllocatedMemory(): Long {
|
||||||
@ -119,7 +160,7 @@ class HUDSystemDebugNode(hudRenderer: HUDRenderer) : DebugScreenNode(hudRenderer
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getFormattedAllocatedMemory(): String {
|
private fun getFormattedAllocatedMemory(): String {
|
||||||
return UnitFormatter.formatBytes(getAllocatedMemory())
|
return getAllocatedMemory().formatBytes()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getUsedMemoryPercent(): Long {
|
private fun getUsedMemoryPercent(): Long {
|
||||||
|
@ -25,11 +25,13 @@ import de.bixilon.minosoft.data.registries.fluid.DefaultFluids
|
|||||||
import de.bixilon.minosoft.data.registries.items.tools.MiningToolItem
|
import de.bixilon.minosoft.data.registries.items.tools.MiningToolItem
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
||||||
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit
|
||||||
import de.bixilon.minosoft.modding.event.CallbackEventInvoker
|
import de.bixilon.minosoft.modding.event.CallbackEventInvoker
|
||||||
import de.bixilon.minosoft.modding.event.events.BlockBreakAckEvent
|
import de.bixilon.minosoft.modding.event.events.BlockBreakAckEvent
|
||||||
import de.bixilon.minosoft.protocol.packets.c2s.play.ArmSwingC2SP
|
import de.bixilon.minosoft.protocol.packets.c2s.play.ArmSwingC2SP
|
||||||
import de.bixilon.minosoft.protocol.packets.c2s.play.BlockBreakC2SP
|
import de.bixilon.minosoft.protocol.packets.c2s.play.BlockBreakC2SP
|
||||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||||
|
import de.bixilon.minosoft.util.KUtil.nullCast
|
||||||
import de.bixilon.minosoft.util.KUtil.synchronizedMapOf
|
import de.bixilon.minosoft.util.KUtil.synchronizedMapOf
|
||||||
import glm_.pow
|
import glm_.pow
|
||||||
import glm_.vec3.Vec3i
|
import glm_.vec3.Vec3i
|
||||||
@ -98,7 +100,7 @@ class LeftClickHandler(
|
|||||||
cancelDigging()
|
cancelDigging()
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
val raycastHit = renderWindow.inputHandler.camera.getTargetBlock()
|
val raycastHit = renderWindow.inputHandler.camera.target?.nullCast<BlockRaycastHit>()
|
||||||
|
|
||||||
if (raycastHit == null) {
|
if (raycastHit == null) {
|
||||||
cancelDigging()
|
cancelDigging()
|
||||||
|
@ -18,10 +18,12 @@ import de.bixilon.minosoft.data.player.Hands
|
|||||||
import de.bixilon.minosoft.data.registries.blocks.BlockUsages
|
import de.bixilon.minosoft.data.registries.blocks.BlockUsages
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
||||||
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit
|
||||||
import de.bixilon.minosoft.protocol.packets.c2s.play.ArmSwingC2SP
|
import de.bixilon.minosoft.protocol.packets.c2s.play.ArmSwingC2SP
|
||||||
import de.bixilon.minosoft.protocol.packets.c2s.play.BlockPlaceC2SP
|
import de.bixilon.minosoft.protocol.packets.c2s.play.BlockPlaceC2SP
|
||||||
import de.bixilon.minosoft.protocol.packets.c2s.play.ItemUseC2SP
|
import de.bixilon.minosoft.protocol.packets.c2s.play.ItemUseC2SP
|
||||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||||
|
import de.bixilon.minosoft.util.KUtil.nullCast
|
||||||
import glm_.vec3.Vec3
|
import glm_.vec3.Vec3
|
||||||
|
|
||||||
class RightClickHandler(
|
class RightClickHandler(
|
||||||
@ -45,7 +47,7 @@ class RightClickHandler(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
val raycastHit = renderWindow.inputHandler.camera.getTargetBlock() ?: return
|
val raycastHit = renderWindow.inputHandler.camera.target?.nullCast<BlockRaycastHit>() ?: return
|
||||||
|
|
||||||
if (raycastHit.distance > RenderConstants.MAX_BLOCK_OUTLINE_RAYCAST_DISTANCE) {
|
if (raycastHit.distance > RenderConstants.MAX_BLOCK_OUTLINE_RAYCAST_DISTANCE) {
|
||||||
return
|
return
|
||||||
@ -94,7 +96,7 @@ class RightClickHandler(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
when (itemInHand.item.use(connection, raycastHit.blockState, raycastHit.blockPosition, raycastHit, Hands.MAIN_HAND, itemInHand)) {
|
when (itemInHand.item.use(connection, raycastHit, Hands.MAIN_HAND, itemInHand)) {
|
||||||
BlockUsages.SUCCESS -> {
|
BlockUsages.SUCCESS -> {
|
||||||
connection.sendPacket(ArmSwingC2SP(Hands.MAIN_HAND))
|
connection.sendPacket(ArmSwingC2SP(Hands.MAIN_HAND))
|
||||||
|
|
||||||
|
@ -17,8 +17,13 @@ import de.bixilon.minosoft.Minosoft
|
|||||||
import de.bixilon.minosoft.config.config.game.controls.KeyBindingsNames
|
import de.bixilon.minosoft.config.config.game.controls.KeyBindingsNames
|
||||||
import de.bixilon.minosoft.data.entities.EntityRotation
|
import de.bixilon.minosoft.data.entities.EntityRotation
|
||||||
import de.bixilon.minosoft.data.player.LocalPlayerEntity
|
import de.bixilon.minosoft.data.player.LocalPlayerEntity
|
||||||
|
import de.bixilon.minosoft.data.registries.blocks.types.FluidBlock
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
import de.bixilon.minosoft.gui.rendering.RenderConstants
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
||||||
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit
|
||||||
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.EntityRaycastHit
|
||||||
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.FluidRaycastHit
|
||||||
|
import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit
|
||||||
import de.bixilon.minosoft.gui.rendering.modding.events.CameraMatrixChangeEvent
|
import de.bixilon.minosoft.gui.rendering.modding.events.CameraMatrixChangeEvent
|
||||||
import de.bixilon.minosoft.gui.rendering.modding.events.CameraPositionChangeEvent
|
import de.bixilon.minosoft.gui.rendering.modding.events.CameraPositionChangeEvent
|
||||||
import de.bixilon.minosoft.gui.rendering.modding.events.FrustumChangeEvent
|
import de.bixilon.minosoft.gui.rendering.modding.events.FrustumChangeEvent
|
||||||
@ -52,6 +57,15 @@ class Camera(
|
|||||||
var cameraRight = Vec3d(0.0, 0.0, -1.0)
|
var cameraRight = Vec3d(0.0, 0.0, -1.0)
|
||||||
private var cameraUp = Vec3d(0.0, 1.0, 0.0)
|
private var cameraUp = Vec3d(0.0, 1.0, 0.0)
|
||||||
|
|
||||||
|
var target: RaycastHit? = null
|
||||||
|
private set
|
||||||
|
var blockTarget: BlockRaycastHit? = null
|
||||||
|
private set
|
||||||
|
var fluidTarget: FluidRaycastHit? = null
|
||||||
|
private set
|
||||||
|
var entityTarget: EntityRaycastHit? = null
|
||||||
|
private set
|
||||||
|
|
||||||
val fov: Double
|
val fov: Double
|
||||||
get() {
|
get() {
|
||||||
val fov = Minosoft.config.config.game.camera.fov / (zoom + 1.0)
|
val fov = Minosoft.config.config.game.camera.fov / (zoom + 1.0)
|
||||||
@ -199,13 +213,20 @@ class Camera(
|
|||||||
}
|
}
|
||||||
// ToDo: Only update if changed
|
// ToDo: Only update if changed
|
||||||
onPositionChange()
|
onPositionChange()
|
||||||
|
|
||||||
|
val eyePosition = entity.eyePosition
|
||||||
|
val cameraFront = cameraFront
|
||||||
|
|
||||||
|
target = raycast(eyePosition, cameraFront, blocks = true, fluids = true, entities = true)
|
||||||
|
blockTarget = raycast(eyePosition, cameraFront, blocks = true, fluids = false, entities = false) as BlockRaycastHit?
|
||||||
|
fluidTarget = raycast(eyePosition, cameraFront, blocks = false, fluids = true, entities = false) as FluidRaycastHit?
|
||||||
|
entityTarget = raycast(eyePosition, cameraFront, blocks = false, fluids = false, entities = true) as EntityRaycastHit?
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getTargetBlock(): RaycastHit? {
|
private fun raycast(origin: Vec3d, direction: Vec3d, blocks: Boolean, fluids: Boolean, entities: Boolean): RaycastHit? {
|
||||||
return raycast(entity.eyePosition, cameraFront)
|
if (!blocks && !fluids && entities) {
|
||||||
}
|
return null // ToDo: Raycast entities
|
||||||
|
}
|
||||||
private fun raycast(origin: Vec3d, direction: Vec3d): RaycastHit? {
|
|
||||||
val currentPosition = Vec3d(origin)
|
val currentPosition = Vec3d(origin)
|
||||||
|
|
||||||
fun getTotalDistance(): Double {
|
fun getTotalDistance(): Double {
|
||||||
@ -215,21 +236,44 @@ class Camera(
|
|||||||
for (i in 0..RAYCAST_MAX_STEPS) {
|
for (i in 0..RAYCAST_MAX_STEPS) {
|
||||||
val blockPosition = currentPosition.floor
|
val blockPosition = currentPosition.floor
|
||||||
val blockState = connection.world[blockPosition]
|
val blockState = connection.world[blockPosition]
|
||||||
if (blockState != null) {
|
|
||||||
val voxelShapeRaycastResult = (blockState.outlineShape + blockPosition + blockPosition.getWorldOffset(blockState.block)).raycast(currentPosition, direction)
|
if (blockState == null) {
|
||||||
if (voxelShapeRaycastResult.hit) {
|
currentPosition += direction * (VecUtil.getDistanceToNextIntegerAxisInDirection(currentPosition, direction) + 0.001)
|
||||||
currentPosition += direction * voxelShapeRaycastResult.distance
|
continue
|
||||||
return RaycastHit(
|
}
|
||||||
|
val voxelShapeRaycastResult = (blockState.block.getOutlineShape(connection, blockState, blockPosition) + blockPosition + blockPosition.getWorldOffset(blockState.block)).raycast(currentPosition, direction)
|
||||||
|
if (voxelShapeRaycastResult.hit) {
|
||||||
|
val distance = getTotalDistance()
|
||||||
|
currentPosition += direction * voxelShapeRaycastResult.distance
|
||||||
|
currentPosition += direction * (VecUtil.getDistanceToNextIntegerAxisInDirection(currentPosition, direction) + 0.001)
|
||||||
|
|
||||||
|
if (blockState.block is FluidBlock) {
|
||||||
|
if (!fluids) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return FluidRaycastHit(
|
||||||
currentPosition,
|
currentPosition,
|
||||||
blockPosition,
|
distance,
|
||||||
getTotalDistance(),
|
|
||||||
blockState,
|
|
||||||
voxelShapeRaycastResult.direction,
|
voxelShapeRaycastResult.direction,
|
||||||
i,
|
blockState,
|
||||||
|
blockPosition,
|
||||||
|
blockState.block.fluid,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!blocks) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return BlockRaycastHit(
|
||||||
|
currentPosition,
|
||||||
|
distance,
|
||||||
|
voxelShapeRaycastResult.direction,
|
||||||
|
blockState,
|
||||||
|
blockPosition,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
currentPosition += direction * (VecUtil.getDistanceToNextIntegerAxisInDirection(currentPosition, direction) + 0.001)
|
||||||
}
|
}
|
||||||
currentPosition += direction * (VecUtil.getDistanceToNextIntegerAxisInDirection(currentPosition, direction) + 0.001)
|
|
||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.gui.rendering.input.camera.hit
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.Directions
|
||||||
|
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
||||||
|
import de.bixilon.minosoft.util.KUtil.format
|
||||||
|
import glm_.vec3.Vec3d
|
||||||
|
import glm_.vec3.Vec3i
|
||||||
|
|
||||||
|
open class BlockRaycastHit(
|
||||||
|
position: Vec3d,
|
||||||
|
distance: Double,
|
||||||
|
hitDirection: Directions,
|
||||||
|
val blockState: BlockState,
|
||||||
|
val blockPosition: Vec3i,
|
||||||
|
) : RaycastHit(position, distance, hitDirection) {
|
||||||
|
val hitPosition = position - blockPosition
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
val ret = StringBuilder()
|
||||||
|
ret.append(blockPosition)
|
||||||
|
ret.append(": ")
|
||||||
|
ret.append(blockState.block.resourceLocation)
|
||||||
|
|
||||||
|
for ((key, value) in blockState.properties) {
|
||||||
|
ret.append('\n')
|
||||||
|
ret.append(' ')
|
||||||
|
ret.append(key.group)
|
||||||
|
ret.append(": ")
|
||||||
|
ret.append(value.format())
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret.toString()
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.gui.rendering.input.camera.hit
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.Directions
|
||||||
|
import de.bixilon.minosoft.data.entities.entities.Entity
|
||||||
|
import glm_.vec3.Vec3d
|
||||||
|
|
||||||
|
class EntityRaycastHit(
|
||||||
|
position: Vec3d,
|
||||||
|
distance: Double,
|
||||||
|
hitDirection: Directions,
|
||||||
|
val entity: Entity,
|
||||||
|
) : RaycastHit(position, distance, hitDirection) {
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return "$position: ${entity.entityType.resourceLocation}"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.gui.rendering.input.camera.hit
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.Directions
|
||||||
|
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
||||||
|
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
|
||||||
|
import de.bixilon.minosoft.data.registries.fluid.Fluid
|
||||||
|
import glm_.vec3.Vec3d
|
||||||
|
import glm_.vec3.Vec3i
|
||||||
|
|
||||||
|
class FluidRaycastHit(
|
||||||
|
position: Vec3d,
|
||||||
|
distance: Double,
|
||||||
|
hitDirection: Directions,
|
||||||
|
blockState: BlockState,
|
||||||
|
blockPosition: Vec3i,
|
||||||
|
val fluid: Fluid,
|
||||||
|
) : BlockRaycastHit(position, distance, hitDirection, blockState, blockPosition) {
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return "$blockPosition: ${fluid.resourceLocation}\n Height: ${fluid.getHeight(blockState)}\n Level: ${blockState.properties[BlockProperties.FLUID_LEVEL]}"
|
||||||
|
}
|
||||||
|
}
|
@ -11,20 +11,13 @@
|
|||||||
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package de.bixilon.minosoft.gui.rendering.input.camera
|
package de.bixilon.minosoft.gui.rendering.input.camera.hit
|
||||||
|
|
||||||
import de.bixilon.minosoft.data.Directions
|
import de.bixilon.minosoft.data.Directions
|
||||||
import de.bixilon.minosoft.data.registries.blocks.BlockState
|
|
||||||
import glm_.vec3.Vec3d
|
import glm_.vec3.Vec3d
|
||||||
import glm_.vec3.Vec3i
|
|
||||||
|
|
||||||
data class RaycastHit(
|
abstract class RaycastHit(
|
||||||
val position: Vec3d,
|
val position: Vec3d,
|
||||||
val blockPosition: Vec3i,
|
|
||||||
val distance: Double,
|
val distance: Double,
|
||||||
val blockState: BlockState,
|
|
||||||
val hitDirection: Directions,
|
val hitDirection: Directions,
|
||||||
val steps: Int,
|
)
|
||||||
) {
|
|
||||||
val hitPosition = position.minus(blockPosition)
|
|
||||||
}
|
|
@ -104,8 +104,8 @@ object GitInfo {
|
|||||||
|
|
||||||
IS_INITIALIZED = true
|
IS_INITIALIZED = true
|
||||||
} catch (exception: Throwable) {
|
} catch (exception: Throwable) {
|
||||||
Log.log(LogMessageType.OTHER, level = LogLevels.WARN) { exception }
|
|
||||||
Log.log(LogMessageType.OTHER, level = LogLevels.WARN) { "Could not load git information." }
|
Log.log(LogMessageType.OTHER, level = LogLevels.WARN) { "Could not load git information." }
|
||||||
|
Log.log(LogMessageType.OTHER, level = LogLevels.WARN) { exception }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@ package de.bixilon.minosoft.util
|
|||||||
|
|
||||||
import de.bixilon.minosoft.data.entities.entities.Entity
|
import de.bixilon.minosoft.data.entities.entities.Entity
|
||||||
import de.bixilon.minosoft.data.registries.ResourceLocation
|
import de.bixilon.minosoft.data.registries.ResourceLocation
|
||||||
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
||||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||||
import de.bixilon.minosoft.util.collections.SynchronizedMap
|
import de.bixilon.minosoft.util.collections.SynchronizedMap
|
||||||
@ -183,4 +184,28 @@ object KUtil {
|
|||||||
}
|
}
|
||||||
return list.toList()
|
return list.toList()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Any.format(): ChatComponent {
|
||||||
|
return ChatComponent.of(when (this) {
|
||||||
|
is Boolean -> {
|
||||||
|
if (this) {
|
||||||
|
"§atrue"
|
||||||
|
} else {
|
||||||
|
"§cfalse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is Enum<*> -> {
|
||||||
|
val name = this.name
|
||||||
|
if (name.length == 1) {
|
||||||
|
name
|
||||||
|
} else {
|
||||||
|
name.lowercase()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is Number -> {
|
||||||
|
"§d$this"
|
||||||
|
}
|
||||||
|
else -> this.toString()
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
package de.bixilon.minosoft.util
|
package de.bixilon.minosoft.util
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.util.UnitFormatter.formatBytes
|
||||||
import oshi.SystemInfo
|
import oshi.SystemInfo
|
||||||
|
|
||||||
object SystemInformation {
|
object SystemInformation {
|
||||||
@ -20,7 +21,7 @@ object SystemInformation {
|
|||||||
val SYSTEM_INFO = SystemInfo()
|
val SYSTEM_INFO = SystemInfo()
|
||||||
val HARDWARE_SYSTEM_INFO = SYSTEM_INFO.hardware
|
val HARDWARE_SYSTEM_INFO = SYSTEM_INFO.hardware
|
||||||
|
|
||||||
val SYSTEM_MEMORY_TEXT: String = UnitFormatter.formatBytes(HARDWARE_SYSTEM_INFO.memory.total)
|
val SYSTEM_MEMORY_TEXT: String = HARDWARE_SYSTEM_INFO.memory.total.formatBytes()
|
||||||
val OS_TEXT: String = "${System.getProperty("os.name")}: ${SYSTEM_INFO.operatingSystem.family} ${SYSTEM_INFO.operatingSystem.bitness}bit"
|
val OS_TEXT: String = "${System.getProperty("os.name")}: ${SYSTEM_INFO.operatingSystem.family} ${SYSTEM_INFO.operatingSystem.bitness}bit"
|
||||||
|
|
||||||
val PROCESSOR_TEXT = " ${RUNTIME.availableProcessors()}x ${HARDWARE_SYSTEM_INFO.processor.processorIdentifier.name.replace("\\s{2,}".toRegex(), "")}"
|
val PROCESSOR_TEXT = " ${RUNTIME.availableProcessors()}x ${HARDWARE_SYSTEM_INFO.processor.processorIdentifier.name.replace("\\s{2,}".toRegex(), "")}"
|
||||||
@ -34,7 +35,7 @@ object SystemInformation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getFormattedMaxMemory(): String {
|
private fun getFormattedMaxMemory(): String {
|
||||||
return UnitFormatter.formatBytes(getMaxMemory())
|
return getMaxMemory().formatBytes()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -18,11 +18,11 @@ object UnitFormatter {
|
|||||||
private val UNITS = arrayOf("", "k", "M", "G", "T", "P", "E", "Z", "Y")
|
private val UNITS = arrayOf("", "k", "M", "G", "T", "P", "E", "Z", "Y")
|
||||||
private val TIME_UNITS = arrayOf("ns", "μs", "ms", "s", "m", "h", "d", "w", "M", "Y")
|
private val TIME_UNITS = arrayOf("ns", "μs", "ms", "s", "m", "h", "d", "w", "M", "Y")
|
||||||
|
|
||||||
fun formatBytes(bytes: Long): String {
|
fun Long.formatBytes(): String {
|
||||||
if (bytes < 0) {
|
if (this < 0) {
|
||||||
return "Unknown"
|
return "Unknown"
|
||||||
}
|
}
|
||||||
return formatUnit(bytes, BYTE_UNITS, 1024L)
|
return formatUnit(this, BYTE_UNITS, 1024L)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun formatNumber(number: Int): String {
|
fun formatNumber(number: Int): String {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user