package mcjty.rftools.blocks.dimlets; import mcjty.lib.container.GenericGuiContainer; import mcjty.lib.gui.Window; import mcjty.lib.gui.events.ButtonEvent; import mcjty.lib.gui.events.TextEvent; import mcjty.lib.gui.layout.PositionalLayout; import mcjty.lib.gui.widgets.Button; import mcjty.lib.gui.widgets.Label; import mcjty.lib.gui.widgets.Panel; import mcjty.lib.gui.widgets.TextField; import mcjty.lib.gui.widgets.*; import mcjty.lib.network.Argument; import mcjty.lib.varia.Counter; import mcjty.lib.varia.Logging; import mcjty.rftools.RFTools; import mcjty.rftools.dimension.world.types.ControllerType; import mcjty.rftools.dimension.world.types.FeatureType; import mcjty.rftools.dimension.world.types.SpecialType; import mcjty.rftools.dimension.world.types.TerrainType; import mcjty.rftools.items.dimlets.DimletKey; import mcjty.rftools.items.dimlets.DimletObjectMapping; import mcjty.rftools.items.dimlets.DimletType; import mcjty.rftools.items.dimlets.KnownDimletConfiguration; import mcjty.rftools.network.RFToolsMessages; import net.minecraft.client.Minecraft; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; import java.awt.*; import java.util.ArrayList; import java.util.List; import java.util.Map; public class GuiDimensionEnscriber extends GenericGuiContainer<DimensionEnscriberTileEntity> { public static final int ENSCRIBER_WIDTH = 256; public static final int ENSCRIBER_HEIGHT = 224; private Button extractButton; private Button storeButton; private TextField nameField; private Label validateField; private static final ResourceLocation iconLocation = new ResourceLocation(RFTools.MODID, "textures/gui/dimensionenscriber.png"); public GuiDimensionEnscriber(DimensionEnscriberTileEntity dimensionEnscriberTileEntity, DimensionEnscriberContainer container) { super(RFTools.instance, RFToolsMessages.INSTANCE, dimensionEnscriberTileEntity, container, RFTools.GUI_MANUAL_DIMENSION, "enscriber"); xSize = ENSCRIBER_WIDTH; ySize = ENSCRIBER_HEIGHT; } @Override public void initGui() { super.initGui(); extractButton = new Button(mc, this).setText("Extract").setLayoutHint(new PositionalLayout.PositionalHint(13, 164, 60, 16)).addButtonEvent( new ButtonEvent() { @Override public void buttonClicked(Widget parent) { extractDimlets(); } } ).setTooltips("Extract the dimlets out of", "a realized dimension tab"); storeButton = new Button(mc, this).setText("Store").setLayoutHint(new PositionalLayout.PositionalHint(13, 182, 60, 16)).addButtonEvent( new ButtonEvent() { @Override public void buttonClicked(Widget parent) { storeDimlets(); } } ).setTooltips("Store dimlets in a", "empty dimension tab"); nameField = new TextField(mc, this).addTextEvent(new TextEvent() { @Override public void textChanged(Widget parent, String newText) { storeName(newText); } }).setLayoutHint(new PositionalLayout.PositionalHint(13, 200, 60, 16)); validateField = new Label(mc, this).setText("Val"); validateField.setTooltips("Hover here for errors..."); validateField.setLayoutHint(new PositionalLayout.PositionalHint(35, 142, 38, 16)); setNameFromDimensionTab(); Widget toplevel = new Panel(mc, this).setBackground(iconLocation).setLayout(new PositionalLayout()).addChild(extractButton).addChild(storeButton). addChild(nameField).addChild(validateField); toplevel.setBounds(new Rectangle(guiLeft, guiTop, xSize, ySize)); window = new Window(this, toplevel); } private void storeName(String name) { sendServerCommand(RFToolsMessages.INSTANCE, DimensionEnscriberTileEntity.CMD_SETNAME, new Argument("name", name)); } private void extractDimlets() { for (int i = 0 ; i < DimensionEnscriberContainer.SIZE_DIMLETS ; i++) { ItemStack stack = inventorySlots.getSlot(i + DimensionEnscriberContainer.SLOT_DIMLETS).getStack(); if (stack != null && stack.stackSize > 0) { // Cannot extract. There are still items in the way. Logging.warn(mc.thePlayer, "You cannot extract. Remove all dimlets first!"); return; } } sendServerCommand(RFToolsMessages.INSTANCE, DimensionEnscriberTileEntity.CMD_EXTRACT); } private void storeDimlets() { sendServerCommand(RFToolsMessages.INSTANCE, DimensionEnscriberTileEntity.CMD_STORE, new Argument("name", nameField.getText())); } private void enableButtons() { Slot slot = inventorySlots.getSlot(DimensionEnscriberContainer.SLOT_TAB); extractButton.setEnabled(false); storeButton.setEnabled(false); if (slot.getStack() != null) { if (slot.getStack().getItem() == DimletSetup.emptyDimensionTab) { storeButton.setEnabled(true); } else if (slot.getStack().getItem() == DimletSetup.realizedDimensionTab) { extractButton.setEnabled(true); } } } private List<DimletKey> extractModifiersForType(List<DimletKey> modifiers, DimletType type) { List<DimletKey> modifiersForType = new ArrayList<DimletKey>(); int i = 0; while (i < modifiers.size()) { DimletKey modifier = modifiers.get(i); if (type.dimletType.isModifiedBy(modifier.getType())) { modifiersForType.add(modifier); modifiers.remove(i); } else { i++; } } return modifiersForType; } private String shortenName(String name) { int idx = name.indexOf('_'); if (idx == -1) { return name; } else { return name.substring(idx+1); } } private void validateDimlets() { List<String> tooltips = new ArrayList<String>(); TerrainType terrainType = null; int cntTerrain = 0; int cntBiomes = 0; int cntController = 0; int cntOwner = 0; for (int i = DimensionEnscriberContainer.SLOT_DIMLETS ; i < DimensionEnscriberContainer.SLOT_TAB ; i++) { Slot slot = inventorySlots.getSlot(i); if (slot != null && slot.getStack() != null && slot.getStack().stackSize > 0) { ItemStack stack = slot.getStack(); DimletKey key = KnownDimletConfiguration.getDimletKey(stack, Minecraft.getMinecraft().theWorld); if (key.getType() == DimletType.DIMLET_TERRAIN) { cntTerrain++; terrainType = DimletObjectMapping.idToTerrainType.get(key); } else if (key.getType() == DimletType.DIMLET_BIOME) { cntBiomes++; } else if (key.getType() == DimletType.DIMLET_CONTROLLER) { cntController++; } else if (key.getType() == DimletType.DIMLET_SPECIAL && DimletObjectMapping.idToSpecialType.get(key) == SpecialType.SPECIAL_OWNER) { cntOwner++; } } } if (cntOwner > 1) { tooltips.add("Using more then one owner dimlet is not useful!"); } if (DimletConfiguration.ownerDimletsNeeded && cntOwner != 1) { tooltips.add("You cannot make a dimension without an owner dimlet!"); storeButton.setEnabled(false); } if (cntTerrain > 1) { tooltips.add("Using more then one TERRAIN is not useful!"); terrainType = null; } if (cntController > 1) { tooltips.add("Using more then one CONTROLLER is not useful!"); } List<DimletKey> modifiers = new ArrayList<DimletKey>(); for (int i = DimensionEnscriberContainer.SLOT_DIMLETS ; i < DimensionEnscriberContainer.SLOT_TAB ; i++) { Slot slot = inventorySlots.getSlot(i); if (slot != null && slot.getStack() != null && slot.getStack().stackSize > 0) { ItemStack stack = slot.getStack(); DimletKey key = KnownDimletConfiguration.getDimletKey(stack, Minecraft.getMinecraft().theWorld); DimletType type = key.getType(); if (type.dimletType.isModifier()) { modifiers.add(key); } else { List<DimletKey> modifiersForType = extractModifiersForType(modifiers, type); if (type == DimletType.DIMLET_TERRAIN) { if (DimletObjectMapping.idToTerrainType.get(key) == TerrainType.TERRAIN_VOID && !modifiersForType.isEmpty()) { tooltips.add("VOID terrain cannot use modifiers"); } } else if (type == DimletType.DIMLET_FEATURE) { FeatureType featureType = DimletObjectMapping.idToFeatureType.get(key); Counter<DimletType> modifierAmountUsed = new Counter<DimletType>(); for (DimletKey modifier : modifiersForType) { modifierAmountUsed.increment(modifier.getType()); } for (Map.Entry<DimletType, Integer> entry : modifierAmountUsed.entrySet()) { Integer amountSupported = featureType.getSupportedModifierAmount(entry.getKey()); if (amountSupported == null) { tooltips.add(shortenName(featureType.name()) + " does not use " + shortenName(entry.getKey().name()) + " modifiers!"); } else if (amountSupported == 1 && entry.getValue() > 1) { tooltips.add(shortenName(featureType.name()) + " only needs one " + shortenName(entry.getKey().name()) + " modifier!"); } } if (terrainType == null && !featureType.supportsAllTerrains()) { tooltips.add(shortenName(featureType.name()) + " is possibly useless as it does not work on all terrains!"); } if (terrainType != null && !featureType.isTerrainSupported(terrainType)) { tooltips.add(shortenName(featureType.name()) + " does not work for terrain " + shortenName(terrainType.name()) + "!"); } } else if (type == DimletType.DIMLET_CONTROLLER) { ControllerType controllerType = DimletObjectMapping.idToControllerType.get(key); int neededBiomes = controllerType.getNeededBiomes(); if (neededBiomes != -1) { if (cntBiomes > neededBiomes) { tooltips.add("Too many biomes specified for " + shortenName(controllerType.name()) + "!"); } else if (cntBiomes < neededBiomes) { tooltips.add("Too few biomes specified for " + shortenName(controllerType.name()) + "!"); } } } } } } if (!modifiers.isEmpty()) { tooltips.add("There are dangling modifiers in this descriptor"); } boolean error = true; if (tooltips.isEmpty()) { tooltips.add("Everything appears to be alright"); error = false; } validateField.setTooltips(tooltips.toArray(new String[tooltips.size()])); validateField.setColor(error ? 0xFF0000 : 0x008800); validateField.setText(error ? "Warn" : "Ok"); } @Override protected void drawGuiContainerBackgroundLayer(float v, int i, int i2) { enableButtons(); validateDimlets(); if (tileEntity.hasTabSlotChangedAndClear()) { setNameFromDimensionTab(); } drawWindow(); } private void setNameFromDimensionTab() { Slot slot = inventorySlots.getSlot(DimensionEnscriberContainer.SLOT_TAB); if (slot.getStack() != null && slot.getStack().getItem() == DimletSetup.realizedDimensionTab) { NBTTagCompound tagCompound = slot.getStack().getTagCompound(); if (tagCompound != null) { String name = tagCompound.getString("name"); if (name != null) { nameField.setText(name); } } } } }