aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/detrav/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/detrav/gui')
-rw-r--r--src/main/java/com/detrav/gui/DetravScannerGUI.java120
-rw-r--r--src/main/java/com/detrav/gui/OresList.java66
-rw-r--r--src/main/java/com/detrav/gui/textures/DetravMapTexture.java149
3 files changed, 335 insertions, 0 deletions
diff --git a/src/main/java/com/detrav/gui/DetravScannerGUI.java b/src/main/java/com/detrav/gui/DetravScannerGUI.java
new file mode 100644
index 0000000000..c0a7e7f16f
--- /dev/null
+++ b/src/main/java/com/detrav/gui/DetravScannerGUI.java
@@ -0,0 +1,120 @@
+package com.detrav.gui;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.StatCollector;
+
+import org.lwjgl.opengl.GL11;
+
+import com.detrav.gui.textures.DetravMapTexture;
+
+import gregtech.api.util.GT_Utility;
+
+/**
+ * Created by wital_000 on 21.03.2016.
+ */
+public class DetravScannerGUI extends GuiScreen {
+
+ public static final int GUI_ID = 20;
+ private static DetravMapTexture map = null;
+ OresList oresList = null;
+
+ private final static int minHeight = 128;
+ private final static int minWidth = 128;
+ private int prevW;
+ private int prevH;
+
+ private static final ResourceLocation back = new ResourceLocation("gregtech:textures/gui/propick.png");
+
+ public DetravScannerGUI() {
+
+ }
+
+ public static void newMap(DetravMapTexture aMap) {
+ if (map != null) {
+ map.deleteGlTexture();
+ map = null;
+ }
+ map = aMap;
+ map.loadTexture(null);
+ }
+
+ @Override
+ public void drawScreen(int x, int y, float f) {
+ this.drawDefaultBackground();
+ if (map == null) return;
+ int currentWidth = Math.max(map.width, minWidth);
+ int currentHeight = Math.max(map.height, minHeight);
+ int aX = (this.width - currentWidth - 100) / 2;
+ int aY = (this.height - currentHeight) / 2;
+
+ if (oresList == null || (prevW != width || prevH != height)) {
+ oresList = new OresList(
+ this,
+ 100,
+ currentHeight,
+ aY,
+ aY + currentHeight,
+ aX + currentWidth,
+ 10,
+ map.packet.ores,
+ ((name, invert) -> { if (map != null) map.loadTexture(null, name, invert); }));
+ prevW = width;
+ prevH = height;
+ }
+
+ // draw back for ores
+ drawRect(aX, aY, aX + currentWidth + 100, aY + currentHeight, 0xFFC6C6C6);
+ map.glBindTexture();
+ map.draw(aX, aY);
+ oresList.drawScreen(x, y, f);
+ mc.getTextureManager().bindTexture(back);
+ GL11.glColor4f(0xFF, 0xFF, 0xFF, 0xFF);
+
+ // draw corners
+ drawTexturedModalRect(aX - 5, aY - 5, 0, 0, 5, 5);// leftTop
+ drawTexturedModalRect(aX + currentWidth + 100, aY - 5, 171, 0, 5, 5);// RightTop
+ drawTexturedModalRect(aX - 5, aY + currentHeight, 0, 161, 5, 5);// leftDown
+ drawTexturedModalRect(aX + currentWidth + 100, aY + currentHeight, 171, 161, 5, 5);// RightDown
+
+ // draw edges
+ for (int i = aX; i < aX + currentWidth + 100; i += 128)
+ drawTexturedModalRect(i, aY - 5, 5, 0, Math.min(128, aX + currentWidth + 100 - i), 5); // top
+ for (int i = aX; i < aX + currentWidth + 100; i += 128)
+ drawTexturedModalRect(i, aY + currentHeight, 5, 161, Math.min(128, aX + currentWidth + 100 - i), 5); // down
+ for (int i = aY; i < aY + currentHeight; i += 128)
+ drawTexturedModalRect(aX - 5, i, 0, 5, 5, Math.min(128, aY + currentHeight - i)); // left
+ for (int i = aY; i < aY + currentHeight; i += 128)
+ drawTexturedModalRect(aX + currentWidth + 100, i, 171, 5, 5, Math.min(128, aY + currentHeight - i)); // right
+
+ if (map.packet.ptype == 2) {
+ HashMap<Byte, Short>[][] fluidInfo = map.packet.map;
+ int tX = x - aX;
+ int tY = y - aY;
+ if (tX >= 0 && tY >= 0 && tX < fluidInfo.length && tY < fluidInfo[0].length) {
+ List<String> info = new ArrayList<>();
+ if (fluidInfo[tX][tY] != null) {
+ short fluidId = fluidInfo[tX][tY].get((byte) 1);
+ short fluidAmount = fluidInfo[tX][tY].get((byte) 2);
+ if (fluidId != 0 && fluidAmount > 0) {
+ info.add(
+ StatCollector.translateToLocal("gui.detrav.scanner.tooltip.fluid_name")
+ + map.packet.metaMap.get(fluidId));
+ info.add(
+ StatCollector.translateToLocal("gui.detrav.scanner.tooltip.fluid_amount")
+ + GT_Utility.formatNumbers(fluidAmount)
+ + " L");
+ } else info.add(StatCollector.translateToLocal("gui.detrav.scanner.tooltip.no_fluid"));
+ } else {
+ info.add(StatCollector.translateToLocal("gui.detrav.scanner.tooltip.no_fluid"));
+ }
+ func_146283_a(info, x, y);
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/com/detrav/gui/OresList.java b/src/main/java/com/detrav/gui/OresList.java
new file mode 100644
index 0000000000..54c2152f5a
--- /dev/null
+++ b/src/main/java/com/detrav/gui/OresList.java
@@ -0,0 +1,66 @@
+package com.detrav.gui;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.function.BiConsumer;
+
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.client.renderer.Tessellator;
+
+import cpw.mods.fml.client.GuiScrollingList;
+
+class OresList extends GuiScrollingList {
+
+ private final HashMap<String, Integer> ores;
+ private final List<String> keys;
+ private final GuiScreen parent;
+ private final BiConsumer<String, Boolean> onSelected;
+ private boolean invert = false;
+
+ private int selected = -1;
+
+ public OresList(GuiScreen parent, int width, int height, int top, int bottom, int left, int entryHeight,
+ HashMap<String, Integer> aOres, BiConsumer<String, Boolean> onSelected) {
+ super(parent.mc, width, height, top, bottom, left, entryHeight);
+ this.parent = parent;
+ this.onSelected = onSelected;
+ ores = aOres;
+ keys = new ArrayList<>(ores.keySet());
+ Collections.sort(keys);
+ if (keys.size() > 1) keys.add(0, "All");
+ selected = 0;
+ }
+
+ @Override
+ protected int getSize() {
+ return keys.size();
+ }
+
+ @Override
+ protected void elementClicked(int index, boolean doubleClick) {
+ selected = index;
+ if (doubleClick) this.invert = !this.invert;
+
+ if (onSelected != null) onSelected.accept(keys.get(index), this.invert);
+ }
+
+ @Override
+ protected boolean isSelected(int index) {
+ return selected == index;
+ }
+
+ @Override
+ protected void drawBackground() {}
+
+ @Override
+ protected void drawSlot(int slotIdx, int entryRight, int slotTop, int slotBuffer, Tessellator tess) {
+ parent.drawString(
+ parent.mc.fontRenderer,
+ parent.mc.fontRenderer.trimStringToWidth(keys.get(slotIdx), listWidth - 10),
+ this.left + 3,
+ slotTop - 1,
+ ores.getOrDefault(keys.get(slotIdx), 0x7d7b76));
+ }
+}
diff --git a/src/main/java/com/detrav/gui/textures/DetravMapTexture.java b/src/main/java/com/detrav/gui/textures/DetravMapTexture.java
new file mode 100644
index 0000000000..01c570d5a1
--- /dev/null
+++ b/src/main/java/com/detrav/gui/textures/DetravMapTexture.java
@@ -0,0 +1,149 @@
+package com.detrav.gui.textures;
+
+import java.awt.Color;
+import java.awt.image.BufferedImage;
+import java.awt.image.WritableRaster;
+
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.texture.AbstractTexture;
+import net.minecraft.client.renderer.texture.TextureUtil;
+import net.minecraft.client.resources.IResourceManager;
+
+import org.lwjgl.opengl.GL11;
+
+import com.detrav.net.ProspectingPacket;
+
+/**
+ * Created by wital_000 on 21.03.2016.
+ */
+public class DetravMapTexture extends AbstractTexture {
+
+ public final ProspectingPacket packet;
+ private String selected = "All";
+ public int width = -1;
+ public int height = -1;
+ public boolean invert = false;
+
+ public DetravMapTexture(ProspectingPacket aPacket) {
+ packet = aPacket;
+ }
+
+ private BufferedImage getImage() {
+ final int backgroundColor = invert ? Color.GRAY.getRGB() : Color.WHITE.getRGB();
+ final int wh = (packet.size * 2 + 1) * 16;
+
+ BufferedImage image = new BufferedImage(wh, wh, BufferedImage.TYPE_INT_ARGB);
+ WritableRaster raster = image.getRaster();
+
+ int playerI = packet.posX - (packet.chunkX - packet.size) * 16 - 1; // Correct player offset
+ int playerJ = packet.posZ - (packet.chunkZ - packet.size) * 16 - 1;
+ for (int i = 0; i < wh; i++) {
+ for (int j = 0; j < wh; j++) {
+ image.setRGB(i, j, backgroundColor);
+ if (packet.map[i][j] != null) {
+ if (packet.ptype == 0 || packet.ptype == 1) {
+ for (short meta : packet.map[i][j].values()) {
+ final String name = packet.metaMap.get(meta);
+ if (!selected.equals("All") && !selected.equals(name)) continue;
+
+ image.setRGB(i, j, packet.ores.getOrDefault(name, Color.BLACK.getRGB()) | 0XFF000000);
+ break;
+ }
+ } else if (packet.ptype == 2) {
+ final short fluidId = packet.map[i][j].get((byte) 1),
+ fluidSize = packet.map[i][j].get((byte) 2);
+ final String name = packet.metaMap.get(fluidId);
+
+ // Variables used to locate within a chunk.
+ final int k = (i % 16), l = (j % 16);
+
+ if (((k + l * 16) * 3) < (fluidSize + 48)
+ && (selected.equals("All") || selected.equals(name))) {
+ image.setRGB(i, j, packet.ores.getOrDefault(name, Color.BLACK.getRGB()) | 0XFF000000);
+ }
+ } else if (packet.ptype == 3) {
+ final short meta = packet.map[i][j].get((byte) 1);
+ image.setRGB(i, j, ((meta & 0xFF) << 16) + ((meta & 0xFF) << 8) + ((meta & 0xFF)) | 0XFF000000);
+ }
+ }
+ // draw player pos
+ if (i == playerI || j == playerJ) {
+ raster.setSample(i, j, 0, (raster.getSample(i, j, 0) + 255) / 2);
+ raster.setSample(i, j, 1, raster.getSample(i, j, 1) / 2);
+ raster.setSample(i, j, 2, raster.getSample(i, j, 2) / 2);
+ }
+ // draw grid
+ if ((i) % 16 == 0 || (j) % 16 == 0) {
+ raster.setSample(i, j, 0, raster.getSample(i, j, 0) / 2);
+ raster.setSample(i, j, 1, raster.getSample(i, j, 1) / 2);
+ raster.setSample(i, j, 2, raster.getSample(i, j, 2) / 2);
+ }
+
+ }
+ }
+
+ return image;
+ }
+
+ @Override
+ public void loadTexture(IResourceManager resourceManager) {
+ this.deleteGlTexture();
+ if (packet != null) {
+ int tId = getGlTextureId();
+ if (tId < 0) return;
+ TextureUtil.uploadTextureImageAllocate(this.getGlTextureId(), getImage(), false, false);
+ width = packet.getSize();
+ height = packet.getSize();
+ }
+ }
+
+ public void loadTexture(IResourceManager resourceManager, boolean invert) {
+ this.invert = invert;
+ loadTexture(resourceManager);
+ }
+
+ public void loadTexture(IResourceManager resourceManager, String selected, boolean invert) {
+ this.selected = selected;
+ loadTexture(resourceManager, invert);
+ }
+
+ public int glBindTexture() {
+ if (this.glTextureId < 0) return this.glTextureId;
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.getGlTextureId());
+ return this.glTextureId;
+ }
+
+ public void draw(int x, int y) {
+ float f = 1F / (float) width;
+ float f1 = 1F / (float) height;
+ int u = 0, v = 0;
+ Tessellator tessellator = Tessellator.instance;
+ tessellator.startDrawingQuads();
+ tessellator.addVertexWithUV(
+ (double) (x),
+ (double) (y + height),
+ 0,
+ (double) ((float) (u) * f),
+ (double) ((float) (v + height) * f1));
+ tessellator.addVertexWithUV(
+ (double) (x + width),
+ (double) (y + height),
+ 0,
+ (double) ((float) (u + width) * f),
+ (double) ((float) (v + height) * f1));
+ tessellator.addVertexWithUV(
+ (double) (x + width),
+ (double) (y),
+ 0,
+ (double) ((float) (u + width) * f),
+ (double) ((float) (v) * f1));
+ tessellator.addVertexWithUV(
+ (double) (x),
+ (double) (y),
+ 0,
+ (double) ((float) (u) * f),
+ (double) ((float) (v) * f1));
+ tessellator.draw();
+ }
+
+}