From 6114da126ae640d03c9a7ac7557089b9be233d66 Mon Sep 17 00:00:00 2001 From: Sen Date: Wed, 11 Jun 2025 18:42:53 +0200 Subject: [PATCH] fix fonts --- client/src/main/java/client/Client.java | 54 ++++++++++-------- client/src/main/java/client/gui/Font.java | 20 +++---- .../client/gui/container/GuiContainer.java | 3 +- .../java/client/gui/options/GuiStyle.java | 2 + .../main/java/client/renderer/Drawing.java | 4 +- .../tileentity/TileEntitySignRenderer.java | 2 +- client/src/main/resources/textures/font.png | Bin 8430 -> 8393 bytes .../src/main/resources/textures/font_old.png | Bin 0 -> 8430 bytes .../src/main/resources/textures/font_tiny.png | Bin 0 -> 1536 bytes common/src/main/java/common/tags/TagList.java | 2 +- .../server/command/CommandEnvironment.java | 31 +--------- .../main/java/server/command/UserPolicy.java | 5 ++ .../command/commands/CommandEntity.java | 46 +++++++++++++++ .../server/command/commands/CommandHelp.java | 36 ++++++++---- 14 files changed, 124 insertions(+), 81 deletions(-) create mode 100644 client/src/main/resources/textures/font_old.png create mode 100644 client/src/main/resources/textures/font_tiny.png create mode 100644 server/src/main/java/server/command/commands/CommandEntity.java diff --git a/client/src/main/java/client/Client.java b/client/src/main/java/client/Client.java index 6fb50f5..d73b54b 100755 --- a/client/src/main/java/client/Client.java +++ b/client/src/main/java/client/Client.java @@ -241,8 +241,8 @@ public class Client implements IThreadListener { } } - public static class RedrawFunction implements FloatFunction { - public void apply(FloatVar cv, float value) { + public static class RedrawFunction implements IntFunction { + public void apply(IntVar cv, int value) { Client.CLIENT.rescale(); } } @@ -253,6 +253,13 @@ public class Client implements IThreadListener { } } + public static class FontFunction implements BoolFunction { + public void apply(BoolVar cv, boolean value) { + Font.load(value); + Client.CLIENT.rescale(); + } + } + private interface DebugRunner { void execute(Keysym key); } @@ -420,8 +427,8 @@ public class Client implements IThreadListener { public int mouse_x; public int mouse_y; - @Variable(name = "gui_scale", category = CVarCategory.GUI, min = 1.0f, max = 5.0f, display = "Skalierung der Benutzeroberfläche", precision = 1, unit = "%", callback = RedrawFunction.class) - private float scale = 1.0f; + @Variable(name = "gui_scale", category = CVarCategory.GUI, min = 1, max = 5, display = "Skalierung der Benutzeroberfläche", unit = "x", callback = RedrawFunction.class) + private int scale = 1; @Variable(name = "phy_sensitivity", category = CVarCategory.INPUT, min = 0.01f, max = 10.0f, display = "Mausempfindlichkeit", precision = 2, unit = "%") public float sensitivity = 1.0f; @@ -463,6 +470,8 @@ public class Client implements IThreadListener { public Style style = Style.DEFAULT; @Variable(name = "gui_scroll_lines", category = CVarCategory.GUI, min = 1, max = 10, display = "Scrollbreite", unit = "Zeilen") public int scrollLines = 3; + @Variable(name = "gui_font_tiny", category = CVarCategory.GUI, display = "Kleine Schriftart", callback = FontFunction.class) + public boolean tinyFont = false; @@ -978,10 +987,10 @@ public class Client implements IThreadListener { String name = (potion.isBadEffect() ? TextColor.ORANGE : TextColor.ACID) + effect.getEffectName(); String desc = TextColor.NEON + effect.getDurationString(); // Drawing.drawRectColor(x, y, 250, Font.DEFAULT.yglyph + 2, color | 0xff000000); - Drawing.drawRectBorder(x, y, 250, Font.YGLYPH + 4, 0xff000000, 0xff202020, 0xffcfcfcf, 0xff6f6f6f); - Drawing.drawGradient(x + 2, y + 2, effect.isInfinite() ? 246 : ((int)(246.0f * ((float)effect.getRemaining() / (float)effect.getDuration()))), Font.YGLYPH, color | 0xff000000, Util.mixColor(color | 0xff000000, 0xff000000)); - Drawing.drawText(name, x + 4, y + 2, 0xffffffff); - Drawing.drawTextRight(desc, x + 250 - 4, y + 2, 0xffffffff); + Drawing.drawRectBorder(x, y, 250, Font.YGLYPH + 6, 0xff000000, 0xff202020, 0xffcfcfcf, 0xff6f6f6f); + Drawing.drawGradient(x + 2, y + 2, effect.isInfinite() ? 246 : ((int)(246.0f * ((float)effect.getRemaining() / (float)effect.getDuration()))), Font.YGLYPH + 2, color | 0xff000000, Util.mixColor(color | 0xff000000, 0xff000000)); + Drawing.drawText(name, x + 4, y + 3, 0xffffffff); + Drawing.drawTextRight(desc, x + 250 - 4, y + 3, 0xffffffff); y += 24; } } @@ -1990,8 +1999,8 @@ public class Client implements IThreadListener { GL11.glViewport(0, 0, x, y); fb_raw_x = x; fb_raw_y = y; - fb_x = Math.max((int)((float)x / this.scale), 1); - fb_y = Math.max((int)((float)y / this.scale), 1); + fb_x = Math.max(x / this.scale, 1); + fb_y = Math.max(y / this.scale, 1); if(this.open != null) { this.refreshing = true; this.displayGuiScreen(this.open); @@ -2015,8 +2024,8 @@ public class Client implements IThreadListener { this.moveCamera((float)(x - mouse_raw_x) * sensitivity, (float)(mouse_raw_y - y) * sensitivity); mouse_raw_x = x; mouse_raw_y = y; - mouse_x = (int)((float)x / this.scale); - mouse_y = (int)((float)y / this.scale); + mouse_x = x / this.scale; + mouse_y = y / this.scale; mouseFirst = false; if(open != null && Bind.isInputEnabled() && Button.isMouseDown() /* && !(win->mouse & 0xfc) */ && !ctrl()) { // if(mouse_clickx < 0 || mouse_clicky < 0) { @@ -2100,9 +2109,8 @@ public class Client implements IThreadListener { } private void rescale() { - Font.setScale(this.scale); - this.fb_x = Math.max((int)((float)this.fb_raw_x / this.scale), 1); - this.fb_y = Math.max((int)((float)this.fb_raw_y / this.scale), 1); + this.fb_x = Math.max(this.fb_raw_x / this.scale, 1); + this.fb_y = Math.max(this.fb_raw_y / this.scale, 1); if(this.open != null) { this.refreshing = true; this.displayGuiScreen(this.open); @@ -2200,12 +2208,12 @@ public class Client implements IThreadListener { GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glLoadIdentity(); GL11.glTranslatef(0.0F, 0.0F, -2000.0F); - if(this.scale != 1.0f) - GL11.glScalef(this.scale, this.scale, 1.0f); + if(this.scale != 1) + GL11.glScalef((float)this.scale, (float)this.scale, 1.0f); } public void scissor(int x, int y, int width, int height) { - GL11.glScissor((int)((float)x * this.scale), (int)((float)y * this.scale), (int)((float)width * this.scale), (int)((float)height * this.scale)); + GL11.glScissor(x * this.scale, y * this.scale, width * this.scale, height * this.scale); } private void addFrame(long runningTime) @@ -2255,7 +2263,7 @@ public class Client implements IThreadListener { this.registerDebug(); System.gc(); System.gc(); - Font.load(); + Font.load(false); GlState.enableBlend(); GlState.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); this.initConsole(); @@ -3226,10 +3234,10 @@ public class Client implements IThreadListener { int by = 0; for(Entry elem : this.playerList.entrySet()) { int x = this.fb_x / 2 - (w * 300) / 2 + bx * 300; - int y = 10 + by * Font.YGLYPH; - Drawing.drawGradient(x, y, 300, Font.YGLYPH, 0x7f404040, 0x7f000000); - Drawing.drawText(elem.getKey(), x + 4, y, 0xffffffff); - Drawing.drawTextRight(formatPing(elem.getValue()), x + 300 - 4, y, 0xffffffff); + int y = 10 + by * (Font.YGLYPH + 2); + Drawing.drawGradient(x, y, 300, Font.YGLYPH + 2, 0x7f404040, 0x7f000000); + Drawing.drawText(elem.getKey(), x + 4, y + 1, 0xffffffff); + Drawing.drawTextRight(formatPing(elem.getValue()), x + 300 - 4, y + 1, 0xffffffff); if(++bx >= w) { bx = 0; ++by; diff --git a/client/src/main/java/client/gui/Font.java b/client/src/main/java/client/gui/Font.java index 0b3f9bd..2ddfabe 100644 --- a/client/src/main/java/client/gui/Font.java +++ b/client/src/main/java/client/gui/Font.java @@ -13,8 +13,9 @@ import common.log.Log; public class Font { public static final FontChar[] SIZES = new FontChar[256]; - public static final int XGLYPH = 12; - public static final int YGLYPH = 18; + + public static int XGLYPH = 12; + public static int YGLYPH = 14; private static int texture; @@ -72,10 +73,12 @@ public class Font { } } - public static void load() { + public static void load(boolean tiny) { + XGLYPH = tiny ? 6 : 12; + YGLYPH = tiny ? 7 : 14; BufferedImage img = null; try { - img = TextureUtil.readImage(FileUtils.getResource("textures/font.png")); + img = TextureUtil.readImage(FileUtils.getResource("textures/font" + (tiny ? "_tiny" : "") + ".png")); } catch(FileNotFoundException e) { Log.IO.error("Konnte Font-Textur nicht laden: Datei nicht vorhanden"); @@ -104,13 +107,4 @@ public class Font { texture = 0; } } - - public static void setScale(float scale) { - if(texture != 0) { - GlState.bindTexture(texture); - boolean linear = scale % 1.0f > 0.0f; - GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, linear ? GL11.GL_LINEAR : GL11.GL_NEAREST); - GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, linear ? GL11.GL_LINEAR : GL11.GL_NEAREST); - } - } } diff --git a/client/src/main/java/client/gui/container/GuiContainer.java b/client/src/main/java/client/gui/container/GuiContainer.java index 7f1eeff..967dfa5 100755 --- a/client/src/main/java/client/gui/container/GuiContainer.java +++ b/client/src/main/java/client/gui/container/GuiContainer.java @@ -6,6 +6,7 @@ import java.util.Set; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL13; +import client.gui.Font; import client.gui.Gui; import client.gui.element.InventoryButton; import client.renderer.Drawing; @@ -1104,7 +1105,7 @@ public abstract class GuiContainer extends Gui // int y = ; // x = x * 2 + this.container_x; // y = y * 2 + this.container_y; - Drawing.drawTextRight(s, xPosition + 32, yPosition + 17, 0xffffffff); + Drawing.drawTextRight(s, xPosition + 32, yPosition + 33 - Font.YGLYPH, 0xffffffff); } if (stack.isItemDamaged()) diff --git a/client/src/main/java/client/gui/options/GuiStyle.java b/client/src/main/java/client/gui/options/GuiStyle.java index 7905591..db064b5 100644 --- a/client/src/main/java/client/gui/options/GuiStyle.java +++ b/client/src/main/java/client/gui/options/GuiStyle.java @@ -72,6 +72,8 @@ public class GuiStyle extends GuiOptions implements DropdownCallback, Bu new SelectableButton(10 + (z % 3) * 320, 360 + (z / 3) * 40, 300, 24, callback, theme.name, theme == this.gm.style)); z++; } + + this.addSelector("gui_font_tiny", 10, height - 124, 300, 24); String[] values = new String[] {"VALUE 1", "VALUE 2"}; this.add(new Dropdown(10, height - 74, 300, 24, false, values, values[1], values[0], this, "DROPDOWN")); diff --git a/client/src/main/java/client/renderer/Drawing.java b/client/src/main/java/client/renderer/Drawing.java index 16c9962..1ce4933 100644 --- a/client/src/main/java/client/renderer/Drawing.java +++ b/client/src/main/java/client/renderer/Drawing.java @@ -507,8 +507,8 @@ public abstract class Drawing { public static void drawTextbox(String str, int x, int y, int back) { Vec2i size = getSize(str); - drawRect(x, y, size.xpos + 4, size.ypos, back); - drawText(str, x + 2, y, 0xffffffff); + drawRect(x, y, size.xpos + 4, size.ypos + 2, back); + drawText(str, x + 2, y + 1, 0xffffffff); } public static void drawTextboxRight(String str, int x, int y, int back) { diff --git a/client/src/main/java/client/renderer/tileentity/TileEntitySignRenderer.java b/client/src/main/java/client/renderer/tileentity/TileEntitySignRenderer.java index 22d543c..deabd4a 100755 --- a/client/src/main/java/client/renderer/tileentity/TileEntitySignRenderer.java +++ b/client/src/main/java/client/renderer/tileentity/TileEntitySignRenderer.java @@ -103,7 +103,7 @@ public class TileEntitySignRenderer extends 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 delta 4831 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 HbL4*klMIkx literal 0 HcmV?d00001 diff --git a/client/src/main/resources/textures/font_tiny.png b/client/src/main/resources/textures/font_tiny.png new file mode 100644 index 0000000000000000000000000000000000000000..3d1c6d9a18cc45908ea29866a382a98ce120dcff GIT binary patch literal 1536 zcmV+b2LJhqP)`iA5d&mWr`!Ml02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00n4CL_t(|+U;G@lH?!=lvMuz zm$}#5BmxZ>HG@@KvzK$Cu|b+vv&77;%Di&a5EK9fK$QZZ0H{&`6aZBUfC8XO0Z;%` zDF6z9Dr*D4mrvw7(Zat504D-78ZZX0%>t979zd7Rr-$Op|IwxXQ=Myl7TSJ#DC*Sb z&NZ6tVVN<21aP#$TZu*cxo;bnSbFRlrXoKm*!|C@Qh&VxU!|Hs2LVR0uG+#R8P4Bm?k zZLFL(-1>eP+>3?a!^Z2DK-LVjl?3Y8V>OfrSkxeH;}c;)lGPIUz~}&xk=IMcK#u1n zfCZUIK}3p>ER>CwOUgj7F%WtaH{?1wJb<+RoPj9MLN-i+dw3Et5@>F-41_ZflXK>v z88o!YWExsU0KiKJTd+Pm>84e~;fB*|>3Xjpz2DV)9hZPg?OByXgCxQVkO0k~_JV3V zo|u5JuNzr74FLK8-;vNTZc4SijUz1))+y?J=?$jTv5)e?tvLlfCp{ zIBP17?20HgG{L)$WJ{rj?-D>PJ)(wM6EqKPMe?LlLsu$i4Z*Y=ptaVh)KKi1qk;dn zldjaz7z?5(Fr|j(P+94G8(RS=HPqjC>Ug_q)TM^TsIK;`>Npe)oy>xYhQ1s4)gX+d z?Wnrx334NkD0%J?rMb8I=fm7e0YnM-4hO$KQmf%kU`5+hH@qEz&PEdxdie2rSZj9S z&Z70xAaEIFK^iMypswcD40srF293afqlV%m+oWkr=|sYU*CcNiAoev zjffo*3-Wp!38dTS5wKijKuHL0=wN3onxhB15zmu6=GM-kSgw}?Q)gOwVnPG}leJ@k z3?N55pm(oZ{nL^-SZjD3ftSxaqsmdV>@>g|6MBHSF9P61Xid6Gy$=qOf)kXk?!G zqNKWSN()jRFsvK*3#Zvn82TDeso5Y3#c zw0F0qES(U29e|p87V&^869Fg>s382?9^jd-`0M?t^?=FA;;}(zSMZF?cHtK`%^G}k z5q~Ey*un!4V0J27c!2cohgocD$X^6M7q^rz_67cPwqK-`%K%x4*bgOQrG`!fpw!Ss zJfO-%0LlX<0#HGC0T0-jwr2I`cAp*9&`$;Q-PF)o)7UT%*i8-fp6Fk;?Do>W-KU entities, TagObject tag) { + int done = 0; + for(Entity entity : entities) { + if(entity.isEntityAlive()) { + BlockPos pos = entity.getPosition(); + TagObject etag = new TagObject(); + entity.writeTags(etag); + if(tag == null) { + exec.logConsole("************************************************************"); + exec.logConsole("Daten von %s bei %d, %d, %d in %s:", entity.getCommandName(), pos.getX(), pos.getY(), pos.getZ(), entity.worldObj.dimension.getFormattedName(false)); + exec.logConsole(etag.format(4)); + } + else { + etag.merge(tag); + entity.readTags(etag); + exec.logConsole("Daten von %s bei %d, %d, %d in %s geändert", entity.getCommandName(), pos.getX(), pos.getY(), pos.getZ(), entity.worldObj.dimension.getFormattedName(false)); + } + done++; + } + } + if(tag != null && done > 1) + exec.logConsole("Daten von %d Objekten geändert", done); + return done; + } +} diff --git a/server/src/main/java/server/command/commands/CommandHelp.java b/server/src/main/java/server/command/commands/CommandHelp.java index c92d042..9a667ab 100644 --- a/server/src/main/java/server/command/commands/CommandHelp.java +++ b/server/src/main/java/server/command/commands/CommandHelp.java @@ -1,5 +1,6 @@ package server.command.commands; +import java.util.Collection; import java.util.List; import java.util.Map.Entry; import java.util.function.Function; @@ -12,24 +13,24 @@ import server.command.Command; import server.command.CommandEnvironment; import server.command.Executor; import server.command.Parameter; +import server.command.RunException; +import server.command.StringCompleter; public class CommandHelp extends Command { public CommandHelp(CommandEnvironment env) { super("help"); this.setParamsOptional(); - this.addEnum("command", CachedExecutable.class, env.getExecutables().values()); + this.addString("command", false, new StringCompleter() { + public Collection complete(CommandEnvironment env) { + return env.getExecutables().keySet(); + } + }); } - public void exec(CommandEnvironment env, Executor exec, CachedExecutable command) { - if(command == null) { - for(CachedExecutable cmd : env.getExecutables().values()) { - this.exec(env, exec, cmd); - } - return; - } + private void formatCommand(CommandEnvironment env, Executor exec, CachedExecutable cmd) { List list = Lists.newArrayList(); - for(Entry entry : command.parameters().entrySet()) { + for(Entry entry : cmd.parameters().entrySet()) { Parameter param = entry.getValue(); boolean required = param.neededIn(env); if(entry.getKey().length() == 1 && !param.positional() && param.shorthand()) { @@ -42,7 +43,7 @@ public class CommandHelp extends Command { }, param.parsers()))) + (required ? ">" : "]")); } } - for(Parameter param : command.positionals()) { + for(Parameter param : cmd.positionals()) { boolean required = param.neededIn(env); list.add((required ? "<" : "[") + (param.parsers().size() == 1 && param.parsers().get(0).getName().equals(param.name()) ? param.name() : @@ -52,6 +53,19 @@ public class CommandHelp extends Command { } }, param.parsers())) + (required ? ">" : "]")); } - exec.logConsole("%s %s", command.name(), Util.buildLines(" ", list)); + exec.logConsole("%s %s", cmd.name(), Util.buildLines(" ", list)); + } + + public void exec(CommandEnvironment env, Executor exec, String command) { + if(command == null) { + for(CachedExecutable cmd : env.getExecutables().values()) { + this.formatCommand(env, exec, cmd); + } + return; + } + CachedExecutable cmd = env.getExecutables().get(command); + if(cmd == null) + throw new RunException("Befehl '%s' ist nicht bekannt", command); + this.formatCommand(env, exec, cmd); } }