package de.luca.lager; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiTextField; import org.lwjgl.input.Keyboard; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Locale; /** * Sparziel und Farm-Rechner. * * Oben das Sparziel mit Fortschritt, darunter der Rechner: Gegenstand und * Preis eingeben, und es steht da, wie viel davon noch fehlt — in Stueck, * Stapeln und Doppelkisten. */ public class GuiRechner extends GuiScreen { private static final DecimalFormat ZAHL; static { DecimalFormatSymbols s = new DecimalFormatSymbols(Locale.GERMANY); ZAHL = new DecimalFormat("#,##0", s); } private static final DecimalFormat GELD; static { DecimalFormatSymbols s = new DecimalFormatSymbols(Locale.GERMANY); GELD = new DecimalFormat("#,##0.00", s); } private final LagerMod mod; private GuiTextField feldZiel; private GuiTextField feldGuthaben; private GuiTextField feldItem; private GuiTextField feldPreis; private GuiTextField feldSchluessel; public GuiRechner(LagerMod mod) { this.mod = mod; } @Override public void initGui() { Keyboard.enableRepeatEvents(true); int m = this.width / 2; feldZiel = neuesFeld(0, m - 40, 46, 130); feldZiel.setText(mod.sparziel <= 0 ? "" : String.valueOf(mod.sparziel)); feldGuthaben = neuesFeld(1, m - 40, 68, 130); long ausScoreboard = mod.guthabenAusScoreboard(); feldGuthaben.setText(String.valueOf(ausScoreboard > 0 ? ausScoreboard : mod.guthaben)); feldItem = neuesFeld(2, m - 40, 126, 130); feldItem.setText(mod.rechnerItem); feldPreis = neuesFeld(3, m - 40, 148, 130); feldPreis.setText(mod.rechnerPreis <= 0 ? "" : String.valueOf(mod.rechnerPreis)); feldSchluessel = neuesFeld(4, m - 40, 206, 130); feldSchluessel.setText(mod.webSchluessel); } private GuiTextField neuesFeld(int id, int x, int y, int breite) { GuiTextField f = new GuiTextField(id, this.fontRendererObj, x, y, breite, 16); f.setMaxStringLength(20); return f; } @Override public void onGuiClosed() { Keyboard.enableRepeatEvents(false); mod.sparziel = alsZahl(feldZiel.getText()); mod.guthaben = alsZahl(feldGuthaben.getText()); mod.rechnerItem = feldItem.getText(); mod.rechnerPreis = alsKomma(feldPreis.getText()); mod.webSchluessel = feldSchluessel.getText().trim(); mod.sichernOeffentlich(); } /** Punkte und Leerzeichen aus der Eingabe entfernen, dann als Zahl lesen. */ private static long alsZahl(String s) { if (s == null) { return 0; } StringBuilder b = new StringBuilder(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c >= '0' && c <= '9') { b.append(c); } } if (b.length() == 0) { return 0; } try { return Long.parseLong(b.toString()); } catch (Exception e) { return 0; } } private static double alsKomma(String s) { if (s == null) { return 0; } String r = s.replace(".", "").replace(',', '.').trim(); StringBuilder b = new StringBuilder(); for (int i = 0; i < r.length(); i++) { char c = r.charAt(i); if ((c >= '0' && c <= '9') || c == '.') { b.append(c); } } try { return Double.parseDouble(b.toString()); } catch (Exception e) { return 0; } } @Override public void drawScreen(int mx, int my, float t) { drawDefaultBackground(); int m = this.width / 2; drawCenteredString(this.fontRendererObj, "§6Sparziel und Rechner", m, 14, 0xFFFFFF); // ---------------- Sparziel ---------------- this.fontRendererObj.drawStringWithShadow("§7Sparziel", m - 150, 50, 0xFFFFFF); this.fontRendererObj.drawStringWithShadow("§7Guthaben", m - 150, 72, 0xFFFFFF); this.fontRendererObj.drawStringWithShadow("§8$", m + 96, 50, 0xFFFFFF); this.fontRendererObj.drawStringWithShadow("§8$", m + 96, 72, 0xFFFFFF); feldZiel.drawTextBox(); feldGuthaben.drawTextBox(); long ziel = alsZahl(feldZiel.getText()); long hab = alsZahl(feldGuthaben.getText()); long fehlt = Math.max(ziel - hab, 0); // Fortschrittsbalken int bx = m - 150; int bb = 300; drawRect(bx, 92, bx + bb, 100, 0x66000000); if (ziel > 0) { double anteil = Math.min((double) hab / (double) ziel, 1.0); drawRect(bx, 92, bx + (int) (bb * anteil), 100, 0xFF33CC55); String prozent = String.valueOf(Math.round(anteil * 100)) + " %"; drawCenteredString(this.fontRendererObj, "§f" + prozent, m, 103, 0xFFFFFF); if (fehlt > 0) { drawCenteredString(this.fontRendererObj, "§7noch §e" + ZAHL.format(fehlt) + " $", m, 114, 0xFFFFFF); } else { drawCenteredString(this.fontRendererObj, "§aZiel erreicht", m, 114, 0xFFFFFF); } } // ---------------- Rechner ---------------- this.fontRendererObj.drawStringWithShadow("§7Gegenstand", m - 150, 130, 0xFFFFFF); this.fontRendererObj.drawStringWithShadow("§7Preis je Stueck", m - 150, 152, 0xFFFFFF); this.fontRendererObj.drawStringWithShadow("§8$", m + 96, 152, 0xFFFFFF); feldItem.drawTextBox(); feldPreis.drawTextBox(); double preis = alsKomma(feldPreis.getText()); int y = 180; if (preis > 0 && fehlt > 0) { long stueck = (long) Math.ceil(fehlt / preis); long stapel = (long) Math.ceil(stueck / 64.0); long kisten = (long) Math.ceil(stapel / 54.0); String was = feldItem.getText().trim(); if (was.isEmpty()) { was = "davon"; } drawCenteredString(this.fontRendererObj, "§7Du brauchst noch", m, y, 0xFFFFFF); drawCenteredString(this.fontRendererObj, "§e" + ZAHL.format(stueck) + " §f" + was, m, y + 14, 0xFFFFFF); drawCenteredString(this.fontRendererObj, "§7= §f" + ZAHL.format(stapel) + " §7Stapel §8· §f" + ZAHL.format(kisten) + " §7Doppelkisten", m, y + 28, 0xFFFFFF); // Was du schon hast, gegenrechnen Integer vorhanden = null; for (java.util.Map.Entry e : mod.gesamtbestand().entrySet()) { if (LagerMod.ohneFarben(e.getKey()).equalsIgnoreCase(was)) { vorhanden = e.getValue(); break; } } if (vorhanden != null) { long rest = Math.max(stueck - vorhanden, 0); drawCenteredString(this.fontRendererObj, "§8im Lager: " + ZAHL.format(vorhanden) + " · noch zu farmen: §e" + ZAHL.format(rest), m, y + 44, 0xFFFFFF); } } else if (fehlt == 0 && ziel > 0) { drawCenteredString(this.fontRendererObj, "§aNichts mehr zu tun.", m, y + 14, 0xFFFFFF); } else { drawCenteredString(this.fontRendererObj, "§8Ziel und Preis eintragen, dann rechne ich.", m, y + 14, 0xFFFFFF); } // ---------------- Verbindung zur Webseite ---------------- this.fontRendererObj.drawStringWithShadow("§7Webseiten-Passwort", m - 150, 210, 0xFFFFFF); feldSchluessel.drawTextBox(); this.fontRendererObj.drawStringWithShadow( mod.webSchluessel.isEmpty() ? "§8leer — die Webseite zeigt dich als offline" : "§a● meldet sich an lukaba.duckdns.org", m - 150, 228, 0xFFFFFF); drawCenteredString(this.fontRendererObj, "§8Tab wechselt das Feld · Enter oder Escape speichert und schliesst", m, this.height - 20, 0xFFFFFF); super.drawScreen(mx, my, t); } @Override protected void keyTyped(char zeichen, int code) { // Escape und Enter tun dasselbe: uebernehmen und schliessen. // onGuiClosed speichert dabei alle Felder. if (code == Keyboard.KEY_ESCAPE || code == Keyboard.KEY_RETURN || code == Keyboard.KEY_NUMPADENTER) { this.mc.displayGuiScreen(null); return; } if (code == Keyboard.KEY_TAB) { GuiTextField[] alle = {feldZiel, feldGuthaben, feldItem, feldPreis, feldSchluessel}; int aktiv = 0; for (int i = 0; i < alle.length; i++) { if (alle[i].isFocused()) { aktiv = i; } alle[i].setFocused(false); } alle[(aktiv + 1) % alle.length].setFocused(true); return; } feldZiel.textboxKeyTyped(zeichen, code); feldGuthaben.textboxKeyTyped(zeichen, code); feldItem.textboxKeyTyped(zeichen, code); feldPreis.textboxKeyTyped(zeichen, code); feldSchluessel.textboxKeyTyped(zeichen, code); } @Override protected void mouseClicked(int x, int y, int knopf) { try { super.mouseClicked(x, y, knopf); } catch (Exception ignoriert) { } feldZiel.mouseClicked(x, y, knopf); feldGuthaben.mouseClicked(x, y, knopf); feldItem.mouseClicked(x, y, knopf); feldPreis.mouseClicked(x, y, knopf); feldSchluessel.mouseClicked(x, y, knopf); } @Override public boolean doesGuiPauseGame() { return false; } }