package joshie.harvest.tools.item; import com.google.common.collect.Lists; import gnu.trove.set.hash.THashSet; import joshie.harvest.tools.HFTools; import joshie.harvest.tools.ToolHelper; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent.WorldTickEvent; import java.util.ArrayList; import java.util.List; import java.util.Queue; import java.util.Set; import static net.minecraft.block.Block.spawnAsEntity; class TreeTasks { static class TreeReplace { private final World world; private final IBlockState state; private final BlockPos pos; private int timer; TreeReplace(World world, BlockPos pos, IBlockState state) { this.world = world; this.pos = pos; this.state = state; this.timer = 0; } @SubscribeEvent public void replaceTrunk(WorldTickEvent event) { if(event.world.provider.getDimension() != world.provider.getDimension()) return; timer++; if(timer > 3) { world.setBlockState(pos, state); MinecraftForge.EVENT_BUS.unregister(this); } } } //Borrowed from Tinkers Construct by boni @SuppressWarnings("WeakerAccess") public static class ChopTree { private final World world; private final EntityPlayer player; private final ItemStack stack; private final Queue<BlockPos> blocks = Lists.newLinkedList(); private final Set<BlockPos> visited = new THashSet<>(); private final List<ItemStack> drops = new ArrayList<>(); ChopTree(BlockPos start, EntityPlayer player, ItemStack stack) { this.world = player.getEntityWorld(); this.player = player; this.stack = stack; this.blocks.add(start); } private void finishChoppingTree() { BlockPos target = new BlockPos(player); drops.stream().forEach(i -> spawnAsEntity(world, target, i)); MinecraftForge.EVENT_BUS.unregister(this); } @SubscribeEvent public void chopTree(WorldTickEvent event) { if(event.world.provider.getDimension() != world.provider.getDimension()) return; int remaining = 4; while(remaining > 0) { if (blocks.isEmpty() || !HFTools.AXE.canUse(stack)) { finishChoppingTree(); //Finish the dropping return; } BlockPos pos = blocks.remove(); if(!visited.add(pos)) continue; //If we've visited the block skip it IBlockState state = world.getBlockState(pos); if (!state.getBlock().isWood(world, pos)) continue; //If this block isn't wood, skip it //Add surrounding blocks for(EnumFacing facing : new EnumFacing[]{ EnumFacing.NORTH, EnumFacing.EAST, EnumFacing.SOUTH, EnumFacing.WEST }) { BlockPos pos2 = pos.offset(facing); if(!visited.contains(pos2)) blocks.add(pos2); } //Add layer above for(int x = 0; x < 3; x++) { for(int z = 0; z < 3; z++) { BlockPos pos2 = pos.add(-1 + x, 1, -1 + z); if(!visited.contains(pos2)) blocks.add(pos2); } } //Break the extra blocks ToolHelper.performTask(player, stack, HFTools.AXE); ToolHelper.collectDrops(world, pos, state, player, drops); world.setBlockToAir(pos); //No particles remaining--; } } } }