package crazypants.enderio.teleport.anchor; import javax.annotation.Nullable; import net.minecraft.block.Block; import net.minecraft.block.ITileEntityProvider; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.EntityLivingBase; 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.EnumChatFormatting; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.UsernameCache; import net.minecraftforge.common.util.ForgeDirection; import com.enderio.core.api.client.gui.IResourceTooltipProvider; import com.enderio.core.common.TileEntityEnder; import com.enderio.core.common.util.ChatUtil; import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import crazypants.enderio.BlockEio; import crazypants.enderio.EnderIO; import crazypants.enderio.GuiHandler; import crazypants.enderio.ModObject; import crazypants.enderio.TileEntityEio; import crazypants.enderio.api.teleport.ITravelAccessable; import crazypants.enderio.config.Config; import crazypants.enderio.machine.MachineRecipeInput; import crazypants.enderio.machine.MachineRecipeRegistry; import crazypants.enderio.machine.painter.BasicPainterTemplate; import crazypants.enderio.machine.painter.IPaintableTileEntity; import crazypants.enderio.machine.painter.PainterUtil; import crazypants.enderio.network.PacketHandler; import crazypants.enderio.teleport.ContainerTravelAccessable; import crazypants.enderio.teleport.ContainerTravelAuth; import crazypants.enderio.teleport.GuiTravelAccessable; import crazypants.enderio.teleport.GuiTravelAuth; import crazypants.enderio.teleport.packet.PacketAccessMode; import crazypants.enderio.teleport.packet.PacketDrainStaff; import crazypants.enderio.teleport.packet.PacketLabel; import crazypants.enderio.teleport.packet.PacketOpenAuthGui; import crazypants.enderio.teleport.packet.PacketPassword; import crazypants.enderio.teleport.packet.PacketTravelEvent; import crazypants.util.IFacade; import crazypants.util.UserIdent; public class BlockTravelAnchor extends BlockEio implements IGuiHandler, ITileEntityProvider, IResourceTooltipProvider, IFacade { public static int renderId = -1; public static BlockTravelAnchor create() { PacketHandler.INSTANCE.registerMessage(PacketAccessMode.class, PacketAccessMode.class, PacketHandler.nextID(), Side.SERVER); PacketHandler.INSTANCE.registerMessage(PacketLabel.class, PacketLabel.class, PacketHandler.nextID(), Side.SERVER); PacketHandler.INSTANCE.registerMessage(PacketTravelEvent.class, PacketTravelEvent.class, PacketHandler.nextID(), Side.SERVER); PacketHandler.INSTANCE.registerMessage(PacketDrainStaff.class, PacketDrainStaff.class, PacketHandler.nextID(), Side.SERVER); PacketHandler.INSTANCE.registerMessage(PacketOpenAuthGui.class, PacketOpenAuthGui.class, PacketHandler.nextID(), Side.SERVER); PacketHandler.INSTANCE.registerMessage(PacketPassword.Handler.class, PacketPassword.class, PacketHandler.nextID(), Side.SERVER); BlockTravelAnchor result = new BlockTravelAnchor(); result.init(); EnderIO.guiHandler.registerGuiHandler(GuiHandler.GUI_ID_TRAVEL_ACCESSABLE, result); EnderIO.guiHandler.registerGuiHandler(GuiHandler.GUI_ID_TRAVEL_AUTH, result); MachineRecipeRegistry.instance.registerRecipe(ModObject.blockPainter.unlocalisedName, result.new PainterTemplate()); return result; } IIcon selectedOverlayIcon; IIcon highlightOverlayIcon; private BlockTravelAnchor() { super(ModObject.blockTravelAnchor.unlocalisedName, TileTravelAnchor.class); if (!Config.travelAnchorEnabled) { setCreativeTab(null); } } public BlockTravelAnchor(String unlocalisedName, Class<? extends TileEntityEio> teClass) { super(unlocalisedName, teClass); } @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iIconRegister) { super.registerBlockIcons(iIconRegister); highlightOverlayIcon = iIconRegister.registerIcon("enderio:blockTravelAnchorHighlight"); selectedOverlayIcon = iIconRegister.registerIcon("enderio:blockTravelAnchorSelected"); } @Override @SideOnly(Side.CLIENT) public IIcon getIcon(IBlockAccess world, int x, int y, int z, int blockSide) { TileEntity te = world.getTileEntity(x, y, z); if (te instanceof IPaintableTileEntity) { Block sourceBlock = ((IPaintableTileEntity) te).getSourceBlock(); if (sourceBlock != null && sourceBlock != this) { return sourceBlock.getIcon(blockSide, ((IPaintableTileEntity) te).getSourceBlockMetadata()); } } return super.getIcon(world, x, y, z, blockSide); } @Override public TileEntity createNewTileEntity(World var1, int var2) { return new TileTravelAnchor(); } @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack par6ItemStack) { if (entity instanceof EntityPlayer) { TileEntity te = world.getTileEntity(x, y, z); if (te instanceof TileTravelAnchor) { TileTravelAnchor ta = (TileTravelAnchor) te; ta.setPlacedBy((EntityPlayer) entity); Block b = PainterUtil.getSourceBlock(par6ItemStack); ta.setSourceBlock(b); ta.setSourceBlockMetadata(PainterUtil.getSourceBlockMetadata(par6ItemStack)); world.markBlockForUpdate(x, y, z); } } } @Override public boolean openGui(World world, int x, int y, int z, EntityPlayer entityPlayer, int side) { TileEntity te = world.getTileEntity(x, y, z); if (!world.isRemote && te instanceof ITravelAccessable) { ITravelAccessable ta = (ITravelAccessable) te; if (ta.canUiBeAccessed(entityPlayer)) { entityPlayer.openGui(EnderIO.instance, GuiHandler.GUI_ID_TRAVEL_ACCESSABLE, world, x, y, z); } else { sendPrivateChatMessage(entityPlayer, ta.getOwner()); } } return true; } public static void sendPrivateChatMessage(EntityPlayer player, UserIdent owner) { if (!player.isSneaking()) { ChatUtil.sendNoSpam(player, EnderIO.lang.localize("gui.travelAccessable.privateBlock1") + " " + EnumChatFormatting.RED + owner.getPlayerName() + EnumChatFormatting.WHITE + " " + EnderIO.lang.localize("gui.travelAccessable.privateBlock2")); } } @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); if (te instanceof ITravelAccessable) { if (ID == GuiHandler.GUI_ID_TRAVEL_ACCESSABLE) { return new ContainerTravelAccessable(player.inventory, (ITravelAccessable) te, world); } else { return new ContainerTravelAuth(player.inventory); } } return null; } @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); if (te instanceof ITravelAccessable) { if (ID == GuiHandler.GUI_ID_TRAVEL_ACCESSABLE) { return new GuiTravelAccessable(player.inventory, (ITravelAccessable) te, world); } else { return new GuiTravelAuth(player, (ITravelAccessable) te, world); } } return null; } @Override protected void processDrop(World world, int x, int y, int z, @Nullable TileEntityEnder te, ItemStack drop) { TileTravelAnchor anchor = (TileTravelAnchor) te; if (anchor == null) { return; } ItemStack itemStack = new ItemStack(this); Block srcBlk = anchor.getSourceBlock(); if (srcBlk != null) { itemStack = createItemStackForSourceBlock(anchor.getSourceBlock(), anchor.getSourceBlockMetadata()); drop.stackTagCompound = (NBTTagCompound) itemStack.stackTagCompound.copy(); } } @Override public boolean doNormalDrops(World world, int x, int y, int z) { return false; } @Override @SideOnly(Side.CLIENT) public int colorMultiplier(IBlockAccess world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); if (te instanceof IPaintableTileEntity) { Block sourceBlock = ((IPaintableTileEntity) te).getSourceBlock(); if (sourceBlock != null && sourceBlock != this) { return sourceBlock.colorMultiplier(world, x, y, z); } } return super.colorMultiplier(world, x, y, z); } @Override public int getRenderType() { return renderId; } @Override public String getUnlocalizedNameForTooltip(ItemStack itemStack) { return getUnlocalizedName(); } public ItemStack createItemStackForSourceBlock(Block block, int damage) { if (block == this) { return new ItemStack(this); } ItemStack result = new ItemStack(this, 1, damage); PainterUtil.setSourceBlock(result, block, damage); return result; } @Override public boolean isOpaqueCube() { return false; } public final class PainterTemplate extends BasicPainterTemplate { public PainterTemplate() { super(BlockTravelAnchor.this); } @Override public ResultStack[] getCompletedResult(float chance, MachineRecipeInput... inputs) { ItemStack paintSource = MachineRecipeInput.getInputForSlot(1, inputs); if (paintSource == null) { return new ResultStack[0]; } return new ResultStack[] { new ResultStack(createItemStackForSourceBlock(Block.getBlockFromItem(paintSource.getItem()), paintSource.getItemDamage())) }; } } @Override public int getFacadeMetadata(IBlockAccess world, int x, int y, int z, int side) { TileEntity te = world.getTileEntity(x, y, z); if (te instanceof TileTravelAnchor) { return ((TileTravelAnchor) te).getSourceBlockMetadata(); } return 0; } @Override public Block getFacade(IBlockAccess world, int x, int y, int z, int side) { TileEntity te = world.getTileEntity(x, y, z); if (te instanceof IPaintableTileEntity) { Block sourceBlock = ((IPaintableTileEntity) te).getSourceBlock(); if (sourceBlock != null) { return sourceBlock; } } return this; } @Override public Block getVisualBlock(IBlockAccess world, int x, int y, int z, ForgeDirection side) { return getFacade(world, x, y, z, side.ordinal()); } @Override public int getVisualMeta(IBlockAccess world, int x, int y, int z, ForgeDirection side) { return getFacadeMetadata(world, x, y, z, side.ordinal()); } @Override public boolean supportsVisualConnections() { return true; } }