Skip to content

Commit 5cdeac4

Browse files
committed
HARVEST and EARTH_RUMMAGER
1 parent 0c2de6b commit 5cdeac4

File tree

5 files changed

+89
-28
lines changed

5 files changed

+89
-28
lines changed

src/main/kotlin/dev/sterner/api/item/HammerLikeItem.kt

+23-15
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.sterner.api.item
22

33
import io.github.fabricators_of_create.porting_lib.event.common.BlockEvents.BreakEvent
4+
import io.github.fabricators_of_create.porting_lib.tags.Tags
45
import net.minecraft.core.BlockPos
56
import net.minecraft.core.Direction
67
import net.minecraft.server.level.ServerLevel
@@ -108,14 +109,18 @@ interface HammerLikeItem {
108109

109110
if (!isToolEffective(targetState)) continue
110111

112+
if (five && targetState.`is`(Tags.Blocks.ORES)) {
113+
continue
114+
}
115+
111116
// Trigger block break event
112117
BreakEvent.BLOCK_BREAK.invoker().onBlockBreak(BreakEvent(level, pos, targetState, entity))
113118

114119
removedBlocks.add(pos)
115120
level.destroyBlock(pos, false, entity)
116121

117122
if (!entity.isCreative) {
118-
handleBlockDrops(targetState, pos, hammerStack, level, entity, hitResult)
123+
handleBlockDrops(targetState, pos, hammerStack, level, entity, hitResult.direction)
119124
}
120125

121126
blocksBroken++
@@ -168,21 +173,24 @@ interface HammerLikeItem {
168173
/**
169174
* Handles block drops when the hammer breaks a block.
170175
*/
171-
private fun handleBlockDrops(
172-
targetState: BlockState,
173-
pos: BlockPos,
174-
hammerStack: ItemStack,
175-
level: Level,
176-
entity: LivingEntity,
177-
hitResult: BlockHitResult
178-
) {
179-
val isCorrectTool = hammerStack.isCorrectToolForDrops(targetState)
180-
if (isCorrectTool) {
181-
targetState.spawnAfterBreak(level as ServerLevel, pos, hammerStack, true)
182-
val drops = Block.getDrops(targetState, level, pos, level.getBlockEntity(pos), entity, hammerStack)
183-
drops.forEach { drop ->
184-
Block.popResourceFromFace(level, pos, hitResult.direction, drop)
176+
companion object {
177+
fun handleBlockDrops(
178+
targetState: BlockState,
179+
pos: BlockPos,
180+
hammerStack: ItemStack,
181+
level: Level,
182+
entity: LivingEntity,
183+
direction: Direction
184+
) {
185+
val isCorrectTool = hammerStack.isCorrectToolForDrops(targetState)
186+
if (isCorrectTool) {
187+
targetState.spawnAfterBreak(level as ServerLevel, pos, hammerStack, true)
188+
val drops = Block.getDrops(targetState, level, pos, level.getBlockEntity(pos), entity, hammerStack)
189+
drops.forEach { drop ->
190+
Block.popResourceFromFace(level, pos, direction, drop)
191+
}
185192
}
186193
}
187194
}
195+
188196
}

src/main/kotlin/dev/sterner/api/item/ItemAbility.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ enum class ItemAbility : StringRepresentable {
1313
NONE,//Fully implemented
1414
SCORCHING_HEAT,//Fully implemented
1515
EXCAVATOR,//Fully implemented
16-
EARTH_RUMMAGER,//TODO, re-implement. 5x5 mining, 25% mining speed penalty, avoids breaking ores
16+
EARTH_RUMMAGER,
1717
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
18-
HARVEST,//TODO re-implement. Enables tilling, also allows excavation of plants and whatnot in a 7x7x7 area
18+
HARVEST,
1919
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
2020
FINALE,//TODO implement. Consumes All stacks of Opening Strike, multiplying damage dealt by the amount of stacks total.
2121
TRIPLE_REBOUND,//TODO implement

src/main/kotlin/dev/sterner/common/components/VoidBoundRevelationComponent.kt

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class VoidBoundRevelationComponent(private val player: Player) : AutoSyncedCompo
2424
return mutableSetOf(
2525
ItemAbility.NONE,
2626
ItemAbility.EXCAVATOR,
27+
ItemAbility.EARTH_RUMMAGER,
2728
ItemAbility.HARVEST,
2829
ItemAbility.SCORCHING_HEAT,
2930
ItemAbility.SPIRIT_VISION

src/main/kotlin/dev/sterner/common/item/equipment/ichor/IchoriumTerraformer.kt

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package dev.sterner.common.item.equipment.ichor
33
import com.google.common.collect.ImmutableMultimap
44
import com.google.common.collect.Multimap
55
import dev.sterner.api.item.HammerLikeItem
6+
import dev.sterner.api.item.ItemAbility
7+
import dev.sterner.api.util.VoidBoundItemUtils
68
import dev.sterner.registry.VoidBoundTiers
79
import net.minecraft.tags.BlockTags
810
import net.minecraft.tags.TagKey
@@ -24,7 +26,8 @@ class IchoriumTerraformer(
2426
), HammerLikeItem {
2527

2628
override fun getDestroySpeed(stack: ItemStack, state: BlockState): Float {
27-
return this.speed
29+
val bl = VoidBoundItemUtils.getActiveAbility(stack) == ItemAbility.EARTH_RUMMAGER
30+
return if (bl) this.speed * 0.75f else this.speed
2831
}
2932

3033
override fun isCorrectToolForDrops(block: BlockState): Boolean {

src/main/kotlin/dev/sterner/common/item/equipment/ichor/IchoriumVorpal.kt

+59-10
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package dev.sterner.common.item.equipment.ichor
22

33
import com.mojang.datafixers.util.Pair
4+
import dev.sterner.api.item.HammerLikeItem
45
import dev.sterner.api.item.ItemAbility
56
import dev.sterner.api.util.VoidBoundItemUtils
67
import dev.sterner.common.item.equipment.GalesEdgeItem.Companion.ascend
78
import dev.sterner.mixin.HoeItemTillablesAccessor
9+
import io.github.fabricators_of_create.porting_lib.common.util.IPlantable
10+
import io.github.fabricators_of_create.porting_lib.event.common.BlockEvents.BreakEvent
811
import net.minecraft.core.BlockPos
9-
import net.minecraft.core.NonNullList
10-
import net.minecraft.server.level.ServerLevel
12+
import net.minecraft.core.Direction
1113
import net.minecraft.sounds.SoundEvents
1214
import net.minecraft.sounds.SoundSource
1315
import net.minecraft.tags.BlockTags
14-
import net.minecraft.world.Containers
1516
import net.minecraft.world.InteractionHand
1617
import net.minecraft.world.InteractionResult
1718
import net.minecraft.world.InteractionResultHolder
@@ -21,8 +22,9 @@ import net.minecraft.world.item.ItemStack
2122
import net.minecraft.world.item.Tier
2223
import net.minecraft.world.item.context.UseOnContext
2324
import net.minecraft.world.level.Level
24-
import net.minecraft.world.level.block.Block
25+
import net.minecraft.world.level.block.Blocks
2526
import net.minecraft.world.level.block.state.BlockState
27+
import net.minecraft.world.level.levelgen.structure.BoundingBox
2628
import net.minecraft.world.phys.BlockHitResult
2729
import team.lodestar.lodestone.systems.item.tools.magic.MagicSwordItem
2830
import java.util.function.Consumer
@@ -45,9 +47,15 @@ class IchoriumVorpal(
4547
return 72000
4648
}
4749

50+
override fun canAttackBlock(state: BlockState?, level: Level?, pos: BlockPos?, player: Player): Boolean {
51+
return VoidBoundItemUtils.getActiveAbility(player.mainHandItem) == ItemAbility.HARVEST
52+
}
53+
4854
override fun use(level: Level, player: Player, usedHand: InteractionHand): InteractionResultHolder<ItemStack> {
4955
if (VoidBoundItemUtils.getActiveAbility(player.mainHandItem) != ItemAbility.HARVEST) {
5056
player.startUsingItem(usedHand)
57+
} else {
58+
5159
}
5260

5361
return super.use(level, player, usedHand)
@@ -119,15 +127,48 @@ class IchoriumVorpal(
119127
stack: ItemStack,
120128
level: Level,
121129
state: BlockState,
122-
pos: BlockPos,
130+
blockPos: BlockPos,
123131
miningEntity: LivingEntity
124132
): Boolean {
125-
if (level is ServerLevel && state.`is`(BlockTags.CROPS)) {
126-
val list = NonNullList.create<ItemStack>()
127-
list.addAll(Block.getDrops(state, level, pos, null, miningEntity, stack))
128-
Containers.dropContents(level, pos, list)
133+
val bl = VoidBoundItemUtils.getActiveAbility(stack) == ItemAbility.HARVEST
134+
if (bl && tags(state)) {
135+
val size = 3
136+
val areaOfEffect = BoundingBox(
137+
blockPos.x - size,
138+
blockPos.y - size,
139+
blockPos.z - size,
140+
blockPos.x + size,
141+
blockPos.y + size,
142+
blockPos.z + size
143+
)
144+
145+
var blocksBroken = 0
146+
val iterator = BlockPos.betweenClosedStream(areaOfEffect).iterator()
147+
val removedBlocks = mutableSetOf<BlockPos>()
148+
149+
while (iterator.hasNext()) {
150+
val pos = iterator.next()
151+
152+
val targetState = level.getBlockState(pos)
153+
if (pos == blockPos || removedBlocks.contains(pos)) continue
154+
155+
val state = level.getBlockState(pos)
156+
if (tags(state)) {
157+
// Trigger block break event
158+
BreakEvent.BLOCK_BREAK.invoker().onBlockBreak(BreakEvent(level, pos, targetState, miningEntity as Player))
159+
160+
removedBlocks.add(pos)
161+
level.destroyBlock(pos, false, miningEntity)
162+
163+
if (!miningEntity.isCreative) {
164+
HammerLikeItem.handleBlockDrops(targetState, pos, stack, level, miningEntity, Direction.UP)
165+
}
166+
167+
blocksBroken++
168+
}
169+
}
129170
}
130-
return super.mineBlock(stack, level, state, pos, miningEntity)
171+
return super.mineBlock(stack, level, state, blockPos, miningEntity)
131172
}
132173

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

182+
override fun isCorrectToolForDrops(block: BlockState): Boolean {
183+
return tags(block)
184+
}
185+
186+
187+
fun tags(state: BlockState) : Boolean {
188+
return state.canBeReplaced() || state.`is`(BlockTags.CROPS) || state.block is IPlantable || state.`is`(BlockTags.FLOWERS)
189+
}
141190
}

0 commit comments

Comments
 (0)