Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package me.spacemex.anotherhammermod.items;
- import net.minecraft.client.gui.screens.Screen;
- import net.minecraft.core.BlockPos;
- import net.minecraft.core.Direction;
- import net.minecraft.network.chat.Component;
- import net.minecraft.network.chat.MutableComponent;
- import net.minecraft.server.level.ServerLevel;
- import net.minecraft.server.level.ServerPlayer;
- import net.minecraft.tags.BlockTags;
- import net.minecraft.tags.TagKey;
- import net.minecraft.world.entity.EquipmentSlot;
- import net.minecraft.world.entity.LivingEntity;
- import net.minecraft.world.item.*;
- import net.minecraft.world.level.Level;
- import net.minecraft.world.level.block.Block;
- import net.minecraft.world.level.block.state.BlockState;
- import net.minecraft.world.level.levelgen.structure.BoundingBox;
- import net.minecraft.world.phys.BlockHitResult;
- import net.minecraft.world.phys.HitResult;
- import net.minecraftforge.common.util.Lazy;
- import org.jetbrains.annotations.Nullable;
- import java.awt.*;
- import java.util.HashSet;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Set;
- import java.util.function.Supplier;
- public class ModHammers extends DiggerItem implements Vanishable {
- private final Lazy<Integer> depth;
- private final Lazy<Integer> radius;
- private final Lazy<Integer> durability;
- public ModHammers(Tier pTier, Supplier<Integer> radius, Supplier<Integer> depth, Supplier<Integer> durability) {
- super(1, -2.8f, pTier,BlockTags.MINEABLE_WITH_PICKAXE, new Properties().durability(durability.get()));
- this.depth = Lazy.of(depth);
- this.radius = Lazy.of(radius);
- this.durability = Lazy.of(durability);
- }
- @Override
- public float getDestroySpeed(ItemStack itemStack, BlockState blockState) {
- if (itemStack.getMaxDamage() - itemStack.getDamageValue() <= 0 ){
- return -1f;
- }
- return super.getDestroySpeed(itemStack,blockState);
- }
- @Override
- public boolean mineBlock(ItemStack HammerStack, Level level, BlockState blockState, BlockPos blockPos, LivingEntity livingEntity) {
- if (level.isClientSide || blockState.getDestroySpeed(level, blockPos) == 0.0F) {
- return true;
- }
- if (Screen.hasShiftDown()){
- return super.mineBlock(HammerStack, level, blockState, blockPos, livingEntity);
- }
- HitResult pick = livingEntity.pick(20D, 1F, false);
- if (!(pick instanceof BlockHitResult && blockState.is(BlockTags.MINEABLE_WITH_PICKAXE))) {
- return super.mineBlock(HammerStack, level, blockState, blockPos, livingEntity);
- }
- this.findAndBreakNearBlocks(pick, blockPos, HammerStack, level, livingEntity);
- return super.mineBlock(HammerStack, level, blockState, blockPos, livingEntity);
- }
- public void findAndBreakNearBlocks(HitResult pick, BlockPos blockPos, ItemStack hammerStack, Level level, LivingEntity livingEntity) {
- if (!(livingEntity instanceof ServerPlayer player)) return;
- var size = (radius.get() / 2);
- var offset = size - 1;
- Direction direction = ((BlockHitResult) pick).getDirection();
- var boundingBox = switch (direction) {
- case DOWN, UP -> new BoundingBox(blockPos.getX() - size, blockPos.getY() - (direction == Direction.UP ? depth.get() - 1 : 0), blockPos.getZ() - size, blockPos.getX() + size, blockPos.getY() + (direction == Direction.DOWN ? depth.get() - 1 : 0), blockPos.getZ() + size);
- case NORTH, SOUTH -> new BoundingBox(blockPos.getX() - size, blockPos.getY() - size + offset, blockPos.getZ() - (direction == Direction.SOUTH ? depth.get() - 1 : 0), blockPos.getX() + size, blockPos.getY() + size + offset, blockPos.getZ() + (direction == Direction.NORTH ? depth.get() - 1 : 0));
- case WEST, EAST -> new BoundingBox(blockPos.getX() - (direction == Direction.EAST ? depth.get() - 1 : 0), blockPos.getY() - size + offset, blockPos.getZ() - size, blockPos.getX() + (direction == Direction.WEST ? depth.get() - 1 : 0), blockPos.getY() + size + offset, blockPos.getZ() + size);
- };
- int damage = 0;
- Iterator<BlockPos> iterator = BlockPos.betweenClosedStream(boundingBox).iterator();
- Set<BlockPos> removedPos = new HashSet<>();
- while (iterator.hasNext()) {
- var pos = iterator.next();
- if (damage >= (hammerStack.getMaxDamage() - hammerStack.getDamageValue() - 1)) {
- break;
- }
- BlockState targetState = level.getBlockState(pos);
- if (pos == blockPos || removedPos.contains(pos) || !canDestroyBlock(targetState, level, pos) || !isCorrectToolForDrops(hammerStack,targetState)) {
- continue;
- }
- removedPos.add(pos);
- level.destroyBlock(pos, false, livingEntity);
- if (!player.isCreative()) {
- boolean correctToolForDrops = hammerStack.isCorrectToolForDrops(targetState);
- if (correctToolForDrops) {
- targetState.spawnAfterBreak((ServerLevel) level, pos, hammerStack,false);
- List<ItemStack> drops = Block.getDrops(targetState, (ServerLevel) level, pos, level.getBlockEntity(pos), livingEntity, hammerStack);
- drops.forEach(e -> Block.popResourceFromFace(level, pos, ((BlockHitResult) pick).getDirection(), e));
- }
- }
- damage ++;
- }
- if (damage != 0 && !player.isCreative()) {
- hammerStack.hurtAndBreak(damage, livingEntity, (livingEntityX) -> {
- livingEntityX.broadcastBreakEvent(EquipmentSlot.MAINHAND);
- });
- }
- }
- private boolean canDestroyBlock(BlockState blockState, Level level, BlockPos blockPos) {
- if (blockState.getDestroySpeed(level, blockPos) <= 0) {
- return false;
- }
- return level.getBlockEntity(blockPos) == null && blockState.is(BlockTags.MINEABLE_WITH_PICKAXE);
- }
- @Override
- public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List<Component> pTooltipComponents, TooltipFlag pIsAdvanced) {
- if (Screen.hasControlDown()) {
- MutableComponent held = Component.translatable("tooltip.hammer.range.ctrl");
- MutableComponent block = Component.translatable("tooltip.hammer.range.block");
- String MoreText = String.format("%d x %d ", radius.get(), depth.get());
- pTooltipComponents.add(held.append(Component.literal(MoreText)).append(block));
- } else {
- pTooltipComponents.add(Component.translatable("tooltip.hammer.pressctrl"));
- }
- }
- }
Add Comment
Please, Sign In to add comment