Skip to content

Commit

Permalink
Fix: Efficient Miner on Ore Mined Event (#2526)
Browse files Browse the repository at this point in the history
Co-authored-by: ItsEmpa <itsempa@users.noreply.github.com>
  • Loading branch information
ItsEmpa and ItsEmpa authored Sep 17, 2024
1 parent 1247a11 commit 46d39d8
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 19 deletions.
39 changes: 23 additions & 16 deletions src/main/java/at/hannibal2/skyhanni/data/MiningAPI.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@ import at.hannibal2.skyhanni.events.LorenzTickEvent
import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent
import at.hannibal2.skyhanni.events.PlaySoundEvent
import at.hannibal2.skyhanni.events.ScoreboardUpdateEvent
import at.hannibal2.skyhanni.events.SecondPassedEvent
import at.hannibal2.skyhanni.events.ServerBlockChangeEvent
import at.hannibal2.skyhanni.events.mining.OreMinedEvent
import at.hannibal2.skyhanni.events.player.PlayerDeathEvent
import at.hannibal2.skyhanni.features.gui.customscoreboard.ScoreboardPattern
import at.hannibal2.skyhanni.features.mining.OreBlock
import at.hannibal2.skyhanni.features.mining.isTitanium
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import at.hannibal2.skyhanni.utils.CollectionUtils.countBy
import at.hannibal2.skyhanni.utils.LocationUtils.distanceToPlayer
Expand Down Expand Up @@ -50,8 +52,7 @@ object MiningAPI {

private var lastInitSound = SimpleTimeMark.farPast()

private var waitingForInitBlock = false
private var waitingForInitBlockPos: LorenzVec? = null
private var initBlockPos: LorenzVec? = null
private var waitingForInitSound = true

private var waitingForEffMinerSound = false
Expand Down Expand Up @@ -146,8 +147,8 @@ object MiningAPI {
val pos = event.location.roundLocationToBlock()
if (recentClickedBlocks.none { it.first == pos }) return
waitingForInitSound = false
waitingForInitBlock = true
waitingForInitBlockPos = event.location.roundLocationToBlock()
waitingForEffMinerBlock = true
initBlockPos = event.location.roundLocationToBlock()
lastInitSound = SimpleTimeMark.now()
}
return
Expand All @@ -164,21 +165,25 @@ object MiningAPI {
@SubscribeEvent
fun onBlockChange(event: ServerBlockChangeEvent) {
if (!inCustomMiningIsland()) return
if (event.newState.block.let { it != Blocks.air && it != Blocks.bedrock }) return
if (event.oldState.block.let { it == Blocks.air || it == Blocks.bedrock }) return
if (event.oldState.block == Blocks.air) return
val oldState = event.oldState
val newState = event.newState
val oldBlock = oldState.block
val newBlock = newState.block

if (oldState == newState) return
if (oldBlock == Blocks.air || oldBlock == Blocks.bedrock) return
if (newBlock != Blocks.air && newBlock != Blocks.bedrock && !isTitanium(newState)) return

val pos = event.location
if (pos.distanceToPlayer() > 7) return

if (lastInitSound.passedSince() > 100.milliseconds) return

val ore = OreBlock.getByStateOrNull(event.oldState) ?: return
val ore = OreBlock.getByStateOrNull(oldState) ?: return

if (waitingForInitBlock) {
if (waitingForInitBlockPos != pos) return
waitingForInitBlock = false
if (initBlockPos == pos) {
surroundingMinedBlocks += MinedBlock(ore, true) to pos
waitingForEffMinerBlock = true
runEvent()
return
}
if (waitingForEffMinerBlock) {
Expand All @@ -205,7 +210,11 @@ object MiningAPI {

if (waitingForInitSound) return
if (lastInitSound.passedSince() < 200.milliseconds) return
// in case the init block is not found
resetOreEvent()
}

private fun runEvent() {
resetOreEvent()

if (surroundingMinedBlocks.isEmpty()) return
Expand Down Expand Up @@ -237,8 +246,7 @@ object MiningAPI {
private fun resetOreEvent() {
lastInitSound = SimpleTimeMark.farPast()
waitingForInitSound = true
waitingForInitBlock = false
waitingForInitBlockPos = null
initBlockPos = null
waitingForEffMinerSound = false
waitingForEffMinerBlock = false
}
Expand All @@ -258,8 +266,7 @@ object MiningAPI {
add("lastInitSound: ${lastInitSound.passedSince().format()}")
}
add("waitingForInitSound: $waitingForInitSound")
add("waitingForInitBlock: $waitingForInitBlock")
add("waitingForInitBlockPos: $waitingForInitBlockPos")
add("waitingForInitBlockPos: $initBlockPos")
add("waitingForEffMinerSound: $waitingForEffMinerSound")
add("waitingForEffMinerBlock: $waitingForEffMinerBlock")
add("recentlyClickedBlocks: ${recentClickedBlocks.joinToString { "(${it.first.toCleanString()}" }}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import at.hannibal2.skyhanni.utils.toLorenzVec
import net.minecraft.block.state.IBlockState
import net.minecraft.util.BlockPos

class ServerBlockChangeEvent(private val blockPos: BlockPos, private val blockState: IBlockState) : LorenzEvent() {
class ServerBlockChangeEvent(blockPos: BlockPos, blockState: IBlockState) : LorenzEvent() {

val location by lazy { blockPos.toLorenzVec() }
val old by lazy { location.getBlockAt().toString().getName() }
Expand All @@ -17,7 +17,7 @@ class ServerBlockChangeEvent(private val blockPos: BlockPos, private val blockSt

companion object {

val pattern = "Block\\{minecraft:(?<name>.*)}".toPattern()
private val pattern = "Block\\{minecraft:(?<name>.*)}".toPattern()

private fun String.getName() = pattern.matchMatcher(this) {
group("name")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ private fun isHighTierMithril(state: IBlockState): Boolean {
return (state.block == Blocks.wool && state.getValue(BlockColored.COLOR) == EnumDyeColor.LIGHT_BLUE)
}

private fun isTitanium(state: IBlockState): Boolean {
fun isTitanium(state: IBlockState): Boolean {
return (state.block == Blocks.stone && state.getValue(BlockStone.VARIANT) == BlockStone.EnumType.DIORITE_SMOOTH)
}

Expand Down

0 comments on commit 46d39d8

Please sign in to comment.