package pneumaticCraft.common.block.tubes; import java.util.ArrayList; import java.util.List; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; import org.lwjgl.opengl.GL11; import pneumaticCraft.client.model.IBaseModel; import pneumaticCraft.common.item.Itemss; import pneumaticCraft.common.network.NetworkHandler; import pneumaticCraft.common.network.PacketOpenTubeModuleGui; import pneumaticCraft.common.thirdparty.ModInteractionUtils; import pneumaticCraft.common.util.PneumaticCraftUtils; import pneumaticCraft.lib.BBConstants; import pneumaticCraft.lib.ModIds; import pneumaticCraft.proxy.CommonProxy.EnumGuiId; import codechicken.lib.data.MCDataInput; import codechicken.lib.data.MCDataOutput; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.common.Optional; public abstract class TubeModule implements ISidedPart{ protected IPneumaticPosProvider pressureTube; protected ForgeDirection dir = ForgeDirection.UP; public AxisAlignedBB[] boundingBoxes = new AxisAlignedBB[6]; protected boolean upgraded; public float lowerBound = 7.5F, higherBound = 0, maxValue = 30; private boolean fake; public boolean advancedConfig; public boolean shouldDrop; public TubeModule(){ double width = getWidth() / 2; double height = getHeight(); boundingBoxes[0] = AxisAlignedBB.getBoundingBox(0.5 - width, BBConstants.PRESSURE_PIPE_MIN_POS - height, 0.5 - width, 0.5 + width, BBConstants.PRESSURE_PIPE_MIN_POS, 0.5 + width); boundingBoxes[1] = AxisAlignedBB.getBoundingBox(0.5 - width, BBConstants.PRESSURE_PIPE_MAX_POS, 0.5 - width, 0.5 + width, BBConstants.PRESSURE_PIPE_MAX_POS + height, 0.5 + width); boundingBoxes[2] = AxisAlignedBB.getBoundingBox(0.5 - width, 0.5 - width, BBConstants.PRESSURE_PIPE_MIN_POS - height, 0.5 + width, 0.5 + width, BBConstants.PRESSURE_PIPE_MIN_POS); boundingBoxes[3] = AxisAlignedBB.getBoundingBox(0.5 - width, 0.5 - width, BBConstants.PRESSURE_PIPE_MAX_POS, 0.5 + width, 0.5 + width, BBConstants.PRESSURE_PIPE_MAX_POS + height); boundingBoxes[4] = AxisAlignedBB.getBoundingBox(BBConstants.PRESSURE_PIPE_MIN_POS - height, 0.5 - width, 0.5 - width, BBConstants.PRESSURE_PIPE_MIN_POS, 0.5 + width, 0.5 + width); boundingBoxes[5] = AxisAlignedBB.getBoundingBox(BBConstants.PRESSURE_PIPE_MAX_POS, 0.5 - width, 0.5 - width, BBConstants.PRESSURE_PIPE_MAX_POS + height, 0.5 + width, 0.5 + width); } public void markFake(){ fake = true; } public boolean isFake(){ return fake; } public void setTube(IPneumaticPosProvider pressureTube){ this.pressureTube = pressureTube; } public IPneumaticPosProvider getTube(){ return pressureTube; } public double getWidth(){ return BBConstants.PRESSURE_PIPE_MAX_POS - BBConstants.PRESSURE_PIPE_MIN_POS; } protected double getHeight(){ return BBConstants.PRESSURE_PIPE_MIN_POS; } public float getThreshold(int redstone){ double slope = (higherBound - lowerBound) / 15; double threshold = lowerBound + slope * redstone; return (float)threshold; } /** * Returns the item that this part drops. * @return */ public List<ItemStack> getDrops(){ List<ItemStack> drops = new ArrayList<ItemStack>(); if(shouldDrop) { drops.add(new ItemStack(ModuleRegistrator.getModuleItem(getType()))); if(upgraded) drops.add(new ItemStack(Itemss.advancedPCB)); } return drops; } @Override public void setDirection(ForgeDirection dir){ this.dir = dir; } public ForgeDirection getDirection(){ return dir; } public void readFromNBT(NBTTagCompound nbt){ dir = ForgeDirection.getOrientation(nbt.getInteger("dir")); upgraded = nbt.getBoolean("upgraded"); lowerBound = nbt.getFloat("lowerBound"); higherBound = nbt.getFloat("higherBound"); advancedConfig = nbt.hasKey("advancedConfig") ? nbt.getBoolean("advancedConfig") : true; } public void writeToNBT(NBTTagCompound nbt){ nbt.setInteger("dir", dir.ordinal()); nbt.setBoolean("upgraded", upgraded); nbt.setFloat("lowerBound", lowerBound); nbt.setFloat("higherBound", higherBound); nbt.setBoolean("advancedConfig", advancedConfig); } @Optional.Method(modid = ModIds.FMP) public void writeDesc(MCDataOutput data){ data.writeInt(dir.ordinal()); } @Optional.Method(modid = ModIds.FMP) public void readDesc(MCDataInput data){ dir = ForgeDirection.getOrientation(data.readInt()); } public void update(){} public void onNeighborTileUpdate(){} public void onNeighborBlockUpdate(){} /** * Used by multiparts and/or by NBT saving. * @return */ public abstract String getType(); public void renderDynamic(double x, double y, double z, float partialTicks, int renderPass, boolean itemRender){ if(renderPass == 0) { GL11.glPushMatrix(); // start // GL11.glDisable(GL11.GL_TEXTURE_2D); // GL11.glEnable(GL11.GL_BLEND); // GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); // GL11.glColor4f(0.82F, 0.56F, 0.09F, 1.0F); GL11.glTranslatef((float)x + 0.5F, (float)y + 1.5F, (float)z + 0.5F); // size GL11.glRotatef(0, 0.0F, 1.0F, 0.0F); GL11.glScalef(1.0F, -1F, -1F); // to make your block have a normal // positioning. comment out to see what // happens FMLClientHandler.instance().getClient().getTextureManager().bindTexture(getModel().getModelTexture(null)); PneumaticCraftUtils.rotateMatrixByMetadata(dir.ordinal()); renderModule(); getModel().renderStatic(0.0625F, null); getModel().renderDynamic(0.0625F, null, partialTicks); GL11.glPopMatrix(); } } protected void renderModule(){} public abstract IBaseModel getModel(); public int getRedstoneLevel(){ return 0; } protected void updateNeighbors(){ pressureTube.world().notifyBlocksOfNeighborChange(pressureTube.x(), pressureTube.y(), pressureTube.z(), pressureTube.world().getBlock(pressureTube.x(), pressureTube.y(), pressureTube.z())); } public boolean isInline(){ return false; } public void sendDescriptionPacket(){ ModInteractionUtils.getInstance().sendDescriptionPacket(pressureTube); } public void addInfo(List<String> curInfo){} public void addItemDescription(List<String> curInfo){} public boolean canUpgrade(){ return true; } public void upgrade(){ upgraded = true; } public boolean isUpgraded(){ return upgraded; } public boolean onActivated(EntityPlayer player){ if(!player.worldObj.isRemote && upgraded && getGuiId() != null) { NetworkHandler.sendTo(new PacketOpenTubeModuleGui(getGuiId().ordinal(), pressureTube.x(), pressureTube.y(), pressureTube.z()), (EntityPlayerMP)player); return true; } return false; } protected abstract EnumGuiId getGuiId(); }