Skip to content

Commit 8c53452

Browse files
author
thraaawn
authored
Gui rework to use own widget based framework
Uffz, but this is bigger than it seems as it basically just cleans up the GuiMachine classes into separate widgets. It allows for much easier reasoning about the GUI and makes it a lot easier to add new functionality. But also touches some parts that might be crashy in regards to ConcurrentModificationExceptions. It should not happen, but I can't fully guarantee that. Needs a bit more testing. This PR also includes a fix for #388 and improvements for the compact skies world, where players are now teleported to their hub machine when returning to the overworld (this only works for newly claimed machines in the hub). New features are the ability to rename machines in the machine GUI and easier adding/removing of whitelist entries.
1 parent b05d98c commit 8c53452

File tree

60 files changed

+4088
-827
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+4088
-827
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.dave.compactmachines3.command;
2+
3+
import net.minecraft.entity.player.EntityPlayer;
4+
5+
public class CommandDebug extends CommandMenu {
6+
@Override
7+
public void initEntries() {
8+
this.addSubcommand(new CommandDebugSetHugeNBT());
9+
}
10+
11+
@Override
12+
public boolean isAllowed(EntityPlayer player, boolean creative, boolean isOp) {
13+
return isOp;
14+
}
15+
16+
@Override
17+
public String getName() {
18+
return "debug";
19+
}
20+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.dave.compactmachines3.command;
2+
3+
import net.minecraft.command.CommandException;
4+
import net.minecraft.command.ICommandSender;
5+
import net.minecraft.entity.player.EntityPlayerMP;
6+
import net.minecraft.item.ItemStack;
7+
import net.minecraft.nbt.NBTTagCompound;
8+
import net.minecraft.server.MinecraftServer;
9+
import net.minecraft.util.EnumHand;
10+
11+
import java.util.Arrays;
12+
13+
public class CommandDebugSetHugeNBT extends CommandBaseExt {
14+
@Override
15+
public String getName() {
16+
return "setHugeNBT";
17+
}
18+
19+
@Override
20+
public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
21+
if(!(sender.getCommandSenderEntity() instanceof EntityPlayerMP)) {
22+
return;
23+
}
24+
25+
EntityPlayerMP player = (EntityPlayerMP) sender.getCommandSenderEntity();
26+
ItemStack stack = player.getHeldItemMainhand().copy();
27+
NBTTagCompound newTag;
28+
if(stack.hasTagCompound()) {
29+
newTag = stack.getTagCompound();
30+
} else {
31+
newTag = new NBTTagCompound();
32+
}
33+
34+
// TODO: Make size configurable via arguments
35+
int fourmeg = 1024*1024*4;
36+
int limit = 2097152;
37+
byte[] hugeByteArray = new byte[fourmeg];
38+
Arrays.fill(hugeByteArray, (byte)255);
39+
newTag.setByteArray("debugHugeNBTTag", hugeByteArray);
40+
41+
stack.setTagCompound(newTag);
42+
43+
player.setHeldItem(EnumHand.MAIN_HAND, stack);
44+
}
45+
}

