package zmaster587.advancedRocketry.item; import io.netty.buffer.ByteBuf; import java.util.LinkedList; import java.util.List; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; import zmaster587.advancedRocketry.api.satellite.SatelliteBase; import zmaster587.advancedRocketry.dimension.DimensionManager; import zmaster587.advancedRocketry.network.PacketSatellite; import zmaster587.advancedRocketry.satellite.SatelliteBiomeChanger; import zmaster587.libVulpes.LibVulpes; import zmaster587.libVulpes.api.IUniversalEnergy; import zmaster587.libVulpes.inventory.GuiHandler; import zmaster587.libVulpes.inventory.TextureResources; import zmaster587.libVulpes.inventory.modules.IButtonInventory; import zmaster587.libVulpes.inventory.modules.IModularInventory; import zmaster587.libVulpes.inventory.modules.ModuleBase; import zmaster587.libVulpes.inventory.modules.ModuleButton; import zmaster587.libVulpes.inventory.modules.ModuleContainerPan; import zmaster587.libVulpes.inventory.modules.ModuleImage; import zmaster587.libVulpes.inventory.modules.ModulePower; import zmaster587.libVulpes.network.INetworkItem; import zmaster587.libVulpes.network.PacketHandler; import zmaster587.libVulpes.network.PacketItemModifcation; public class ItemBiomeChanger extends ItemSatelliteIdentificationChip implements IModularInventory, IButtonInventory, INetworkItem { @Override public List<ModuleBase> getModules(int id, EntityPlayer player) { List<ModuleBase> list = new LinkedList<ModuleBase>(); SatelliteBiomeChanger sat = (SatelliteBiomeChanger) getSatellite(player.getCurrentEquippedItem()); if(player.worldObj.isRemote) { list.add(new ModuleImage(24, 14, zmaster587.advancedRocketry.inventory.TextureResources.earthCandyIcon)); } List<ModuleBase> list2 = new LinkedList<ModuleBase>(); int j = 0; for(byte biomeByte : sat.discoveredBiomes()) { BiomeGenBase biome = BiomeGenBase.getBiome(biomeByte); list2.add(new ModuleButton(32, 16 + 24*(j++), biome.biomeID, biome.biomeName, this, TextureResources.buttonBuild)); } //Relying on a bug, is this safe? ModuleContainerPan pan = new ModuleContainerPan(32, 16, list2, new LinkedList<ModuleBase>(), null, 128, 128, 0, -64, 0, 1000); list.add(pan); list.add(new ModuleButton(120, 124, -1, "Scan Biome", this, TextureResources.buttonScan)); list.add(new ModulePower(16, 48, (IUniversalEnergy) sat)); return list; } @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean arg5) { SatelliteBase sat = DimensionManager.getInstance().getSatellite(this.getSatelliteId(stack)); SatelliteBiomeChanger mapping = null; if(sat instanceof SatelliteBiomeChanger) mapping = (SatelliteBiomeChanger)sat; if(!stack.hasTagCompound()) list.add("Unprogrammed"); else if(mapping == null) list.add("Satellite not yet launched"); else if(mapping.getDimensionId() == player.worldObj.provider.dimensionId) { list.add("Connected"); list.add("Selected Biome: " + BiomeGenBase.getBiome(mapping.getBiome()).biomeName); list.add("Num Biomes Scanned: " + mapping.discoveredBiomes().size()); } else list.add("Not Connected"); super.addInformation(stack, player, list, arg5); } @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { if(!world.isRemote) { SatelliteBase sat = DimensionManager.getInstance().getSatellite(this.getSatelliteId(stack)); if(sat != null) { if(player.isSneaking()) { if(getSatellite(stack ) != null) { //Make sure to update player so discoveredBiome Ids match PacketHandler.sendToPlayer(new PacketSatellite(getSatellite(stack )), player); player.openGui(LibVulpes.instance, GuiHandler.guiId.MODULARNOINV.ordinal(), world, -1, -1, 0); } return super.onItemRightClick(stack, world, player); } else { //Attempt to change biome sat.performAction(player, world, (int)player.posX, (int)player.posY, (int)player.posZ); } } } return super.onItemRightClick(stack, world, player); } private int getBiomeId(ItemStack stack) { SatelliteBase sat = getSatellite(stack); if(sat != null && sat instanceof SatelliteBiomeChanger) return ((SatelliteBiomeChanger)sat).getBiome(); else return -1; } private void setBiomeId(ItemStack stack, int id) { if(BiomeGenBase.getBiome(id) != null) { SatelliteBase sat = getSatellite(stack); if(sat != null && sat instanceof SatelliteBiomeChanger) { ((SatelliteBiomeChanger)sat).setBiome(id); } } } @Override public String getModularInventoryName() { return "item.biomeChanger.name"; } @Override public boolean canInteractWithContainer(EntityPlayer entity) { return true; } @Override @SideOnly(Side.CLIENT) public void onInventoryButtonPressed(int buttonId) { ItemStack stack = Minecraft.getMinecraft().thePlayer.getHeldItem(); if(stack != null && stack.getItem() == this) { setBiomeId(stack, buttonId); PacketHandler.sendToServer(new PacketItemModifcation(this, Minecraft.getMinecraft().thePlayer, (byte)0)); } } @Override public void writeDataToNetwork(ByteBuf out, byte id, ItemStack stack) { if(id == 0) { out.writeInt(getBiomeId(stack)); } } @Override public void readDataFromNetwork(ByteBuf in, byte packetId, NBTTagCompound nbt, ItemStack stack) { if(packetId == 0) { nbt.setInteger("biome", in.readInt()); } } @Override public void useNetworkData(EntityPlayer player, Side side, byte id, NBTTagCompound nbt, ItemStack stack) { if(id == 0) { int biomeId = nbt.getInteger("biome"); //If -1 then discover current biome if(biomeId == -1) { ((SatelliteBiomeChanger)getSatellite(stack)).addBiome(player.worldObj.getBiomeGenForCoords((int)player.posX, (int)player.posZ).biomeID); } else setBiomeId(stack, biomeId); player.closeScreen(); } } }