From 84c5a4d39a0842f1774e6984a01818a9c5ec315f Mon Sep 17 00:00:00 2001 From: Bixilon Date: Mon, 21 Jun 2021 22:22:00 +0200 Subject: [PATCH] fluid submerged state, check block break water submerged state --- .../minosoft/data/player/LocalPlayerEntity.kt | 25 ++++++++++++++++--- .../enchantment/DefaultEnchantments.kt | 1 + .../minosoft/data/registries/fluid/Fluid.kt | 6 ++++- .../gui/rendering/input/LeftClickHandler.kt | 14 +++++++++-- 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/data/player/LocalPlayerEntity.kt b/src/main/java/de/bixilon/minosoft/data/player/LocalPlayerEntity.kt index 5332e113e..0d866a3dc 100644 --- a/src/main/java/de/bixilon/minosoft/data/player/LocalPlayerEntity.kt +++ b/src/main/java/de/bixilon/minosoft/data/player/LocalPlayerEntity.kt @@ -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.enchantment.DefaultEnchantments 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.Item 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.EMPTY 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.clearZero import de.bixilon.minosoft.gui.rendering.util.VecUtil.empty @@ -95,6 +97,7 @@ class LocalPlayerEntity( // fluids stuff private val fluidHeights: MutableMap = synchronizedMapOf() + var submgergedFluid: Fluid? = null var input = MovementInput() @@ -645,18 +648,18 @@ class LocalPlayerEntity( continue } - val fluid = blockState.block.fluid + val blockFluid = blockState.block.fluid - if (fluid !is FlowableFluid) { + if (blockFluid !is FlowableFluid) { continue } - val fluidVelocity = fluid.getVelocity(connection, blockState, blockPosition) + val fluidVelocity = blockFluid.getVelocity(connection, blockState, blockPosition) if (height < 0.4) { fluidVelocity *= height } - velocity += (fluidVelocity * fluid.getVelocityMultiplier(connection, blockState, blockPosition)) + velocity += (fluidVelocity * blockFluid.getVelocityMultiplier(connection, blockState, blockPosition)) checks++ } @@ -689,6 +692,20 @@ class LocalPlayerEntity( 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() { diff --git a/src/main/java/de/bixilon/minosoft/data/registries/enchantment/DefaultEnchantments.kt b/src/main/java/de/bixilon/minosoft/data/registries/enchantment/DefaultEnchantments.kt index a15b09c3e..121cf2fb7 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/enchantment/DefaultEnchantments.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/enchantment/DefaultEnchantments.kt @@ -19,4 +19,5 @@ object DefaultEnchantments { val SOUL_SPEED = "minecraft:soul_speed".asResourceLocation() val UNBREAKING = "minecraft:unbreaking".asResourceLocation() val EFFICIENCY = "minecraft:efficiency".asResourceLocation() + val AQUA_AFFINITY = "minecraft:aqua_affinity".asResourceLocation() } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/fluid/Fluid.kt b/src/main/java/de/bixilon/minosoft/data/registries/fluid/Fluid.kt index 654b5b28b..dc6c5a764 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/fluid/Fluid.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/fluid/Fluid.kt @@ -62,7 +62,11 @@ open class Fluid( } fun getHeight(blockState: BlockState): Float { - return (blockState.properties[BlockProperties.FLUID_LEVEL] ?: return 0.0f).unsafeCast() / 9.0f + val fluidLevel = blockState.properties[BlockProperties.FLUID_LEVEL]?.unsafeCast() ?: 0 + if (fluidLevel == 0) { + return 1.0f + } + return fluidLevel / 9.0f } open fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) {} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/LeftClickHandler.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/LeftClickHandler.kt index 13a63ba57..66beefa13 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/LeftClickHandler.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/LeftClickHandler.kt @@ -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.effects.DefaultStatusEffects 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.gui.rendering.RenderConstants import de.bixilon.minosoft.gui.rendering.RenderWindow @@ -54,6 +55,8 @@ class LeftClickHandler( private var acknowledgedBreakStarts: MutableMap = synchronizedMapOf() 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 miningFatigueStatusEffect = connection.registries.statusEffectRegistry[DefaultStatusEffects.MINING_FATIGUE] @@ -194,10 +197,17 @@ class LeftClickHandler( } 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) { speedMultiplier /= 5.0f