package mcjty.rftools.blocks.environmental; import mcjty.lib.base.StyleConfig; import mcjty.lib.container.GenericGuiContainer; import mcjty.lib.gui.Window; import mcjty.lib.gui.events.ButtonEvent; import mcjty.lib.gui.events.ChoiceEvent; import mcjty.lib.gui.events.TextEvent; import mcjty.lib.gui.events.ValueEvent; import mcjty.lib.gui.layout.HorizontalAlignment; import mcjty.lib.gui.layout.HorizontalLayout; import mcjty.lib.gui.layout.PositionalLayout; import mcjty.lib.gui.widgets.Button; import mcjty.lib.gui.widgets.*; import mcjty.lib.gui.widgets.Label; import mcjty.lib.gui.widgets.Panel; import mcjty.lib.gui.widgets.TextField; import mcjty.lib.network.Argument; import mcjty.rftools.RFTools; import mcjty.rftools.blocks.RedstoneMode; import mcjty.rftools.blocks.teleporter.PacketGetPlayers; import mcjty.rftools.blocks.teleporter.PlayerName; import mcjty.rftools.network.RFToolsMessages; import net.minecraft.util.ResourceLocation; import org.lwjgl.input.Keyboard; import java.awt.*; import java.util.*; import java.util.List; public class GuiEnvironmentalController extends GenericGuiContainer<EnvironmentalControllerTileEntity> { public static final int ENV_WIDTH = 194; public static final int ENV_HEIGHT = 224; public static final String MODE_BLACKLIST = "BL"; public static final String MODE_WHITELIST = "WL"; private static final ResourceLocation iconLocation = new ResourceLocation(RFTools.MODID, "textures/gui/environmentalcontroller.png"); private static final ResourceLocation iconGuiElements = new ResourceLocation(RFTools.MODID, "textures/gui/guielements.png"); // A copy of the players we're currently showing. private List<String> players = null; private int listDirty = 0; private static Set<String> fromServer_players = new HashSet<String>(); public static void storePlayersForClient(java.util.List<PlayerName> players) { Set<String> p = new HashSet<String>(); for (PlayerName n : players) { p.add(n.getName()); } fromServer_players = p; } private Panel toplevel; private TextField minyTextField; private TextField maxyTextField; private TextField nameField; private ImageChoiceLabel redstoneMode; private WidgetList playersList; private Button addButton; private Button delButton; public GuiEnvironmentalController(EnvironmentalControllerTileEntity environmentalControllerTileEntity, EnvironmentalControllerContainer container) { super(RFTools.instance, RFToolsMessages.INSTANCE, environmentalControllerTileEntity, container, RFTools.GUI_MANUAL_MAIN, "envctrl"); xSize = ENV_WIDTH; ySize = ENV_HEIGHT; } @Override public void initGui() { super.initGui(); toplevel = new Panel(mc, this).setBackground(iconLocation).setLayout(new PositionalLayout()); int r = tileEntity.getRadius(); if (r < 5) { r = 5; } else if (r > 100) { r = 100; } int miny = tileEntity.getMiny(); int maxy = tileEntity.getMaxy(); Panel radiusPanel = new Panel(mc, this).setLayout(new HorizontalLayout()).setLayoutHint(new PositionalLayout.PositionalHint(25, 6, ENV_WIDTH - 30, 16)); ScrollableLabel radius = new ScrollableLabel(mc, this).setRealMinimum(5).setRealMaximum(100).setRealValue(r).setDesiredWidth(24).addValueEvent(new ValueEvent() { @Override public void valueChanged(Widget parent, int newValue) { sendServerCommand(RFToolsMessages.INSTANCE, EnvironmentalControllerTileEntity.CMD_SETRADIUS, new Argument("radius", newValue)); } }); Slider slider = new Slider(mc, this).setHorizontal().setScrollable(radius).setMinimumKnobSize(12); radiusPanel.addChild(new Label(mc, this).setText("Radius:")).addChild(slider).addChild(radius); Panel minPanel = new Panel(mc, this).setLayout(new HorizontalLayout()).setLayoutHint(new PositionalLayout.PositionalHint(25, 24, ENV_WIDTH - 30, 16)); minyTextField = new TextField(mc, this).setText(Integer.toString(miny)).addTextEvent(new TextEvent() { @Override public void textChanged(Widget parent, String newText) { sendBounds(true); } }); maxyTextField = new TextField(mc, this).setText(Integer.toString(maxy)).addTextEvent(new TextEvent() { @Override public void textChanged(Widget parent, String newText) { sendBounds(false); } }); minPanel.addChild(new Label(mc, this).setText("Height:")).addChild(minyTextField).addChild(maxyTextField); playersList = new WidgetList(mc, this); Slider playerSlider = new Slider(mc, this).setDesiredWidth(11).setVertical().setScrollable(playersList); Panel playersPanel = new Panel(mc, this) .setLayoutHint(new PositionalLayout.PositionalHint(25, 42, ENV_WIDTH - 30, 72)) .setLayout(new HorizontalLayout().setSpacing(1).setHorizontalMargin(3)).addChild(playersList).addChild(playerSlider); Panel controlPanel = new Panel(mc, this) .setLayoutHint(new PositionalLayout.PositionalHint(25, 118, ENV_WIDTH - 30, 16)) .setLayout(new HorizontalLayout().setHorizontalMargin(1).setVerticalMargin(0).setSpacing(1)); ChoiceLabel blacklist = new ChoiceLabel(mc, this).addChoices(MODE_BLACKLIST, MODE_WHITELIST) .setDesiredWidth(30) .setDesiredHeight(15) .setChoiceTooltip(MODE_BLACKLIST, "Players in the list above will not get the effects") .setChoiceTooltip(MODE_WHITELIST, "Players in the list above will get the effects") .addChoiceEvent(new ChoiceEvent() { @Override public void choiceChanged(Widget parent, String newChoice) { changeBlacklistMode(newChoice); } }); if (tileEntity.isWhitelistMode()) { blacklist.setChoice(MODE_WHITELIST); } else { blacklist.setChoice(MODE_BLACKLIST); } addButton = new Button(mc, this).setText("+").setDesiredHeight(15).setTooltips("Add a player to the list").addButtonEvent(new ButtonEvent() { @Override public void buttonClicked(Widget parent) { addPlayer(); } }); delButton = new Button(mc, this).setText("-").setDesiredHeight(15).setTooltips("Remove selected player from the list").addButtonEvent(new ButtonEvent() { @Override public void buttonClicked(Widget parent) { delPlayer(); } }); nameField = new TextField(mc, this); initRedstoneMode(); controlPanel.addChild(blacklist).addChild(addButton).addChild(delButton).addChild(nameField).addChild(redstoneMode); toplevel.addChild(radiusPanel).addChild(minPanel).addChild(playersPanel).addChild(controlPanel); toplevel.setBounds(new Rectangle(guiLeft, guiTop, xSize, ySize)); window = new Window(this, toplevel); Keyboard.enableRepeatEvents(true); listDirty = 0; requestPlayers(); } private void initRedstoneMode() { redstoneMode = new ImageChoiceLabel(mc, this). setDesiredHeight(16). setDesiredWidth(16). addChoiceEvent(new ChoiceEvent() { @Override public void choiceChanged(Widget parent, String newChoice) { changeRedstoneMode(); } }). addChoice(RedstoneMode.REDSTONE_IGNORED.getDescription(), "Redstone mode:\nIgnored", iconGuiElements, 0, 0). addChoice(RedstoneMode.REDSTONE_OFFREQUIRED.getDescription(), "Redstone mode:\nOff to activate", iconGuiElements, 16, 0). addChoice(RedstoneMode.REDSTONE_ONREQUIRED.getDescription(), "Redstone mode:\nOn to activate", iconGuiElements, 32, 0); redstoneMode.setCurrentChoice(tileEntity.getRedstoneMode().ordinal()); } private void changeBlacklistMode(String newAccess) { sendServerCommand(RFToolsMessages.INSTANCE, EnvironmentalControllerTileEntity.CMD_SETBLACKLIST, new Argument("blacklist", MODE_BLACKLIST.equals(newAccess))); } private void changeRedstoneMode() { tileEntity.setRedstoneMode(RedstoneMode.values()[redstoneMode.getCurrentChoiceIndex()]); sendServerCommand(RFToolsMessages.INSTANCE, EnvironmentalControllerTileEntity.CMD_RSMODE, new Argument("rs", RedstoneMode.values()[redstoneMode.getCurrentChoiceIndex()].getDescription())); } private void addPlayer() { sendServerCommand(RFToolsMessages.INSTANCE, EnvironmentalControllerTileEntity.CMD_ADDPLAYER, new Argument("player", nameField.getText())); listDirty = 0; } private void delPlayer() { sendServerCommand(RFToolsMessages.INSTANCE, EnvironmentalControllerTileEntity.CMD_DELPLAYER, new Argument("player", players.get(playersList.getSelected()))); listDirty = 0; } private void requestPlayers() { RFToolsMessages.INSTANCE.sendToServer(new PacketGetPlayers(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord, EnvironmentalControllerTileEntity.CMD_GETPLAYERS, EnvironmentalControllerTileEntity.CLIENTCMD_GETPLAYERS)); } private void populatePlayers() { List<String> newPlayers = new ArrayList<String>(fromServer_players); Collections.sort(newPlayers); if (newPlayers.equals(playersList)) { return; } players = new ArrayList<String>(newPlayers); playersList.removeChildren(); for (String player : players) { playersList.addChild(new Label(mc, this).setText(player).setColor(StyleConfig.colorTextInListNormal).setHorizontalAlignment(HorizontalAlignment.ALIGH_LEFT)); } } private void requestListsIfNeeded() { listDirty--; if (listDirty <= 0) { requestPlayers(); listDirty = 20; } } private void sendBounds(boolean minchanged) { int miny; int maxy; try { miny = Integer.parseInt(minyTextField.getText()); } catch (NumberFormatException e) { miny = 0; } try { maxy = Integer.parseInt(maxyTextField.getText()); } catch (NumberFormatException e) { maxy = 0; } if (minchanged) { if (miny > maxy) { maxy = miny; maxyTextField.setText(Integer.toString(maxy)); } } else { if (miny > maxy) { miny = maxy; minyTextField.setText(Integer.toString(miny)); } } sendServerCommand(RFToolsMessages.INSTANCE, EnvironmentalControllerTileEntity.CMD_SETBOUNDS, new Argument("miny", miny), new Argument("maxy", maxy)); } @Override protected void drawGuiContainerBackgroundLayer(float v, int i, int i2) { requestListsIfNeeded(); populatePlayers(); enableButtons(); drawWindow(); } private void enableButtons() { int isPlayerSelected = playersList.getSelected(); delButton.setEnabled(isPlayerSelected != -1); String name = nameField.getText(); addButton.setEnabled(name != null && !name.isEmpty()); } }