wip: fluid pushing

This commit is contained in:
Bixilon 2021-06-20 23:14:23 +02:00
parent 85c965048f
commit f03c49fbcc
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
4 changed files with 61 additions and 35 deletions

View File

@ -39,7 +39,6 @@ import de.bixilon.minosoft.data.registries.items.Item
import de.bixilon.minosoft.data.registries.other.containers.Container import de.bixilon.minosoft.data.registries.other.containers.Container
import de.bixilon.minosoft.data.registries.other.containers.PlayerInventory import de.bixilon.minosoft.data.registries.other.containers.PlayerInventory
import de.bixilon.minosoft.data.tags.DefaultBlockTags import de.bixilon.minosoft.data.tags.DefaultBlockTags
import de.bixilon.minosoft.data.tags.DefaultFluidTags
import de.bixilon.minosoft.data.tags.Tag import de.bixilon.minosoft.data.tags.Tag
import de.bixilon.minosoft.gui.rendering.chunk.models.AABB import de.bixilon.minosoft.gui.rendering.chunk.models.AABB
import de.bixilon.minosoft.gui.rendering.input.camera.MovementInput import de.bixilon.minosoft.gui.rendering.input.camera.MovementInput
@ -308,7 +307,7 @@ class LocalPlayerEntity(
var movement = Vec3d(delta) var movement = Vec3d(delta)
// ToDo: Check for piston movement+ // ToDo: Check for piston movement
if (!movementMultiplier.empty) { if (!movementMultiplier.empty) {
movement = movement * movementMultiplier movement = movement * movementMultiplier
@ -615,7 +614,7 @@ class LocalPlayerEntity(
get() = (onGround && fallDistance < PhysicsConstants.STEP_HEIGHT) && !connection.world.isSpaceEmpty(aabb + Vec3(0.0f, fallDistance - PhysicsConstants.STEP_HEIGHT, 0.0f)) get() = (onGround && fallDistance < PhysicsConstants.STEP_HEIGHT) && !connection.world.isSpaceEmpty(aabb + Vec3(0.0f, fallDistance - PhysicsConstants.STEP_HEIGHT, 0.0f))
private fun updateFluidState(fluidType: ResourceLocation): Boolean { private fun updateFluidState(fluid: ResourceLocation): Boolean {
val aabb = aabb.shrink() val aabb = aabb.shrink()
var height = 0.0f var height = 0.0f
@ -624,18 +623,15 @@ class LocalPlayerEntity(
val velocity = Vec3d.EMPTY val velocity = Vec3d.EMPTY
var checks = 0 var checks = 0
var velocityMultiplier = 1.0
for ((blockPosition, blockState) in connection.world[aabb]) { for ((blockPosition, blockState) in connection.world[aabb]) {
if (blockState.block !is FluidBlock) { if (blockState.block !is FluidBlock) {
continue continue
} }
if (blockState.block.fluid.resourceLocation != fluid) {
if (!connection.inTag(blockState.block.fluid, TagsS2CP.FLUID_TAG_RESOURCE_LOCATION, fluidType)) {
continue continue
} }
val fluidHeight = blockPosition.y + blockState.block.getFluidHeight(blockState) val fluidHeight = blockPosition.y + blockState.block.fluid.getHeight(blockState)
if (fluidHeight < aabb.min.y) { if (fluidHeight < aabb.min.y) {
continue continue
@ -654,47 +650,45 @@ class LocalPlayerEntity(
if (fluid !is FlowableFluid) { if (fluid !is FlowableFluid) {
continue continue
} }
velocityMultiplier = fluid.getVelocityMultiplier(connection, blockState, blockPosition)
val fluidVelocity = fluid.getVelocity(connection, blockState, blockPosition) val fluidVelocity = fluid.getVelocity(connection, blockState, blockPosition)
if (height < 0.4) { if (height < 0.4) {
fluidVelocity *= height fluidVelocity *= height
} }
velocity += fluidVelocity velocity += (fluidVelocity * fluid.getVelocityMultiplier(connection, blockState, blockPosition))
checks++ checks++
} }
if (velocity.length() > 0.0) { if (velocity.length() > 0.0) {
if (checks > 0) { if (checks > 0) {
velocity *= 1.0 / checks velocity /= checks
} }
velocity *= velocityMultiplier velocity *= velocityMultiplier
if (abs(velocity.x) < 0.004 && abs(velocity.z) < 0.003 && velocity.length() < 0.0045000000000000005) { if (abs(this.velocity.x) < 0.003 && abs(this.velocity.z) < 0.003 && velocity.length() < 0.0045000000000000005) {
velocity assign velocity.normalize() * 0.0045000000000000005 velocity assign (velocity.normalize() * 0.0045000000000000005)
} }
this.velocity assign (this.velocity + velocity) val finalVelocity = this.velocity + velocity
this.velocity assign finalVelocity
} }
fluidHeights[fluidType] = height fluidHeights[fluid] = height
return inFluid return inFluid
} }
private fun updateWaterState() { private fun updateFluidStates() {
fluidHeights.clear() fluidHeights.clear()
if (vehicle is Boat) { if (vehicle is Boat) {
return // ToDo return // ToDo
} }
if (updateFluidState(DefaultFluidTags.WATER_TAG)) { connection.registries.fluidRegistry.forEachItem {
// Log.log(LogMessageType.OTHER, LogLevels.VERBOSE){"In Water: Yes"} updateFluidState(it.resourceLocation)
return
// ToDo
} }
// Log.log(LogMessageType.OTHER, LogLevels.VERBOSE){"In Water: No"}
} }
override fun realTick() { override fun realTick() {
@ -704,7 +698,7 @@ class LocalPlayerEntity(
} }
super.realTick() super.realTick()
tickMovement() tickMovement()
updateWaterState() updateFluidStates()
sendMovementPackets() sendMovementPackets()

View File

@ -16,13 +16,11 @@ package de.bixilon.minosoft.data.registries.blocks.types
import com.google.gson.JsonObject import com.google.gson.JsonObject
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.BlockState
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
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.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.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
import kotlin.random.Random import kotlin.random.Random
@ -40,17 +38,9 @@ open class FluidBlock(resourceLocation: ResourceLocation, registries: Registries
} }
} }
fun getFluidHeight(blockState: BlockState): Float {
return (blockState.properties[BlockProperties.FLUID_LEVEL]?.nullCast() ?: 0) * FLUID_HEIGHT_CALCULATOR
}
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
fluid.randomTick(connection, blockState, blockPosition, random) fluid.randomTick(connection, blockState, blockPosition, random)
} }
companion object {
private const val FLUID_HEIGHT_CALCULATOR = 1.0f / 16.0f
}
} }

View File

@ -13,10 +13,13 @@
package de.bixilon.minosoft.data.registries.fluid package de.bixilon.minosoft.data.registries.fluid
import com.google.gson.JsonObject import com.google.gson.JsonObject
import de.bixilon.minosoft.data.Directions
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.BlockState
import de.bixilon.minosoft.data.registries.blocks.types.FluidBlock
import de.bixilon.minosoft.data.registries.versions.Registries import de.bixilon.minosoft.data.registries.versions.Registries
import de.bixilon.minosoft.gui.rendering.util.VecUtil.EMPTY import de.bixilon.minosoft.gui.rendering.util.VecUtil.EMPTY
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 glm_.vec3.Vec3d import glm_.vec3.Vec3d
import glm_.vec3.Vec3i import glm_.vec3.Vec3i
@ -31,8 +34,42 @@ abstract class FlowableFluid(
abstract fun getVelocityMultiplier(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i): Double abstract fun getVelocityMultiplier(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i): Double
fun getVelocity(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i): Vec3d { open fun getVelocity(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i): Vec3d {
// ToDo if (blockState.block !is FluidBlock) {
return Vec3d.EMPTY return Vec3d.EMPTY
} }
val thisFluidHeight = blockState.block.fluid.getHeight(blockState)
val velocity = Vec3d.EMPTY
for (direction in Directions.SIDES) {
val neighbourBlockState = connection.world[blockPosition + direction] ?: continue
if (neighbourBlockState.block !is FluidBlock) {
continue
}
val fluid = neighbourBlockState.block.fluid
if (!matches(fluid)) {
continue
}
val height = neighbourBlockState.block.fluid.getHeight(neighbourBlockState)
var magic = 0.0f
if (height == 0.0f) {
// ToDo
} else {
magic = thisFluidHeight - height
}
if (magic != 0.0f) {
velocity += (direction.vectord * magic)
}
}
// ToDo: Falling fluid
return velocity.normalize() * -1.0
}
} }