src/main/java/org/dave/compactmachines3/gui/GuiHandler.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import net.minecraftforge.fml.common.network.NetworkRegistry;
88
import org.dave.compactmachines3.CompactMachines3;
99
import org.dave.compactmachines3.gui.machine.GuiMachine;
10-
import org.dave.compactmachines3.gui.machine.GuiMachineAdmin;
1110
import org.dave.compactmachines3.gui.machine.GuiMachineContainer;
1211
import org.dave.compactmachines3.gui.psd.GuiPSDScreen;
1312
import org.dave.compactmachines3.gui.psd.Pages;
@@ -21,7 +20,7 @@ public static void init() {
2120
@Override
2221
public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
2322
if(ID == GuiIds.MACHINE_VIEW.ordinal() || ID == GuiIds.MACHINE_ADMIN.ordinal()) {
24-
return new GuiMachineContainer(world, new BlockPos(x, y, z));
23+
return new GuiMachineContainer(world, new BlockPos(x, y, z), player);
2524
}
2625

2726
return null;
@@ -34,9 +33,9 @@ public Object getClientGuiElement(int ID, EntityPlayer player, World world, int
3433
Pages.activePageOnClient = "welcome";
3534
return new GuiPSDScreen();
3635
} else if(ID == GuiIds.MACHINE_VIEW.ordinal()) {
37-
return new GuiMachine(world, new BlockPos(x, y, z));
36+
return new GuiMachine(new GuiMachineContainer(world, new BlockPos(x, y, z), player), false);
3837
} else if(ID == GuiIds.MACHINE_ADMIN.ordinal()) {
39-
return new GuiMachineAdmin(world, new BlockPos(x, y, z));
38+
return new GuiMachine(new GuiMachineContainer(world, new BlockPos(x, y, z), player), true);
4039
}
4140

4241
return null;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package org.dave.compactmachines3.gui.framework;
2+
3+
import java.util.ArrayList;
4+
5+
public class CircularPointedArrayList<E> extends ArrayList<E> {
6+
int pointer = 0;
7+
8+
public E getPointedElement() {
9+
return this.get(pointer);
10+
}
11+
12+
public E next() {
13+
this.pointer++;
14+
if(pointer >= this.size()) {
15+
pointer = 0;
16+
}
17+
18+
return getPointedElement();
19+
}
20+
21+
public E prev() {
22+
this.pointer--;
23+
if(pointer <= 0) {
24+
pointer = this.size()-1;
25+
}
26+
27+
return getPointedElement();
28+
}
29+
30+
public void setPointerTo(E element) {
31+
int position = this.indexOf(element);
32+
if(position == -1) {
33+
pointer = 0;
34+
} else {
35+
pointer = position;
36+
}
37+
}
38+
}
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package org.dave.compactmachines3.gui.framework;
2+
3+
import net.minecraft.client.gui.FontRenderer;
4+
import net.minecraft.client.gui.GuiScreen;
5+
import net.minecraft.client.renderer.GlStateManager;
6+
import net.minecraft.util.ResourceLocation;
7+
import net.minecraftforge.fml.client.config.GuiUtils;
8+
import org.dave.compactmachines3.CompactMachines3;
9+
import org.dave.compactmachines3.gui.framework.widgets.Widget;
10+
import org.dave.compactmachines3.gui.framework.widgets.WidgetPanel;
11+
12+
13+
public class GUI extends WidgetPanel {
14+
private static ResourceLocation tabIcons;
15+
16+
public boolean hasTabs = false;
17+
18+
public GUI(int x, int y, int width, int height) {
19+
this.setX(x);
20+
this.setY(y);
21+
this.setWidth(width);
22+
this.setHeight(height);
23+
24+
this.tabIcons = new ResourceLocation(CompactMachines3.MODID, "textures/gui/tabicons.png");
25+
}
26+
27+
public void drawGUI(GuiScreen screen) {
28+
this.setX((screen.width - this.width)/2);
29+
this.setY((screen.height - this.height)/2);
30+
31+
this.shiftAndDraw(screen);
32+
}
33+
34+
@Override
35+
public void drawBeforeShift(GuiScreen screen) {
36+
//screen.drawDefaultBackground();
37+
38+
super.drawBeforeShift(screen);
39+
}
40+
41+
@Override
42+
public void draw(GuiScreen screen) {
43+
drawWindow(screen);
44+
super.draw(screen);
45+
}
46+
47+
protected void drawWindow(GuiScreen screen) {
48+
GlStateManager.disableLighting();
49+
50+
GlStateManager.color(1f, 1f, 1f, 1f);
51+
screen.mc.renderEngine.bindTexture(tabIcons);
52+
53+
float offsetX = 0.0f;
54+
float offsetY = 0.0f;
55+
56+
GlStateManager.pushMatrix();
57+
GlStateManager.translate(offsetX, offsetY, 0);
58+
59+
int texOffsetY = 11;
60+
int texOffsetX = 64;
61+
62+
int width = this.width;
63+
int xOffset = 0;
64+
65+
if(hasTabs) {
66+
width -= 32;
67+
xOffset += 32;
68+
}
69+
70+
// Top Left corner
71+
screen.drawTexturedModalRect(xOffset, 0, texOffsetX, texOffsetY, 4, 4);
72+
73+
// Top right corner
74+
screen.drawTexturedModalRect(xOffset+width - 4, 0, texOffsetX + 4 + 64, texOffsetY, 4, 4);
75+
76+
// Bottom Left corner
77+
screen.drawTexturedModalRect(xOffset, this.height - 4, texOffsetX, texOffsetY + 4 + 64, 4, 4);
78+
79+
// Bottom Right corner
80+
screen.drawTexturedModalRect(xOffset+width - 4, this.height - 4, texOffsetX + 4 + 64, texOffsetY + 4 + 64, 4, 4);
81+
82+
// Top edge
83+
GUIHelper.drawStretchedTexture(xOffset+4, 0, width - 8, 4, texOffsetX + 4, texOffsetY, 64, 4);
84+
85+
// Bottom edge
86+
GUIHelper.drawStretchedTexture(xOffset+4, this.height - 4, width - 8, 4, texOffsetX + 4, texOffsetY + 4 + 64, 64, 4);
87+
88+
// Left edge
89+
GUIHelper.drawStretchedTexture(xOffset, 4, 4, this.height - 8, texOffsetX, texOffsetY+4, 4, 64);
90+
91+
// Right edge
92+
GUIHelper.drawStretchedTexture(xOffset+width - 4, 4, 4, this.height - 8, texOffsetX + 64 + 4, texOffsetY + 3, 4, 64);
93+
94+
GUIHelper.drawStretchedTexture(xOffset+4, 4, width - 8, this.height - 8, texOffsetX + 4, texOffsetY+4, 64, 64);
95+
96+
GlStateManager.popMatrix();
97+
}
98+
99+
public void drawTooltips(GuiScreen screen, int mouseX, int mouseY) {
100+
Widget hoveredWidget = getHoveredWidget(mouseX, mouseY);
101+
FontRenderer font = screen.mc.fontRenderer;
102+
103+
if(hoveredWidget != null && hoveredWidget.getTooltip() != null) {
104+
if(hoveredWidget.getTooltip().size() > 0) {
105+
GuiUtils.drawHoveringText(hoveredWidget.getTooltip(), mouseX, mouseY, width, height, 180, font);
106+
}/* else {
107+
List<String> tooltips = new ArrayList<>();
108+
tooltips.add(hoveredWidget.toString());
109+
GuiUtils.drawHoveringText(tooltips, mouseX, mouseY, width, height, 180, font);
110+
}*/
111+
}
112+
}
113+
114+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package org.dave.compactmachines3.gui.framework;
2+
3+
import net.minecraft.client.gui.FontRenderer;
4+
import net.minecraft.client.gui.GuiScreen;
5+
import net.minecraft.client.renderer.BufferBuilder;
6+
import net.minecraft.client.renderer.GlStateManager;
7+
import net.minecraft.client.renderer.Tessellator;
8+
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
9+
import org.lwjgl.opengl.GL11;
10+
11+
public class GUIHelper {
12+
public static void drawSplitStringCentered(String str, GuiScreen screen, int x, int y, int width, int color) {
13+
FontRenderer renderer = screen.mc.fontRenderer;
14+
int yOffset = 0;
15+
for(String row : renderer.listFormattedStringToWidth(str, width)) {
16+
screen.drawCenteredString(renderer, row, x + width/2, y + yOffset, color);
17+
yOffset += renderer.FONT_HEIGHT;
18+
}
19+
}
20+
21+
public static void drawColoredRectangle(int x, int y, int width, int height, int argb) {
22+
int a = (argb >> 24) & 0xFF;
23+
int r = (argb >> 16) & 0xFF;
24+
int g = (argb >> 8) & 0xFF;
25+
int b = (argb & 0xFF);
26+
drawColoredRectangle(x, y, width, height, r, g, b, a);
27+
}
28+
29+
public static void drawColoredRectangle(int x, int y, int width, int height, int red, int green, int blue, int alpha) {
30+
double zLevel = 0.0f;
31+
32+
GlStateManager.disableTexture2D();
33+
GlStateManager.enableBlend();
34+
GlStateManager.disableAlpha();
35+
GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
36+
GlStateManager.shadeModel(GL11.GL_SMOOTH);
37+
38+
Tessellator tessellator = Tessellator.getInstance();
39+
BufferBuilder renderer = tessellator.getBuffer();
40+
renderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR);
41+
renderer.pos((x + 0), (y + 0), zLevel).color(red, green, blue, alpha).endVertex();
42+
renderer.pos((x + 0), (y + height), zLevel).color(red, green, blue, alpha).endVertex();
43+
renderer.pos((x + width), (y + height), zLevel).color(red, green, blue, alpha).endVertex();
44+
renderer.pos((x + width), (y + 0), zLevel).color(red, green, blue, alpha).endVertex();
45+
tessellator.draw();
46+
47+
GlStateManager.shadeModel(GL11.GL_FLAT);
48+
GlStateManager.disableBlend();
49+
GlStateManager.enableAlpha();
50+
GlStateManager.enableTexture2D();
51+
52+
}
53+
54+
public static void drawStretchedTexture(int x, int y, int width, int height, int textureX, int textureY, int textureWidth, int textureHeight) {
55+
float f = 0.00390625F;
56+
double zLevel = 0.0f;
57+
58+
Tessellator tessellator = Tessellator.getInstance();
59+
BufferBuilder bufferbuilder = tessellator.getBuffer();
60+
bufferbuilder.begin(7, DefaultVertexFormats.POSITION_TEX);
61+
bufferbuilder
62+
.pos((double)(x + 0), (double)(y + height), zLevel)
63+
.tex((double)((float)(textureX + 0) * f), (double)((float)(textureY + textureHeight) * f))
64+
.endVertex();
65+
66+
bufferbuilder
67+
.pos((double)(x + width), (double)(y + height), zLevel)
68+
.tex((double)((float)(textureX + textureWidth) * f), (double)((float)(textureY + textureHeight) * f))
69+
.endVertex();
70+
71+
bufferbuilder
72+
.pos((double)(x + width), (double)(y + 0), zLevel)
73+
.tex((double)((float)(textureX + textureWidth) * f), (double)((float)(textureY + 0) * f))
74+
.endVertex();
75+
76+
bufferbuilder
77+
.pos((double)(x + 0), (double)(y + 0), zLevel)
78+
.tex((double)((float)(textureX + 0) * f), (double)((float)(textureY + 0) * f))
79+
.endVertex();
80+
81+
tessellator.draw();
82+
}
83+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package org.dave.compactmachines3.gui.framework;
2+
3+
public interface ISelectable {
4+
boolean isSelected();
5+
void setSelected(boolean state);
6+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.dave.compactmachines3.gui.framework;
2+
3+
public class SmartNumberFormatter {
4+
5+
public static String formatNumber(double value) {
6+
double decimalRange = 100;
7+
double normalRange = 100000;
8+
9+
if(value > -decimalRange && value < decimalRange) {
10+
if(value == Math.round(value)) {
11+
return String.format("%d", Math.round(value));
12+
}
13+
14+
return String.format("%.2f", value);
15+
}
16+
17+
if(value > -normalRange && value < normalRange) {
18+
return String.format("%.0f", value);
19+
}
20+
21+
return String.format("%.2e", value).toLowerCase();
22+
}
23+
}

0 commit comments

Comments
 (0)