diff --git a/src/main/java/techreborn/events/BlockBreakHandler.java b/src/main/java/techreborn/events/BlockBreakHandler.java index 1083b1db4..8a38d36d5 100644 --- a/src/main/java/techreborn/events/BlockBreakHandler.java +++ b/src/main/java/techreborn/events/BlockBreakHandler.java @@ -24,10 +24,16 @@ package techreborn.events; +import net.minecraft.block.state.IBlockState; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import reborncore.common.registration.RebornRegistry; import reborncore.common.registration.impl.ConfigRegistry; +import techreborn.init.ModItems; import techreborn.items.ItemGems; import techreborn.lib.ModInfo; import techreborn.utils.OreDictUtils; @@ -44,4 +50,22 @@ public class BlockBreakHandler { event.getDrops().add(ItemGems.getGemByName("red_garnet").copy()); } } + + @SubscribeEvent + public void getBreakSpeedEvent(PlayerEvent.BreakSpeed event){ + if(event.getEntityPlayer().getHeldItem(EnumHand.MAIN_HAND).getItem() == ModItems.ADVANCED_CHAINSAW){ + BlockPos pos = event.getPos(); + World worldIn = event.getEntityPlayer().world; + float speed = 2F; + int blocks = 0; + for (int i = 1; i < 10; i++) { + BlockPos nextPos = pos.up(i); + IBlockState nextState = worldIn.getBlockState(nextPos); + if(nextState.getBlock().isWood(worldIn, nextPos)){ + blocks ++; + } + } + event.setNewSpeed(speed * blocks); + } + } } diff --git a/src/main/java/techreborn/items/tools/ItemAdvancedChainsaw.java b/src/main/java/techreborn/items/tools/ItemAdvancedChainsaw.java index dfab46750..04266af48 100644 --- a/src/main/java/techreborn/items/tools/ItemAdvancedChainsaw.java +++ b/src/main/java/techreborn/items/tools/ItemAdvancedChainsaw.java @@ -24,17 +24,28 @@ package techreborn.items.tools; +import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import reborncore.common.powerSystem.PoweredItem; import techreborn.config.ConfigTechReborn; import techreborn.init.ModItems; +import java.util.ArrayList; +import java.util.List; + public class ItemAdvancedChainsaw extends ItemChainsaw { public ItemAdvancedChainsaw() { @@ -60,9 +71,62 @@ public class ItemAdvancedChainsaw extends ItemChainsaw { itemList.add(charged); } + @Override + public boolean onBlockDestroyed(ItemStack stack, World worldIn, IBlockState blockIn, BlockPos pos, EntityLivingBase entityLiving) { + for (int i = 1; i < 10; i++) { + BlockPos nextPos = pos.up(i); + IBlockState nextState = worldIn.getBlockState(nextPos); + if(nextState.getBlock().isWood(worldIn, nextPos)){ + breakBlock(nextPos, stack, worldIn, entityLiving, pos); + } + } + return super.onBlockDestroyed(stack, worldIn, blockIn, pos, entityLiving); + } + + @Override + public float getStrVsBlock(ItemStack stack, IBlockState state) { + float speed = super.getStrVsBlock(stack, state); + return super.getStrVsBlock(stack, state); + } + @Override public boolean canHarvestBlock(IBlockState blockIn) { return Items.DIAMOND_AXE.canHarvestBlock(blockIn); } + + public void breakBlock(BlockPos pos, ItemStack stack, World world, EntityLivingBase entityLiving, BlockPos oldPos) { + if (oldPos == pos) { + return; + } + if (!PoweredItem.canUseEnergy(cost, stack)) { + return; + } + IBlockState blockState = world.getBlockState(pos); + Block block = blockState.getBlock(); + if (blockState.getBlockHardness(world, pos) == -1.0F) { + return; + } + List stuff = block.getDrops(world, pos, blockState, 0); + List dropList = new ArrayList<>(); + BlockEvent.HarvestDropsEvent event = new BlockEvent.HarvestDropsEvent(world, pos, blockState, 0, 1, dropList, (EntityPlayer) entityLiving, false); + MinecraftForge.EVENT_BUS.post(event); + for (ItemStack drop : dropList) { + if (!drop.isEmpty() && drop.getCount() > 0) { + stuff.add(drop); + } + } + for (ItemStack drop : stuff) { + if (world.isRemote) { + continue; + } + final EntityItem entityitem = new EntityItem(world, oldPos.getX(), oldPos.getY(), oldPos.getZ(), drop); + entityitem.motionX = (oldPos.getX() - oldPos.getX()) / 10.0f; + entityitem.motionY = 0.15000000596046448; + entityitem.motionZ = (oldPos.getZ() - oldPos.getZ()) / 10.0f; + world.spawnEntity(entityitem); + } + PoweredItem.useEnergy(cost, stack); + world.setBlockToAir(pos); + } }