fix fluid digging, improve fluid velocity

This commit is contained in:
Bixilon 2021-06-27 22:59:35 +02:00
parent 9ebaeb6eb0
commit ddcf3fd7f5
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
6 changed files with 15 additions and 24 deletions

View File

@ -60,9 +60,6 @@ import de.bixilon.minosoft.util.KUtil.decide
import de.bixilon.minosoft.util.KUtil.nullCast
import de.bixilon.minosoft.util.KUtil.synchronizedMapOf
import de.bixilon.minosoft.util.MMath
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
import glm_.func.cos
import glm_.func.rad
import glm_.func.sin
@ -575,14 +572,11 @@ class LocalPlayerEntity(
velocity /= checks
}
velocity *= velocityMultiplier
if (abs(this.velocity.x) < 0.003 && abs(this.velocity.z) < 0.003 && velocity.length() < 0.0045000000000000005) {
velocity assign (velocity.normalize() * 0.0045000000000000005)
}
val finalVelocity = this.velocity + velocity
this.velocity assign finalVelocity
this.velocity assign (this.velocity + velocity)
}
fluidHeights[fluid] = height
return inFluid
@ -599,11 +593,12 @@ class LocalPlayerEntity(
updateFluidState(it.resourceLocation)
}
submgergedFluid = null
// ToDo: Boat
val eyeHeight = eyePosition.y - 0.1111111119389534
val eyePosition = (Vec3d(position.x, eyeHeight, position.z)).blockPosition
submgergedFluid = null
val blockState = connection.world[eyePosition] ?: return
if (blockState.block !is FluidBlock) {
return

View File

@ -35,10 +35,10 @@ abstract class FlowableFluid(
abstract fun getVelocityMultiplier(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i): Double
open fun getVelocity(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i): Vec3d {
if (blockState.block !is FluidBlock) {
if (blockState.block !is FluidBlock || !blockState.block.fluid.matches(this)) {
return Vec3d.EMPTY
}
val thisFluidHeight = blockState.block.fluid.getHeight(blockState)
val fluidHeight = getHeight(blockState)
val velocity = Vec3d.EMPTY
@ -54,16 +54,16 @@ abstract class FlowableFluid(
}
val height = neighbourBlockState.block.fluid.getHeight(neighbourBlockState)
var magic = 0.0f
var heightDifference = 0.0f
if (height == 0.0f) {
// ToDo
} else {
magic = thisFluidHeight - height
heightDifference = fluidHeight - height
}
if (magic != 0.0f) {
velocity += (direction.vectord * magic)
if (heightDifference != 0.0f) {
velocity += (direction.vectord * heightDifference)
}
}

View File

@ -25,13 +25,11 @@ import de.bixilon.minosoft.data.registries.fluid.DefaultFluids
import de.bixilon.minosoft.data.registries.items.tools.MiningToolItem
import de.bixilon.minosoft.gui.rendering.RenderConstants
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.events.BlockBreakAckEvent
import de.bixilon.minosoft.protocol.packets.c2s.play.ArmSwingC2SP
import de.bixilon.minosoft.protocol.packets.c2s.play.BlockBreakC2SP
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.KUtil.nullCast
import de.bixilon.minosoft.util.KUtil.synchronizedMapOf
import glm_.pow
import glm_.vec3.Vec3i
@ -100,7 +98,7 @@ class LeftClickHandler(
cancelDigging()
return false
}
val raycastHit = renderWindow.inputHandler.camera.target?.nullCast<BlockRaycastHit>()
val raycastHit = renderWindow.inputHandler.camera.blockTarget
if (raycastHit == null) {
cancelDigging()

View File

@ -18,12 +18,10 @@ import de.bixilon.minosoft.data.player.Hands
import de.bixilon.minosoft.data.registries.blocks.BlockUsages
import de.bixilon.minosoft.gui.rendering.RenderConstants
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.BlockPlaceC2SP
import de.bixilon.minosoft.protocol.packets.c2s.play.ItemUseC2SP
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.KUtil.nullCast
import glm_.vec3.Vec3
class RightClickHandler(
@ -47,7 +45,7 @@ class RightClickHandler(
return
}
val raycastHit = renderWindow.inputHandler.camera.target?.nullCast<BlockRaycastHit>() ?: return
val raycastHit = renderWindow.inputHandler.camera.blockTarget ?: return
if (raycastHit.distance > RenderConstants.MAX_BLOCK_OUTLINE_RAYCAST_DISTANCE) {
return

View File

@ -61,7 +61,7 @@ class Camera(
var target: RaycastHit? = null
private set
var blockTarget: BlockRaycastHit? = null
var blockTarget: BlockRaycastHit? = null // Block target or if blocked by entity null
private set
var fluidTarget: FluidRaycastHit? = null
private set

View File

@ -24,10 +24,10 @@ class FluidRaycastHit(
position: Vec3d,
distance: Double,
hitDirection: Directions,
blockState: BlockState,
blockPosition: Vec3i,
val blockState: BlockState,
val blockPosition: Vec3i,
val fluid: Fluid,
) : BlockRaycastHit(position, distance, hitDirection, blockState, blockPosition) {
) : RaycastHit(position, distance, hitDirection) {
override fun toString(): String {
return "$blockPosition: ${fluid.resourceLocation}\n Height: ${fluid.getHeight(blockState)}\n Level: ${blockState.properties[BlockProperties.FLUID_LEVEL]}"