package tectech.thing.metaTileEntity.pipe; import static gregtech.api.enums.Dyes.MACHINE_METAL; import static net.minecraft.util.StatCollector.translateToLocal; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import gregtech.GTMod; import gregtech.api.enums.Dyes; import gregtech.api.enums.Textures; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IColoredTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.logic.PowerLogic; import gregtech.api.logic.interfaces.PowerLogicHost; import gregtech.api.metatileentity.BaseMetaPipeEntity; import gregtech.api.metatileentity.MetaPipeEntity; import gregtech.api.objects.GTRenderedTexture; import gregtech.common.GTClient; import tectech.TecTech; import tectech.loader.NetworkDispatcher; import tectech.mechanics.pipe.IActivePipe; import tectech.mechanics.pipe.IConnectsToEnergyTunnel; import tectech.mechanics.pipe.PipeActivityMessage; import tectech.util.CommonValues; public class MTEPipeEnergy extends MetaPipeEntity implements IConnectsToEnergyTunnel, IActivePipe { static Textures.BlockIcons.CustomIcon EMcandy, EMCandyActive; private static Textures.BlockIcons.CustomIcon EMpipe; public byte connectionCount = 0; private boolean active; public MTEPipeEnergy(int aID, String aName, String aNameRegional) { super(aID, aName, aNameRegional, 0); } public MTEPipeEnergy(String aName) { super(aName, 0); } @Override public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) { return new MTEPipeEnergy(mName); } @Override @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister aBlockIconRegister) { EMcandy = new Textures.BlockIcons.CustomIcon("iconsets/EM_CANDY"); EMCandyActive = new Textures.BlockIcons.CustomIcon("iconsets/EM_CANDY_ACTIVE"); EMpipe = new Textures.BlockIcons.CustomIcon("iconsets/EM_LASER"); super.registerIcons(aBlockIconRegister); } @Override public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, int aConnections, int colorIndex, boolean aConnected, boolean aRedstone) { return new ITexture[] { new GTRenderedTexture(EMpipe), new GTRenderedTexture( getActive() ? EMCandyActive : EMcandy, Dyes.getModulation(colorIndex, MACHINE_METAL.getRGBA())) }; } @Override public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side, ItemStack itemStack) { return false; } @Override public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side, ItemStack itemStack) { return false; } public void updateNeighboringNetworks() { IGregTechTileEntity aBaseMetaTileEntity = this.getBaseMetaTileEntity(); for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { IGregTechTileEntity gregTechTileEntity = aBaseMetaTileEntity.getIGregTechTileEntityAtSide(side); if (gregTechTileEntity != null && gregTechTileEntity.getMetaTileEntity() instanceof MTEPipeEnergy neighbor) { neighbor.updateNetwork(true); } } } public void updateNetwork(boolean nestedCall) { IGregTechTileEntity aBaseMetaTileEntity = this.getBaseMetaTileEntity(); active = false; mConnections = 0; connectionCount = 0; if (aBaseMetaTileEntity.getColorization() < 0) { return; } for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { final ForgeDirection oppositeSide = side.getOpposite(); TileEntity tTileEntity = aBaseMetaTileEntity.getTileEntityAtSide(side); if (tTileEntity instanceof IColoredTileEntity coloredTileEntity) { byte tColor = coloredTileEntity.getColorization(); if (tColor != aBaseMetaTileEntity.getColorization()) { continue; } } if (tTileEntity instanceof PowerLogicHost host) { PowerLogic logic = host.getPowerLogic(oppositeSide); if (logic != null && logic.canUseLaser()) { mConnections |= side.flag; connectionCount++; continue; } } if (tTileEntity instanceof IConnectsToEnergyTunnel tunnel && tunnel.canConnect(oppositeSide)) { mConnections |= side.flag; connectionCount++; } else if (tTileEntity instanceof IGregTechTileEntity gregTechTileEntity && gregTechTileEntity.getMetaTileEntity() instanceof IConnectsToEnergyTunnel tunnel) { if (tunnel.canConnect(oppositeSide)) { mConnections |= side.flag; connectionCount++; } } } if (!nestedCall) updateNeighboringNetworks(); } @Override public void onColorChangeServer(byte aColor) { this.updateNetwork(false); super.onColorChangeServer(aColor); } @Override public void onBlockDestroyed() { IGregTechTileEntity aBaseMetaTileEntity = this.getBaseMetaTileEntity(); for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { IGregTechTileEntity gregTechTileEntity = aBaseMetaTileEntity.getIGregTechTileEntityAtSide(side); if (gregTechTileEntity != null && gregTechTileEntity.getMetaTileEntity() instanceof MTEPipeEnergy neighbor) { neighbor.mConnections &= ~side.getOpposite().flag; neighbor.connectionCount--; } } super.onBlockDestroyed(); } @Override public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { this.updateNetwork(false); super.onFirstTick(aBaseMetaTileEntity); } @Override public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { if (aBaseMetaTileEntity.isServerSide()) { if ((aTick & 31) == 31) { if (TecTech.RANDOM.nextInt(15) == 0) { NetworkDispatcher.INSTANCE.sendToAllAround( new PipeActivityMessage.PipeActivityData(this), aBaseMetaTileEntity.getWorld().provider.dimensionId, aBaseMetaTileEntity.getXCoord(), aBaseMetaTileEntity.getYCoord(), aBaseMetaTileEntity.getZCoord(), 256); } } } else if (aBaseMetaTileEntity.isClientSide() && GTClient.changeDetected == 4) { aBaseMetaTileEntity.issueTextureUpdate(); } } @Override public boolean onWrenchRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, float aX, float aY, float aZ, ItemStack aTool) { IGregTechTileEntity aBaseMetaTileEntity = this.getBaseMetaTileEntity(); if (this.isConnectedAtSide(wrenchingSide)) { this.mConnections &= ~wrenchingSide.flag; this.connectionCount--; IGregTechTileEntity gregTechTileEntity = aBaseMetaTileEntity.getIGregTechTileEntityAtSide(wrenchingSide); if (gregTechTileEntity != null && gregTechTileEntity.getMetaTileEntity() instanceof MTEPipeEnergy neighbor) { neighbor.mConnections &= ~wrenchingSide.getOpposite().flag; neighbor.connectionCount--; } } else { this.mConnections |= wrenchingSide.flag; this.connectionCount++; IGregTechTileEntity gregTechTileEntity = aBaseMetaTileEntity.getIGregTechTileEntityAtSide(wrenchingSide); if (gregTechTileEntity != null && gregTechTileEntity.getMetaTileEntity() instanceof MTEPipeEnergy neighbor) { neighbor.mConnections |= wrenchingSide.getOpposite().flag; neighbor.connectionCount--; } } return super.onWrenchRightClick(side, wrenchingSide, aPlayer, aX, aY, aZ, aTool); } @Override public void loadNBTData(NBTTagCompound nbtTagCompound) { active = nbtTagCompound.getBoolean("eActive"); } @Override public void saveNBTData(NBTTagCompound nbtTagCompound) { nbtTagCompound.setBoolean("eActive", active); } @Override public boolean renderInside(ForgeDirection side) { return false; } @Override public byte getTileEntityBaseType() { return 4; } @Override public String[] getDescription() { return new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.pipe.energystream.desc.0"), // Laser // tunneling // device. EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + translateToLocal("gt.blockmachines.pipe.energystream.desc.1"), // Bright Vacuum!!! EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.pipe.energystream.desc.2"), // Must be // painted to // work EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.pipe.energystream.desc.3") // Do not split // or turn }; } @Override public void setActive(boolean state) { if (state != active) { active = state; getBaseMetaTileEntity().issueTextureUpdate(); } } @Override public boolean getActive() { return active; } @Override public void markUsed() { this.active = true; } @Override public boolean canConnect(ForgeDirection side) { return true; } @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { if (GTMod.instance.isClientSide() && (GTClient.hideValue & 0x2) != 0) return AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + 1, aY + 1, aZ + 1); else return getActualCollisionBoundingBoxFromPool(aWorld, aX, aY, aZ); } public AxisAlignedBB getActualCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { float tSpace = (1f - 0.5f) / 2; float tSide0 = tSpace; float tSide1 = 1f - tSpace; float tSide2 = tSpace; float tSide3 = 1f - tSpace; float tSide4 = tSpace; float tSide5 = 1f - tSpace; if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.DOWN) != 0) { tSide0 = tSide2 = tSide4 = 0; tSide3 = tSide5 = 1; } if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.UP) != 0) { tSide2 = tSide4 = 0; tSide1 = tSide3 = tSide5 = 1; } if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.NORTH) != 0) { tSide0 = tSide2 = tSide4 = 0; tSide1 = tSide5 = 1; } if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.SOUTH) != 0) { tSide0 = tSide4 = 0; tSide1 = tSide3 = tSide5 = 1; } if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.WEST) != 0) { tSide0 = tSide2 = tSide4 = 0; tSide1 = tSide3 = 1; } if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.EAST) != 0) { tSide0 = tSide2 = 0; tSide1 = tSide3 = tSide5 = 1; } byte tConn = ((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections; if ((tConn & 1 << ForgeDirection.DOWN.ordinal()) != 0) { tSide0 = 0f; } if ((tConn & 1 << ForgeDirection.UP.ordinal()) != 0) { tSide1 = 1f; } if ((tConn & 1 << ForgeDirection.NORTH.ordinal()) != 0) { tSide2 = 0f; } if ((tConn & 1 << ForgeDirection.SOUTH.ordinal()) != 0) { tSide3 = 1f; } if ((tConn & 1 << ForgeDirection.WEST.ordinal()) != 0) { tSide4 = 0f; } if ((tConn & 1 << ForgeDirection.EAST.ordinal()) != 0) { tSide5 = 1f; } return AxisAlignedBB .getBoundingBox(aX + tSide4, aY + tSide0, aZ + tSide2, aX + tSide5, aY + tSide1, aZ + tSide3); } @Override public float getThickNess() { if (GTMod.instance.isClientSide() && GTClient.hideValue == 1) { return 0.0625F; } return 0.5f; } }