package de.luca.lager; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiTextField; import net.minecraft.util.BlockPos; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; /** * Die Uebersicht, die auf Tastendruck erscheint. * * Oben ein Suchfeld, darunter alle Gegenstaende aus den Truhen in der Naehe, * nach Menge sortiert. Rechts daneben steht, in wie vielen Truhen der * Gegenstand liegt. */ public class GuiLager extends GuiScreen { private final LagerMod mod; private GuiTextField suche; private int rollen; private List zeilen = new ArrayList(); private static class Zeile { String name; // ohne Farbcodes, fuer die Anzeige String roh; // Originalname, so wie er in den Truhen steht int menge; int truhen; } public GuiLager(LagerMod mod) { this.mod = mod; } @Override public void initGui() { Keyboard.enableRepeatEvents(true); suche = new GuiTextField(0, this.fontRendererObj, this.width / 2 - 150, 34, 300, 18); suche.setFocused(true); suche.setMaxStringLength(40); aktualisieren(); } @Override public void onGuiClosed() { Keyboard.enableRepeatEvents(false); } private void aktualisieren() { String filter = suche == null ? "" : suche.getText().toLowerCase(); Map bestand = mod.gesamtbestand(); List nah = mod.truhenInDerNaehe(); zeilen.clear(); for (Map.Entry e : bestand.entrySet()) { String reiner = entfaerben(e.getKey()); if (!filter.isEmpty() && !reiner.toLowerCase().contains(filter)) { continue; } Zeile z = new Zeile(); z.name = reiner; z.roh = e.getKey(); z.menge = e.getValue(); z.truhen = 0; for (LagerMod.Truhe t : nah) { if (t.inhalt.containsKey(e.getKey())) { z.truhen++; } } zeilen.add(z); } Collections.sort(zeilen, new Comparator() { public int compare(Zeile a, Zeile b) { return b.menge - a.menge; } }); rollen = 0; } /** Entfernt die Farbcodes, damit die Suche und die Breite stimmen. */ private static String entfaerben(String s) { if (s == null) { return ""; } StringBuilder b = new StringBuilder(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c == '§' && i + 1 < s.length()) { i++; } else { b.append(c); } } return b.toString(); } @Override public void drawScreen(int mausX, int mausY, float teilTick) { drawDefaultBackground(); int mitte = this.width / 2; int anzahlTruhen = mod.truhenInDerNaehe().size(); drawCenteredString(this.fontRendererObj, "§6Lager", mitte, 12, 0xFFFFFF); drawCenteredString(this.fontRendererObj, "§7" + anzahlTruhen + " Truhen im Umkreis von " + LagerMod.UMKREIS + " Bloecken" + " §8· anklicken heftet an den Bildschirmrand", mitte, 22, 0xFFFFFF); suche.drawTextBox(); if (suche.getText().isEmpty()) { this.fontRendererObj.drawStringWithShadow("§8suchen …", suche.xPosition + 4, suche.yPosition + 5, 0xFFFFFF); } int y = 62; int hoehe = this.height - 90; int passen = hoehe / 12; if (zeilen.isEmpty()) { drawCenteredString(this.fontRendererObj, anzahlTruhen == 0 ? "§7Noch keine Truhen erfasst. Oeffne eine, dann steht sie hier." : "§7Nichts gefunden.", mitte, y + 20, 0xFFFFFF); } for (int i = 0; i < passen && i + rollen < zeilen.size(); i++) { Zeile z = zeilen.get(i + rollen); int zy = y + i * 12; // Zebrastreifen, damit die Zeilen auseinanderzuhalten sind if ((i & 1) == 0) { drawRect(mitte - 155, zy - 1, mitte + 155, zy + 10, 0x22FFFFFF); } String menge = String.valueOf(z.menge); String staepel = z.menge >= 64 ? (" §8(" + (z.menge / 64) + "×64)") : ""; boolean fest = mod.angeheftet.contains(z.roh); this.fontRendererObj.drawStringWithShadow( (fest ? "§6● §f" : "§8○ §f") + z.name, mitte - 150, zy, 0xFFFFFF); this.fontRendererObj.drawStringWithShadow("§e" + menge + staepel, mitte + 60, zy, 0xFFFFFF); this.fontRendererObj.drawStringWithShadow("§7" + z.truhen + "×", mitte + 135, zy, 0xFFFFFF); } if (zeilen.size() > passen) { drawCenteredString(this.fontRendererObj, "§8" + (rollen + 1) + "–" + Math.min(rollen + passen, zeilen.size()) + " von " + zeilen.size() + " §8(Mausrad)", mitte, this.height - 22, 0xFFFFFF); } super.drawScreen(mausX, mausY, teilTick); } @Override protected void keyTyped(char zeichen, int code) { if (code == Keyboard.KEY_ESCAPE) { this.mc.displayGuiScreen(null); return; } if (suche.textboxKeyTyped(zeichen, code)) { aktualisieren(); } } @Override protected void mouseClicked(int x, int y, int knopf) { try { super.mouseClicked(x, y, knopf); } catch (Exception ignoriert) { // GuiScreen wirft hier in 1.8.9 eine geprüfte Ausnahme } suche.mouseClicked(x, y, knopf); // Klick auf eine Zeile heftet den Gegenstand an den Bildschirmrand int mitte = this.width / 2; if (knopf == 0 && x > mitte - 155 && x < mitte + 155) { int i = (y - 62) / 12; if (i >= 0 && i + rollen < zeilen.size() && y >= 62) { mod.anheftenUmschalten(zeilen.get(i + rollen).roh); } } } @Override public void handleMouseInput() { try { super.handleMouseInput(); } catch (Exception ignoriert) { } int rad = Mouse.getEventDWheel(); if (rad != 0) { rollen += (rad > 0 ? -3 : 3); int hoehe = this.height - 90; int passen = hoehe / 12; if (rollen > zeilen.size() - passen) { rollen = zeilen.size() - passen; } if (rollen < 0) { rollen = 0; } } } @Override public boolean doesGuiPauseGame() { return false; } }