package advancedsystemsmanager.client.gui; import advancedsystemsmanager.containers.ContainerRelay; import advancedsystemsmanager.helpers.CollisionHelper; import advancedsystemsmanager.network.ASMPacket; import advancedsystemsmanager.network.PacketHandler; import advancedsystemsmanager.reference.Names; import advancedsystemsmanager.tileentities.TileEntityRelay; import advancedsystemsmanager.util.UserPermission; import com.mojang.authlib.GameProfile; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; import java.util.ArrayList; import java.util.List; @SideOnly(Side.CLIENT) public class GuiRelay extends GuiBase { private static final ResourceLocation TEXTURE = registerTexture("Relay"); private static final int LIST_POS_X = 12; private static final int LIST_POS_Y = 14; private static final int LIST_TEXT_POS_X = 3; private static final int LIST_TEXT_POS_Y = 4; private static final int LIST_MENU_HEIGHT = 12; private static final int LIST_MENU_WIDTH = 95; private static final int INFO_SIZE = 7; private static final int INFO_MARGIN_X = 1; private static final int INFO_MARGIN_Y = 2; private static final int NO_ACCESS_TEXT_Y = 30; private static final int INFO_BOX_POS_X = 122; private static final int INFO_BOX_POS_Y = 109; private static final int INFO_BOX_NAME_X = 5; private static final int INFO_BOX_NAME_Y = 5; private static final int INFO_BOX_INFO_X = 5; private static final int INFO_BOX_INFO_Y = 16; private static final int INFO_MARGIN_INFO_Y = 3; private static final int INFO_TEXT_X = 6; private static final int INFO_TEXT_Y = 1; private static final int INFO_BOX_FULL_TEXT_X = 5; private static final int INFO_BOX_FULL_TEXT_Y = 5; private static final int INFO_BOX_FULL_TEXT_W = 85; private static final int BUTTON_WIDTH = 47; private static final int BUTTON_HEIGHT = 11; private static final int BUTTON_TEXT_Y = 4; private static final int BUTTON_AREA_X = 121; private static final int BUTTON_AREA_Y = 13; private static final int BUTTON_AREA_WIDTH = 97; private static final int BUTTON_X_LEFT = BUTTON_AREA_X; private static final int BUTTON_X_MIDDLE = BUTTON_X_LEFT + (BUTTON_AREA_WIDTH - BUTTON_WIDTH) / 2; private static final int BUTTON_X_RIGHT = BUTTON_X_LEFT + BUTTON_AREA_WIDTH - BUTTON_WIDTH; private static final int BUTTON_Y_TOP = 45; private static final int BUTTON_Y_MIDDLE = 60; private static final int BUTTON_Y_BOT = 75; private static final int BUTTON_Y_DOWN = 64; private static final int BUTTON_Y_FURTHER_DOWN = 77; private static final int BUTTON_Y_FAR_BOT = 90; private static final int PERMISSIONS_PER_PAGE = 11; private static final int PAGE_Y = 149; private static final int PAGE_BUTTON_SIZE = 7; private static final int PAGE_BUTTON_DISTANCE = 40; private static final int PAGE_BUTTON_X_LEFT = LIST_POS_X + (LIST_MENU_WIDTH - PAGE_BUTTON_DISTANCE) / 2 - PAGE_BUTTON_SIZE; private static final int PAGE_BUTTON_X_RIGHT = LIST_POS_X + (LIST_MENU_WIDTH + PAGE_BUTTON_DISTANCE) / 2; private static final int PAGE_BUTTON_Y = 147; private TileEntityRelay relay; private List<Button> buttons = new ArrayList<Button>(); private int currentPage; private int selectedPermission = -1; private UserPermission cachedPermission; private boolean hasCachedPermission; public GuiRelay(final TileEntityRelay relay, InventoryPlayer player) { super(new ContainerRelay(relay, player)); xSize = 229; ySize = 158; this.relay = relay; buttons.add(new Button(Names.GIVE_PERMISSION, BUTTON_X_LEFT, BUTTON_Y_DOWN) { @Override public boolean isVisible() { return getSelectedPermission() == -1; } @Override public boolean isEnabled() { return getUserPermission() == null; } @Override public void onClick() { if (relay.getPermissions().size() < TileEntityRelay.PERMISSION_MAX_LENGTH) { relay.getPermissions().add(new UserPermission(getUser())); addUser(); } } }); buttons.add(new Button(Names.REVOKE_PERMISSION, BUTTON_X_RIGHT, BUTTON_Y_DOWN) { @Override public boolean isVisible() { return getSelectedPermission() == -1; } @Override public boolean isEnabled() { return getUserPermission() != null; } @Override public void onClick() { removeUser(); } }); buttons.add(new Button(Names.ACTIVATE_USER, BUTTON_X_LEFT, BUTTON_Y_TOP) { @Override public boolean isVisible() { return getSelectedPermission() != -1 && isOp(getUserPermission(), true); } @Override public boolean isEnabled() { return !relay.getPermissions().get(getSelectedPermission()).isActive(); } @Override public void onClick() { relay.getPermissions().get(getSelectedPermission()).setActive(true); updateUser(getSelectedPermission()); } }); buttons.add(new Button(Names.DEACTIVATE_USER, BUTTON_X_RIGHT, BUTTON_Y_TOP) { @Override public boolean isVisible() { return getSelectedPermission() != -1 && isOp(getUserPermission(), true); } @Override public boolean isEnabled() { return relay.getPermissions().get(getSelectedPermission()).isActive(); } @Override public void onClick() { relay.getPermissions().get(getSelectedPermission()).setActive(false); updateUser(getSelectedPermission()); } }); buttons.add(new Button(Names.DELETE_USER, BUTTON_X_MIDDLE, BUTTON_Y_BOT) { @Override public boolean isVisible() { return getSelectedPermission() != -1 && isOp(getUserPermission(), true); } @Override public boolean isEnabled() { return true; } @Override public void onClick() { removeUser(getSelectedPermission()); selectedPermission = -1; } }); buttons.add(new Button(Names.MAKE_EDITOR, BUTTON_X_LEFT, BUTTON_Y_MIDDLE) { @Override public boolean isVisible() { return getSelectedPermission() != -1 && isOwner(getUserPermission(), true) && !isOwner(relay.getPermissions().get(getSelectedPermission()), false); } @Override public boolean isEnabled() { return !relay.getPermissions().get(getSelectedPermission()).isOp(); } @Override public void onClick() { relay.getPermissions().get(getSelectedPermission()).setOp(true); updateUser(getSelectedPermission()); } }); buttons.add(new Button(Names.REMOVE_EDITOR, BUTTON_X_RIGHT, BUTTON_Y_MIDDLE) { @Override public boolean isVisible() { return getSelectedPermission() != -1 && isOwner(getUserPermission(), true) && !isOwner(relay.getPermissions().get(getSelectedPermission()), false); } @Override public boolean isEnabled() { return relay.getPermissions().get(getSelectedPermission()).isOp(); } @Override public void onClick() { relay.getPermissions().get(getSelectedPermission()).setOp(false); updateUser(getSelectedPermission()); } }); buttons.add(new Button(Names.SHOW_LIST_TO_ALL, BUTTON_X_LEFT, BUTTON_Y_FURTHER_DOWN) { @Override public boolean isVisible() { return getSelectedPermission() == -1 && isOp(getUserPermission(), true); } @Override public boolean isEnabled() { return relay.doesListRequireOp(); } @Override public void onClick() { relay.setListRequireOp(false); updateGlobalSettings(); } }); buttons.add(new Button(Names.SHOW_TO_EDITORS, BUTTON_X_RIGHT, BUTTON_Y_FURTHER_DOWN) { @Override public boolean isVisible() { return getSelectedPermission() == -1 && isOp(getUserPermission(), true); } @Override public boolean isEnabled() { return !relay.doesListRequireOp(); } @Override public void onClick() { relay.setListRequireOp(true); updateGlobalSettings(); } }); buttons.add(new Button(Names.ENABLE_CREATIVE_MODE, BUTTON_X_LEFT, BUTTON_Y_FAR_BOT) { @Override public boolean isVisible() { return getSelectedPermission() == -1 && isOp(getUserPermission(), true) && (Minecraft.getMinecraft().playerController.isInCreativeMode() || relay.isCreativeMode()); } @Override public boolean isEnabled() { return !relay.isCreativeMode(); } @Override public void onClick() { relay.setCreativeMode(true); updateGlobalSettings(); } }); buttons.add(new Button(Names.DISABLE_CREATIVE_MODE, BUTTON_X_RIGHT, BUTTON_Y_FAR_BOT) { @Override public boolean isVisible() { return getSelectedPermission() == -1 && isOp(getUserPermission(), true) && (Minecraft.getMinecraft().playerController.isInCreativeMode() || relay.isCreativeMode()); } @Override public boolean isEnabled() { return relay.isCreativeMode(); } @Override public void onClick() { relay.setCreativeMode(false); updateGlobalSettings(); } }); } @Override public ResourceLocation getComponentResource() { return TEXTURE; } private int getSelectedPermission() { if (selectedPermission < 0 || selectedPermission >= relay.getPermissions().size() || (relay.doesListRequireOp() && !isOp(getUserPermission(), true))) { return selectedPermission = -1; } else { return selectedPermission; } } @Override protected void drawGuiBackground(float partialTick, int mX, int mY) { hasCachedPermission = false; GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); bindTexture(TEXTURE); drawTexture(0, 0, 0, 0, xSize, ySize); mX -= guiLeft; mY -= guiTop; UserPermission player = getUserPermission(); UserPermission selected = getSelectedPermission() == -1 ? null : relay.getPermissions().get(getSelectedPermission()); if (!relay.doesListRequireOp() || isOp(player, true)) { int start = getStartId(); for (int i = start; i <= getEndId(); i++) { UserPermission permission = relay.getPermissions().get(i); int x = LIST_POS_X; int y = LIST_POS_Y + (i - start) * LIST_MENU_HEIGHT; int srcXMenu = getSelectedPermission() == i ? 1 : 0; int srcYMenu = CollisionHelper.inBounds(x, y, LIST_MENU_WIDTH, LIST_MENU_HEIGHT, mX, mY) ? 1 : 0; drawTexture(x, y, srcXMenu * LIST_MENU_WIDTH, ySize + srcYMenu * LIST_MENU_HEIGHT, LIST_MENU_WIDTH, LIST_MENU_HEIGHT); for (int j = 0; j < 2; j++) { renderInfoBox(j, permission, x + LIST_MENU_WIDTH - (1 + j) * (INFO_SIZE + INFO_MARGIN_X), y + INFO_MARGIN_Y); } drawString(permission.getUser().getName(), x + LIST_TEXT_POS_X, y + LIST_TEXT_POS_Y, 0.7F, 0xEEEEEE); } if (getPageCount() > 1) { drawCenteredString(Names.PAGE + " " + (currentPage + 1) + " " + Names.OF + " " + getPageCount(), LIST_POS_X, PAGE_Y, 0.6F, LIST_MENU_WIDTH, 0x404040); for (int i = 0; i < 2; i++) { int x = i == 0 ? PAGE_BUTTON_X_LEFT : PAGE_BUTTON_X_RIGHT; int y = PAGE_BUTTON_Y; int srcXButton = i; int srcYButton = CollisionHelper.inBounds(x, y, PAGE_BUTTON_SIZE, PAGE_BUTTON_SIZE, mX, mY) ? 1 : 0; drawTexture(x, y, srcXButton * PAGE_BUTTON_SIZE, ySize + LIST_MENU_HEIGHT * 2 + INFO_SIZE + BUTTON_HEIGHT * 3 + srcYButton * PAGE_BUTTON_SIZE, PAGE_BUTTON_SIZE, PAGE_BUTTON_SIZE); } } } else { drawCenteredString(Names.NO_ACCESS, LIST_POS_X, LIST_POS_Y + NO_ACCESS_TEXT_Y, 1F, LIST_MENU_WIDTH, 0x804040); } UserPermission info = relay.doesListRequireOp() && !isOp(player, true) ? player : selected; if (info != null) { drawString(info.getUser().getName(), INFO_BOX_POS_X + INFO_BOX_NAME_X, INFO_BOX_POS_Y + INFO_BOX_NAME_Y, 0.7F, 0x404040); for (int i = 0; i < 2; i++) { int x = INFO_BOX_POS_X + INFO_BOX_INFO_X; int y = INFO_BOX_POS_Y + INFO_BOX_INFO_Y + i * (INFO_SIZE + INFO_MARGIN_INFO_Y); renderInfoBox(i, info, x, y); drawInfoBoxString(i, info, x + INFO_SIZE + INFO_TEXT_X, y + INFO_TEXT_Y); } } else { String str; if (isOp(player, true)) { str = Names.EDITOR_DESCRIPTION_SHORT; } else { str = Names.USER_DESCRIPTION_SHORT; } drawSplitString(str, INFO_BOX_POS_X + INFO_BOX_FULL_TEXT_X, INFO_BOX_POS_Y + INFO_BOX_FULL_TEXT_Y, INFO_BOX_FULL_TEXT_W, 0.7F, 0x404040); } for (Button button : buttons) { if (button.isVisible()) { int textureId = button.isEnabled() ? CollisionHelper.inBounds(button.x, button.y, BUTTON_WIDTH, BUTTON_HEIGHT, mX, mY) ? 2 : 1 : 0; drawTexture(button.x, button.y, 0, ySize + LIST_MENU_HEIGHT * 2 + INFO_SIZE + BUTTON_HEIGHT * textureId, BUTTON_WIDTH, BUTTON_HEIGHT); drawCenteredString(button.name, button.x, button.y + BUTTON_TEXT_Y, 0.4F, BUTTON_WIDTH, button.isEnabled() ? 0x404040 : 0x808080); } } String message = null; if (getSelectedPermission() == -1) { message = Names.USER_DESCRIPTION_LONG; } else if (isOp(getUserPermission(), true)) { message = Names.EDITOR_DESCRIPTION_LONG; } if (message != null) { drawSplitString(message, BUTTON_AREA_X, BUTTON_AREA_Y, BUTTON_AREA_WIDTH, 0.6F, 0x404040); } } @Override protected void mouseClicked(int mX, int mY, int b) { mX = scaleX(mX); mY = scaleY(mY); super.mouseClicked(mX, mY, b); mX -= guiLeft; mY -= guiTop; UserPermission player = getUserPermission(); if (!relay.doesListRequireOp() || isOp(player, true)) { int start = getStartId(); for (int i = start; i <= getEndId(); i++) { // UserPermission permission = relay.getPermissions().get(i); int x = LIST_POS_X; int y = LIST_POS_Y + (i - start) * LIST_MENU_HEIGHT; if (CollisionHelper.inBounds(x, y, LIST_MENU_WIDTH, LIST_MENU_HEIGHT, mX, mY)) { if (getSelectedPermission() == i) { selectedPermission = -1; } else { selectedPermission = i; } break; } } if (getPageCount() > 1) { for (int i = -1; i <= 1; i += 2) { int x = i == -1 ? PAGE_BUTTON_X_LEFT : PAGE_BUTTON_X_RIGHT; int y = PAGE_BUTTON_Y; if (CollisionHelper.inBounds(x, y, PAGE_BUTTON_SIZE, PAGE_BUTTON_SIZE, mX, mY)) { currentPage += i; if (currentPage < 0) { currentPage = getPageCount() - 1; } else if (currentPage == getPageCount()) { currentPage = 0; } break; } } } } for (Button button : buttons) { if (button.isVisible() && button.isEnabled() && CollisionHelper.inBounds(button.x, button.y, BUTTON_WIDTH, BUTTON_HEIGHT, mX, mY)) { button.onClick(); break; } } } private int getStartId() { int maxPageId = getPageCount(); if (currentPage >= maxPageId) { currentPage = maxPageId - 1; } return currentPage * PERMISSIONS_PER_PAGE; } private int getPageCount() { return (relay.getPermissions().size() - 1) / PERMISSIONS_PER_PAGE + 1; } private int getEndId() { return Math.min(getStartId() + PERMISSIONS_PER_PAGE, relay.getPermissions().size()) - 1; } private void renderInfoBox(int id, UserPermission permission, int x, int y) { int textureId = id == 0 ? isOwner(permission, false) ? 5 : isOp(permission, false) ? 4 : 3 : permission.isActive() ? relay.isCreativeMode() ? 2 : 1 : 0; drawTexture(x, y, textureId * INFO_SIZE, ySize + LIST_MENU_HEIGHT * 2, INFO_SIZE, INFO_SIZE); } private void drawInfoBoxString(int id, UserPermission permission, int x, int y) { String str = id == 0 ? isOwner(permission, false) ? Names.PERMISSION_OWNER : isOp(permission, false) ? Names.PERMISSION_EDITOR : Names.PERMISSION_USER : relay.isCreativeMode() ? permission.isActive() ? Names.PERMISSION_RESTRICTED : Names.PERMISSION_CREATIVE : permission.isActive() ? Names.PERMISSION_INVENTORY : Names.PERMISSION_DENIED; drawString(str, x, y, 0.7F, 0x404040); } private boolean isOwner(UserPermission permission, boolean viewer) { return (permission != null && permission.getUser().equals(relay.getOwner())) || (viewer && getUser().equals(relay.getOwner())); } private boolean isOp(UserPermission permission, boolean viewer) { return isOwner(permission, viewer) || (permission != null && permission.isOp()); } private GameProfile getUser() { return Minecraft.getMinecraft().thePlayer.getGameProfile(); } private UserPermission getUserPermission() { if (hasCachedPermission) { return cachedPermission; } else { hasCachedPermission = true; cachedPermission = null; } for (UserPermission permission : relay.getPermissions()) { if (permission.getUser().equals(getUser())) { cachedPermission = permission; break; } } return cachedPermission; } private void removeUser(int id) { ASMPacket dw = PacketHandler.getServerPacket(); dw.writeBoolean(true); //user data dw.writeBoolean(false); //existing dw.writeVarIntToBuffer(id); dw.writeBoolean(true); //deleted dw.sendServerPacket(); } private void removeUser() { for (int i = 0; i < relay.getPermissions().size(); i++) { if (relay.getPermissions().get(i).getUser().equals(getUser())) { removeUser(i); break; } } } private void updateGlobalSettings() { ASMPacket dw = PacketHandler.getServerPacket(); dw.writeBoolean(false); //no user data dw.writeBoolean(relay.isCreativeMode()); dw.writeBoolean(relay.doesListRequireOp()); dw.sendServerPacket(); } private void addUser() { ASMPacket dw = PacketHandler.getServerPacket(); dw.writeBoolean(true); //user data dw.writeBoolean(true); //added GameProfile user = getUser(); dw.writeStringToBuffer(user.getName()); dw.writeUUID(user.getId()); dw.sendServerPacket(); } private void updateUser(int id) { UserPermission permission = relay.getPermissions().get(id); ASMPacket dw = PacketHandler.getServerPacket(); dw.writeBoolean(true); //user data dw.writeBoolean(false); //existing dw.writeVarIntToBuffer(id); dw.writeBoolean(false); //update dw.writeBoolean(permission.isActive()); dw.writeBoolean(permission.isOp()); dw.sendServerPacket(); } private abstract class Button { private String name; private int x, y; protected Button(String name, int x, int y) { this.name = name; this.x = x; this.y = y; } public abstract boolean isVisible(); public abstract boolean isEnabled(); public abstract void onClick(); } }