Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ fun raycastForFluid(player: Player, startPosition: Point, direction: Vec, maxDis
return null // No fluid found within the range
}

fun findBlockFace(player: Player, blockPosition: Point): BlockFace? {
fun findBlockFace(blockPosition: Point): BlockFace? {
return BlockFace.entries.firstOrNull { dir ->
val direction = dir.toDirection()
blockPosition.add(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import org.everbuild.blocksandstuff.fluids.impl.EmptyFluid
import org.everbuild.blocksandstuff.fluids.impl.Fluid
import org.everbuild.blocksandstuff.fluids.impl.LavaFluid
import org.everbuild.blocksandstuff.fluids.impl.WaterFluid
import org.everbuild.blocksandstuff.fluids.listener.setupFluidPlacementEvent
import org.everbuild.blocksandstuff.fluids.placement.getFluidPlacementEventNode
import org.everbuild.blocksandstuff.fluids.pickup.getFluidPickupEventNode

object MinestomFluids {
Expand Down Expand Up @@ -77,9 +77,7 @@ object MinestomFluids {
private fun events(): EventNode<Event> = EventNode.all("fluid-events")
.addListener(InstanceTickEvent::class.java, MinestomFluids::onTick)
.addChild(getFluidPickupEventNode())
.also {
setupFluidPlacementEvent() // TODO
}
.addChild(getFluidPlacementEventNode())

/**
* Processes the given chunk to ingest and manage fluid-related operations,
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@ package org.everbuild.blocksandstuff.fluids.pickup

import net.minestom.server.coordinate.BlockVec
import net.minestom.server.entity.Player
import net.minestom.server.event.trait.BlockEvent
import net.minestom.server.event.trait.CancellableEvent
import net.minestom.server.event.trait.InstanceEvent
import net.minestom.server.event.trait.PlayerEvent
import net.minestom.server.event.trait.PlayerInstanceEvent
import net.minestom.server.instance.Instance
import net.minestom.server.instance.block.Block
Expand All @@ -19,7 +16,7 @@ class FluidPickupEvent(
) : CancellableEvent, PlayerInstanceEvent {
private var isCancelled = false

override fun isCancelled(): Boolean =isCancelled
override fun isCancelled(): Boolean = isCancelled
override fun setCancelled(cancel: Boolean) {
isCancelled = cancel
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package org.everbuild.blocksandstuff.fluids.pickup

import net.minestom.server.MinecraftServer
import net.minestom.server.coordinate.BlockVec
import net.minestom.server.entity.EquipmentSlot
import net.minestom.server.entity.attribute.Attribute
import net.minestom.server.event.EventNode
import net.minestom.server.event.player.PlayerUseItemEvent
Expand All @@ -19,7 +18,7 @@ import org.everbuild.blocksandstuff.fluids.raycastForFluid

fun getFluidPickupEventNode() = EventNode.all("fluid-pickup")
.addListener(PlayerUseItemEvent::class.java) { event: PlayerUseItemEvent ->
if (event.player.itemInMainHand != ItemStack.of(Material.BUCKET)) return@addListener
if (event.itemStack != ItemStack.of(Material.BUCKET)) return@addListener

val instance = event.player.instance

Expand All @@ -29,9 +28,18 @@ fun getFluidPickupEventNode() = EventNode.all("fluid-pickup")
event.player.eyePosition(),
event.player.position.direction(),
event.player.getAttributeValue(Attribute.BLOCK_INTERACTION_RANGE)
) ?: return@addListener
)

if (liquidBlock==null) {
//FIXME: sometimes this is null when it shouldn't
// and the water doesn't get picked up which causes a client desync
// this is a fix for the desync but not the raycastForFluid being null
event.player.inventory.update()

val blockFace = findBlockFace(player = event.player, liquidBlock) ?: return@addListener
return@addListener
}

val blockFace = findBlockFace(liquidBlock) ?: return@addListener

val pickupEvent = FluidPickupEvent(
event.instance,
Expand All @@ -40,6 +48,7 @@ fun getFluidPickupEventNode() = EventNode.all("fluid-pickup")
BlockVec(liquidBlock.x(), liquidBlock.y(), liquidBlock.z()),
Block.AIR
)

MinecraftServer.getGlobalEventHandler().callCancellable(pickupEvent) {
instance.placeBlock(
PlayerPlacement(
Expand All @@ -54,18 +63,16 @@ fun getFluidPickupEventNode() = EventNode.all("fluid-pickup")
liquidBlock.z().toFloat(),
)
)
}

val fluid = MinestomFluids.getFluidInstanceOnBlock(pickupEvent.sourceBlock)
val fluid = MinestomFluids.getFluidInstanceOnBlock(pickupEvent.sourceBlock)

if (fluid is WaterFluid || fluid is LavaFluid) {
val material = if (fluid is WaterFluid) Material.WATER_BUCKET
if (fluid is WaterFluid || fluid is LavaFluid) {
val material = if (fluid is WaterFluid) Material.WATER_BUCKET
else Material.LAVA_BUCKET

event.player.inventory.setEquipment(
EquipmentSlot.MAIN_HAND,
event.player.heldSlot,
ItemStack.of(material)
)
event.player.setItemInHand(event.hand, ItemStack.of(material))
}
}

event.player.inventory.update()

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.everbuild.blocksandstuff.fluids.placement

import net.minestom.server.coordinate.BlockVec
import net.minestom.server.entity.Player
import net.minestom.server.event.trait.CancellableEvent
import net.minestom.server.event.trait.PlayerInstanceEvent
import net.minestom.server.instance.Instance
import net.minestom.server.instance.block.Block

class FluidPlaceEvent(
private val instance: Instance,
private val player: Player,
val block: Block,
val placePosition: BlockVec,
var blockToPlace: Block
) : CancellableEvent, PlayerInstanceEvent {
private var isCancelled = false

override fun isCancelled(): Boolean = isCancelled
override fun setCancelled(cancel: Boolean) {
isCancelled = cancel
}

override fun getInstance(): Instance = instance
override fun getPlayer(): Player = player
}
Loading