1
1
package dev.sterner.common.item.equipment.ichor
2
2
3
3
import com.mojang.datafixers.util.Pair
4
+ import dev.sterner.api.item.HammerLikeItem
4
5
import dev.sterner.api.item.ItemAbility
5
6
import dev.sterner.api.util.VoidBoundItemUtils
6
7
import dev.sterner.common.item.equipment.GalesEdgeItem.Companion.ascend
7
8
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
8
11
import net.minecraft.core.BlockPos
9
- import net.minecraft.core.NonNullList
10
- import net.minecraft.server.level.ServerLevel
12
+ import net.minecraft.core.Direction
11
13
import net.minecraft.sounds.SoundEvents
12
14
import net.minecraft.sounds.SoundSource
13
15
import net.minecraft.tags.BlockTags
14
- import net.minecraft.world.Containers
15
16
import net.minecraft.world.InteractionHand
16
17
import net.minecraft.world.InteractionResult
17
18
import net.minecraft.world.InteractionResultHolder
@@ -21,8 +22,9 @@ import net.minecraft.world.item.ItemStack
21
22
import net.minecraft.world.item.Tier
22
23
import net.minecraft.world.item.context.UseOnContext
23
24
import net.minecraft.world.level.Level
24
- import net.minecraft.world.level.block.Block
25
+ import net.minecraft.world.level.block.Blocks
25
26
import net.minecraft.world.level.block.state.BlockState
27
+ import net.minecraft.world.level.levelgen.structure.BoundingBox
26
28
import net.minecraft.world.phys.BlockHitResult
27
29
import team.lodestar.lodestone.systems.item.tools.magic.MagicSwordItem
28
30
import java.util.function.Consumer
@@ -45,9 +47,15 @@ class IchoriumVorpal(
45
47
return 72000
46
48
}
47
49
50
+ override fun canAttackBlock (state : BlockState ? , level : Level ? , pos : BlockPos ? , player : Player ): Boolean {
51
+ return VoidBoundItemUtils .getActiveAbility(player.mainHandItem) == ItemAbility .HARVEST
52
+ }
53
+
48
54
override fun use (level : Level , player : Player , usedHand : InteractionHand ): InteractionResultHolder <ItemStack > {
49
55
if (VoidBoundItemUtils .getActiveAbility(player.mainHandItem) != ItemAbility .HARVEST ) {
50
56
player.startUsingItem(usedHand)
57
+ } else {
58
+
51
59
}
52
60
53
61
return super .use(level, player, usedHand)
@@ -119,15 +127,48 @@ class IchoriumVorpal(
119
127
stack : ItemStack ,
120
128
level : Level ,
121
129
state : BlockState ,
122
- pos : BlockPos ,
130
+ blockPos : BlockPos ,
123
131
miningEntity : LivingEntity
124
132
): 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
+ }
129
170
}
130
- return super .mineBlock(stack, level, state, pos , miningEntity)
171
+ return super .mineBlock(stack, level, state, blockPos , miningEntity)
131
172
}
132
173
133
174
override fun onUseTick (level : Level , player : LivingEntity , stack : ItemStack , remainingUseDuration : Int ) {
@@ -138,4 +179,12 @@ class IchoriumVorpal(
138
179
super .onUseTick(level, player, stack, remainingUseDuration)
139
180
}
140
181
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
+ }
141
190
}
0 commit comments