package crazypants.enderio.teleport.telepad; import java.util.List; import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.play.client.C08PacketPlayerBlockPlacement; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import com.enderio.core.api.client.gui.IResourceTooltipProvider; import com.enderio.core.common.util.BlockCoord; import com.enderio.core.common.util.Util; import com.enderio.core.common.vecmath.Vector3d; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.common.registry.GameRegistry; import crazypants.enderio.EnderIO; import crazypants.enderio.EnderIOTab; import crazypants.enderio.ModObject; import crazypants.enderio.api.teleport.ITelePad; import crazypants.enderio.teleport.anchor.BlockTravelAnchor; public class ItemCoordSelector extends Item implements IResourceTooltipProvider { public static ItemCoordSelector create() { ItemCoordSelector ret = new ItemCoordSelector(); GameRegistry.registerItem(ret, ModObject.itemCoordSelector.unlocalisedName); return ret; } private ItemCoordSelector() { setCreativeTab(EnderIOTab.tabEnderIO); setUnlocalizedName(ModObject.itemCoordSelector.unlocalisedName); setTextureName("EnderIO:" + ModObject.itemCoordSelector.unlocalisedName); setMaxStackSize(1); } @SuppressWarnings("unchecked") @Override public void getSubItems(Item item, CreativeTabs p_150895_2_, @SuppressWarnings("rawtypes") List list) { ItemStack stack = new ItemStack(item); init(stack); list.add(stack); } public static void init(ItemStack stack) { stack.stackTagCompound = new NBTTagCompound(); new BlockCoord().writeToNBT(stack.stackTagCompound); stack.stackTagCompound.setBoolean("default", true); } @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean p_77624_4_) { if(!stack.stackTagCompound.getBoolean("default")) { list.add(getCoords(stack).chatString(EnumChatFormatting.GRAY)); } super.addInformation(stack, player, list, p_77624_4_); } @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { if (rayTraceCoords(stack, world, player)) { player.swingItem(); } return super.onItemRightClick(stack, world, player); } @Override public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { if (!rayTraceCoords(stack, world, player)) { return false; } TileEntity te = world.getTileEntity(x, y, z); if(te instanceof ITelePad) { ITelePad tp = (ITelePad) te; TileTelePad tile = null; if (te instanceof TileTelePad) { tile = (TileTelePad) te; } if(tp.canBlockBeAccessed(player)) { BlockCoord bc = getCoords(stack); BlockCoord cur = new BlockCoord(tp.getX(), tp.getY(), tp.getZ()); int dim = getDimension(stack); int curDim = tp.getTargetDim(); if(!bc.equals(cur)) { if(tile != null) { tile.setCoords_internal(bc); } else { tp.setCoords(bc); } if(!world.isRemote) { player.addChatMessage(new ChatComponentText(EnderIO.lang.localize("itemCoordSelector.chat.setCoords", bc.chatString()))); } } if(dim != curDim) { if(tile != null) { tile.setTargetDim_internal(dim); } else { tp.setTargetDim(dim); } if(!world.isRemote) { player.addChatMessage(new ChatComponentText(EnderIO.lang.localize("itemCoordSelector.chat.setDimension", EnumChatFormatting.GREEN.toString(), Integer.toString(dim)))); } } if(bc.equals(cur) && dim == curDim) { return false; } } else { BlockTravelAnchor.sendPrivateChatMessage(player, tp.getOwner()); } } if(world.isRemote) { sendItemUsePacket(stack, player, world, x, y, z, side, hitX, hitY, hitZ); } return true; } // returns false if the raytrace provided no new information private boolean rayTraceCoords(ItemStack stack, World world, EntityPlayer player) { Vector3d headVec = Util.getEyePositionEio(player); Vec3 start = headVec.getVec3(); Vec3 lookVec = player.getLook(1.0F); double reach = 500; headVec.add(lookVec.xCoord * reach, lookVec.yCoord * reach, lookVec.zCoord * reach); MovingObjectPosition mop = world.rayTraceBlocks(start, headVec.getVec3()); if (mop == null) { return false; } BlockCoord bc = new BlockCoord(mop); BlockCoord onStack = getCoords(stack); TileEntity te = bc.getTileEntity(world); if(te instanceof ITelePad) { return true; } if(!player.isSneaking()) { ForgeDirection dir = ForgeDirection.VALID_DIRECTIONS[mop.sideHit]; bc = bc.getLocation(dir); } int dim = world.provider.dimensionId; int curDim = getDimension(stack); boolean changed = false; if(!bc.equals(onStack)) { setCoords(stack, bc); onCoordsChanged(player, bc); changed = true; } if (dim != curDim) { setDimension(stack, world); onDimensionChanged(player, getDimension(stack)); changed = true; } return changed; } private void sendItemUsePacket(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { NetHandlerPlayClient netClientHandler = (NetHandlerPlayClient) FMLClientHandler.instance().getClientPlayHandler(); netClientHandler.addToSendQueue(new C08PacketPlayerBlockPlacement(x, y, z, side, player.inventory.getCurrentItem(), hitX, hitY, hitZ)); } private void onCoordsChanged(EntityPlayer player, BlockCoord bc) { if(!player.worldObj.isRemote) { player.addChatMessage(new ChatComponentText(EnderIO.lang.localize("itemCoordSelector.chat.newCoords", bc.chatString()))); } } private void onDimensionChanged(EntityPlayer player, int dim) { if(!player.worldObj.isRemote) { player.addChatMessage(new ChatComponentText(EnderIO.lang.localize("itemCoordSelector.chat.newDimension", EnumChatFormatting.GREEN.toString(), Integer.toString(dim)))); } } public void setCoords(ItemStack stack, BlockCoord bc) { stack.stackTagCompound.setBoolean("default", false); bc.writeToNBT(stack.stackTagCompound); } public void setDimension(ItemStack stack, World world) { stack.stackTagCompound.setInteger("dimension", world.provider.dimensionId); } public BlockCoord getCoords(ItemStack stack) { return BlockCoord.readFromNBT(stack.stackTagCompound); } public int getDimension(ItemStack stack) { return stack.stackTagCompound.getInteger("dimension"); } @Override public String getUnlocalizedNameForTooltip(ItemStack itemStack) { return getUnlocalizedName(); } }