devenshona

HammerClass

Apr 12th, 2024
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.59 KB | None | 0 0
  1. package me.spacemex.anotherhammermod.items;
  2.  
  3. import net.minecraft.client.gui.screens.Screen;
  4. import net.minecraft.core.BlockPos;
  5. import net.minecraft.core.Direction;
  6. import net.minecraft.network.chat.Component;
  7. import net.minecraft.network.chat.MutableComponent;
  8. import net.minecraft.server.level.ServerLevel;
  9. import net.minecraft.server.level.ServerPlayer;
  10. import net.minecraft.tags.BlockTags;
  11. import net.minecraft.tags.TagKey;
  12. import net.minecraft.world.entity.EquipmentSlot;
  13. import net.minecraft.world.entity.LivingEntity;
  14. import net.minecraft.world.item.*;
  15. import net.minecraft.world.level.Level;
  16. import net.minecraft.world.level.block.Block;
  17. import net.minecraft.world.level.block.state.BlockState;
  18. import net.minecraft.world.level.levelgen.structure.BoundingBox;
  19. import net.minecraft.world.phys.BlockHitResult;
  20. import net.minecraft.world.phys.HitResult;
  21. import net.minecraftforge.common.util.Lazy;
  22. import org.jetbrains.annotations.Nullable;
  23.  
  24. import java.awt.*;
  25. import java.util.HashSet;
  26. import java.util.Iterator;
  27. import java.util.List;
  28. import java.util.Set;
  29. import java.util.function.Supplier;
  30.  
  31. public class ModHammers extends DiggerItem implements Vanishable {
  32.  
  33.     private final Lazy<Integer> depth;
  34.     private final Lazy<Integer> radius;
  35.     private final Lazy<Integer> durability;
  36.  
  37.     public ModHammers(Tier pTier, Supplier<Integer> radius, Supplier<Integer> depth, Supplier<Integer> durability) {
  38.         super(1, -2.8f, pTier,BlockTags.MINEABLE_WITH_PICKAXE, new Properties().durability(durability.get()));
  39.         this.depth = Lazy.of(depth);
  40.         this.radius = Lazy.of(radius);
  41.         this.durability = Lazy.of(durability);
  42.     }
  43.  
  44.  
  45.     @Override
  46.     public float getDestroySpeed(ItemStack itemStack, BlockState blockState) {
  47.         if (itemStack.getMaxDamage() - itemStack.getDamageValue() <= 0 ){
  48.             return -1f;
  49.         }
  50.         return super.getDestroySpeed(itemStack,blockState);
  51.     }
  52.     @Override
  53.     public boolean mineBlock(ItemStack HammerStack, Level level, BlockState blockState, BlockPos blockPos, LivingEntity livingEntity) {
  54.         if (level.isClientSide || blockState.getDestroySpeed(level, blockPos) == 0.0F) {
  55.             return true;
  56.         }
  57.         if (Screen.hasShiftDown()){
  58.             return super.mineBlock(HammerStack, level, blockState, blockPos, livingEntity);
  59.         }
  60.         HitResult pick = livingEntity.pick(20D, 1F, false);
  61.         if (!(pick instanceof BlockHitResult && blockState.is(BlockTags.MINEABLE_WITH_PICKAXE))) {
  62.             return super.mineBlock(HammerStack, level, blockState, blockPos, livingEntity);
  63.         }
  64.         this.findAndBreakNearBlocks(pick, blockPos, HammerStack, level, livingEntity);
  65.         return super.mineBlock(HammerStack, level, blockState, blockPos, livingEntity);
  66.     }
  67.     public void findAndBreakNearBlocks(HitResult pick, BlockPos blockPos, ItemStack hammerStack, Level level, LivingEntity livingEntity) {
  68.         if (!(livingEntity instanceof ServerPlayer player)) return;
  69.         var size = (radius.get() / 2);
  70.         var offset = size - 1;
  71.         Direction direction = ((BlockHitResult) pick).getDirection();
  72.         var boundingBox = switch (direction) {
  73.             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);
  74.             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));
  75.             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);
  76.         };
  77.         int damage = 0;
  78.         Iterator<BlockPos> iterator = BlockPos.betweenClosedStream(boundingBox).iterator();
  79.         Set<BlockPos> removedPos = new HashSet<>();
  80.         while (iterator.hasNext()) {
  81.             var pos = iterator.next();
  82.             if (damage >= (hammerStack.getMaxDamage() - hammerStack.getDamageValue() - 1)) {
  83.                 break;
  84.             }
  85.             BlockState targetState = level.getBlockState(pos);
  86.             if (pos == blockPos || removedPos.contains(pos) || !canDestroyBlock(targetState, level, pos) || !isCorrectToolForDrops(hammerStack,targetState)) {
  87.                 continue;
  88.             }
  89.             removedPos.add(pos);
  90.             level.destroyBlock(pos, false, livingEntity);
  91.             if (!player.isCreative()) {
  92.                 boolean correctToolForDrops = hammerStack.isCorrectToolForDrops(targetState);
  93.                 if (correctToolForDrops) {
  94.                     targetState.spawnAfterBreak((ServerLevel) level, pos, hammerStack,false);
  95.                     List<ItemStack> drops = Block.getDrops(targetState, (ServerLevel) level, pos, level.getBlockEntity(pos), livingEntity, hammerStack);
  96.                     drops.forEach(e -> Block.popResourceFromFace(level, pos, ((BlockHitResult) pick).getDirection(), e));
  97.                 }
  98.             }
  99.             damage ++;
  100.         }
  101.         if (damage != 0 && !player.isCreative()) {
  102.             hammerStack.hurtAndBreak(damage, livingEntity, (livingEntityX) -> {
  103.                 livingEntityX.broadcastBreakEvent(EquipmentSlot.MAINHAND);
  104.             });
  105.         }
  106.     }
  107.     private boolean canDestroyBlock(BlockState blockState, Level level, BlockPos blockPos) {
  108.         if (blockState.getDestroySpeed(level, blockPos) <= 0) {
  109.             return false;
  110.         }
  111.         return level.getBlockEntity(blockPos) == null && blockState.is(BlockTags.MINEABLE_WITH_PICKAXE);
  112.     }
  113.  
  114.     @Override
  115.     public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List<Component> pTooltipComponents, TooltipFlag pIsAdvanced) {
  116.         if (Screen.hasControlDown()) {
  117.             MutableComponent held = Component.translatable("tooltip.hammer.range.ctrl");
  118.             MutableComponent block = Component.translatable("tooltip.hammer.range.block");
  119.             String MoreText = String.format("%d x %d ", radius.get(), depth.get());
  120.             pTooltipComponents.add(held.append(Component.literal(MoreText)).append(block));
  121.         } else {
  122.             pTooltipComponents.add(Component.translatable("tooltip.hammer.pressctrl"));
  123.         }
  124.     }
  125. }
  126.  
Add Comment
Please, Sign In to add comment