package joshie.harvest.tools.render;
import com.google.common.collect.ImmutableList;
import joshie.harvest.core.helpers.MCClientHelper;
import joshie.harvest.core.util.annotations.HFEvents;
import joshie.harvest.tools.HFTools;
import net.minecraft.block.*;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.PlayerControllerMP;
import net.minecraft.client.renderer.BlockRendererDispatcher;
import net.minecraft.client.renderer.RenderGlobal;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.VertexBuffer;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderWorldLastEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import java.util.List;
//Borrowed from Tinkers Construct by boni
@HFEvents(Side.CLIENT)
@SuppressWarnings("unused")
public class RenderToolBreak {
@SubscribeEvent
public void renderExtraBlockBreak(RenderWorldLastEvent event) {
PlayerControllerMP controller = MCClientHelper.getPlayerController();
EntityPlayer player = MCClientHelper.getPlayer();
World world = player.worldObj;
ItemStack tool = player.getHeldItemMainhand();
if (tool != null && (tool.getItem() == HFTools.HAMMER || tool.getItem() == HFTools.HOE)) {
Entity renderEntity = MCClientHelper.getRenderViewEntity();
double distance = controller.getBlockReachDistance();
RayTraceResult rayTraceResult = renderEntity.rayTrace(distance, event.getPartialTicks());
if (rayTraceResult != null) {
if (tool.getItem() == HFTools.HAMMER && HFTools.HAMMER.canUse(tool)) {
ImmutableList<BlockPos> extraBlocks = HFTools.HAMMER.getBlocks(world, rayTraceResult.getBlockPos(), player, tool);
drawSelection(event.getContext(), extraBlocks, player, event.getPartialTicks());
if (controller.getIsHittingBlock()) {
drawBlockDamageTexture(MCClientHelper.getMinecraft().renderGlobal, controller,
Tessellator.getInstance(), Tessellator.getInstance().getBuffer(),
player, event.getPartialTicks(), world, extraBlocks);
}
} else if (tool.getItem() == HFTools.HOE && HFTools.HOE.canUse(tool)) {
drawSelection(event.getContext(), HFTools.HOE.getBlocks(world, rayTraceResult.getBlockPos(), player, tool), player, event.getPartialTicks());
}
}
}
}
private void drawSelection(RenderGlobal render, ImmutableList<BlockPos> extraBlocks, EntityPlayer player, float ticks) {
for (BlockPos pos : extraBlocks) {
render.drawSelectionBox(player, new RayTraceResult(new Vec3d(0, 0, 0), EnumFacing.UP, pos), 0, ticks);
}
}
private void drawBlockDamageTexture(RenderGlobal renderGlobal, PlayerControllerMP controllerMP, Tessellator tessellatorIn, VertexBuffer worldRendererIn, Entity entityIn, float partialTicks, World world, List<BlockPos> blocks) {
double d0 = entityIn.lastTickPosX + (entityIn.posX - entityIn.lastTickPosX) * (double) partialTicks;
double d1 = entityIn.lastTickPosY + (entityIn.posY - entityIn.lastTickPosY) * (double) partialTicks;
double d2 = entityIn.lastTickPosZ + (entityIn.posZ - entityIn.lastTickPosZ) * (double) partialTicks;
TextureManager renderEngine = Minecraft.getMinecraft().renderEngine;
int progress = (int) (controllerMP.curBlockDamageMP * 10f) - 1; // 0-10
if(progress < 0) {
return;
}
renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
renderGlobal.preRenderDamagedBlocks();
worldRendererIn.begin(7, DefaultVertexFormats.BLOCK);
worldRendererIn.setTranslation(-d0, -d1, -d2);
worldRendererIn.noColor();
for(BlockPos blockpos : blocks) {
Block block = world.getBlockState(blockpos).getBlock();
TileEntity te = world.getTileEntity(blockpos);
boolean hasBreak = block instanceof BlockChest || block instanceof BlockEnderChest || block instanceof BlockSign || block instanceof BlockSkull;
if(!hasBreak) {
hasBreak = te != null && te.canRenderBreaking();
}
if(!hasBreak) {
IBlockState iblockstate = world.getBlockState(blockpos);
if(iblockstate.getMaterial() != Material.AIR) {
TextureAtlasSprite textureatlassprite = renderGlobal.destroyBlockIcons[progress];
BlockRendererDispatcher blockrendererdispatcher = Minecraft.getMinecraft().getBlockRendererDispatcher();
blockrendererdispatcher.renderBlockDamage(iblockstate, blockpos, textureatlassprite, world);
}
}
}
tessellatorIn.draw();
worldRendererIn.setTranslation(0.0D, 0.0D, 0.0D);
renderGlobal.postRenderDamagedBlocks();
}
}