diff options
author | syeyoung <42869671+cyoung06@users.noreply.github.com> | 2020-11-23 17:38:00 +0900 |
---|---|---|
committer | syeyoung <42869671+cyoung06@users.noreply.github.com> | 2020-11-23 17:38:00 +0900 |
commit | 8292e2b632d34a92f98e8dd896750b5b5ab011bd (patch) | |
tree | 5d714771d737b866e33b840c21ed004ccc9dac72 | |
parent | fdc4638c4bbd84e1429812387d0f3a2626b95ae6 (diff) | |
download | Skyblock-Dungeons-Guide-8292e2b632d34a92f98e8dd896750b5b5ab011bd.tar.gz Skyblock-Dungeons-Guide-8292e2b632d34a92f98e8dd896750b5b5ab011bd.tar.bz2 Skyblock-Dungeons-Guide-8292e2b632d34a92f98e8dd896750b5b5ab011bd.zip |
gui stuff
7 files changed, 412 insertions, 1 deletions
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/DungeonsGuide.java b/src/main/java/kr/syeyoung/dungeonsguide/DungeonsGuide.java index 81e976b8..8eae47c4 100644 --- a/src/main/java/kr/syeyoung/dungeonsguide/DungeonsGuide.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/DungeonsGuide.java @@ -1,6 +1,8 @@ package kr.syeyoung.dungeonsguide; +import kr.syeyoung.dungeonsguide.commands.CommandEditRoom; import net.minecraft.init.Blocks; +import net.minecraftforge.client.ClientCommandHandler; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; @@ -22,6 +24,9 @@ public class DungeonsGuide dungeonsGuide = this; skyblockStatus = new SkyblockStatus(); MinecraftForge.EVENT_BUS.register(new EventListener()); + CommandEditRoom cc = new CommandEditRoom(); + ClientCommandHandler.instance.registerCommand(cc); + MinecraftForge.EVENT_BUS.register(cc); } public SkyblockStatus getSkyblockStatus() { diff --git a/src/main/java/kr/syeyoung/dungeonsguide/EventListener.java b/src/main/java/kr/syeyoung/dungeonsguide/EventListener.java index 86992aaa..ac3f3432 100644 --- a/src/main/java/kr/syeyoung/dungeonsguide/EventListener.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/EventListener.java @@ -1,6 +1,7 @@ package kr.syeyoung.dungeonsguide; import kr.syeyoung.dungeonsguide.dungeon.DungeonContext; +import kr.syeyoung.dungeonsguide.dungeon.data.DungeonRoomInfo; import kr.syeyoung.dungeonsguide.dungeon.doorfinder.DungeonDoor; import kr.syeyoung.dungeonsguide.dungeon.roomfinder.DungeonRoom; import kr.syeyoung.dungeonsguide.utils.MapUtils; @@ -70,7 +71,6 @@ public class EventListener { fontRenderer.drawString("room uuid: "+dungeonRoom.getDungeonRoomInfo().getUuid() + (dungeonRoom.getDungeonRoomInfo().isRegistered() ?"":" (not registered)"), 5, 138, 0xFFFFFF); fontRenderer.drawString("room name: "+dungeonRoom.getDungeonRoomInfo().getName(), 5, 148, 0xFFFFFF); } - } } diff --git a/src/main/java/kr/syeyoung/dungeonsguide/commands/CommandEditRoom.java b/src/main/java/kr/syeyoung/dungeonsguide/commands/CommandEditRoom.java new file mode 100644 index 00000000..4f196b80 --- /dev/null +++ b/src/main/java/kr/syeyoung/dungeonsguide/commands/CommandEditRoom.java @@ -0,0 +1,75 @@ +package kr.syeyoung.dungeonsguide.commands; + +import kr.syeyoung.dungeonsguide.DungeonsGuide; +import kr.syeyoung.dungeonsguide.SkyblockStatus; +import kr.syeyoung.dungeonsguide.dungeon.DungeonContext; +import kr.syeyoung.dungeonsguide.dungeon.roomfinder.DungeonRoom; +import kr.syeyoung.dungeonsguide.roomedit.GuiDungeonRoomEdit; +import kr.syeyoung.dungeonsguide.utils.MapUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.util.ChatComponentText; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import net.minecraftforge.fml.relauncher.Side; + +import java.awt.*; + +public class CommandEditRoom extends CommandBase { + @Override + public String getCommandName() { + return "editroom"; + } + + @Override + public String getCommandUsage(ICommandSender sender) { + return "editroom"; + } + + @Override + public void processCommand(ICommandSender sender, String[] args) throws CommandException { + SkyblockStatus skyblockStatus = DungeonsGuide.getDungeonsGuide().getSkyblockStatus(); + if (!skyblockStatus.isOnDungeon()) { + sender.addChatMessage(new ChatComponentText("You're not in dungeons")); + return; + } + + if (skyblockStatus.getContext() == null) { + sender.addChatMessage(new ChatComponentText("Dungeon Context is null")); + return; + } + + + DungeonContext context = skyblockStatus.getContext(); + EntityPlayerSP thePlayer = Minecraft.getMinecraft().thePlayer; + Point roomPt = context.getMapProcessor().worldPointToRoomPoint(thePlayer.getPosition()); + DungeonRoom dungeonRoom = context.getRoomMapper().get(roomPt); + + if (dungeonRoom == null) { + sender.addChatMessage(new ChatComponentText("Can't determine the dungeon room you're in")); + return; + } + + openit = new GuiDungeonRoomEdit(dungeonRoom); + } + + GuiScreen openit; + + @SubscribeEvent + public void tick(TickEvent.ClientTickEvent tick){ + if ( openit != null &&tick.phase == TickEvent.Phase.END && tick.side == Side.CLIENT && tick.type == TickEvent.Type.CLIENT) { + Minecraft.getMinecraft().displayGuiScreen(openit); + openit = null; + } + } + + @Override + public int getRequiredPermissionLevel() { + return 0; + } +} diff --git a/src/main/java/kr/syeyoung/dungeonsguide/roomedit/GuiDungeonRoomEdit.java b/src/main/java/kr/syeyoung/dungeonsguide/roomedit/GuiDungeonRoomEdit.java new file mode 100644 index 00000000..0ce2b72b --- /dev/null +++ b/src/main/java/kr/syeyoung/dungeonsguide/roomedit/GuiDungeonRoomEdit.java @@ -0,0 +1,81 @@ +package kr.syeyoung.dungeonsguide.roomedit; + +import kr.syeyoung.dungeonsguide.dungeon.roomfinder.DungeonRoom; +import kr.syeyoung.dungeonsguide.roomedit.elements.MButton; +import kr.syeyoung.dungeonsguide.roomedit.elements.MLabel; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.ScaledResolution; +import org.lwjgl.input.Mouse; + +import java.awt.*; +import java.io.IOException; + +public class GuiDungeonRoomEdit extends GuiScreen { + + private MPanel mainPanel = new MPanel(); + + private DungeonRoom room; + + public GuiDungeonRoomEdit(DungeonRoom room) { + this.room = room; + + mainPanel.setBackgroundColor(Color.green); + MLabel label = new MLabel(); + label.setText("blah blah is great!"); + label.setBackgroundColor(Color.BLACK); + label.setBounds(new Rectangle(0,0,50,10)); + mainPanel.add(label); + + MButton mButton = new MButton(); + mButton.setText("this is awesome"); + label.setBounds(new Rectangle(30,20,50,10)); + mainPanel.add(label); + } + + @Override + public void initGui() { + // update bounds + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + mainPanel.setBounds(new Rectangle((scaledResolution.getScaledWidth() - 500) / 2, (scaledResolution.getScaledHeight() - 300) / 2,500,300)); + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + mainPanel.render0(new Rectangle(0,0,scaledResolution.getScaledWidth(),scaledResolution.getScaledHeight()), mouseX, mouseY, mouseX, mouseY, partialTicks); + } + + @Override + protected void keyTyped(char typedChar, int keyCode) throws IOException { + mainPanel.keyTyped0(typedChar, keyCode); + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { + mainPanel.mouseClicked0(mouseX, mouseY,mouseX,mouseY, mouseButton); + } + + @Override + protected void mouseReleased(int mouseX, int mouseY, int state) { + mainPanel.mouseReleased0(mouseX, mouseY,mouseX,mouseY, state); + } + + @Override + protected void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { + mainPanel.mouseClickMove0(mouseX,mouseY,mouseX,mouseY,clickedMouseButton,timeSinceLastClick); + } + + @Override + public void handleMouseInput() throws IOException { + super.handleMouseInput(); + + int i = Mouse.getEventX() * this.width / this.mc.displayWidth; + int j = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1; + + int wheel = Mouse.getDWheel(); + if (wheel != 0) { + mainPanel.mouseScrolled0(i, j,i,j, wheel); + } + } +} diff --git a/src/main/java/kr/syeyoung/dungeonsguide/roomedit/MPanel.java b/src/main/java/kr/syeyoung/dungeonsguide/roomedit/MPanel.java new file mode 100644 index 00000000..6c8a1f50 --- /dev/null +++ b/src/main/java/kr/syeyoung/dungeonsguide/roomedit/MPanel.java @@ -0,0 +1,168 @@ +package kr.syeyoung.dungeonsguide.roomedit; + +import lombok.AccessLevel; +import lombok.Getter; +import org.lwjgl.opengl.GL11; +import org.w3c.dom.css.Rect; + +import java.awt.*; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; + +@Getter +public class MPanel { + protected Rectangle bounds = new Rectangle(0,0,0,0); // relative to parent + + protected List<MPanel> childComponents = new ArrayList<MPanel>(); + + protected Color backgroundColor; + + @Getter(AccessLevel.PUBLIC) + protected boolean isFocused; + + public void setBackgroundColor(Color c) { + this.backgroundColor = c; + } + + public void setPosition(Point pt) { + this.bounds.x = pt.x; + this.bounds.y = pt.y; + } + + public void setSize(Dimension dim) { + this.bounds.width = dim.width; + this.bounds.height = dim.height; + } + + public Dimension getSize() { + return bounds.getSize(); + } + + public void setBounds(Rectangle bounds) { + this.bounds.x = bounds.x; + this.bounds.y = bounds.y; + this.bounds.width = bounds.width; + this.bounds.height = bounds.height; + } + + public void add(MPanel child) { + this.childComponents.add(child); + } + + public void remove(MPanel panel) { + this.childComponents.remove(panel); + } + + public void render0(Rectangle parentClip, int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks) { // 0,0 - a a + int relMousex = relMousex0 - bounds.x; + int relMousey = relMousey0 - bounds.y; + + Rectangle absParent = parentClip.getBounds(); + + GL11.glPushAttrib(GL11.GL_SCISSOR_BIT); + GL11.glTranslated(bounds.x, bounds.y, 0); + absParent.add(-bounds.x, -bounds.y); + + Rectangle absBound = bounds.getBounds(); // 0,0 - a a + Rectangle clip = determineClip(parentClip, absBound); + + GL11.glEnable(GL11.GL_SCISSOR_TEST); + GL11.glScissor(clip.x, clip.y, clip.width, clip.height); + + GL11.glClearColor(backgroundColor.getRed(), backgroundColor.getGreen(), backgroundColor.getBlue(), backgroundColor.getAlpha()); + + GL11.glPushMatrix(); + render(absMousex, absMousey, relMousex, relMousey, partialTicks); + GL11.glPopMatrix(); + + GL11.glDisable(GL11.GL_SCISSOR_TEST); + + GL11.glPopAttrib(); + + for (MPanel mPanel : childComponents){ + GL11.glPushMatrix(); + mPanel.render0(clip, absMousex, absMousey, relMousex, relMousey, partialTicks); + GL11.glPopMatrix(); + } + } + + private Rectangle determineClip(Rectangle rect1, Rectangle rect2) { + int minX = Math.max(rect1.x, rect2.x); + int minY = Math.max(rect1.y, rect2.y); + int maxX = Math.min(rect1.x + rect1.width, rect2.x + rect2.width); + int maxY = Math.min(rect1.y + rect1.height, rect2.y +rect2.height); + if (minX > maxX) return new Rectangle(0,0,0,0); + if (minY > maxY) return new Rectangle(0,0,0,0); + return new Rectangle(minX, minY, maxX - minX, maxY - minY); + } + + public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks) {} + + protected void keyTyped0(char typedChar, int keyCode) { + for (MPanel childComponent : childComponents) { + childComponent.keyTyped0(typedChar, keyCode); + } + + if (isFocused) + keyTyped(typedChar, keyCode); + } + protected void keyTyped(char typedChar, int keyCode) {}; + + protected boolean mouseClicked0(int absMouseX, int absMouseY, int relMouseX0, int relMouseY0, int mouseButton) { + int relMousex = relMouseX0 - bounds.x; + int relMousey = relMouseY0 - bounds.y; + + boolean noClip = true; + boolean focusedOverall = false; + for (MPanel childComponent : childComponents) { + if (childComponent.mouseClicked0(absMouseX, absMouseY, relMouseX0, relMouseY0, mouseButton)) { + noClip = false; + focusedOverall = true; + } + } + + if (bounds.contains(relMousex, relMousey) && noClip) { + isFocused = true; + focusedOverall = true; + } + + mouseClicked(absMouseX, absMouseY, relMousex, relMousey, mouseButton); + return focusedOverall; + } + + protected void mouseClicked(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int mouseButton) {} + + protected void mouseReleased0(int absMouseX, int absMouseY, int relMouseX0, int relMouseY0, int state) { + int relMousex = relMouseX0 - bounds.x; + int relMousey = relMouseY0 - bounds.y; + + for (MPanel childComponent : childComponents) { + childComponent.mouseReleased0(absMouseX, absMouseY, relMousex, relMousey, state); + } + mouseReleased(absMouseX, absMouseY, relMousex, relMousey, state); + } + protected void mouseReleased(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int state) {} + + protected void mouseClickMove0(int absMouseX, int absMouseY, int relMouseX0, int relMouseY0, int clickedMouseButton, long timeSinceLastClick) { + int relMousex = relMouseX0 - bounds.x; + int relMousey = relMouseY0 - bounds.y; + + for (MPanel childComponent : childComponents) { + childComponent.mouseClickMove0(absMouseX, absMouseY, relMousex, relMousey, clickedMouseButton, timeSinceLastClick); + } + mouseClickMove(absMouseX, absMouseY, relMousex, relMousey, clickedMouseButton, timeSinceLastClick); + } + protected void mouseClickMove(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int clickedMouseButton, long timeSinceLastClick) {} + + protected void mouseScrolled0(int absMouseX, int absMouseY, int relMouseX0, int relMouseY0, int scrollAmount) { + int relMousex = relMouseX0 - bounds.x; + int relMousey = relMouseY0 - bounds.y; + + for (MPanel childComponent : childComponents) { + childComponent.mouseScrolled0(absMouseX, absMouseY, relMousex, relMousey, scrollAmount); + } + mouseScrolled(absMouseX, absMouseY, relMousex, relMousey, scrollAmount); + } + protected void mouseScrolled(int absMouseX, int absMouseY, int relMouseX0, int relMouseY0, int scrollAmount) {} +} diff --git a/src/main/java/kr/syeyoung/dungeonsguide/roomedit/elements/MButton.java b/src/main/java/kr/syeyoung/dungeonsguide/roomedit/elements/MButton.java new file mode 100644 index 00000000..e6c675ca --- /dev/null +++ b/src/main/java/kr/syeyoung/dungeonsguide/roomedit/elements/MButton.java @@ -0,0 +1,51 @@ +package kr.syeyoung.dungeonsguide.roomedit.elements; + +import kr.syeyoung.dungeonsguide.roomedit.MPanel; +import lombok.Getter; +import lombok.Setter; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import org.lwjgl.opengl.GL11; +import org.w3c.dom.css.Rect; + +import java.awt.*; + +@Getter +@Setter +public class MButton extends MPanel { + private String text; + + private Color foreground = Color.white; + private Color hover = Color.gray; + private Color disabled = Color.darkGray; + + private boolean enabled; + + private Runnable onActionPerformed; + + @Override + public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks) { + Dimension bounds = getSize(); + + Color bg = backgroundColor; + if (!enabled) { + bg = disabled; + } else if (new Rectangle(new Point(0,0),bounds).contains(relMousex0, relMousey0)) { + bg = hover; + } + GL11.glClearColor(bg.getRed(), bg.getGreen(), bg.getBlue(), bg.getAlpha()); + + FontRenderer renderer = Minecraft.getMinecraft().fontRendererObj; + int width = renderer.getStringWidth(text); + int x = (bounds.width - width) / 2; + int y = (bounds.height - renderer.FONT_HEIGHT) / 2; + + renderer.drawString(text, x,y, foreground.getRGB()); + } + + @Override + protected void mouseClicked(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int mouseButton) { + if (onActionPerformed != null && new Rectangle(new Point(0,0),getSize()).contains(relMouseX, relMouseY)) + onActionPerformed.run(); + } +} diff --git a/src/main/java/kr/syeyoung/dungeonsguide/roomedit/elements/MLabel.java b/src/main/java/kr/syeyoung/dungeonsguide/roomedit/elements/MLabel.java new file mode 100644 index 00000000..1bc0c0f7 --- /dev/null +++ b/src/main/java/kr/syeyoung/dungeonsguide/roomedit/elements/MLabel.java @@ -0,0 +1,31 @@ +package kr.syeyoung.dungeonsguide.roomedit.elements; + +import kr.syeyoung.dungeonsguide.roomedit.MPanel; +import lombok.Getter; +import lombok.Setter; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; + +import java.awt.*; + +public class MLabel extends MPanel { + @Getter + @Setter + private String text; + + @Getter + @Setter + private Color foreground = Color.white; + + @Override + public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks) { + Dimension bounds = getSize(); + + FontRenderer renderer = Minecraft.getMinecraft().fontRendererObj; + int width = renderer.getStringWidth(text); + int x = (bounds.width - width) / 2; + int y = (bounds.height - renderer.FONT_HEIGHT) / 2; + + renderer.drawString(text, x,y, foreground.getRGB()); + } +} |