View File

@ -15,6 +15,7 @@ package de.bixilon.minosoft.data.registries.fluid
import com.google.gson.JsonObject import com.google.gson.JsonObject
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.BlockState
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
import de.bixilon.minosoft.data.registries.blocks.types.FluidBlock import de.bixilon.minosoft.data.registries.blocks.types.FluidBlock
import de.bixilon.minosoft.data.registries.fluid.lava.LavaFluid import de.bixilon.minosoft.data.registries.fluid.lava.LavaFluid
import de.bixilon.minosoft.data.registries.fluid.water.WaterFluid import de.bixilon.minosoft.data.registries.fluid.water.WaterFluid
@ -24,6 +25,7 @@ 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.versions.Registries import de.bixilon.minosoft.data.registries.versions.Registries
import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.util.KUtil.unsafeCast
import glm_.vec3.Vec3i import glm_.vec3.Vec3i
import kotlin.random.Random import kotlin.random.Random
@ -59,6 +61,9 @@ open class Fluid(
return matches(other.block.fluid) return matches(other.block.fluid)
} }
fun getHeight(blockState: BlockState): Float {
return (blockState.properties[BlockProperties.FLUID_LEVEL] ?: return 0.0f).unsafeCast<Int>() / 9.0f
}
open fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) {} open fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) {}