fluid submerged state, check block break water submerged state

This commit is contained in:
Bixilon 2021-06-21 22:22:00 +02:00
parent b603439d44
commit 84c5a4d39a
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
4 changed files with 39 additions and 7 deletions

View File

@ -34,6 +34,7 @@ import de.bixilon.minosoft.data.registries.effects.attributes.DefaultStatusEffec
import de.bixilon.minosoft.data.registries.effects.attributes.StatusEffectAttributeInstance import de.bixilon.minosoft.data.registries.effects.attributes.StatusEffectAttributeInstance
import de.bixilon.minosoft.data.registries.enchantment.DefaultEnchantments import de.bixilon.minosoft.data.registries.enchantment.DefaultEnchantments
import de.bixilon.minosoft.data.registries.fluid.FlowableFluid import de.bixilon.minosoft.data.registries.fluid.FlowableFluid
import de.bixilon.minosoft.data.registries.fluid.Fluid
import de.bixilon.minosoft.data.registries.items.DefaultItems import de.bixilon.minosoft.data.registries.items.DefaultItems
import de.bixilon.minosoft.data.registries.items.Item 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
@ -45,6 +46,7 @@ import de.bixilon.minosoft.gui.rendering.input.camera.MovementInput
import de.bixilon.minosoft.gui.rendering.util.VecUtil import de.bixilon.minosoft.gui.rendering.util.VecUtil
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.assign import de.bixilon.minosoft.gui.rendering.util.VecUtil.assign
import de.bixilon.minosoft.gui.rendering.util.VecUtil.blockPosition
import de.bixilon.minosoft.gui.rendering.util.VecUtil.chunkPosition import de.bixilon.minosoft.gui.rendering.util.VecUtil.chunkPosition
import de.bixilon.minosoft.gui.rendering.util.VecUtil.clearZero import de.bixilon.minosoft.gui.rendering.util.VecUtil.clearZero
import de.bixilon.minosoft.gui.rendering.util.VecUtil.empty import de.bixilon.minosoft.gui.rendering.util.VecUtil.empty
@ -95,6 +97,7 @@ class LocalPlayerEntity(
// fluids stuff // fluids stuff
private val fluidHeights: MutableMap<ResourceLocation, Float> = synchronizedMapOf() private val fluidHeights: MutableMap<ResourceLocation, Float> = synchronizedMapOf()
var submgergedFluid: Fluid? = null
var input = MovementInput() var input = MovementInput()
@ -645,18 +648,18 @@ class LocalPlayerEntity(
continue continue
} }
val fluid = blockState.block.fluid val blockFluid = blockState.block.fluid
if (fluid !is FlowableFluid) { if (blockFluid !is FlowableFluid) {
continue continue
} }
val fluidVelocity = fluid.getVelocity(connection, blockState, blockPosition) val fluidVelocity = blockFluid.getVelocity(connection, blockState, blockPosition)
if (height < 0.4) { if (height < 0.4) {
fluidVelocity *= height fluidVelocity *= height
} }
velocity += (fluidVelocity * fluid.getVelocityMultiplier(connection, blockState, blockPosition)) velocity += (fluidVelocity * blockFluid.getVelocityMultiplier(connection, blockState, blockPosition))
checks++ checks++
} }
@ -689,6 +692,20 @@ class LocalPlayerEntity(
updateFluidState(it.resourceLocation) updateFluidState(it.resourceLocation)
} }
// 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
}
val height = eyePosition.y + blockState.block.fluid.getHeight(blockState)
if (height > eyeHeight) {
submgergedFluid = blockState.block.fluid
}
} }
override fun realTick() { override fun realTick() {

View File

@ -19,4 +19,5 @@ object DefaultEnchantments {
val SOUL_SPEED = "minecraft:soul_speed".asResourceLocation() val SOUL_SPEED = "minecraft:soul_speed".asResourceLocation()
val UNBREAKING = "minecraft:unbreaking".asResourceLocation() val UNBREAKING = "minecraft:unbreaking".asResourceLocation()
val EFFICIENCY = "minecraft:efficiency".asResourceLocation() val EFFICIENCY = "minecraft:efficiency".asResourceLocation()
val AQUA_AFFINITY = "minecraft:aqua_affinity".asResourceLocation()
} }

View File

@ -62,7 +62,11 @@ open class Fluid(
} }
fun getHeight(blockState: BlockState): Float { fun getHeight(blockState: BlockState): Float {
return (blockState.properties[BlockProperties.FLUID_LEVEL] ?: return 0.0f).unsafeCast<Int>() / 9.0f val fluidLevel = blockState.properties[BlockProperties.FLUID_LEVEL]?.unsafeCast<Int>() ?: 0
if (fluidLevel == 0) {
return 1.0f
}
return fluidLevel / 9.0f
} }
open fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) {} open fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) {}

View File

@ -21,6 +21,7 @@ import de.bixilon.minosoft.data.player.Hands
import de.bixilon.minosoft.data.registries.blocks.BlockState import de.bixilon.minosoft.data.registries.blocks.BlockState
import de.bixilon.minosoft.data.registries.effects.DefaultStatusEffects import de.bixilon.minosoft.data.registries.effects.DefaultStatusEffects
import de.bixilon.minosoft.data.registries.enchantment.DefaultEnchantments import de.bixilon.minosoft.data.registries.enchantment.DefaultEnchantments
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
@ -54,6 +55,8 @@ class LeftClickHandler(
private var acknowledgedBreakStarts: MutableMap<Vec3i, BlockState?> = synchronizedMapOf() private var acknowledgedBreakStarts: MutableMap<Vec3i, BlockState?> = synchronizedMapOf()
private val efficiencyEnchantment = connection.registries.enchantmentRegistry[DefaultEnchantments.EFFICIENCY] private val efficiencyEnchantment = connection.registries.enchantmentRegistry[DefaultEnchantments.EFFICIENCY]
private val aquaAffinityEnchantment = connection.registries.enchantmentRegistry[DefaultEnchantments.AQUA_AFFINITY]
private val hasteStatusEffect = connection.registries.statusEffectRegistry[DefaultStatusEffects.HASTE] private val hasteStatusEffect = connection.registries.statusEffectRegistry[DefaultStatusEffects.HASTE]
private val miningFatigueStatusEffect = connection.registries.statusEffectRegistry[DefaultStatusEffects.MINING_FATIGUE] private val miningFatigueStatusEffect = connection.registries.statusEffectRegistry[DefaultStatusEffects.MINING_FATIGUE]
@ -194,10 +197,17 @@ class LeftClickHandler(
} }
connection.player.activeStatusEffects[miningFatigueStatusEffect]?.let { connection.player.activeStatusEffects[miningFatigueStatusEffect]?.let {
speedMultiplier *= 0.3f.pow(it.amplifier + 1) speedMultiplier *= when (it.amplifier) {
0 -> 0.3f
1 -> 0.09f
2 -> 0.0027f
else -> 8.1E-4f
}
} }
// ToDo: Check if is in water if (connection.player.submgergedFluid?.resourceLocation == DefaultFluids.WATER && connection.player.getEquipmentEnchant(aquaAffinityEnchantment) == 0) {
speedMultiplier /= 5.0f
}
if (!connection.player.onGround) { if (!connection.player.onGround) {
speedMultiplier /= 5.0f speedMultiplier /= 5.0f