package net.tropicraft.item; import java.util.List; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.MovingObjectPosition.MovingObjectType; import net.minecraft.util.StatCollector; import net.minecraft.world.World; import net.tropicraft.registry.TCBlockRegistry; import net.tropicraft.registry.TCCreativeTabRegistry; import net.tropicraft.util.TropicraftWorldUtils; import net.tropicraft.world.TeleporterTropics; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class ItemPortalEnchanter extends ItemTropicraft { public ItemPortalEnchanter() { super(); maxStackSize = 1; this.setCreativeTab(TCCreativeTabRegistry.tabMisc); } @SideOnly(Side.CLIENT) @Override public void addInformation(ItemStack itemstack, EntityPlayer ent, List list, boolean wat) { list.add(StatCollector.translateToLocal("portalenchanter.type_" + itemstack.getItemDamage())); } /** * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) */ @Override public void getSubItems(Item item, CreativeTabs tabs, List list) { list.add(new ItemStack(item, 1, 0)); list.add(new ItemStack(item, 1, 1)); } @Override public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer) { if (!world.isRemote && (itemstack.getItemDamage() == 1 || entityplayer.capabilities.isCreativeMode)) { int destination = entityplayer.dimension == 0 ? TropicraftWorldUtils.TROPICS_DIMENSION_ID : 0; TropicraftWorldUtils.teleportPlayer((EntityPlayerMP) entityplayer); return itemstack; } // Portal starter only usable in overworld & tropics // TODO NOTE: Commented out for now because pickles /*if (entityplayer.dimension != 0 && entityplayer.dimension != TropicraftWorldUtils.TROPICS_DIMENSION_ID) { return itemstack; }*/ double playerX = entityplayer.prevPosX + (entityplayer.posX - entityplayer.prevPosX); double playerY = entityplayer.prevPosY + (entityplayer.posY - entityplayer.prevPosY) + 1.62D - (double) entityplayer.yOffset; double playerZ = entityplayer.prevPosZ + (entityplayer.posZ - entityplayer.prevPosZ); MovingObjectPosition target = this.getMovingObjectPositionFromPlayer(world, entityplayer, true); if (target == null || world.isRemote) { return itemstack; } else { if (target.typeOfHit == MovingObjectType.BLOCK) { int x = target.blockX; int y = target.blockY; int z = target.blockZ; int l = world.getBlockMetadata(x, y, z); if (!world.canMineBlock(entityplayer, x, y, z)) { return itemstack; } if (!entityplayer.canPlayerEdit(x, y, z, l, itemstack)) { return itemstack; } boolean found = false; for (int searchZ = -4; searchZ <= 4 && !found; searchZ++) { for (int searchX = -4; searchX <= 4 && !found; searchX++) { if (canGen(world, x + searchX, y, z + searchZ)) { found = true; entityplayer.swingItem(); (new TeleporterTropics(FMLCommonHandler.instance().getMinecraftServerInstance().worldServerForDimension(entityplayer.dimension))).buildTeleporterAt(x + searchX, y, z + searchZ, entityplayer); //ModLoader.getMinecraftInstance().effectRenderer.addEffect(new EntitySplashFX(ModLoader.getMinecraftInstance().theWorld, playerX, playerY, playerZ, 0D, 0D, 0D)); itemstack.damageItem(1, entityplayer); } } } } } return itemstack; } public boolean canGen(World world, int x, int y, int z) { if (y < 9) return false; for (int offsetZ = -2; offsetZ < 3; offsetZ++) { for (int offsetX = -2; offsetX < 3; offsetX++) { if (offsetX == -2 || offsetX == 2 || offsetZ == -2 || offsetZ == 2) { Block block = world.getBlock(x + offsetX, y, z + offsetZ); if (block != Blocks.sandstone && block != TCBlockRegistry.tropicsPortalWall) { return false; } } else { if (world.getBlock(x + offsetX, y, z + offsetZ).getMaterial() != Material.water) { return false; } if (!world.isAirBlock(x + offsetX, y + 1, z + offsetZ)) { return false; } } } } return true; } @Override public boolean isFull3D() { return true; } }