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 @@ -21,6 +21,7 @@ import io.github.pylonmc.rebar.nms.NmsAccessor
import io.github.pylonmc.rebar.registry.RebarRegistry
import io.github.pylonmc.rebar.util.IMMEDIATE_FACES
import io.github.pylonmc.rebar.util.editBlockData
import io.github.pylonmc.rebar.util.getBlockData
import io.github.pylonmc.rebar.util.isChunkLoaded
import io.github.pylonmc.rebar.util.position.BlockPosition
import io.github.pylonmc.rebar.util.position.position
Expand Down Expand Up @@ -142,10 +143,12 @@ open class RebarBlock private constructor(val block: Block) : WailaSupplier, Key
*/
open fun postInitialise() {}

fun getBlockData() = getBlockData(BlockData::class.java)

fun <D : BlockData> getBlockData(dataType: Class<D>) = block.getBlockData(dataType)

@JvmOverloads
fun editBlockData(editor: Consumer<BlockData>, applyPhysics: Boolean = true) {
block.editBlockData(editor, applyPhysics)
}
fun editBlockData(editor: Consumer<BlockData>, applyPhysics: Boolean = true) = editBlockData(BlockData::class.java, editor, applyPhysics)

@JvmOverloads
fun <D : BlockData> editBlockData(dataType: Class<D>, editor: Consumer<D>, applyPhysics: Boolean = true) {
Expand Down
27 changes: 22 additions & 5 deletions rebar/src/main/kotlin/io/github/pylonmc/rebar/util/RebarUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

package io.github.pylonmc.rebar.util

import com.google.common.base.Preconditions
import io.github.pylonmc.rebar.Rebar
import io.github.pylonmc.rebar.addon.RebarAddon
import io.github.pylonmc.rebar.block.BlockListener
Expand Down Expand Up @@ -906,21 +907,37 @@ fun VirtualInventory.unsafeSubtract(slot: Int, amount: Int) {
}

@JvmOverloads
fun Block.editBlockData(editor: Consumer<BlockData>, applyPhysics: Boolean = true) {
editBlockData(BlockData::class.java, editor, applyPhysics)
}
fun Block.editBlockData(editor: Consumer<BlockData>, applyPhysics: Boolean = true) = editBlockData(BlockData::class.java, editor, applyPhysics)

@JvmOverloads
fun <D: BlockData> Block.editBlockData(dataType: Class<D>, editor: Consumer<D>, applyPhysics: Boolean = true) {
val blockData = this.blockData
editor.accept(dataType.cast(blockData))
val blockData = getBlockData(dataType)
editor.accept(blockData)
setBlockData(blockData, applyPhysics)
}

fun <D: BlockData> Block.getBlockData(dataType: Class<D>): D {
val blockData = this.blockData
Preconditions.checkState(dataType.isInstance(blockData))
return dataType.cast(this.blockData)
}

fun ItemStack.isBroken(): Boolean {
val maxDamage = getData(DataComponentTypes.MAX_DAMAGE) ?: return false
val damage = getData(DataComponentTypes.DAMAGE) ?: return false
return damage >= maxDamage && !hasData(DataComponentTypes.UNBREAKABLE);
}

/**
* This is used commonly when you are manipulating an [ItemStack] before it has been damaged, but when you know it
* will be damaged,and you want to check if it will break after the damage is applied.
*
* @return if this [ItemStack] has only 1 durability left.
*/
fun ItemStack.hasOneDurabilityLeft(): Boolean {
val maxDamage = getData(DataComponentTypes.MAX_DAMAGE) ?: return false
val damage = getData(DataComponentTypes.DAMAGE) ?: return false
return damage == maxDamage - 1 && !hasData(DataComponentTypes.UNBREAKABLE);
}

const val FLUID_EPSILON = 1.0e-6
Loading