Skip to content

Commit

Permalink
HARVEST and EARTH_RUMMAGER
Browse files Browse the repository at this point in the history
  • Loading branch information
mrsterner committed Sep 16, 2024
1 parent 0c2de6b commit 5cdeac4
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 28 deletions.
38 changes: 23 additions & 15 deletions src/main/kotlin/dev/sterner/api/item/HammerLikeItem.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.sterner.api.item

import io.github.fabricators_of_create.porting_lib.event.common.BlockEvents.BreakEvent
import io.github.fabricators_of_create.porting_lib.tags.Tags
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.server.level.ServerLevel
Expand Down Expand Up @@ -108,14 +109,18 @@ interface HammerLikeItem {

if (!isToolEffective(targetState)) continue

if (five && targetState.`is`(Tags.Blocks.ORES)) {
continue
}

// Trigger block break event
BreakEvent.BLOCK_BREAK.invoker().onBlockBreak(BreakEvent(level, pos, targetState, entity))

removedBlocks.add(pos)
level.destroyBlock(pos, false, entity)

if (!entity.isCreative) {
handleBlockDrops(targetState, pos, hammerStack, level, entity, hitResult)
handleBlockDrops(targetState, pos, hammerStack, level, entity, hitResult.direction)
}

blocksBroken++
Expand Down Expand Up @@ -168,21 +173,24 @@ interface HammerLikeItem {
/**
* Handles block drops when the hammer breaks a block.
*/
private fun handleBlockDrops(
targetState: BlockState,
pos: BlockPos,
hammerStack: ItemStack,
level: Level,
entity: LivingEntity,
hitResult: BlockHitResult
) {
val isCorrectTool = hammerStack.isCorrectToolForDrops(targetState)
if (isCorrectTool) {
targetState.spawnAfterBreak(level as ServerLevel, pos, hammerStack, true)
val drops = Block.getDrops(targetState, level, pos, level.getBlockEntity(pos), entity, hammerStack)
drops.forEach { drop ->
Block.popResourceFromFace(level, pos, hitResult.direction, drop)
companion object {
fun handleBlockDrops(
targetState: BlockState,
pos: BlockPos,
hammerStack: ItemStack,
level: Level,
entity: LivingEntity,
direction: Direction
) {
val isCorrectTool = hammerStack.isCorrectToolForDrops(targetState)
if (isCorrectTool) {
targetState.spawnAfterBreak(level as ServerLevel, pos, hammerStack, true)
val drops = Block.getDrops(targetState, level, pos, level.getBlockEntity(pos), entity, hammerStack)
drops.forEach { drop ->
Block.popResourceFromFace(level, pos, direction, drop)
}
}
}
}

}
4 changes: 2 additions & 2 deletions src/main/kotlin/dev/sterner/api/item/ItemAbility.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ enum class ItemAbility : StringRepresentable {
NONE,//Fully implemented
SCORCHING_HEAT,//Fully implemented
EXCAVATOR,//Fully implemented
EARTH_RUMMAGER,//TODO, re-implement. 5x5 mining, 25% mining speed penalty, avoids breaking ores
EARTH_RUMMAGER,
VAMPIRISM,//TODO re-implement. Saps the target's lifeforce, healing half a heart for each spirit their soul has / half a heart for each armor point a player has, with a 10 tick cooldown for each half heart
HARVEST,//TODO re-implement. Enables tilling, also allows excavation of plants and whatnot in a 7x7x7 area
HARVEST,
OPENER,//TODO re-implement. First hit on a mob deals increased damage and grants a stack of Wrath, lasting a minute, up to 10 stacks. Transforms into Finale when you reach 10 stacks, or sneak right click
FINALE,//TODO implement. Consumes All stacks of Opening Strike, multiplying damage dealt by the amount of stacks total.
TRIPLE_REBOUND,//TODO implement
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class VoidBoundRevelationComponent(private val player: Player) : AutoSyncedCompo
return mutableSetOf(
ItemAbility.NONE,
ItemAbility.EXCAVATOR,
ItemAbility.EARTH_RUMMAGER,
ItemAbility.HARVEST,
ItemAbility.SCORCHING_HEAT,
ItemAbility.SPIRIT_VISION
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package dev.sterner.common.item.equipment.ichor
import com.google.common.collect.ImmutableMultimap
import com.google.common.collect.Multimap
import dev.sterner.api.item.HammerLikeItem
import dev.sterner.api.item.ItemAbility
import dev.sterner.api.util.VoidBoundItemUtils
import dev.sterner.registry.VoidBoundTiers
import net.minecraft.tags.BlockTags
import net.minecraft.tags.TagKey
Expand All @@ -24,7 +26,8 @@ class IchoriumTerraformer(
), HammerLikeItem {

override fun getDestroySpeed(stack: ItemStack, state: BlockState): Float {
return this.speed
val bl = VoidBoundItemUtils.getActiveAbility(stack) == ItemAbility.EARTH_RUMMAGER
return if (bl) this.speed * 0.75f else this.speed
}

override fun isCorrectToolForDrops(block: BlockState): Boolean {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
package dev.sterner.common.item.equipment.ichor

import com.mojang.datafixers.util.Pair
import dev.sterner.api.item.HammerLikeItem
import dev.sterner.api.item.ItemAbility
import dev.sterner.api.util.VoidBoundItemUtils
import dev.sterner.common.item.equipment.GalesEdgeItem.Companion.ascend
import dev.sterner.mixin.HoeItemTillablesAccessor
import io.github.fabricators_of_create.porting_lib.common.util.IPlantable
import io.github.fabricators_of_create.porting_lib.event.common.BlockEvents.BreakEvent
import net.minecraft.core.BlockPos
import net.minecraft.core.NonNullList
import net.minecraft.server.level.ServerLevel
import net.minecraft.core.Direction
import net.minecraft.sounds.SoundEvents
import net.minecraft.sounds.SoundSource
import net.minecraft.tags.BlockTags
import net.minecraft.world.Containers
import net.minecraft.world.InteractionHand
import net.minecraft.world.InteractionResult
import net.minecraft.world.InteractionResultHolder
Expand All @@ -21,8 +22,9 @@ import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Tier
import net.minecraft.world.item.context.UseOnContext
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.Blocks
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.levelgen.structure.BoundingBox
import net.minecraft.world.phys.BlockHitResult
import team.lodestar.lodestone.systems.item.tools.magic.MagicSwordItem
import java.util.function.Consumer
Expand All @@ -45,9 +47,15 @@ class IchoriumVorpal(
return 72000
}

override fun canAttackBlock(state: BlockState?, level: Level?, pos: BlockPos?, player: Player): Boolean {
return VoidBoundItemUtils.getActiveAbility(player.mainHandItem) == ItemAbility.HARVEST
}

override fun use(level: Level, player: Player, usedHand: InteractionHand): InteractionResultHolder<ItemStack> {
if (VoidBoundItemUtils.getActiveAbility(player.mainHandItem) != ItemAbility.HARVEST) {
player.startUsingItem(usedHand)
} else {

}

return super.use(level, player, usedHand)
Expand Down Expand Up @@ -119,15 +127,48 @@ class IchoriumVorpal(
stack: ItemStack,
level: Level,
state: BlockState,
pos: BlockPos,
blockPos: BlockPos,
miningEntity: LivingEntity
): Boolean {
if (level is ServerLevel && state.`is`(BlockTags.CROPS)) {
val list = NonNullList.create<ItemStack>()
list.addAll(Block.getDrops(state, level, pos, null, miningEntity, stack))
Containers.dropContents(level, pos, list)
val bl = VoidBoundItemUtils.getActiveAbility(stack) == ItemAbility.HARVEST
if (bl && tags(state)) {
val size = 3
val areaOfEffect = BoundingBox(
blockPos.x - size,
blockPos.y - size,
blockPos.z - size,
blockPos.x + size,
blockPos.y + size,
blockPos.z + size
)

var blocksBroken = 0
val iterator = BlockPos.betweenClosedStream(areaOfEffect).iterator()
val removedBlocks = mutableSetOf<BlockPos>()

while (iterator.hasNext()) {
val pos = iterator.next()

val targetState = level.getBlockState(pos)
if (pos == blockPos || removedBlocks.contains(pos)) continue

val state = level.getBlockState(pos)
if (tags(state)) {
// Trigger block break event
BreakEvent.BLOCK_BREAK.invoker().onBlockBreak(BreakEvent(level, pos, targetState, miningEntity as Player))

removedBlocks.add(pos)
level.destroyBlock(pos, false, miningEntity)

if (!miningEntity.isCreative) {
HammerLikeItem.handleBlockDrops(targetState, pos, stack, level, miningEntity, Direction.UP)
}

blocksBroken++
}
}
}
return super.mineBlock(stack, level, state, pos, miningEntity)
return super.mineBlock(stack, level, state, blockPos, miningEntity)
}

override fun onUseTick(level: Level, player: LivingEntity, stack: ItemStack, remainingUseDuration: Int) {
Expand All @@ -138,4 +179,12 @@ class IchoriumVorpal(
super.onUseTick(level, player, stack, remainingUseDuration)
}

override fun isCorrectToolForDrops(block: BlockState): Boolean {
return tags(block)
}


fun tags(state: BlockState) : Boolean {
return state.canBeReplaced() || state.`is`(BlockTags.CROPS) || state.block is IPlantable || state.`is`(BlockTags.FLOWERS)
}
}

0 comments on commit 5cdeac4

Please sign in to comment.