package de.luca.lager; import net.minecraft.client.gui.GuiScreen; import org.lwjgl.input.Keyboard; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; /** * Was kommt wie schnell rein: Geld je Stunde aus dem Scoreboard und * Gegenstaende je Stunde aus dem, was du wirklich eingesammelt hast. */ public class GuiFarm extends GuiScreen { private static final DecimalFormat ZAHL; static { DecimalFormatSymbols s = new DecimalFormatSymbols(Locale.GERMANY); ZAHL = new DecimalFormat("#,##0", s); } private final LagerMod mod; private int rollen; public GuiFarm(LagerMod mod) { this.mod = mod; } @Override public void drawScreen(int mx, int my, float t) { drawDefaultBackground(); long jetzt = System.currentTimeMillis(); int m = this.width / 2; drawCenteredString(this.fontRendererObj, "§6Farm", m, 10, 0xFFFFFF); // ---------------- Geld ---------------- long[] gb = mod.geldUndBankAusScoreboard(); long vermoegen = (gb[0] > 0 ? gb[0] : 0) + (gb[1] > 0 ? gb[1] : 0); Double geldStunde = mod.farm.geldProStunde(jetzt); this.fontRendererObj.drawStringWithShadow("§7Vermoegen", 26, 30, 0xFFFFFF); this.fontRendererObj.drawStringWithShadow( "§f" + ZAHL.format(vermoegen) + " §7$", 26, 41, 0xFFFFFF); this.fontRendererObj.drawStringWithShadow("§7Geld je Stunde", 200, 30, 0xFFFFFF); if (geldStunde == null) { this.fontRendererObj.drawStringWithShadow("§8wird noch gemessen", 200, 41, 0xFFFFFF); } else { this.fontRendererObj.drawStringWithShadow( (geldStunde >= 0 ? "§a+" : "§c") + ZAHL.format(Math.round(geldStunde)) + " §7$/h §8(" + mod.farm.geldSpanneMinuten(jetzt) + " min)", 200, 41, 0xFFFFFF); } // ---------------- Sparziel ---------------- int y = 60; if (mod.sparziel > 0) { long fehlt = Math.max(mod.sparziel - vermoegen, 0); if (fehlt == 0) { this.fontRendererObj.drawStringWithShadow("§aSparziel erreicht.", 26, y, 0xFFFFFF); } else { this.fontRendererObj.drawStringWithShadow("§7Bis " + ZAHL.format(mod.sparziel) + " $ fehlen §e" + ZAHL.format(fehlt) + " §7$", 26, y, 0xFFFFFF); Double dauer = Farm.stundenBis(fehlt, geldStunde); this.fontRendererObj.drawStringWithShadow(dauer == null ? "§8Tempo noch unbekannt — spiel ein paar Minuten weiter." : "§7In dem Tempo noch §f" + Farm.dauer(dauer), 200, y, 0xFFFFFF); } y += 20; } // ---------------- Was du einsammelst ---------------- this.fontRendererObj.drawStringWithShadow("§8Gegenstand", 26, y, 0xFFFFFF); this.fontRendererObj.drawStringWithShadow("§8eingesammelt", 190, y, 0xFFFFFF); this.fontRendererObj.drawStringWithShadow("§8je Stunde", 275, y, 0xFFFFFF); this.fontRendererObj.drawStringWithShadow("§8im Lager", 355, y, 0xFFFFFF); y += 12; List zeilen = sammeln(jetzt); int platz = Math.max((this.height - 46 - y) / 11, 1); rollen = Math.max(Math.min(rollen, zeilen.size() - platz), 0); if (zeilen.isEmpty()) { this.fontRendererObj.drawStringWithShadow( "§8Noch nichts gezaehlt. Bau was ab, dann steht es hier.", 26, y, 0xFFFFFF); } for (int i = rollen; i < zeilen.size() && i - rollen < platz; i++) { Zeile z = zeilen.get(i); String name = z.name.length() > 28 ? z.name.substring(0, 27) + "…" : z.name; this.fontRendererObj.drawStringWithShadow("§f" + name, 26, y, 0xFFFFFF); this.fontRendererObj.drawStringWithShadow( z.gefarmt > 0 ? "§7" + ZAHL.format(z.gefarmt) : "§8—", 190, y, 0xFFFFFF); this.fontRendererObj.drawStringWithShadow(z.proStunde == null ? "§8—" : "§a+" + ZAHL.format(Math.round(z.proStunde)) + " §8/h", 275, y, 0xFFFFFF); this.fontRendererObj.drawStringWithShadow( z.imLager > 0 ? "§7" + ZAHL.format(z.imLager) : "§8—", 355, y, 0xFFFFFF); y += 11; } if (zeilen.size() > platz) { drawCenteredString(this.fontRendererObj, "§8" + (zeilen.size() - platz) + " weitere — Mausrad rollt", m, this.height - 40, 0xFFFFFF); } drawCenteredString(this.fontRendererObj, "§8Gezaehlt wird, was wirklich bei dir ankommt — nicht der Klick.", m, this.height - 28, 0xFFFFFF); drawCenteredString(this.fontRendererObj, "§8Beim Kistenschieben zaehle ich nicht mit · Escape schliesst", m, this.height - 16, 0xFFFFFF); super.drawScreen(mx, my, t); } private static class Zeile { String name; long gefarmt; long imLager; Double proStunde; } /** Eingesammeltes und Lagerbestand zusammenwerfen. */ private List sammeln(long jetzt) { Map bestand = mod.gesamtbestand(); Set namen = new HashSet(); namen.addAll(mod.farm.gesamt.keySet()); namen.addAll(bestand.keySet()); List liste = new ArrayList(); for (String n : namen) { Zeile z = new Zeile(); z.name = LagerMod.ohneFarben(n); Long g = mod.farm.gesamt.get(n); z.gefarmt = g == null ? 0 : g; Integer l = bestand.get(n); z.imLager = l == null ? 0 : l; z.proStunde = mod.farm.gefarmtProStunde(n, jetzt); liste.add(z); } // Was am schnellsten reinkommt, steht oben. Collections.sort(liste, new Comparator() { public int compare(Zeile a, Zeile b) { double ra = a.proStunde == null ? -1 : a.proStunde; double rb = b.proStunde == null ? -1 : b.proStunde; if (ra != rb) { return Double.compare(rb, ra); } if (a.gefarmt != b.gefarmt) { return Long.compare(b.gefarmt, a.gefarmt); } return Long.compare(b.imLager, a.imLager); } }); return liste; } @Override public void handleMouseInput() { super.handleMouseInput(); int rad = org.lwjgl.input.Mouse.getEventDWheel(); if (rad > 0) { rollen = Math.max(rollen - 2, 0); } else if (rad < 0) { rollen += 2; } } @Override protected void keyTyped(char zeichen, int code) { if (code == Keyboard.KEY_ESCAPE || code == Keyboard.KEY_RETURN || code == Keyboard.KEY_NUMPADENTER) { this.mc.displayGuiScreen(null); } } @Override public boolean doesGuiPauseGame() { return false; } }