package blusunrize.immersiveengineering.common.blocks.cloth; import blusunrize.immersiveengineering.api.energy.wires.IImmersiveConnectable; import blusunrize.immersiveengineering.api.energy.wires.ImmersiveNetHandler.Connection; import blusunrize.immersiveengineering.api.shader.CapabilityShader; import blusunrize.immersiveengineering.api.shader.CapabilityShader.ShaderWrapper_Direct; import blusunrize.immersiveengineering.api.shader.IShaderItem; import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IHammerInteraction; import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.ILightValue; import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IPlayerInteraction; import blusunrize.immersiveengineering.common.blocks.metal.TileEntityConnectorStructural; import blusunrize.immersiveengineering.common.util.Utils; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumDyeColor; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing.Axis; import net.minecraft.util.EnumHand; import net.minecraft.util.math.Vec3d; import net.minecraftforge.common.capabilities.Capability; import javax.annotation.Nullable; public class TileEntityBalloon extends TileEntityConnectorStructural implements ILightValue, IPlayerInteraction, IHammerInteraction { public int style = 0; public int colour0 = 0xffffff; public int colour1 = 0xffffff; public ShaderWrapper_Direct shader = new ShaderWrapper_Direct("immersiveengineering:balloon"); @Override public int getLightValue() { return 13; } @Override public void readCustomNBT(NBTTagCompound nbt, boolean descPacket) { super.readCustomNBT(nbt,descPacket); //to prevent old ballons from going black int nbtVersion = nbt.getInteger("nbtVersion"); if(nbtVersion>=1) { style = nbt.getInteger("style"); colour0 = nbt.getInteger("colour0"); colour1 = nbt.getInteger("colour1"); } if(nbt.hasKey("shader")) { shader = new ShaderWrapper_Direct("immersiveengineering:balloon"); shader.deserializeNBT(nbt.getCompoundTag("shader")); } } @Override public void writeCustomNBT(NBTTagCompound nbt, boolean descPacket) { super.writeCustomNBT(nbt,descPacket); nbt.setInteger("nbtVersion", 1); nbt.setInteger("style",style); nbt.setInteger("colour0",colour0); nbt.setInteger("colour1",colour1); nbt.setTag("shader", shader.serializeNBT()); } @Override public float[] getBlockBounds() { return new float[]{.125f,0,.125f,.875f,.9375f,.875f}; } @Override public boolean receiveClientEvent(int id, int arg) { if(id==0) { this.markContainingBlockForUpdate(null); return true; } return super.receiveClientEvent(id, arg); } @Override public boolean hasCapability(Capability<?> capability, @Nullable EnumFacing facing) { if(capability == CapabilityShader.SHADER_CAPABILITY) return true; return super.hasCapability(capability, facing); } @Override public <T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing) { if(capability == CapabilityShader.SHADER_CAPABILITY) return (T)shader; return super.getCapability(capability, facing); } @Override public String getCacheKey(IBlockState object) { if(shader!=null && shader.getShaderItem()!=null && shader.getShaderItem().getItem() instanceof IShaderItem) return ((IShaderItem)shader.getShaderItem().getItem()).getShaderName(shader.getShaderItem()); return colour0+":"+colour1+":"+style; } @Override public int getRenderColour(IBlockState object, String group) { if(shader!=null && shader.getShaderItem()!=null && shader.getShaderItem().getItem() instanceof IShaderItem) return 0xffffffff; if (style==0) { if (group.startsWith("balloon1_")) return 0xff000000|colour1; if (group.startsWith("balloon0_")) return 0xff000000|colour0; } else { if (group.endsWith("_1")) return 0xff000000|colour1; if (group.endsWith("_0")) return 0xff000000|colour0; } return 0xffffffff; } @Override public Vec3d getRaytraceOffset(IImmersiveConnectable link) { int xDif = ((TileEntity)link).getPos().getX()-getPos().getX(); int zDif = ((TileEntity)link).getPos().getZ()-getPos().getZ(); int yDif = ((TileEntity)link).getPos().getY()-getPos().getY(); if(yDif<0) { double dist = Math.sqrt(xDif*xDif + zDif*zDif); if(dist/Math.abs(yDif)<2.5) return new Vec3d(.5,.09375,.5); } if(Math.abs(zDif)>Math.abs(xDif)) return new Vec3d(.5,.09375,zDif>0?.8125:.1875); else return new Vec3d(xDif>0?.8125:.1875,.09375,.5); } @Override public Vec3d getConnectionOffset(Connection con) { int xDif = (con==null||con.start==null||con.end==null)?0: (con.start.equals(this.getPos())&&con.end!=null)? con.end.getX()-getPos().getX(): (con.end.equals(this.getPos())&& con.start!=null)?con.start.getX()-getPos().getX(): 0; int zDif = (con==null||con.start==null||con.end==null)?0: (con.start.equals(this.getPos())&&con.end!=null)? con.end.getZ()-getPos().getZ(): (con.end.equals(this.getPos())&& con.start!=null)?con.start.getZ()-getPos().getZ(): 0; int yDif = (con==null||con.start==null||con.end==null)?0: (con.start.equals(this.getPos())&&con.end!=null)? con.end.getY()-getPos().getY(): (con.end.equals(this.getPos())&& con.start!=null)?con.start.getY()-getPos().getY(): 0; if(yDif<0) { double dist = Math.sqrt(xDif*xDif + zDif*zDif); if(dist/Math.abs(yDif)<2.5) return new Vec3d(.5,.09375,.5); } if(Math.abs(zDif)>Math.abs(xDif)) return new Vec3d(.5,.09375,zDif>0?.78125:.21875); else return new Vec3d(xDif>0?.78125:.21875,.09375,.5); } @Override public boolean interact(EnumFacing side, EntityPlayer player, EnumHand hand, ItemStack heldItem, float hitX, float hitY, float hitZ) { if(heldItem!=null && heldItem.getItem() instanceof IShaderItem) { if(this.shader==null) this.shader = new ShaderWrapper_Direct("immersiveengineering:balloon"); this.shader.setShaderItem(Utils.copyStackWithAmount(heldItem,1)); markContainingBlockForUpdate(null); return true; } int target = 0; if(side.getAxis()==Axis.Y && style==0) target = (hitX<.375||hitX>.625)&&(hitZ<.375||hitZ>.625)?1:0; else if(side.getAxis()==Axis.Z) { if(style==0) target = (hitX<.375||hitX>.625)?1:0; else target =(hitY>.5625&&hitY<.75)?1:0; } else if(side.getAxis()==Axis.X) { if(style==0) target = (hitZ<.375||hitZ>.625)?1:0; else target =(hitY>.5625&&hitY<.75)?1:0; } int heldDye = Utils.getDye(heldItem); if(heldDye==-1) return false; heldDye = EnumDyeColor.byMetadata(15-heldDye).getMapColor().colorValue; if(target==0) { if(colour0==heldDye) return false; colour0 = heldDye; } else { if(colour1==heldDye) return false; colour1 = heldDye; } markContainingBlockForUpdate(null); return true; } @Override public boolean hammerUseSide(EnumFacing side, EntityPlayer player, float hitX, float hitY, float hitZ) { style = 1-style; markContainingBlockForUpdate(null); return true; } }