diff --git a/game/client/src/main/java/net/minecraft/client/Minecraft.java b/game/client/src/main/java/net/minecraft/client/Minecraft.java
index 2383491e3..f13f5ef15 100644
--- a/game/client/src/main/java/net/minecraft/client/Minecraft.java
+++ b/game/client/src/main/java/net/minecraft/client/Minecraft.java
@@ -30,9 +30,9 @@ import net.minecraft.client.holiday.Holidays;
 import net.minecraft.client.net.handler.PacketHandlerClient;
 import net.minecraft.client.render.block.model.BlockModelGrass;
 import net.minecraft.client.render.font.FontDefault;
-import net.minecraft.client.render.font.FontMonospace;
 import net.minecraft.client.render.font.FontRenderer;
 import net.minecraft.client.render.font.FontRendererDefault;
+import net.minecraft.client.render.font.Fonts;
 import net.minecraft.client.world.WorldClient;
 import net.minecraft.client.world.chunk.provider.ChunkProviderStatic;
 import net.minecraft.core.achievement.Achievements;
@@ -313,7 +313,7 @@ public class Minecraft
         this.gameSettings = new GameSettings(this, mcDataDir);
         this.texturePackList = new TexturePackList(this, this.mcDataDir);
         this.textureManager = new TextureManager(this, this.texturePackList, this.gameSettings);
-        this.font = new FontRendererDefault(new FontDefault(this.textureManager));
+        this.font = new FontRendererDefault();
 
         if(test) return;
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ExceptionPopupElement.java b/game/client/src/main/java/net/minecraft/client/gui/ExceptionPopupElement.java
index 768e35691..2abe35c8f 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ExceptionPopupElement.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ExceptionPopupElement.java
@@ -51,7 +51,7 @@ public class ExceptionPopupElement {
 
 
         PopupScreen popup = new PopupBuilder(parent,860/scale).withLabel("gui.exception.label.exception_occurred")
-                .withMessageBox("gui.exception.list",400/scale,s.toString(),(860/scale) / mc.font.charWidth('m'))
+                .withMessageBox("gui.exception.list",400/scale,s.toString(),(860/scale) / mc.font.getFont().charWidth('m'))
                 .withButtonGroup("gui.exception.choice",new String[]{"gui.exception.button.back","gui.exception.button.copy_error"},new int[]{0,1})
                 .withOnCloseListener(new PopupListener(mc,s.toString().replaceAll("§[0-9a-f|klmnor]","")))
                 .build();
@@ -95,7 +95,7 @@ public class ExceptionPopupElement {
         ScreenBlank screen = new ScreenBlank();
         mc.displayScreen(screen);
         PopupScreen popup = new PopupBuilder(screen,860/scale).withLabel("gui.exception.label.fatal_error")
-                .withMessageBox("gui.exception.list",400/scale,s.toString(),(860/scale) / mc.font.charWidth('m'))
+                .withMessageBox("gui.exception.list",400/scale,s.toString(),(860/scale) / mc.font.getFont().charWidth('m'))
                 .withButtonGroup("gui.exception.choice",new String[]{"gui.exception.button.copy_error","gui.exception.button.copy_error_and_quit"},new int[]{0,2},new boolean[]{false,true})
                 .withBackgroundColor(0xff402020, 0xff501010)
                 .withOnCloseListener(new PopupListener(mc,s.toString().replaceAll("§[0-9a-f|klmnor]","")))
@@ -140,7 +140,7 @@ public class ExceptionPopupElement {
         ScreenBlank screen = new ScreenBlank();
         mc.displayScreen(screen);
         PopupScreen popup = new PopupBuilder(screen,860/scale).withLabel("gui.exception.label.startup_error")
-                .withMessageBox("gui.exception.list",400/scale,s.toString(),(860/scale) / mc.font.charWidth('m'))
+                .withMessageBox("gui.exception.list",400/scale,s.toString(),(860/scale) / mc.font.getFont().charWidth('m'))
                 .withButtonGroup("gui.exception.choice",new String[]{"gui.exception.button.copy_error","gui.exception.button.copy_error_and_quit"},new int[]{0,2},new boolean[]{false,true})
                 .withBackgroundColor(0xff402020, 0xff501010)
                 .withOnCloseListener(new PopupListener(mc,s.toString().replaceAll("§[0-9a-f|klmnor]","")))
diff --git a/game/client/src/main/java/net/minecraft/client/gui/Gui.java b/game/client/src/main/java/net/minecraft/client/gui/Gui.java
index b3abca07c..f9d726850 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/Gui.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/Gui.java
@@ -4,7 +4,6 @@ import static org.lwjgl.opengl.GL11.*;
 
 import net.minecraft.client.render.TextureManager;
 import net.minecraft.client.render.font.FontRenderer;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.texture.Texture;
 import net.minecraft.client.render.texture.meta.gui.GuiTextureProperties;
 import net.minecraft.client.render.texture.stitcher.IconCoordinate;
@@ -218,23 +217,23 @@ public class Gui
     }
 
     public void drawStringCenteredShadow(final @NotNull FontRenderer fontRenderer, final @NotNull CharSequence chars, final int x, final int y, final int argb) {
-        FontHelper.renderCentered(Tessellator.instance, chars, x, y).setZ(this.zLevel).setShadow().setColor(argb).call(fontRenderer);
+        fontRenderer.renderCentered(Tessellator.instance, chars, x, y).setZ(this.zLevel).setShadow().setColor(argb).call();
     }
     
     public void drawStringCenteredNoShadow(final @NotNull FontRenderer fontRenderer, final @NotNull CharSequence chars, final int x, final int y, final int argb) {
-        FontHelper.renderCentered(Tessellator.instance, chars, x, y).setZ(this.zLevel).setColor(argb).call(fontRenderer);
+        fontRenderer.renderCentered(Tessellator.instance, chars, x, y).setZ(this.zLevel).setColor(argb).call();
     }
 
     public void drawStringShadow(final @NotNull FontRenderer fontRenderer, final @NotNull CharSequence chars, final int x, final int y, final int argb) {
-        FontHelper.render(Tessellator.instance, chars, x, y).setZ(this.zLevel).setShadow().setColor(argb).call(fontRenderer);
+        fontRenderer.render(Tessellator.instance, chars, x, y).setZ(this.zLevel).setShadow().setColor(argb).call();
     }
     
     public void drawStringNoShadow(final @NotNull FontRenderer fontRenderer, final @NotNull CharSequence chars, final int x, final int y, final int argb) {
-        FontHelper.render(Tessellator.instance, chars, x, y).setZ(this.zLevel).setColor(argb).call(fontRenderer);
+        fontRenderer.render(Tessellator.instance, chars, x, y).setZ(this.zLevel).setColor(argb).call();
     }
 
     public void drawStringConstrained(final @NotNull FontRenderer fontRenderer, final @NotNull CharSequence chars, final int x, final int y, final int maxWidth, final int argb) {
-        FontHelper.renderWidthConstrained(Tessellator.instance, chars, x, y, maxWidth).setZ(this.zLevel).setColor(argb).call(fontRenderer);
+        fontRenderer.renderWidthConstrained(Tessellator.instance, chars, x, y, maxWidth).setZ(this.zLevel).setColor(argb).call();
     }
 
     public void drawTexturedModalRect(final int x, final int y, final int u, final int v, final int width, final int height)
diff --git a/game/client/src/main/java/net/minecraft/client/gui/HeldItemTooltipElement.java b/game/client/src/main/java/net/minecraft/client/gui/HeldItemTooltipElement.java
index f0433812c..7bd5e1000 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/HeldItemTooltipElement.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/HeldItemTooltipElement.java
@@ -4,7 +4,6 @@ import static org.lwjgl.opengl.GL11.*;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.option.Option;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.client.util.helper.Colors;
@@ -128,7 +127,7 @@ public class HeldItemTooltipElement extends Gui {
 			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 		}
 
-		FontHelper.renderCentered(Tessellator.instance, this.string, x, y).setShadow().setColor(rgb).call(mc.font);
+		mc.font.renderCentered(Tessellator.instance, this.string, x, y).setShadow().setColor(rgb).call();
 
 		glDisable(GL_BLEND);
 		glEnable(GL_ALPHA_TEST);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenConsole.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenConsole.java
index f39fb603f..50f7557bd 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenConsole.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenConsole.java
@@ -11,7 +11,7 @@ import net.minecraft.client.render.font.FontMonospace;
 import net.minecraft.client.console.shell.RuntimeExecutor;
 import net.minecraft.client.render.font.FontRenderer;
 import net.minecraft.client.render.font.FontRendererDefault;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
+import net.minecraft.client.render.font.Fonts;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.render.window.CursorShape;
 import net.minecraft.core.net.command.TextFormatting;
@@ -38,7 +38,7 @@ public class ScreenConsole extends Screen {
 
         private final @NotNull Map<LogMessage.@NotNull Level, @NotNull TextFormatting> preludes = new HashMap<>();
 
-        private @Nullable FontRenderer fontRenderer = null;
+        private final @NotNull FontRenderer fontRenderer = new FontRendererDefault(Fonts.MONOSPACE);
 
         private int width = 0;
         private int scroll = 0;
@@ -53,8 +53,6 @@ public class ScreenConsole extends Screen {
 
         public void init(final @NotNull Minecraft mc, final int width) {
             this.width = width;
-            this.fontRenderer = new FontRendererDefault(new FontMonospace(mc.textureManager));
-            this.fontRenderer.init(mc.texturePackList);
 
             initWorkedLines();
             final @NotNull List<@NotNull String> workedLine = new ArrayList<>();
@@ -76,9 +74,7 @@ public class ScreenConsole extends Screen {
             final int lines = Math.min(heightLines, WORKED_LINES.size() - this.scroll);
             for (int i = lines - 1; i >= 0; i--) {
                 final @NotNull String line = WORKED_LINES.get((WORKED_LINES.size() - 1) - (i + this.scroll));
-                if (this.fontRenderer != null) {
-                    FontHelper.render(Tessellator.instance, line, x, y + getHeight(numLines) - LINE_HEIGHT - LINE_HEIGHT * i).setColor(0xFF_CF_CF_CF).call(this.fontRenderer);
-                }
+                this.fontRenderer.render(Tessellator.instance, line, x, y + getHeight(numLines) - LINE_HEIGHT - LINE_HEIGHT * i).setColor(0xFF_CF_CF_CF).call();
             }
             renderScrollIndicator(x, y, numLines);
         }
@@ -139,10 +135,6 @@ public class ScreenConsole extends Screen {
         }
 
         private void formatString(final @NotNull LogMessage message, final @NotNull List<@NotNull String> out) {
-            if (this.fontRenderer == null) {
-                return;
-            }
-
             out.clear();
             final @NotNull String @NotNull[] workedString = message.getMessage()
                 .replace("\r\n", "\n")
@@ -164,9 +156,9 @@ public class ScreenConsole extends Screen {
                         if (newFormat != null) {
                             nextFormat = newFormat;
                         }
-                        lineWidth -= this.fontRenderer.charWidth(c) + this.fontRenderer.charWidth(trimmedLine.charAt(i + 1));
+                        lineWidth -= this.fontRenderer.getFont().charWidth(c) + this.fontRenderer.getFont().charWidth(trimmedLine.charAt(i + 1));
                     }
-                    final int cWidth = this.fontRenderer.charWidth(c);
+                    final int cWidth = this.fontRenderer.getFont().charWidth(c);
                     if (lineWidth + cWidth >= this.width) {
                         out.add(currentFormat.toString() + sb);
                         sb = new StringBuilder();
@@ -185,7 +177,7 @@ public class ScreenConsole extends Screen {
         private static final @NotNull List<@NotNull String> HISTORY = new ArrayList<>();
         private static final @Nullable RuntimeExecutor EXECUTOR = new RuntimeExecutor();
 
-        private @Nullable FontRenderer fontRenderer = null;
+        private final @NotNull FontRenderer fontRenderer = new FontRendererDefault(Fonts.MONOSPACE);
 
         private @NotNull String text = "";
         private @NotNull String highlightedText = "";
@@ -200,18 +192,11 @@ public class ScreenConsole extends Screen {
             this.editor = new TextFieldEditor(this, true);
         }
 
-        public void init(final @NotNull Minecraft mc) {
-            this.fontRenderer = new FontRendererDefault(new FontMonospace(mc.textureManager));
-            this.fontRenderer.init(mc.texturePackList);
-        }
-
         public void tick() {
             this.cursorCounter++;
         }
 
         public void render(final int x, final int y) {
-            if (this.fontRenderer == null) return;
-
             boolean addedStart = false;
             final @NotNull String @NotNull[] splitHighlighted = this.highlightedText.split("\n", -1);
             for (int i = 0; i < splitHighlighted.length; i++) {
@@ -239,8 +224,6 @@ public class ScreenConsole extends Screen {
         }
 
         public void click(final int mx, final int my) {
-            if (this.fontRenderer == null) return;
-
             final int oneChar = MathHelper.ceil(this.fontRenderer.stringWidthDouble(" "));
 
             final int cx = (mx - (oneChar * 2)) / oneChar;
@@ -379,10 +362,6 @@ public class ScreenConsole extends Screen {
         }
 
         private int @NotNull[] getCursor() {
-            if (this.fontRenderer == null) {
-                return new int[2];
-            }
-
             final @NotNull String @NotNull[] split = this.text.split("\n", -1);
 
             int cursor = this.editor.getCursor();
@@ -443,7 +422,6 @@ public class ScreenConsole extends Screen {
         Keyboard.enableRepeatEvents(true);
 
         this.logRenderer.init(this.mc, this.width - PADDING * 2);
-        this.inputRenderer.init(this.mc);
     }
 
     @Override
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenFontTest.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenFontTest.java
index 9809e3626..9c5823e46 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenFontTest.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenFontTest.java
@@ -1,18 +1,21 @@
 package net.minecraft.client.gui;
 
 import net.minecraft.client.render.font.Alignment;
-import net.minecraft.client.render.font.FontRenderer;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
+import net.minecraft.client.render.font.Fonts;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.net.ChatEmotes;
+import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.util.helper.ChatAllowedCharacters;
+import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.lwjgl.input.Mouse;
-import org.lwjgl.opengl.GL11;
 
 import java.util.Map;
 
 public class ScreenFontTest extends Screen{
+    private static final char[] chars = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'};
+    private static final @NotNull NamespaceID testId = new NamespaceID("test", "value");
+    private static final @NotNull StringBuilder builder = new StringBuilder();
     public double scroll = 0;
     public ScreenFontTest(final @Nullable Screen parent) {
         super(parent);
@@ -22,73 +25,64 @@ public class ScreenFontTest extends Screen{
         renderTexturedBackground();
         super.render(mx, my, partialTick);
 
-        scroll += Mouse.getDWheel() * fontRenderer.fontHeight()/2;
+        this.scroll += Mouse.getDWheel() * this.fontRenderer.getFont().fontHeight();
 
-//        drawStringCenteredNoShadow(this.mc.font, "§l§oBetter than Adventure!", this.width /2, this.height /2 - 30, 0x22ffffff);
-//        this.fontRenderer.renderCentered(Tessellator.instance,  "§l§oBetter than Adventure!", this.width /2, this.height /2 - 20, 0, false, 0xffffffL, null, null, null);
+        final int maxWidth = (int) (width/1.2);
 
-//        FontHelper.renderWidthConstrained(Tessellator.instance,
-//            "§bLorem ipsum dolor sit amet, §+§3consectetur adipiscing elit, sed do eiusmod tempor incididunt §+§1ut labore et §+§rdolore magna aliqua.§- Ut enim §-ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut §-aliquip ex ea commodo consequat. Duis aute irure dolor in §+§rreprehenderit in voluptate velit esse cillum dolore §-eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. \n Test String1!",
-//            (this.width/2) - 120, this.height/2, 240).setColor(0xFFAAFF).call(this.fontRenderer);
-//
-//        FontHelper.render(Tessellator.instance, "Test String2!", (this.width/2) - 120, FontHelper.getLastEndingY()).call(this.fontRenderer);
-//        FontHelper.render(Tessellator.instance, "Test String3!", (this.width/2) - 120, FontHelper.getLastEndingY()).setColor(0xFF0000).call(this.fontRenderer);
-//        FontHelper.render(Tessellator.instance, "Test String4!", (this.width/2) - 120, FontHelper.getLastEndingY()).call(this.fontRenderer);
-
-//        StringBuilder builder = new StringBuilder();
-//        for (char i = 0; i < 256; i++) {
-//            builder.append(i);
-//            if (i != 0 && i % 16 == 0) {
-//                builder.append("\n");
-//            }
-//        }
-//
-//        FontHelper.renderWidthConstrained(Tessellator.instance, builder, (this.width/2) - 120, FontHelper.getLastEndingY(), Integer.MAX_VALUE).call(this.fontRenderer);
-
-        drawRect((width - 400)/2, 10, (width + 400)/2, 400, 0xFF232323);
-        long start = System.currentTimeMillis();
-        final StringBuilder builder = new StringBuilder("§0§0§0§0§<AAAAFF>");
+        drawRect((this.width - maxWidth)/2, 0, (this.width + maxWidth)/2, this.height, 0xFF232323);
+        final long start = System.currentTimeMillis();
+        builder.setLength(0);
+        builder.append("§0§0§0§0§<AAAAFF>");
         for (int i = 0; i < 1000; i++) {
             builder.append("a");
         }
         builder.append("\n").append(ChatAllowedCharacters.ALLOWED_CHARACTERS);
-        builder.append("\n").append("Obfuscation test: §kTEST STRING §r§<FFAAAA> Static Text");
+        builder.append("\n").append("§rItalic test: §oTEST STRING");
+        builder.append("\n").append("§rBold test: §lTEST STRING");
+        builder.append("\n").append("§rUnderline test: §nTEST STRING");
+        builder.append("\n").append("§rStrikethrough test: §mTEST STRING");
+        builder.append("\n").append("§rObfuscation test: §kTEST STRING Static §rText");
+        builder.append("\n").append("§rAll No Obf test: §o§l§n§mTEST STRING");
+        builder.append("\n").append("§rAll test: §k§o§l§n§mTEST STRING§r");
         builder.append("\n").append("\tTab");
         builder.append("\n").append("\t\tTabTab");
         builder.append("\n").append("   TripleSpace");
 
-        for (Map.Entry<String, Character> entry : ChatEmotes.getEmotes().entrySet()) {
+        for (final Map.Entry<String, Character> entry : ChatEmotes.getEmotes().entrySet()) {
             builder.append("\n").append(entry.getKey().replace(":", "")).append(": ").append(entry.getValue());
         }
 
         builder.append("\n§bLorem ipsum dolor sit amet, §+§3consectetur adipiscing elit, sed do eiusmod tempor incididunt §+§1ut labore et §+§rdolore magna aliqua.§- Ut enim §-ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut §-aliquip ex ea commodo consequat. Duis aute irure dolor in §+§rreprehenderit in voluptate velit esse cillum dolore §-eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. \nTest String1!");
-        FontHelper.renderWidthConstrained(Tessellator.instance, builder, (width - 400)/2, (int) (10 + scroll), 400).setAlignment(Alignment.LEFT).setColor(0xFFAAFF).setShadow().call(this.fontRenderer);
+        this.fontRenderer.renderWidthConstrained(Tessellator.instance, builder, (this.width - maxWidth)/2, (int) (10 + this.scroll), maxWidth).setAlignment(Alignment.LEFT).setColor(0xFFAAFF).setShadow().call();
         final long bigStringRenderTime = System.currentTimeMillis() - start;
-        FontHelper.render(Tessellator.instance, "" + bigStringRenderTime/1000f, (width - 400)/2, FontHelper.getLastEndingY() + 20).call(this.fontRenderer);
+        this.fontRenderer.render(Tessellator.instance, bigStringRenderTime/1000f + "s", (this.width - maxWidth)/2, this.fontRenderer.getLastEndingY() + 20).call();
 
         final long memTotal = Runtime.getRuntime().totalMemory();
         final long memFree = Runtime.getRuntime().freeMemory();
         final long memUsed = memTotal - memFree;
 
-        FontHelper.render(Tessellator.instance, "" + memUsed/(1024 * 1024) + "MB", (width - 400)/2, FontHelper.getLastEndingY() + 20).call(this.fontRenderer);
+        this.fontRenderer.render(Tessellator.instance, memUsed/(1024 * 1024) + "MB", (this.width - maxWidth)/2, this.fontRenderer.getLastEndingY()).call();
+
+        this.fontRenderer.render(Tessellator.instance, "Unicode: Better than Adventure", (this.width - maxWidth)/2, this.fontRenderer.getLastEndingY()).setFont(Fonts.UNICODE).call();
+        this.fontRenderer.render(Tessellator.instance, "Default: Better than Adventure", (this.width - maxWidth)/2, this.fontRenderer.getLastEndingY()).setFont(Fonts.DEFAULT).call();
+        this.fontRenderer.render(Tessellator.instance, "Monospace: Better than Adventure", (this.width - maxWidth)/2, this.fontRenderer.getLastEndingY()).setFont(Fonts.MONOSPACE).call();
+
+        int y = this.fontRenderer.getLastEndingY() + 10;
+        this.fontRenderer.render(Tessellator.instance, "String: ", (this.width - maxWidth)/2, y).setColor(0xFFAAFF).call(); this.fontRenderer.render(Tessellator.instance, "Test String", this.fontRenderer.getLastEndingX(), y).call(); y = this.fontRenderer.getLastEndingY();
+        this.fontRenderer.render(Tessellator.instance, "null (Object): ", (this.width - maxWidth)/2, y).setColor(0xFFAAFF).call(); this.fontRenderer.render(Tessellator.instance, (Object) null, this.fontRenderer.getLastEndingX(), y).call(); y = this.fontRenderer.getLastEndingY();
+        this.fontRenderer.render(Tessellator.instance, "object: ", (this.width - maxWidth)/2, y).setColor(0xFFAAFF).call(); this.fontRenderer.render(Tessellator.instance, testId, this.fontRenderer.getLastEndingX(), y).call(); y = this.fontRenderer.getLastEndingY();
+        this.fontRenderer.render(Tessellator.instance, "boolean: ", (this.width - maxWidth)/2, y).setColor(0xFFAAFF).call(); this.fontRenderer.render(Tessellator.instance, true, this.fontRenderer.getLastEndingX(), y).call(); y = this.fontRenderer.getLastEndingY();
+        this.fontRenderer.render(Tessellator.instance, "int: ", (this.width - maxWidth)/2, y).setColor(0xFFAAFF).call(); this.fontRenderer.render(Tessellator.instance, 15, this.fontRenderer.getLastEndingX(), y).call(); y = this.fontRenderer.getLastEndingY();
+        this.fontRenderer.render(Tessellator.instance, "long: ", (this.width - maxWidth)/2, y).setColor(0xFFAAFF).call(); this.fontRenderer.render(Tessellator.instance, 1500L, this.fontRenderer.getLastEndingX(), y).call(); y = this.fontRenderer.getLastEndingY();
+        this.fontRenderer.render(Tessellator.instance, "char: ", (this.width - maxWidth)/2, y).setColor(0xFFAAFF).call(); this.fontRenderer.render(Tessellator.instance, 'a', this.fontRenderer.getLastEndingX(), y).call(); y = this.fontRenderer.getLastEndingY();
+        this.fontRenderer.render(Tessellator.instance, "float: ", (this.width - maxWidth)/2, y).setColor(0xFFAAFF).call(); this.fontRenderer.render(Tessellator.instance, 0.5f, this.fontRenderer.getLastEndingX(), y).call(); y = this.fontRenderer.getLastEndingY();
+        this.fontRenderer.render(Tessellator.instance, "double: ", (this.width - maxWidth)/2, y).setColor(0xFFAAFF).call(); this.fontRenderer.render(Tessellator.instance, 0.5, this.fontRenderer.getLastEndingX(), y).call(); y = this.fontRenderer.getLastEndingY();
+        this.fontRenderer.render(Tessellator.instance, "char array: ", (this.width - maxWidth)/2, y).setColor(0xFFAAFF).call(); this.fontRenderer.render(Tessellator.instance, chars, this.fontRenderer.getLastEndingX(), y).call(); y = this.fontRenderer.getLastEndingY();
 
         final double mouseX = (double) (Mouse.getX() * this.mc.resolution.getScaledWidthScreenCoords()) / this.mc.resolution.getWidthScreenCoords();
         final double mouseY =  (this.mc.resolution.getScaledHeightScreenCoords() - (double) (Mouse.getY() * this.mc.resolution.getScaledHeightScreenCoords()) / this.mc.resolution.getHeightScreenCoords());
 
-        FontHelper.renderDouble(Tessellator.instance, "Double Precision", mouseX - this.fontRenderer.stringWidthDouble("Double Precision") - 3, mouseY - 6).setShadow().call(this.fontRenderer);
-        FontHelper.render(Tessellator.instance, "Int Precision", (int) (mouseX + 3), (int) (mouseY - 5)).setShadow().call(this.fontRenderer);
-
-//        StringBuilder message = new StringBuilder("<Useless7695> ");
-//        for (char i = '!'; i <= '~'; i++) {
-//            message.append(i);
-//        }
-//        for (char i = '!'; i <= '~'; i++) {
-//            message.append(i);
-//        }
-//        for (char i = '!'; i <= '~'; i++) {
-//            message.append(i);
-//        }
-//
-//        FontHelper.renderWidthConstrained(Tessellator.instance, message, (this.width - 320)/2, 10, 320).setShadow().call(this.fontRenderer);
+        this.fontRenderer.renderDouble(Tessellator.instance, "Double Precision", mouseX - this.fontRenderer.stringWidthDouble("Double Precision") - 3, mouseY - 6).setShadow().call();
+        this.fontRenderer.render(Tessellator.instance, "Int Precision", (int) (mouseX + 3), (int) (mouseY - 5)).setShadow().call();
     }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenMissingMinecraft.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenMissingMinecraft.java
index 0922fba33..9f5a24383 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenMissingMinecraft.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenMissingMinecraft.java
@@ -22,7 +22,7 @@ public class ScreenMissingMinecraft extends Screen {
         buttons.add(new ButtonElement(0, width / 2 - 100, height / 4 + 120 + 12, i.translateKey("gui.no_minecraft.button.quit")));
         ClickableLabelElement installLabel = new ClickableLabelElement(1, width / 2 - 170, (height / 4 - 60) + 60 + 64, downloadString, 0x7C99EA);
         buttons.add(installLabel);
-        buttons.add(new ClickableLabelElement(2, 0,  height - mc.font.fontHeight() - 4, i.translateKey("gui.main_menu.button.discord"), 0x5865F2));
+        buttons.add(new ClickableLabelElement(2, 0,  height - mc.font.getFont().fontHeight() - 4, i.translateKey("gui.main_menu.button.discord"), 0x5865F2));
     }
     @Override
     public void render(int mx, int my, float partialTick)
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenSoundTest.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenSoundTest.java
index a87899095..cf5488740 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenSoundTest.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenSoundTest.java
@@ -166,7 +166,7 @@ public class ScreenSoundTest extends Screen {
         builder.append(I18n.getInstance().translateKeyAndFormat("gui.sound_test.label.id", currentEntry == null ? null : currentEntry.getEventID())).append("\n");
         builder.append(I18n.getInstance().translateKeyAndFormat("gui.sound_test.label.subtitle", currentEntry == null ? null : currentEntry.getSubtitleKey(), currentEntry == null ? null : currentEntry.getSubtitleTranslated())).append("\n");
 //        builder.append(I18n.getInstance().translateKeyAndFormat("gui.sound_test.label.url", String.valueOf(currentEntry == null ? null : (showURL ? currentEntry.url : "REDACTED")))).append("\n");
-        fontRenderer.renderWidthConstrained(Tessellator.instance, builder, 5, top + 30, 0, true, 0xBBBBBB, width - 10, Alignment.LEFT, null, null, null);
+        this.fontRenderer.renderWidthConstrained(Tessellator.instance, builder, 5, this.top + 30, this.width - 10).setShadow().setColor(0xBBBBBB).call();
     }
     @Override
     public void renderBackground() {
diff --git a/game/client/src/main/java/net/minecraft/client/gui/TextFieldElement.java b/game/client/src/main/java/net/minecraft/client/gui/TextFieldElement.java
index 617eeccf8..3010e37cb 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/TextFieldElement.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/TextFieldElement.java
@@ -139,7 +139,7 @@ public class TextFieldElement extends Gui implements ITextField
         {
             boolean drawCursor = isFocused && (cursorCounter / 6) % 2 == 0;
             int cursor = editor.getCursor();
-            int maxDisplayableChars = this.width / fontRenderer.charWidth('_');
+            int maxDisplayableChars = this.width / fontRenderer.getFont().charWidth('_');
 
             if(text.length() <= maxDisplayableChars-1){
                 drawStringShadow(fontRenderer, text, xPosition + 4, yPosition + (height - 8) / 2, 0xE0E0E0);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/TooltipElement.java b/game/client/src/main/java/net/minecraft/client/gui/TooltipElement.java
index 4168675e6..58cf00879 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/TooltipElement.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/TooltipElement.java
@@ -8,7 +8,6 @@ import com.google.gson.stream.JsonReader;
 import com.mojang.logging.LogUtils;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.font.FontRenderer;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.texture.stitcher.TextureRegistry;
@@ -96,7 +95,7 @@ public class TooltipElement extends Gui
         drawBackground(x, y, x + width, y + height);
 //        drawRect(x, y, x + width, y + height, 0xFFFFFFFF);
 
-        FontHelper.renderWidthConstrained(Tessellator.instance, chars, x + padding, y + padding, maxWidth).call(this.fontRenderer);
+        this.fontRenderer.renderWidthConstrained(Tessellator.instance, chars, x + padding, y + padding, maxWidth).call();
     }
     public int getPadding(){
         return 0;
diff --git a/game/client/src/main/java/net/minecraft/client/gui/achievements/ScreenAchievements.java b/game/client/src/main/java/net/minecraft/client/gui/achievements/ScreenAchievements.java
index 241dada68..8fa77fe57 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/achievements/ScreenAchievements.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/achievements/ScreenAchievements.java
@@ -11,7 +11,6 @@ import net.minecraft.client.gui.achievements.data.AchievementPages;
 import net.minecraft.client.gui.options.OptionsButtonElement;
 import net.minecraft.client.render.Lighting;
 import net.minecraft.client.render.Scissor;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.item.model.ItemModelDispatcher;
 import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.texture.stitcher.TextureRegistry;
@@ -862,7 +861,7 @@ public class ScreenAchievements extends Screen
                 boxHeight += 12;
             }
             boxRender = tooltip.drawBackground(mouseX, mouseY, TOOLTIP_OFF_X, TOOLTIP_OFF_Y, boxWidth + 3, boxHeight + 3 + 12);
-            FontHelper.renderWidthConstrained(Tessellator.instance, desc, boxRender[0] + padding, boxRender[1] + 12 + padding, boxWidth).setColor(0xffa0a0a0).call(this.fontRenderer);
+            this.fontRenderer.renderWidthConstrained(Tessellator.instance, desc, boxRender[0] + padding, boxRender[1] + 12 + padding, boxWidth).setColor(0xffa0a0a0).call();
             if(statsCounter.isUnlocked(achievement)) { // Add taken string to bottom
                 drawStringShadow(fontRenderer, I18n.getInstance().translateKey("gui.achievements.label.taken"), boxRender[0] + padding, boxRender[1] + boxHeight + 8 + padding, 0xff9090ff);
             }
@@ -871,7 +870,7 @@ public class ScreenAchievements extends Screen
             String msg = I18n.getInstance().translateKeyAndFormat("gui.achievements.label.requires", achievement.parent.getStatName());
             int boxHeight = MathHelper.ceil(fontRenderer.heightOfConstrainedChars(msg, boxWidth));
             boxRender = tooltip.drawBackground(mouseX, mouseY, TOOLTIP_OFF_X, TOOLTIP_OFF_Y, boxWidth + 3, boxHeight + 3 + 12);
-            FontHelper.renderWidthConstrained(Tessellator.instance, msg, boxRender[0] + padding, boxRender[1] + 12 + padding, boxWidth).setColor(0xff705050).call(this.fontRenderer);
+            this.fontRenderer.renderWidthConstrained(Tessellator.instance, msg, boxRender[0] + padding, boxRender[1] + 12 + padding, boxWidth).setColor(0xff705050).call();
         }
         int color = statsCounter.canUnlock(achievement) ? achievement.getType().colorName : achievement.getType().colorNameLocked;
         drawStringShadow(fontRenderer, name, boxRender[0] + padding, boxRender[1] + padding, color);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/chat/GuiElementChatSuggestions.java b/game/client/src/main/java/net/minecraft/client/gui/chat/GuiElementChatSuggestions.java
index 8c7501e44..d64dcbbd0 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/chat/GuiElementChatSuggestions.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/chat/GuiElementChatSuggestions.java
@@ -22,7 +22,6 @@ import net.minecraft.client.gui.text.ITextField;
 import net.minecraft.client.gui.text.TextFieldEditor;
 import net.minecraft.client.net.command.ClientCommandSource;
 import net.minecraft.client.render.font.FontRenderer;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.net.command.*;
 import net.minecraft.core.net.command.util.CommandHelper;
@@ -167,7 +166,7 @@ public class GuiElementChatSuggestions extends Gui {
 
             int textX = (int) (leftMargin + 1 + (this.anchor.xPosition * (largestSuggestion - fontRenderer.stringWidth(suggestionText))));
 
-            FontHelper.render(Tessellator.instance, colorCode + suggestionText, textX, minY + suggestionBoxHeight - suggestionHeight + 3).setShadow().setColor(0xE0E0E0).call(fontRenderer);
+            fontRenderer.render(Tessellator.instance, colorCode + suggestionText, textX, minY + suggestionBoxHeight - suggestionHeight + 3).setShadow().setColor(0xE0E0E0).call();
         }
 
         if (this.isHoveringOverSuggestions(mouseX, mouseY) && this.suggestions.get(this.getIndexOfSuggestionBeingHoveredOver(mouseX, mouseY).get()).getTooltip() != null) {
@@ -186,7 +185,7 @@ public class GuiElementChatSuggestions extends Gui {
         minY += (int) CommandHelper.linearInterpolation(this.anchor.yPosition, heightIndex * 12, -12 - heightIndex * 12);
 
         this.drawRect(leftMargin, minY, stringWidth + leftMargin + 1, minY + 12, Integer.MIN_VALUE);
-        FontHelper.render(Tessellator.instance, text, leftMargin + 1, minY + 2).setShadow().setColor(0xE0E0E0).call(fontRenderer);
+        fontRenderer.render(Tessellator.instance, text, leftMargin + 1, minY + 2).setShadow().setColor(0xE0E0E0).call();
     }
 
     private List<String> getCommandUsage(int cursor) {
diff --git a/game/client/src/main/java/net/minecraft/client/gui/createworld/ButtonComponent.java b/game/client/src/main/java/net/minecraft/client/gui/createworld/ButtonComponent.java
index cb571c2f0..083cadd5f 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/createworld/ButtonComponent.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/createworld/ButtonComponent.java
@@ -3,7 +3,6 @@ package net.minecraft.client.gui.createworld;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.ButtonElement;
 import net.minecraft.client.gui.paged.PageComponent;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.sound.SoundCategory;
@@ -47,7 +46,7 @@ public abstract class ButtonComponent
         if (relativeMouseX >= 0 && relativeMouseX <= width && relativeMouseY >= COMPONENT_SPACING && relativeMouseY <= getHeight() - COMPONENT_SPACING) {
             textColor = 0xFFFFFFA0;
         }
-        FontHelper.render(Tessellator.instance, translated, x, y + (getHeight() / 2) - 4).setShadow().setColor(textColor).call(mc.font);
+        mc.font.render(Tessellator.instance, translated, x, y + (getHeight() / 2) - 4).setShadow().setColor(textColor).call();
         resetButton.enabled = !isDefault();
         renderButton(x, y, width - BUTTON_WIDTH, COMPONENT_SPACING, BUTTON_WIDTH, 20, relativeMouseX, relativeMouseY);
         int stringWidth = mc.font.stringWidth(translated);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/createworld/TextFieldComponent.java b/game/client/src/main/java/net/minecraft/client/gui/createworld/TextFieldComponent.java
index f0318cdd6..ca8ffc6ab 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/createworld/TextFieldComponent.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/createworld/TextFieldComponent.java
@@ -4,7 +4,6 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.TextFieldElement;
 import net.minecraft.client.gui.paged.CallbackComponent;
 import net.minecraft.client.gui.paged.OnValueChangedCallback;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.lang.I18n;
 import org.lwjgl.input.Keyboard;
@@ -53,7 +52,7 @@ public class TextFieldComponent
         if (relativeMouseX >= 0 && relativeMouseX <= width && relativeMouseY >= COMPONENT_SPACING && relativeMouseY <= getHeight() - COMPONENT_SPACING) {
             textColor = 0xFFFFFFA0;
         }
-        FontHelper.render(Tessellator.instance, translated, x, y + (getHeight() / 2) - 4).setShadow().setColor(textColor).call(mc.font);
+        mc.font.render(Tessellator.instance, translated, x, y + (getHeight() / 2) - 4).setShadow().setColor(textColor).call();
         int stringWidth = mc.font.stringWidth(translated);
         int lineMaxX = x + width - BUTTON_WIDTH - 8;
         drawRect(x + stringWidth + 8, y + getHeight() / 2, lineMaxX, y + getHeight() / 2 + 1, 0x5F7F7F7F);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/hud/HudIngame.java b/game/client/src/main/java/net/minecraft/client/gui/hud/HudIngame.java
index 859aa3078..510108ee0 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/hud/HudIngame.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/hud/HudIngame.java
@@ -17,7 +17,6 @@ import net.minecraft.client.gui.HeldItemTooltipElement;
 import net.minecraft.client.gui.ScreenPhotoMode;
 import net.minecraft.client.render.block.model.BlockModelDispatcher;
 import net.minecraft.client.render.font.FontRenderer;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.core.block.BlockLogicPortal;
 import net.minecraft.core.enums.ChatVisibility;
 import net.minecraft.core.enums.HumanArmorShape;
@@ -435,7 +434,7 @@ public class HudIngame extends Gui
                         color = 0xFFFFFF;
                     }
                     drawStringShadow(fontRenderer, "Better than Adventure! ", tsp, tsp + lineHeight * line, color);
-                    drawStringShadow(fontRenderer, Global.VERSION, FontHelper.getLastEndingX(), tsp + lineHeight * line++, 0xffffff);
+                    drawStringShadow(fontRenderer, Global.VERSION, fontRenderer.getLastEndingX(), tsp + lineHeight * line++, 0xffffff);
                 }
                 if (mc.gameSettings.fpsInOverlay.value)
                 {
@@ -859,7 +858,7 @@ public class HudIngame extends Gui
                 y -= (h + 2);
                 drawRect(xPad, y - sp - 1, xPad + MAX_CHAT_WIDTH, y + h - sp + 1, alpha / 2 << 24);
                 GL11.glEnable(GL_BLEND);
-                FontHelper.renderWidthConstrained(Tessellator.instance, message, xPad, y, MAX_CHAT_WIDTH).setShadow().setColor(0xFFFFFF + (alpha << 24)).call(this.fontRenderer);
+                this.fontRenderer.renderWidthConstrained(Tessellator.instance, message, xPad, y, MAX_CHAT_WIDTH).setShadow().setColor(0xFFFFFF + (alpha << 24)).call();
             }
         }
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/hud/component/HubComponentSubtitles.java b/game/client/src/main/java/net/minecraft/client/gui/hud/component/HubComponentSubtitles.java
index ca6913b97..be8a27ca2 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/hud/component/HubComponentSubtitles.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/hud/component/HubComponentSubtitles.java
@@ -5,7 +5,6 @@ import net.minecraft.client.gui.Gui;
 import net.minecraft.client.gui.hud.HudIngame;
 import net.minecraft.client.gui.hud.component.layout.Layout;
 import net.minecraft.client.gui.subtitles.SubtitleTracker;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.sound.SoundRepository;
 import org.lwjgl.opengl.GL11;
@@ -102,13 +101,13 @@ public class HubComponentSubtitles extends HudComponentMovable {
                 if (subtitle != null) {
                     gui.drawRect(xRight - maxMessageWidth - xPad * 2, yBottom + y2 - 1, xRight, yBottom + y2 + 8, alpha / 2 << 24);
                     GL11.glEnable(GL_BLEND);
-                    FontHelper.renderCentered(Tessellator.instance, subtitle, xRight - (maxMessageWidth) / 2 - xPad, yBottom + y2).setShadow().setColor(0xFFFFFF + (alpha << 24)).call(mc.font);
+                    mc.font.renderCentered(Tessellator.instance, subtitle, xRight - (maxMessageWidth) / 2 - xPad, yBottom + y2).setShadow().setColor(0xFFFFFF + (alpha << 24)).call();
                     if (mc.thePlayer != null) {
                         final double sin = Math.sin(entry.getRelativeAngle(mc.thePlayer) + Math.PI/2);
                         if (sin > 0.7) {
-                            FontHelper.render(Tessellator.instance, "<", xRight - maxMessageWidth - xPad, yBottom + y2).setColor(0xFFFFFF + (alpha << 24)).call(mc.font);
+                            mc.font.render(Tessellator.instance, "<", xRight - maxMessageWidth - xPad, yBottom + y2).setColor(0xFFFFFF + (alpha << 24)).call();
                         } else if (sin < -0.7) {
-                            FontHelper.render(Tessellator.instance, ">", xRight - mc.font.stringWidth(">") - xPad/2, yBottom + y2).setColor(0xFFFFFF + (alpha << 24)).call(mc.font);
+                            mc.font.render(Tessellator.instance, ">", xRight - mc.font.stringWidth(">") - xPad/2, yBottom + y2).setColor(0xFFFFFF + (alpha << 24)).call();
                         }
                     }
                 }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentLog.java b/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentLog.java
index aa4fe23b9..559d1f4ef 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentLog.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentLog.java
@@ -9,7 +9,6 @@ import net.minecraft.client.gui.hud.component.layout.Layout;
 import net.minecraft.client.gui.hud.component.layout.LayoutAbsolute;
 import net.minecraft.client.gui.hud.component.layout.LayoutSnap;
 import net.minecraft.client.render.font.FontRenderer;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.net.command.TextFormatting;
 import org.jetbrains.annotations.NotNull;
@@ -87,7 +86,7 @@ public class HudComponentLog extends HudComponentMovable {
                 int acc = 0;
                 int c = 0;
                 for (; c < line.length(); c++) {
-                    final int cWidth = mc.font.charWidth(line.charAt(c));
+                    final int cWidth = mc.font.getFont().charWidth(line.charAt(c));
                     if (acc + cWidth + ellipsisWidth > WIDTH) {
                         break;
                     }
@@ -167,11 +166,11 @@ public class HudComponentLog extends HudComponentMovable {
 
             final int lineWidth = sr.stringWidth(line);
             if (anchor == null || anchor == ComponentAnchor.TOP_LEFT || anchor == ComponentAnchor.CENTER_LEFT || anchor == ComponentAnchor.BOTTOM_LEFT) {
-                FontHelper.render(Tessellator.instance, line, x + PADDING, y + PADDING + i * LINE_HEIGHT).setShadow().setColor(0x00_FF_FF_FF + ((int)(opacities[i] * 0xFF) << 24)).call(sr);
+                sr.render(Tessellator.instance, line, x + PADDING, y + PADDING + i * LINE_HEIGHT).setShadow().setColor(0x00_FF_FF_FF + ((int)(opacities[i] * 0xFF) << 24)).call();
             } else if (anchor == ComponentAnchor.TOP_CENTER || anchor == ComponentAnchor.CENTER || anchor == ComponentAnchor.BOTTOM_CENTER) {
-                FontHelper.render(Tessellator.instance, line, x + PADDING + WIDTH / 2 - lineWidth / 2, y + PADDING + i * LINE_HEIGHT).setShadow().setColor(0x00_FF_FF_FF + ((int)(opacities[i] * 0xFF) << 24)).call(sr);
+                sr.render(Tessellator.instance, line, x + PADDING + WIDTH / 2 - lineWidth / 2, y + PADDING + i * LINE_HEIGHT).setShadow().setColor(0x00_FF_FF_FF + ((int)(opacities[i] * 0xFF) << 24)).call();
             } else {
-                FontHelper.render(Tessellator.instance, line, x + PADDING + WIDTH - lineWidth, y + PADDING + i * LINE_HEIGHT).setShadow().setColor(0x00_FF_FF_FF + ((int)(opacities[i] * 0xFF) << 24)).call(sr);
+                sr.render(Tessellator.instance, line, x + PADDING + WIDTH - lineWidth, y + PADDING + i * LINE_HEIGHT).setShadow().setColor(0x00_FF_FF_FF + ((int)(opacities[i] * 0xFF) << 24)).call();
             }
         }
         GL11.glDisable(GL11.GL_BLEND);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/keyboard/keys/CharKey.java b/game/client/src/main/java/net/minecraft/client/gui/keyboard/keys/CharKey.java
index 29013ee1c..0256cad4a 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/keyboard/keys/CharKey.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/keyboard/keys/CharKey.java
@@ -83,7 +83,7 @@ public class CharKey extends Key{
                 size,
                 TextureRegistry.getTexture("minecraft:gui/screen/keyboard/radial_background"));
 
-            drawStringCenteredShadow(mc.font, String.valueOf(getActiveChar(mc, keyboard, originX, originY, mouseX, mouseY)), x + width/2 + originX, y + mc.font.fontHeight()/2 + 4 + originY, texColor);
+            drawStringCenteredShadow(mc.font, String.valueOf(getActiveChar(mc, keyboard, originX, originY, mouseX, mouseY)), x + width/2 + originX, y + mc.font.getFont().fontHeight()/2 + 4 + originY, texColor);
 
             final double dx;
             final double dy;
@@ -114,7 +114,7 @@ public class CharKey extends Key{
             GL11.glDisable(GL11.GL_BLEND);
             GL11.glPopMatrix();
         } else {
-            drawStringCenteredShadow(mc.font, String.valueOf(getActiveChar(mc, keyboard, originX, originY, mouseX, mouseY)), x + width/2 + originX, y + mc.font.fontHeight()/2 + 4 + originY, texColor);
+            drawStringCenteredShadow(mc.font, String.valueOf(getActiveChar(mc, keyboard, originX, originY, mouseX, mouseY)), x + width/2 + originX, y + mc.font.getFont().fontHeight()/2 + 4 + originY, texColor);
         }
         GL11.glColor4f(1f, 1f, 1f, 1f);
     }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/modelviewer/elements/ListenerTextFieldElement.java b/game/client/src/main/java/net/minecraft/client/gui/modelviewer/elements/ListenerTextFieldElement.java
index 6fcd2c098..baf0ddd0b 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/modelviewer/elements/ListenerTextFieldElement.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/modelviewer/elements/ListenerTextFieldElement.java
@@ -126,7 +126,7 @@ public class ListenerTextFieldElement extends ListenerButtonElement implements I
         {
             boolean drawCursor = isFocused && (cursorCounter / 6) % 2 == 0;
             int cursor = editor.getCursor();
-            int maxDisplayableChars = this.width / fontRenderer.charWidth('_');
+            int maxDisplayableChars = this.width / fontRenderer.getFont().charWidth('_');
 
             if (!text.isEmpty() || isFocused){
                 if(prefaceText.length() + text.length() <= maxDisplayableChars-1){
diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/components/AvailableTexturePackListComponent.java b/game/client/src/main/java/net/minecraft/client/gui/options/components/AvailableTexturePackListComponent.java
index ebd819aa1..f77a8b087 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/components/AvailableTexturePackListComponent.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/components/AvailableTexturePackListComponent.java
@@ -6,7 +6,6 @@ import java.util.ArrayList;
 import java.util.List;
 
 import net.minecraft.client.gui.ButtonElement;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.core.sound.SoundCategory;
 import org.lwjgl.opengl.GL11;
 
@@ -73,7 +72,7 @@ public class AvailableTexturePackListComponent
     @Override
     public void render(int x, int y, int width, int relativeMouseX, int relativeMouseY) {
         if (availablePacks.isEmpty()) {
-            FontHelper.renderCentered(Tessellator.instance, I18n.getInstance().translateKey("gui.options.page.texture_packs.label.no_packs"), x + width / 2, y + 4).setShadow().setColor(0x5F7F7F7F).call(mc.font);
+            mc.font.renderCentered(Tessellator.instance, I18n.getInstance().translateKey("gui.options.page.texture_packs.label.no_packs"), x + width / 2, y + 4).setShadow().setColor(0x5F7F7F7F).call();
         }
         for (int i = 0; i < availablePacks.size(); i++) {
             TexturePackButton button = availablePacks.get(i);
@@ -169,21 +168,21 @@ public class AvailableTexturePackListComponent
 
 			if(format == Global.TEXTURE_PACK_FORMAT) {
 				// Correct version
-                FontHelper.render(Tessellator.instance, this.texturePack.manifest.getName(), x + this.height + 2, y + 1).call(mc.font);
-                FontHelper.render(Tessellator.instance, this.texturePack.manifest.getDescriptionLine1(), x + this.height + 2, y + 12).setColor(0x808080).call(mc.font);
-                FontHelper.render(Tessellator.instance, this.texturePack.manifest.getDescriptionLine2(), x + this.height + 2, y + 22).setColor(0x808080).call(mc.font);
+                mc.font.render(Tessellator.instance, this.texturePack.manifest.getName(), x + this.height + 2, y + 1).call();
+                mc.font.render(Tessellator.instance, this.texturePack.manifest.getDescriptionLine1(), x + this.height + 2, y + 12).setColor(0x808080).call();
+                mc.font.render(Tessellator.instance, this.texturePack.manifest.getDescriptionLine2(), x + this.height + 2, y + 22).setColor(0x808080).call();
 			}else if(format == -1) {
 				// Manifest error
-                FontHelper.render(Tessellator.instance, TextFormatting.RED + this.texturePack.manifest.getName(), x + this.height + 2, y + 1).call(mc.font);
-                FontHelper.render(Tessellator.instance, this.texturePack.manifest.getDescriptionLine1(), x + this.height + 2, y + 12).setColor(0x808080).call(mc.font);
-                FontHelper.render(Tessellator.instance, this.texturePack.manifest.getDescriptionLine2(), x + this.height + 2, y + 22).setColor(0x808080).call(mc.font);
+                mc.font.render(Tessellator.instance, TextFormatting.RED + this.texturePack.manifest.getName(), x + this.height + 2, y + 1).call();
+                mc.font.render(Tessellator.instance, this.texturePack.manifest.getDescriptionLine1(), x + this.height + 2, y + 12).setColor(0x808080).call();
+                mc.font.render(Tessellator.instance, this.texturePack.manifest.getDescriptionLine2(), x + this.height + 2, y + 22).setColor(0x808080).call();
 				rgbVersion = Colors.allChatColors[TextFormatting.RED.id].getARGB();
 			}else {
 				// Wrong texture pack version
 				I18n i18n = I18n.getInstance();
-                FontHelper.render(Tessellator.instance, TextFormatting.RED + this.texturePack.manifest.getName(), x + this.height + 2, y + 1).call(mc.font);
-                FontHelper.render(Tessellator.instance, i18n.translateKey("gui.options.page.texture_packs.label.outdated_pack.1"), x + this.height + 2, y + 12).setColor(0x808080).call(mc.font);
-                FontHelper.render(Tessellator.instance, i18n.translateKey("gui.options.page.texture_packs.label.outdated_pack.2"), x + this.height + 2, y + 22).setColor(0x808080).call(mc.font);
+                mc.font.render(Tessellator.instance, TextFormatting.RED + this.texturePack.manifest.getName(), x + this.height + 2, y + 1).call();
+                mc.font.render(Tessellator.instance, i18n.translateKey("gui.options.page.texture_packs.label.outdated_pack.1"), x + this.height + 2, y + 12).setColor(0x808080).call();
+                mc.font.render(Tessellator.instance, i18n.translateKey("gui.options.page.texture_packs.label.outdated_pack.2"), x + this.height + 2, y + 22).setColor(0x808080).call();
 				rgbVersion = Colors.allChatColors[TextFormatting.RED.id].getARGB();
 			}
 
@@ -194,7 +193,7 @@ public class AvailableTexturePackListComponent
 
             String version = texturePack.manifest.getPackVersion();
             int versionWidth = mc.font.stringWidth(version);
-            FontHelper.render(Tessellator.instance, texturePack.manifest.getPackVersion(), x + width - versionWidth - 2, y + 1).setColor(rgbVersion).call(mc.font);
+            mc.font.render(Tessellator.instance, texturePack.manifest.getPackVersion(), x + width - versionWidth - 2, y + 1).setColor(rgbVersion).call();
         }
         public void setupButton(int x, int y, int width, int mouseX, int mouseY){
             button.setX(x + width - button.width - 1);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/components/ButtonComponent.java b/game/client/src/main/java/net/minecraft/client/gui/options/components/ButtonComponent.java
index db2477777..76ae1a7aa 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/components/ButtonComponent.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/components/ButtonComponent.java
@@ -2,7 +2,6 @@ package net.minecraft.client.gui.options.components;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.ButtonElement;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.render.window.CursorShape;
 import net.minecraft.core.lang.I18n;
@@ -47,7 +46,7 @@ public abstract class ButtonComponent
         if (relativeMouseX >= 0 && relativeMouseX <= width && relativeMouseY >= COMPONENT_SPACING && relativeMouseY <= getHeight() - COMPONENT_SPACING) {
             textColor = 0xFFFFFFA0;
         }
-        FontHelper.render(Tessellator.instance, translated, x, y + (getHeight() / 2) - 4).setShadow().setColor(textColor).call(mc.font);
+        mc.font.render(Tessellator.instance, translated, x, y + (getHeight() / 2) - 4).setShadow().setColor(textColor).call();
         resetButton.enabled = !isDefault();
         renderButton(x, y, width - BUTTON_WIDTH, COMPONENT_SPACING, BUTTON_WIDTH, 20, relativeMouseX, relativeMouseY);
         int stringWidth = mc.font.stringWidth(translated);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/components/LanguagePackListComponent.java b/game/client/src/main/java/net/minecraft/client/gui/options/components/LanguagePackListComponent.java
index 169e03488..bd31099ab 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/components/LanguagePackListComponent.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/components/LanguagePackListComponent.java
@@ -2,7 +2,6 @@ package net.minecraft.client.gui.options.components;
 
 import com.mojang.logging.LogUtils;
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.lang.Language;
@@ -142,8 +141,8 @@ public class LanguagePackListComponent
                 }
                 empty = false;
             }
-            FontHelper.renderCentered(Tessellator.instance, fullName, x + (width / 2), y + 1).setShadow().call(this.mc.font);
-            FontHelper.renderCentered(Tessellator.instance, empty ? "Unknown Credits" : credits, x + width / 2, y + 12).setShadow().setColor(0x808080).call(this.mc.font);
+            this.mc.font.renderCentered(Tessellator.instance, fullName, x + (width / 2), y + 1).setShadow().call();
+            this.mc.font.renderCentered(Tessellator.instance, empty ? "Unknown Credits" : credits, x + width / 2, y + 12).setShadow().setColor(0x808080).call();
         }
     }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/components/OptionsCategory.java b/game/client/src/main/java/net/minecraft/client/gui/options/components/OptionsCategory.java
index 2687ef45a..a4216a707 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/components/OptionsCategory.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/components/OptionsCategory.java
@@ -2,7 +2,6 @@ package net.minecraft.client.gui.options.components;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.ItemElement;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.lang.I18n;
@@ -85,7 +84,7 @@ public class OptionsCategory
         {
             textColor = 0xFFFFA0;
         }
-        FontHelper.render(Tessellator.instance, (this.collapsed ? "▷" : "▽"), x, y + PADDING + 10).setShadow().setColor(textColor).call(mc.font);
+        mc.font.render(Tessellator.instance, (this.collapsed ? "▷" : "▽"), x, y + PADDING + 10).setShadow().setColor(textColor).call();
 
         int xOffset = 10;
         if (icon != null)
@@ -93,7 +92,7 @@ public class OptionsCategory
             renderItem.render(icon, x + 11, y + PADDING + 5);
             xOffset += 20;
         }
-        FontHelper.render(Tessellator.instance, i18n.translateKey(this.translationKey), x + xOffset, y + PADDING + 10).setShadow().setColor(textColor).call(mc.font);
+        mc.font.render(Tessellator.instance, i18n.translateKey(this.translationKey), x + xOffset, y + PADDING + 10).setShadow().setColor(textColor).call();
         if (!collapsed) {
             int componentY = TOP_SPACING;
             for (OptionsComponent component : components)
diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/components/SelectedTexturePackListComponent.java b/game/client/src/main/java/net/minecraft/client/gui/options/components/SelectedTexturePackListComponent.java
index 0e8720107..9a65d728f 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/components/SelectedTexturePackListComponent.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/components/SelectedTexturePackListComponent.java
@@ -2,7 +2,6 @@ package net.minecraft.client.gui.options.components;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.ButtonElement;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.render.texturepack.TexturePack;
 import net.minecraft.client.util.helper.Colors;
@@ -64,10 +63,10 @@ public class SelectedTexturePackListComponent implements OptionsComponent {
     @Override
     public void render(int x, int y, int width, int relativeMouseX, int relativeMouseY) {
         if (selectedPacks.isEmpty()) {
-            FontHelper.renderCentered(Tessellator.instance, I18n.getInstance().translateKey("gui.options.page.texture_packs.label.no_packs"), x + width / 2, y + 4)
+            mc.font.renderCentered(Tessellator.instance, I18n.getInstance().translateKey("gui.options.page.texture_packs.label.no_packs"), x + width / 2, y + 4)
                 .setShadow()
                 .setColor(0x5F7F7F7F)
-                .call(mc.font);
+                .call();
         }
         for (TexturePackButton button : selectedPacks) {
             if (button == draggedButton) continue;
@@ -264,21 +263,21 @@ public class SelectedTexturePackListComponent implements OptionsComponent {
 
             if(format == Global.TEXTURE_PACK_FORMAT) {
                 // Correct version
-                FontHelper.render(Tessellator.instance, this.texturePack.manifest.getName(), x + this.xPos + this.height + 2, y + this.yPos + 1).call(mc.font);
-                FontHelper.render(Tessellator.instance, this.texturePack.manifest.getDescriptionLine1(), x + this.xPos + this.height + 2, y + this.yPos + 12).setColor(0x808080).call(mc.font);
-                FontHelper.render(Tessellator.instance, this.texturePack.manifest.getDescriptionLine2(), x + this.xPos + this.height + 2, y + this.yPos + 22).setColor(0x808080).call(mc.font);
+                mc.font.render(Tessellator.instance, this.texturePack.manifest.getName(), x + this.xPos + this.height + 2, y + this.yPos + 1).call();
+                mc.font.render(Tessellator.instance, this.texturePack.manifest.getDescriptionLine1(), x + this.xPos + this.height + 2, y + this.yPos + 12).setColor(0x808080).call();
+                mc.font.render(Tessellator.instance, this.texturePack.manifest.getDescriptionLine2(), x + this.xPos + this.height + 2, y + this.yPos + 22).setColor(0x808080).call();
             }else if(format == -1) {
                 // Manifest error
-                FontHelper.render(Tessellator.instance, TextFormatting.RED + this.texturePack.manifest.getName(), x + this.xPos + this.height + 2, y + this.yPos + 1).call(mc.font);
-                FontHelper.render(Tessellator.instance, this.texturePack.manifest.getDescriptionLine1(), x + this.xPos + this.height + 2, y + this.yPos + 12).setColor(0x808080).call(mc.font);
-                FontHelper.render(Tessellator.instance, this.texturePack.manifest.getDescriptionLine2(), x + this.xPos + this.height + 2, y + this.yPos + 22).setColor(0x808080).call(mc.font);
+                mc.font.render(Tessellator.instance, TextFormatting.RED + this.texturePack.manifest.getName(), x + this.xPos + this.height + 2, y + this.yPos + 1).call();
+                mc.font.render(Tessellator.instance, this.texturePack.manifest.getDescriptionLine1(), x + this.xPos + this.height + 2, y + this.yPos + 12).setColor(0x808080).call();
+                mc.font.render(Tessellator.instance, this.texturePack.manifest.getDescriptionLine2(), x + this.xPos + this.height + 2, y + this.yPos + 22).setColor(0x808080).call();
                 rgbVersion = Colors.allChatColors[TextFormatting.RED.id].getARGB();
             }else {
                 // Wrong texture pack version
                 I18n i18n = I18n.getInstance();
-                FontHelper.render(Tessellator.instance, TextFormatting.RED + this.texturePack.manifest.getName(), x + this.xPos + this.height + 2, y + this.yPos + 1).call(mc.font);
-                FontHelper.render(Tessellator.instance, i18n.translateKey("gui.options.page.texture_packs.label.outdated_pack.1"), x + this.xPos + this.height + 2, y + this.yPos + 12).setColor(0x808080).call(mc.font);
-                FontHelper.render(Tessellator.instance, i18n.translateKey("gui.options.page.texture_packs.label.outdated_pack.2"), x + this.xPos + this.height + 2, y + this.yPos + 22).setColor(0x808080).call(mc.font);
+                mc.font.render(Tessellator.instance, TextFormatting.RED + this.texturePack.manifest.getName(), x + this.xPos + this.height + 2, y + this.yPos + 1).call();
+                mc.font.render(Tessellator.instance, i18n.translateKey("gui.options.page.texture_packs.label.outdated_pack.1"), x + this.xPos + this.height + 2, y + this.yPos + 12).setColor(0x808080).call();
+                mc.font.render(Tessellator.instance, i18n.translateKey("gui.options.page.texture_packs.label.outdated_pack.2"), x + this.xPos + this.height + 2, y + this.yPos + 22).setColor(0x808080).call();
                 rgbVersion = Colors.allChatColors[TextFormatting.RED.id].getARGB();
             }
 
@@ -289,7 +288,7 @@ public class SelectedTexturePackListComponent implements OptionsComponent {
 
             String version = texturePack.manifest.getPackVersion();
             int versionWidth = mc.font.stringWidth(version);
-            FontHelper.render(Tessellator.instance, this.texturePack.manifest.getPackVersion(), x + this.xPos + width - versionWidth - 2, y + this.yPos + 1).setColor(rgbVersion).call(mc.font);
+            mc.font.render(Tessellator.instance, this.texturePack.manifest.getPackVersion(), x + this.xPos + width - versionWidth - 2, y + this.yPos + 1).setColor(rgbVersion).call();
         }
         public void setupButton(int x, int y, int width, int mouseX, int mouseY){
             button.setX(x + xPos + width - button.width - 1);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/components/TooltipPickerComponent.java b/game/client/src/main/java/net/minecraft/client/gui/options/components/TooltipPickerComponent.java
index 984d1d2a5..2794b2fb7 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/components/TooltipPickerComponent.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/components/TooltipPickerComponent.java
@@ -21,10 +21,8 @@ public class TooltipPickerComponent
     protected void renderButton(final int x, final int y, final int relativeButtonX, final int relativeButtonY, final int buttonWidth, final int buttonHeight, final int relativeMouseX, final int relativeMouseY) {
         super.renderButton(x, y, relativeButtonX, relativeButtonY, buttonWidth, buttonHeight, relativeMouseX, relativeMouseY);
 
-        final int padding = 3;
-        final int yOffset = 0;
         final int stringWidth = mc.font.stringWidth(this.option.getDisplayStringValue());
-        final int stringHeight = mc.font.fontHeight();
+        final int stringHeight = mc.font.getFont().fontHeight();
         GL11.glColor4f(1, 1, 1, 1);
         this.tooltip.render(this.option.getDisplayStringValue(), x + relativeButtonX + buttonWidth/2 - stringWidth/2, y + relativeButtonY + buttonHeight/2 - stringHeight/2, 0, 0, -1, -1, false);
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java b/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
index d520763ea..c473d621b 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
@@ -70,6 +70,7 @@ public abstract class OptionsPages
                 .withComponent(new IntegerOptionComponent(mc.gameSettings.guiScale))
                 .withComponent(new FloatOptionComponent(mc.gameSettings.screenPadding))
                 .withComponent(new TooltipPickerComponent(mc.gameSettings.tooltipStyle))
+                .withComponent(new ToggleableOptionComponent<>(mc.gameSettings.font))
                 .withComponent(new ToggleableOptionComponent<>(mc.gameSettings.chatVisibility))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.fpsInOverlay))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.versionInOverlay))
@@ -84,7 +85,6 @@ public abstract class OptionsPages
             .withComponent(new OptionsCategory("gui.options.page.general.category.miscellaneous")
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.discordRichPresence))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.enableItemClumping))
-                .withComponent(new BooleanOptionComponent(mc.gameSettings.forceUnicodeFont))
                 .withComponent(new FloatOptionComponent(mc.gameSettings.autosaveTimer))
             )
             .withComponent(new ShortcutComponent("gui.options.page.general.button.open_worlds_folder", () -> FileOpener.open(new File(mc.getMinecraftDir(), "saves"))))
diff --git a/game/client/src/main/java/net/minecraft/client/gui/popup/LabelComponent.java b/game/client/src/main/java/net/minecraft/client/gui/popup/LabelComponent.java
index 362e4629f..03cf664d0 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/popup/LabelComponent.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/popup/LabelComponent.java
@@ -2,7 +2,6 @@ package net.minecraft.client.gui.popup;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.font.FontRenderer;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.tessellator.Tessellator;
 
 public class LabelComponent
@@ -28,6 +27,6 @@ public class LabelComponent
     @Override
     public void render(final int x, final int y, final int mouseX, final int mouseY) {
         final int middle = (x - PopupScreen.HORIZONTAL_MARGIN) + getWidth() / 2;
-        FontHelper.renderCentered(Tessellator.instance, this.text, middle, y).setShadow().setColor(this.color).call(this.fontRenderer);
+        this.fontRenderer.renderCentered(Tessellator.instance, this.text, middle, y).setShadow().setColor(this.color).call();
     }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/popup/MessageBoxComponent.java b/game/client/src/main/java/net/minecraft/client/gui/popup/MessageBoxComponent.java
index 52d0dac0c..8d2dc435e 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/popup/MessageBoxComponent.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/popup/MessageBoxComponent.java
@@ -2,7 +2,6 @@ package net.minecraft.client.gui.popup;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.Scissor;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.util.helper.MathHelper;
@@ -127,7 +126,7 @@ public class MessageBoxComponent
         // Draw lines
         for (int i = 0; i < lines.size(); i++)
         {
-            FontHelper.render(Tessellator.instance, lines.get(i),x + 4,(y + 4) + (i * 12) - getScrollPixels()).setShadow().call(this.minecraft.font);
+            this.minecraft.font.render(Tessellator.instance, lines.get(i),x + 4,(y + 4) + (i * 12) - getScrollPixels()).setShadow().call();
         }
 
         Scissor.disable();
diff --git a/game/client/src/main/java/net/minecraft/client/option/GameSettings.java b/game/client/src/main/java/net/minecraft/client/option/GameSettings.java
index 322e568c7..20f0168ff 100644
--- a/game/client/src/main/java/net/minecraft/client/option/GameSettings.java
+++ b/game/client/src/main/java/net/minecraft/client/option/GameSettings.java
@@ -18,6 +18,8 @@ import net.minecraft.client.gui.TooltipElement;
 import net.minecraft.client.gui.hud.component.HudComponents;
 import net.minecraft.client.input.InputDevice;
 import net.minecraft.client.option.enums.Colorblindness;
+import net.minecraft.client.render.font.Font;
+import net.minecraft.client.render.font.Fonts;
 import net.minecraft.core.enums.ChatVisibility;
 import net.minecraft.core.enums.Difficulty;
 import net.minecraft.client.option.enums.LightmapStyle;
@@ -102,7 +104,6 @@ public class GameSettings {
 	public OptionBoolean showCollisionBoxes = new OptionBoolean(this, "showCollisionBoxes", false);
 	public OptionBoolean swapCraftingButtons = new OptionBoolean(this, "swapCraftingButtons", false);
 	public OptionBoolean forceOnscreenKeyboard = new OptionBoolean(this, "forceOnscreenKeyboard", false);
-    public OptionBoolean forceUnicodeFont = new OptionBoolean(this, "forceUnicodeFont", false);
 	public OptionEnum<PlacementMode> placementMode = new OptionEnum<>(this, "placementMode", PlacementMode.class, PlacementMode.DEFAULT).setIsSlider(false);
 	public OptionBoolean discordRichPresence = new OptionBoolean(this, "discordRichPresence", false);
 	public OptionImmersiveMode immersiveMode = new OptionImmersiveMode(this);
@@ -164,6 +165,7 @@ public class GameSettings {
 	public OptionBoolean borderlessFullscreen = new OptionBoolean(this, "borderlessFullscreen", true);
 	public OptionBoolean startInFullscreen = new OptionBoolean(this, "startInFullscreen", true);
 	public OptionTooltip tooltipStyle = new OptionTooltip(this, "tooltipStyle", "default");
+	public OptionFont font = new OptionFont(this, "font", Fonts.DEFAULT);
 	public OptionEnum<LightmapStyle> lightmapStyle = new OptionEnum<>(this, "lightmapStyle", LightmapStyle.class, LightmapStyle.GRAY);
 	public OptionBoolean customLightmap = new OptionBoolean(this, "customLightmap", true);
 	public OptionBoolean fog = new OptionBoolean(this, "fog", true);
@@ -414,6 +416,9 @@ public class GameSettings {
 			}
 			return "Unknown";
 		}
+		if (option == this.font) {
+			return trans.translateKey("options.font." + this.font.value.getKey());
+		}
 		if (option instanceof OptionBoolean) {
 			Boolean flag = (Boolean) option.value;
 			if (flag) {
diff --git a/game/client/src/main/java/net/minecraft/client/option/OptionFont.java b/game/client/src/main/java/net/minecraft/client/option/OptionFont.java
new file mode 100644
index 000000000..588d258d1
--- /dev/null
+++ b/game/client/src/main/java/net/minecraft/client/option/OptionFont.java
@@ -0,0 +1,54 @@
+package net.minecraft.client.option;
+
+import net.minecraft.client.render.dynamictexture.DynamicTexture;
+import net.minecraft.client.render.font.Font;
+import net.minecraft.client.render.font.Fonts;
+import net.minecraft.core.util.helper.Toggleable;
+import org.jetbrains.annotations.NotNull;
+
+public class OptionFont extends OptionToggleable<@NotNull Font> implements Toggleable {
+
+    public OptionFont(final GameSettings gameSettings, final String name, final @NotNull Font defaultValue) {
+        super(gameSettings, name, defaultValue, null);
+    }
+
+    @Override
+    public void parse(final String string) {
+        this.value = Fonts.fontWithKey(string);
+    }
+
+    @Override
+    public void toggle() {
+        this.value = Fonts.fontAtIndex((getValueIndex() + 1) % size());
+    }
+
+    @Override
+    public void toggle(final int delta) {
+        this.value = Fonts.fontAtIndex(DynamicTexture.pmod(getValueIndex() + delta, size()));
+    }
+
+    @Override
+    public int getValueIndex() {
+        return Fonts.indexForFont(this.value);
+    }
+
+    @Override
+    public void setValueWithIndex(final int i) {
+        this.value = Fonts.fontAtIndex(i);
+    }
+
+    @Override
+    public int size() {
+        return Fonts.fontAmount();
+    }
+
+    @Override
+    public boolean isSlider() {
+        return true;
+    }
+
+    @Override
+    public String getValueString() {
+        return this.value.getKey();
+    }
+}
diff --git a/game/client/src/main/java/net/minecraft/client/render/LoadingScreenRenderer.java b/game/client/src/main/java/net/minecraft/client/render/LoadingScreenRenderer.java
index 8f70c5cb5..5147e0bf7 100644
--- a/game/client/src/main/java/net/minecraft/client/render/LoadingScreenRenderer.java
+++ b/game/client/src/main/java/net/minecraft/client/render/LoadingScreenRenderer.java
@@ -5,7 +5,6 @@ import static org.lwjgl.opengl.GL11.*;
 import java.util.List;
 import java.util.Random;
 
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import org.lwjgl.opengl.GL11;
 
 import net.minecraft.client.Minecraft;
@@ -208,11 +207,11 @@ public class LoadingScreenRenderer
         }
 
         // Draw title and stage
-        FontHelper.renderCentered(t, this.title, width / 2, height / 2 - 4 - 16).setShadow().call(this.minecraft.font);
-        FontHelper.renderCentered(t, this.stage, width / 2, (height / 2 - 4) + 8).setShadow().call(this.minecraft.font);
+        this.minecraft.font.renderCentered(t, this.title, width / 2, height / 2 - 4 - 16).setShadow().call();
+        this.minecraft.font.renderCentered(t, this.stage, width / 2, (height / 2 - 4) + 8).setShadow().call();
 
         // Draw tip
-        FontHelper.renderCentered(t, this.tip, width / 2, (height / 2 - 4) + 32).setShadow().call(this.minecraft.font);
+        this.minecraft.font.renderCentered(t, this.tip, width / 2, (height / 2 - 4) + 32).setShadow().call();
 
         this.minecraft.renderer.endRenderGame(1.0f);
 
diff --git a/game/client/src/main/java/net/minecraft/client/render/TextureManager.java b/game/client/src/main/java/net/minecraft/client/render/TextureManager.java
index e0071feb7..22f510e6c 100644
--- a/game/client/src/main/java/net/minecraft/client/render/TextureManager.java
+++ b/game/client/src/main/java/net/minecraft/client/render/TextureManager.java
@@ -33,8 +33,7 @@ import net.minecraft.client.render.dynamictexture.DynamicTextureLavaStill;
 import net.minecraft.client.render.dynamictexture.DynamicTextureTrommel;
 import net.minecraft.client.render.dynamictexture.DynamicTextureWaterFlow;
 import net.minecraft.client.render.dynamictexture.DynamicTextureWaterStill;
-import net.minecraft.client.render.font.FontDefault;
-import net.minecraft.client.render.font.FontRendererDefault;
+import net.minecraft.client.render.font.Fonts;
 import net.minecraft.client.render.texture.meta.AnimationProperties;
 import net.minecraft.client.render.texture.stitcher.AtlasStitcher;
 import net.minecraft.client.render.texture.stitcher.IconCoordinate;
@@ -410,7 +409,7 @@ public class TextureManager {
 
 		Colors.loadColors();
 
-        this.mc.font.init(this.mc.texturePackList);
+		Fonts.refreshFonts(this.mc.texturePackList);
 
 		mc.skinVariantList.refresh(errors);
 		mc.mainMenuBackground.refresh(errors);
diff --git a/game/client/src/main/java/net/minecraft/client/render/entity/MobRenderer.java b/game/client/src/main/java/net/minecraft/client/render/entity/MobRenderer.java
index 63392a634..3a49016bd 100644
--- a/game/client/src/main/java/net/minecraft/client/render/entity/MobRenderer.java
+++ b/game/client/src/main/java/net/minecraft/client/render/entity/MobRenderer.java
@@ -4,7 +4,6 @@ import com.mojang.logging.LogUtils;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.font.FontRenderer;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.model.ModelBase;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.Global;
@@ -248,10 +247,10 @@ public class MobRenderer<T extends Mob> extends EntityRenderer<T>
         t.addVertex(j + 1, -1 + byte0, 0.0D);
         t.draw();
         GL11.glEnable(3553 /* GL_TEXTURE_2D */);
-        FontHelper.render(t, s, -sr.stringWidth(s) / 2, byte0).setColor(0x20ffffff).call(sr);
+        sr.render(t, s, -sr.stringWidth(s) / 2, byte0).setColor(0x20ffffff).call();
         if (!depthTest) GL11.glEnable(2929 /* GL_DEPTH_TEST */);
         GL11.glDepthMask(true);
-        FontHelper.render(t, s, -sr.stringWidth(s) / 2, byte0).setColor(0xFFFFFF).call(sr);
+        sr.render(t, s, -sr.stringWidth(s) / 2, byte0).setColor(0xFFFFFF).call();
         GL11.glEnable(2896 /* GL_LIGHTING */);
         GL11.glDisable(3042 /* GL_BLEND */);
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
diff --git a/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererPlayer.java b/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererPlayer.java
index 4ed76a5e9..0a7a0c9d7 100644
--- a/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererPlayer.java
+++ b/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererPlayer.java
@@ -8,7 +8,6 @@ import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.PlayerSkinParser;
 import net.minecraft.client.render.block.model.BlockModelDispatcher;
 import net.minecraft.client.render.font.FontRenderer;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.tileentity.TileEntityRenderer;
 import net.minecraft.client.render.camera.EntityCamera;
 import net.minecraft.client.render.model.ModelPlayer;
@@ -164,7 +163,7 @@ public class MobRendererPlayer extends MobRendererBipedArmored<Player>
                     t.draw();
                     GL11.glEnable(GL11.GL_TEXTURE_2D);
                     GL11.glDepthMask(true);
-                    FontHelper.renderCentered(t, s, 0, 0).setColor(0x20ffffff).call(font);
+                    font.renderCentered(t, s, 0, 0).setColor(0x20ffffff).call();
                     GL11.glEnable(GL11.GL_LIGHTING);
                     GL11.glDisable(GL11.GL_BLEND);
                     GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
diff --git a/game/client/src/main/java/net/minecraft/client/render/font/Font.java b/game/client/src/main/java/net/minecraft/client/render/font/Font.java
index bdc0c87fd..1cdd19a31 100644
--- a/game/client/src/main/java/net/minecraft/client/render/font/Font.java
+++ b/game/client/src/main/java/net/minecraft/client/render/font/Font.java
@@ -11,6 +11,8 @@ public interface Font {
 
     void init(@NotNull TexturePackList packList);
 
+    @NotNull String getKey();
+
     int textureForChar(char c);
     char getObfuscatedChar(char c, Random random);
     boolean canRenderChar(char c);
diff --git a/game/client/src/main/java/net/minecraft/client/render/font/FontDefault.java b/game/client/src/main/java/net/minecraft/client/render/font/FontDefault.java
index a10d064a5..fe7abeb4b 100644
--- a/game/client/src/main/java/net/minecraft/client/render/font/FontDefault.java
+++ b/game/client/src/main/java/net/minecraft/client/render/font/FontDefault.java
@@ -1,14 +1,14 @@
 package net.minecraft.client.render.font;
 
-import net.minecraft.client.render.TextureManager;
+import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.render.texture.Texture;
 import net.minecraft.core.util.helper.ChatAllowedCharacters;
 import org.jetbrains.annotations.NotNull;
 
 public class FontDefault extends FontFile {
-    public FontDefault(final @NotNull TextureManager textureManager) {
-        super(textureManager, "/font/font_%02X.png", "/font/glyph_sizes_default.bin");
+    public FontDefault(@NotNull final String key) {
+        super(key, "/assets/minecraft/textures/gui/font/default/font_%02X.png", "/assets/minecraft/textures/gui/font/default/glyph_sizes.bin");
     }
 
     @Override
@@ -23,7 +23,7 @@ public class FontDefault extends FontFile {
         if (fontIndex < 0) return 0;
         final int index = fontIndex / GLYPHS_PER_TEXTURE;
         if (this.texHandleCache[index] != TEXTURE_UNASSIGNED) return this.texHandleCache[index];
-        final Texture texture = this.textureManager.loadTextureNoDefault(String.format(this.textureFormat, index));
+        final Texture texture = Minecraft.getMinecraft().textureManager.loadTextureNoDefault(String.format(this.textureFormat, index));
         if (texture == null) {
             this.texHandleCache[index] = 0;
             return 0;
@@ -43,7 +43,7 @@ public class FontDefault extends FontFile {
         final double fUpper = upper;
         final double fLower = (lower + 1);
 
-        return (fLower - fUpper) / 2.0D + 1;
+        return (fLower - fUpper) / 2d + 1;
     }
 
     @Override
@@ -78,6 +78,6 @@ public class FontDefault extends FontFile {
         tessellator.addVertexWithUV(x - shift,          y + height,  z, uMin + epsilon, vMax - epsilon);
         tessellator.addVertexWithUV(x - shift + width,  y + height,  z, uMax - epsilon, vMax - epsilon);
         tessellator.addVertexWithUV(x + shift + width,  y,           z, uMax - epsilon, vMin + epsilon);
-        return (fLower - fUpper)/2 + 1;
+        return (fLower - fUpper)/2d + 1;
     }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/render/font/FontFile.java b/game/client/src/main/java/net/minecraft/client/render/font/FontFile.java
index a19072aff..be72ac583 100644
--- a/game/client/src/main/java/net/minecraft/client/render/font/FontFile.java
+++ b/game/client/src/main/java/net/minecraft/client/render/font/FontFile.java
@@ -1,6 +1,6 @@
 package net.minecraft.client.render.font;
 
-import net.minecraft.client.render.TextureManager;
+import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.render.texture.Texture;
 import net.minecraft.client.render.texturepack.TexturePackList;
@@ -31,10 +31,11 @@ public class FontFile implements Font {
 
     protected final @NotNull String textureFormat;
     protected final @NotNull String glyphSizesPath;
-    protected final @NotNull TextureManager textureManager;
 
-    public FontFile(final @NotNull TextureManager textureManager, @NotNull final String texturesFormat, @NotNull final String glyphSizesPath) {
-        this.textureManager = textureManager;
+    protected final @NotNull String key;
+
+    public FontFile(@NotNull final String key, @NotNull final String texturesFormat, @NotNull final String glyphSizesPath) {
+        this.key = key;
         this.textureFormat = texturesFormat;
         this.glyphSizesPath = glyphSizesPath;
         this.charWidth = new byte[Character.MAX_VALUE + 1];
@@ -52,11 +53,16 @@ public class FontFile implements Font {
         }
     }
 
+    @Override
+    public @NotNull String getKey() {
+        return this.key;
+    }
+
     @Override
     public int textureForChar(final char c) {
         final int index = c / GLYPHS_PER_TEXTURE;
         if (this.texHandleCache[index] != TEXTURE_UNASSIGNED) return this.texHandleCache[index];
-        final Texture texture = this.textureManager.loadTextureNoDefault(String.format(this.textureFormat, index));
+        final Texture texture = Minecraft.getMinecraft().textureManager.loadTextureNoDefault(String.format(this.textureFormat, index));
         if (texture == null) {
             this.texHandleCache[index] = 0;
             return 0;
@@ -93,7 +99,7 @@ public class FontFile implements Font {
         final double fUpper = upper;
         final double fLower = (lower + 1);
 
-        return (fLower - fUpper) / 2.0D + 1;
+        return (fLower - fUpper) / 2d + 1;
     }
 
     @Override
@@ -130,6 +136,6 @@ public class FontFile implements Font {
         tessellator.addVertexWithUV(x - shift,          y + height,  z, uMin + epsilon, vMax - epsilon);
         tessellator.addVertexWithUV(x - shift + width,  y + height,  z, uMax - epsilon, vMax - epsilon);
         tessellator.addVertexWithUV(x + shift + width,  y,           z, uMax - epsilon, vMin + epsilon);
-        return (fLower - fUpper)/2 + 1;
+        return (fLower - fUpper)/2d + 1;
     }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/render/font/FontMonospace.java b/game/client/src/main/java/net/minecraft/client/render/font/FontMonospace.java
index 84e168513..fbb29546b 100644
--- a/game/client/src/main/java/net/minecraft/client/render/font/FontMonospace.java
+++ b/game/client/src/main/java/net/minecraft/client/render/font/FontMonospace.java
@@ -1,6 +1,5 @@
 package net.minecraft.client.render.font;
 
-import net.minecraft.client.render.TextureManager;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.render.texturepack.TexturePackList;
 import net.minecraft.core.util.helper.ChatAllowedCharacters;
@@ -11,8 +10,8 @@ import java.util.Arrays;
 public class FontMonospace extends FontFile{
     public static final int MONOSPACE_WIDTH = 10;
 
-    public FontMonospace(final @NotNull TextureManager textureManager) {
-        super(textureManager, "/font/mono_%02X.png", "");
+    public FontMonospace(@NotNull final String key) {
+        super(key, "/assets/minecraft/textures/gui/font/monospace/mono_%02X.png", "");
     }
 
     @Override
diff --git a/game/client/src/main/java/net/minecraft/client/render/font/FontRenderer.java b/game/client/src/main/java/net/minecraft/client/render/font/FontRenderer.java
index ce7182b92..9bdc88504 100644
--- a/game/client/src/main/java/net/minecraft/client/render/font/FontRenderer.java
+++ b/game/client/src/main/java/net/minecraft/client/render/font/FontRenderer.java
@@ -7,23 +7,170 @@ import org.jetbrains.annotations.Nullable;
 
 import java.util.List;
 
-public interface FontRenderer extends Font {
-    void render(@NotNull Tessellator tessellator, @NotNull CharSequence chars, int x, int y, double z, boolean shadow, long baseConfig, double @Nullable [] xPosBuffer, double @Nullable [] yPosBuffer, long @Nullable [] configBuffer);
-    void renderDouble(@NotNull Tessellator tessellator, @NotNull CharSequence chars, double x, double y, double z, boolean shadow, long baseConfig, double @Nullable [] xPosBuffer, double @Nullable [] yPosBuffer, long @Nullable [] configBuffer);
-    void renderCentered(@NotNull Tessellator tessellator, @NotNull CharSequence chars, int x, int y, double z, boolean shadow, long baseConfig, double @Nullable [] xPosBuffer, double @Nullable [] yPosBuffer, long @Nullable [] configBuffer);
-    void renderCenteredDouble(@NotNull Tessellator tessellator, @NotNull CharSequence chars, double x, double y, double z, boolean shadow, long baseConfig, double @Nullable [] xPosBuffer, double @Nullable [] yPosBuffer, long @Nullable [] configBuffer);
-    void renderWidthConstrained(@NotNull Tessellator tessellator, @NotNull CharSequence chars, int x, int y, double z, boolean shadow, long baseConfig, int maxWidth, @NotNull Alignment alignment, double @Nullable [] xPosBuffer, double @Nullable [] yPosBuffer, long @Nullable [] configBuffer);
-    void renderWidthConstrainedDouble(@NotNull Tessellator tessellator, @NotNull CharSequence chars, double x, double y, double z, boolean shadow, long baseConfig, double maxWidth, @NotNull Alignment alignment, double @Nullable [] xPosBuffer, double @Nullable [] yPosBuffer, long @Nullable [] configBuffer);
-    void renderConstrained(@NotNull Tessellator tessellator, @NotNull CharSequence chars, int x, int y, double z, boolean shadow, long baseConfig, int maxWidth, int maxHeight, @NotNull Alignment alignment, double @Nullable [] xPosBuffer, double @Nullable [] yPosBuffer, long @Nullable [] configBuffer);
-    void renderConstrainedDouble(@NotNull Tessellator tessellator, @NotNull CharSequence chars, double x, double y, double z, boolean shadow, long baseConfig, double maxWidth, double maxHeight, @NotNull Alignment alignment, double @Nullable [] xPosBuffer, double @Nullable [] yPosBuffer, long @Nullable [] configBuffer);
-
-    @NotNull List<String> splitCharsIntoLines(@NotNull CharSequence chars, double maxWidth, @Nullable List<String> output);
-    @NotNull List<String> splitLinesIntoConstrainedLines(@NotNull List<String> lines, double maxWidth, @Nullable List<String> output);
-    double heightOfConstrainedChars(@NotNull CharSequence chars, double maxWidth);
-    double heightOfLines(@NotNull List<String> lines, double maxWidth);
-
-    double stringWidthDouble(CharSequence chars);
-    default int stringWidth(final CharSequence chars) {
-        return MathHelper.ceil(stringWidthDouble(chars));
+@SuppressWarnings("unused")
+public abstract class FontRenderer {
+    protected static final long CONFIG_DEFAULT = 0xFF_FF_FF_FFL;
+    protected static final @NotNull String NULL_STRING = String.valueOf((Object) null);
+
+    private static final RenderIntegerBase method_render = new RenderIntegerBase() { @Override public void call() {
+        this.fontRenderer.renderImpl(this.font, this.tessellator, this.chars, this.x, this.y, this.z, this.shadow, this.config, this.xPosBuffer, this.yPosBuffer, this.configBuffer); this.needCall = false; }};
+
+    private static final RenderDoubleBase method_renderDouble = new RenderDoubleBase() { @Override public void call() {
+        this.fontRenderer.renderDoubleImpl(this.font, this.tessellator, this.chars, this.x, this.y, this.z, this.shadow, this.config, this.xPosBuffer, this.yPosBuffer, this.configBuffer); this.needCall = false; }};
+
+    private static final RenderIntegerBase method_renderCentered = new RenderIntegerBase() { @Override public void call() {
+        this.fontRenderer.renderCenteredImpl(this.font, this.tessellator, this.chars, this.x, this.y, this.z, this.shadow, this.config, this.xPosBuffer, this.yPosBuffer, this.configBuffer); this.needCall = false; }};
+
+    private static final RenderDoubleBase method_renderCenteredDouble = new RenderDoubleBase() { @Override public void call() {
+        this.fontRenderer.renderCenteredDoubleImpl(this.font, this.tessellator, this.chars, this.x, this.y, this.z, this.shadow, this.config, this.xPosBuffer, this.yPosBuffer, this.configBuffer); this.needCall = false; }};
+
+    private static final RenderIntegerConstrainedBase method_renderWidthConstrained = new RenderIntegerConstrainedBase() { @Override public void call() {
+        this.fontRenderer.renderWidthConstrainedImpl(this.font, this.tessellator, this.chars, this.x, this.y, this.z, this.shadow, this.config, this.maxWidth, this.alignment, this.xPosBuffer, this.yPosBuffer, this.configBuffer); this.needCall = false; }};
+
+    private static final RenderDoubleConstrainedBase method_renderWidthConstrainedDouble = new RenderDoubleConstrainedBase() { @Override public void call() {
+        this.fontRenderer.renderWidthConstrainedDoubleImpl(this.font, this.tessellator, this.chars, this.x, this.y, this.z, this.shadow, this.config, this.maxWidth, this.alignment, this.xPosBuffer, this.yPosBuffer, this.configBuffer); this.needCall = false; }};
+
+    private static final RenderIntegerConstrainedBase method_renderConstrained = new RenderIntegerConstrainedBase() { @Override public void call() {
+        this.fontRenderer.renderConstrainedImpl(this.font, this.tessellator, this.chars, this.x, this.y, this.z, this.shadow, this.config, this.maxWidth, this.maxHeight, this.alignment, this.xPosBuffer, this.yPosBuffer, this.configBuffer); this.needCall = false; }};
+
+    private static final RenderDoubleConstrainedBase method_renderConstrainedDouble = new RenderDoubleConstrainedBase() { @Override public void call() {
+        this.fontRenderer.renderConstrainedDoubleImpl(this.font, this.tessellator, this.chars, this.x, this.y, this.z, this.shadow, this.config, this.maxWidth, this.maxHeight, this.alignment, this.xPosBuffer, this.yPosBuffer, this.configBuffer); this.needCall = false; }};
+
+    private final double @NotNull [] xPosBuffer = new double[1];
+    private final double @NotNull [] yPosBuffer = new double[1];
+    private final long @NotNull [] configBuffer = new long[1];
+
+    abstract void renderImpl(@NotNull Font font, @NotNull Tessellator tessellator, @NotNull CharSequence chars, int x, int y, double z, boolean shadow, long baseConfig, double @Nullable [] xPosBuffer, double @Nullable [] yPosBuffer, long @Nullable [] configBuffer);
+    public final @NotNull RenderIntegerBase render(@NotNull final Tessellator tessellator, @Nullable final Object o, final int x, final int y) { return render(tessellator, String.valueOf(o), x, y); }
+    public final @NotNull RenderIntegerBase render(@NotNull final Tessellator tessellator, final boolean b, final int x, final int y) { return method_render.init(this, tessellator, Boolean.toString(b), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerBase render(@NotNull final Tessellator tessellator, final int i, final int x, final int y) { return method_render.init(this, tessellator, Integer.toString(i), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerBase render(@NotNull final Tessellator tessellator, final long l, final int x, final int y) { return method_render.init(this, tessellator, Long.toString(l), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerBase render(@NotNull final Tessellator tessellator, final char c, final int x, final int y) { return method_render.init(this, tessellator, String.valueOf(c), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerBase render(@NotNull final Tessellator tessellator, final float f, final int x, final int y) { return method_render.init(this, tessellator, Float.toString(f), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerBase render(@NotNull final Tessellator tessellator, final double d, final int x, final int y) { return method_render.init(this, tessellator, Double.toString(d), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerBase render(@NotNull final Tessellator tessellator, final char @Nullable [] cArr, final int x, final int y) { return method_render.init(this, tessellator, cArr == null ? NULL_STRING : new String(cArr), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerBase render(@NotNull final Tessellator tessellator, @Nullable final CharSequence chars, final int x, final int y) {return method_render.init(this, tessellator, chars == null ? NULL_STRING : chars, x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+
+    abstract void renderDoubleImpl(@NotNull Font font, @NotNull Tessellator tessellator, @NotNull CharSequence chars, double x, double y, double z, boolean shadow, long baseConfig, double @Nullable [] xPosBuffer, double @Nullable [] yPosBuffer, long @Nullable [] configBuffer);
+    public final @NotNull RenderDoubleBase renderDouble(@NotNull final Tessellator tessellator, @Nullable final Object o, final double x, final double y) { return renderDouble(tessellator, String.valueOf(o), x, y); }
+    public final @NotNull RenderDoubleBase renderDouble(@NotNull final Tessellator tessellator, final boolean b, final double x, final double y) { return method_renderDouble.init(this, tessellator, Boolean.toString(b), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleBase renderDouble(@NotNull final Tessellator tessellator, final int i, final double x, final double y) { return method_renderDouble.init(this, tessellator, Integer.toString(i), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleBase renderDouble(@NotNull final Tessellator tessellator, final long l, final double x, final double y) { return method_renderDouble.init(this, tessellator, Long.toString(l), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleBase renderDouble(@NotNull final Tessellator tessellator, final char c, final double x, final double y) { return method_renderDouble.init(this, tessellator, String.valueOf(c), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleBase renderDouble(@NotNull final Tessellator tessellator, final float f, final double x, final double y) { return method_renderDouble.init(this, tessellator, Float.toString(f), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleBase renderDouble(@NotNull final Tessellator tessellator, final double d, final double x, final double y) { return method_renderDouble.init(this, tessellator, Double.toString(d), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleBase renderDouble(@NotNull final Tessellator tessellator, final char @Nullable [] cArr, final double x, final double y) { return method_renderDouble.init(this, tessellator, cArr == null ? NULL_STRING : new String(cArr), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleBase renderDouble(@NotNull final Tessellator tessellator, @Nullable final CharSequence chars, final double x, final double y) {return method_renderDouble.init(this, tessellator, chars == null ? NULL_STRING : chars, x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+
+    abstract void renderCenteredImpl(@NotNull Font font, @NotNull Tessellator tessellator, @NotNull CharSequence chars, int x, int y, double z, boolean shadow, long baseConfig, double @Nullable [] xPosBuffer, double @Nullable [] yPosBuffer, long @Nullable [] configBuffer);
+    public final @NotNull RenderIntegerBase renderCentered(@NotNull final Tessellator tessellator, @Nullable final Object o, final int x, final int y) { return renderCentered(tessellator, String.valueOf(o), x, y); }
+    public final @NotNull RenderIntegerBase renderCentered(@NotNull final Tessellator tessellator, final boolean b, final int x, final int y) { return method_renderCentered.init(this, tessellator, Boolean.toString(b), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerBase renderCentered(@NotNull final Tessellator tessellator, final int i, final int x, final int y) { return method_renderCentered.init(this, tessellator, Integer.toString(i), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerBase renderCentered(@NotNull final Tessellator tessellator, final long l, final int x, final int y) { return method_renderCentered.init(this, tessellator, Long.toString(l), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerBase renderCentered(@NotNull final Tessellator tessellator, final char c, final int x, final int y) { return method_renderCentered.init(this, tessellator, String.valueOf(c), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerBase renderCentered(@NotNull final Tessellator tessellator, final float f, final int x, final int y) { return method_renderCentered.init(this, tessellator, Float.toString(f), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerBase renderCentered(@NotNull final Tessellator tessellator, final double d, final int x, final int y) { return method_renderCentered.init(this, tessellator, Double.toString(d), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerBase renderCentered(@NotNull final Tessellator tessellator, final char @Nullable [] cArr, final int x, final int y) { return method_renderCentered.init(this, tessellator, cArr == null ? NULL_STRING : new String(cArr), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerBase renderCentered(@NotNull final Tessellator tessellator, @Nullable final CharSequence chars, final int x, final int y) {return method_renderCentered.init(this, tessellator, chars == null ? NULL_STRING : chars, x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+
+    abstract void renderCenteredDoubleImpl(@NotNull Font font, @NotNull Tessellator tessellator, @NotNull CharSequence chars, double x, double y, double z, boolean shadow, long baseConfig, double @Nullable [] xPosBuffer, double @Nullable [] yPosBuffer, long @Nullable [] configBuffer);
+    public final @NotNull RenderDoubleBase renderCenteredDouble(@NotNull final Tessellator tessellator, @Nullable final Object o, final double x, final double y) { return renderCenteredDouble(tessellator, String.valueOf(o), x, y); }
+    public final @NotNull RenderDoubleBase renderCenteredDouble(@NotNull final Tessellator tessellator, final boolean b, final double x, final double y) { return method_renderCenteredDouble.init(this, tessellator, Boolean.toString(b), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleBase renderCenteredDouble(@NotNull final Tessellator tessellator, final int i, final double x, final double y) { return method_renderCenteredDouble.init(this, tessellator, Integer.toString(i), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleBase renderCenteredDouble(@NotNull final Tessellator tessellator, final long l, final double x, final double y) { return method_renderCenteredDouble.init(this, tessellator, Long.toString(l), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleBase renderCenteredDouble(@NotNull final Tessellator tessellator, final char c, final double x, final double y) { return method_renderCenteredDouble.init(this, tessellator, String.valueOf(c), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleBase renderCenteredDouble(@NotNull final Tessellator tessellator, final float f, final double x, final double y) { return method_renderCenteredDouble.init(this, tessellator, Float.toString(f), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleBase renderCenteredDouble(@NotNull final Tessellator tessellator, final double d, final double x, final double y) { return method_renderCenteredDouble.init(this, tessellator, Double.toString(d), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleBase renderCenteredDouble(@NotNull final Tessellator tessellator, final char @Nullable [] cArr, final double x, final double y) { return method_renderCenteredDouble.init(this, tessellator, cArr == null ? NULL_STRING : new String(cArr), x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleBase renderCenteredDouble(@NotNull final Tessellator tessellator, @Nullable final CharSequence chars, final double x, final double y) {return method_renderCenteredDouble.init(this, tessellator, chars == null ? NULL_STRING : chars, x, y, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+
+    abstract void renderWidthConstrainedImpl(@NotNull Font font, @NotNull Tessellator tessellator, @NotNull CharSequence chars, int x, int y, double z, boolean shadow, long baseConfig, int maxWidth, @NotNull Alignment alignment, double @Nullable [] xPosBuffer, double @Nullable [] yPosBuffer, long @Nullable [] configBuffer);
+    public final @NotNull RenderIntegerConstrainedBase renderWidthConstrained(@NotNull final Tessellator tessellator, @Nullable final Object o, final int x, final int y, final int maxWidth) { return renderWidthConstrained(tessellator, String.valueOf(o), x, y, maxWidth); }
+    public final @NotNull RenderIntegerConstrainedBase renderWidthConstrained(@NotNull final Tessellator tessellator, final boolean b, final int x, final int y, final int maxWidth) { return method_renderWidthConstrained.init(this, tessellator, Boolean.toString(b), x, y, maxWidth, Integer.MAX_VALUE, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerConstrainedBase renderWidthConstrained(@NotNull final Tessellator tessellator, final int i, final int x, final int y, final int maxWidth) { return method_renderWidthConstrained.init(this, tessellator, Integer.toString(i), x, y, maxWidth, Integer.MAX_VALUE, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerConstrainedBase renderWidthConstrained(@NotNull final Tessellator tessellator, final long l, final int x, final int y, final int maxWidth) { return method_renderWidthConstrained.init(this, tessellator, Long.toString(l), x, y, maxWidth, Integer.MAX_VALUE, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerConstrainedBase renderWidthConstrained(@NotNull final Tessellator tessellator, final char c, final int x, final int y, final int maxWidth) { return method_renderWidthConstrained.init(this, tessellator, String.valueOf(c), x, y, maxWidth, Integer.MAX_VALUE, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerConstrainedBase renderWidthConstrained(@NotNull final Tessellator tessellator, final float f, final int x, final int y, final int maxWidth) { return method_renderWidthConstrained.init(this, tessellator, Float.toString(f), x, y, maxWidth, Integer.MAX_VALUE, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerConstrainedBase renderWidthConstrained(@NotNull final Tessellator tessellator, final double d, final int x, final int y, final int maxWidth) { return method_renderWidthConstrained.init(this, tessellator, Double.toString(d), x, y, maxWidth, Integer.MAX_VALUE, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerConstrainedBase renderWidthConstrained(@NotNull final Tessellator tessellator, final char @Nullable [] cArr, final int x, final int y, final int maxWidth) { return method_renderWidthConstrained.init(this, tessellator, cArr == null ? NULL_STRING : new String(cArr), x, y, maxWidth, Integer.MAX_VALUE, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerConstrainedBase renderWidthConstrained(@NotNull final Tessellator tessellator, @Nullable final CharSequence chars, final int x, final int y, final int maxWidth) {return method_renderWidthConstrained.init(this, tessellator, chars == null ? NULL_STRING : chars, x, y, maxWidth, Integer.MAX_VALUE, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+
+    abstract void renderWidthConstrainedDoubleImpl(@NotNull Font font, @NotNull Tessellator tessellator, @NotNull CharSequence chars, double x, double y, double z, boolean shadow, long baseConfig, double maxWidth, @NotNull Alignment alignment, double @Nullable [] xPosBuffer, double @Nullable [] yPosBuffer, long @Nullable [] configBuffer);
+    public final @NotNull RenderDoubleConstrainedBase renderWidthConstrainedDouble(@NotNull final Tessellator tessellator, @Nullable final Object o, final double x, final double y, final double maxWidth) { return renderWidthConstrainedDouble(tessellator, String.valueOf(o), x, y, maxWidth); }
+    public final @NotNull RenderDoubleConstrainedBase renderWidthConstrainedDouble(@NotNull final Tessellator tessellator, final boolean b, final double x, final double y, final double maxWidth) { return method_renderWidthConstrainedDouble.init(this, tessellator, Boolean.toString(b), x, y, maxWidth, Double.MAX_VALUE, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleConstrainedBase renderWidthConstrainedDouble(@NotNull final Tessellator tessellator, final int i, final double x, final double y, final double maxWidth) { return method_renderWidthConstrainedDouble.init(this, tessellator, Integer.toString(i), x, y, maxWidth, Double.MAX_VALUE, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleConstrainedBase renderWidthConstrainedDouble(@NotNull final Tessellator tessellator, final long l, final double x, final double y, final double maxWidth) { return method_renderWidthConstrainedDouble.init(this, tessellator, Long.toString(l), x, y, maxWidth, Double.MAX_VALUE, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleConstrainedBase renderWidthConstrainedDouble(@NotNull final Tessellator tessellator, final char c, final double x, final double y, final double maxWidth) { return method_renderWidthConstrainedDouble.init(this, tessellator, String.valueOf(c), x, y, maxWidth, Double.MAX_VALUE, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleConstrainedBase renderWidthConstrainedDouble(@NotNull final Tessellator tessellator, final float f, final double x, final double y, final double maxWidth) { return method_renderWidthConstrainedDouble.init(this, tessellator, Float.toString(f), x, y, maxWidth, Double.MAX_VALUE, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleConstrainedBase renderWidthConstrainedDouble(@NotNull final Tessellator tessellator, final double d, final double x, final double y, final double maxWidth) { return method_renderWidthConstrainedDouble.init(this, tessellator, Double.toString(d), x, y, maxWidth, Double.MAX_VALUE, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleConstrainedBase renderWidthConstrainedDouble(@NotNull final Tessellator tessellator, final char @Nullable [] cArr, final double x, final double y, final double maxWidth) { return method_renderWidthConstrainedDouble.init(this, tessellator, cArr == null ? NULL_STRING : new String(cArr), x, y, maxWidth, Double.MAX_VALUE, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleConstrainedBase renderWidthConstrainedDouble(@NotNull final Tessellator tessellator, @Nullable final CharSequence chars, final double x, final double y, final double maxWidth) {return method_renderWidthConstrainedDouble.init(this, tessellator, chars == null ? NULL_STRING : chars, x, y, maxWidth, Double.MAX_VALUE, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+
+    abstract void renderConstrainedImpl(@NotNull Font font, @NotNull Tessellator tessellator, @NotNull CharSequence chars, int x, int y, double z, boolean shadow, long baseConfig, int maxWidth, int maxHeight, @NotNull Alignment alignment, double @Nullable [] xPosBuffer, double @Nullable [] yPosBuffer, long @Nullable [] configBuffer);
+    public final @NotNull RenderIntegerConstrainedBase renderConstrained(@NotNull final Tessellator tessellator, @Nullable final Object o, final int x, final int y, final int maxWidth, final int maxHeight) { return renderConstrained(tessellator, String.valueOf(o), x, y, maxWidth, maxHeight); }
+    public final @NotNull RenderIntegerConstrainedBase renderConstrained(@NotNull final Tessellator tessellator, final boolean b, final int x, final int y, final int maxWidth, final int maxHeight) { return method_renderConstrained.init(this, tessellator, Boolean.toString(b), x, y, maxWidth, maxHeight, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerConstrainedBase renderConstrained(@NotNull final Tessellator tessellator, final int i, final int x, final int y, final int maxWidth, final int maxHeight) { return method_renderConstrained.init(this, tessellator, Integer.toString(i), x, y, maxWidth, maxHeight, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerConstrainedBase renderConstrained(@NotNull final Tessellator tessellator, final long l, final int x, final int y, final int maxWidth, final int maxHeight) { return method_renderConstrained.init(this, tessellator, Long.toString(l), x, y, maxWidth, maxHeight, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerConstrainedBase renderConstrained(@NotNull final Tessellator tessellator, final char c, final int x, final int y, final int maxWidth, final int maxHeight) { return method_renderConstrained.init(this, tessellator, String.valueOf(c), x, y, maxWidth, maxHeight, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerConstrainedBase renderConstrained(@NotNull final Tessellator tessellator, final float f, final int x, final int y, final int maxWidth, final int maxHeight) { return method_renderConstrained.init(this, tessellator, Float.toString(f), x, y, maxWidth, maxHeight, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerConstrainedBase renderConstrained(@NotNull final Tessellator tessellator, final double d, final int x, final int y, final int maxWidth, final int maxHeight) { return method_renderConstrained.init(this, tessellator, Double.toString(d), x, y, maxWidth, maxHeight, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerConstrainedBase renderConstrained(@NotNull final Tessellator tessellator, final char @Nullable [] cArr, final int x, final int y, final int maxWidth, final int maxHeight) { return method_renderConstrained.init(this, tessellator, cArr == null ? NULL_STRING : new String(cArr), x, y, maxWidth, maxHeight, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderIntegerConstrainedBase renderConstrained(@NotNull final Tessellator tessellator, @Nullable final CharSequence chars, final int x, final int y, final int maxWidth, final int maxHeight) {return method_renderConstrained.init(this, tessellator, chars == null ? NULL_STRING : chars, x, y, maxWidth, maxHeight, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+
+    abstract void renderConstrainedDoubleImpl(@NotNull Font font, @NotNull Tessellator tessellator, @NotNull CharSequence chars, double x, double y, double z, boolean shadow, long baseConfig, double maxWidth, double maxHeight, @NotNull Alignment alignment, double @Nullable [] xPosBuffer, double @Nullable [] yPosBuffer, long @Nullable [] configBuffer);
+    public final @NotNull RenderDoubleConstrainedBase renderConstrainedDouble(@NotNull final Tessellator tessellator, @Nullable final Object o, final double x, final double y, final double maxWidth, final double maxHeight) { return renderConstrainedDouble(tessellator, String.valueOf(o), x, y, maxWidth, maxHeight); }
+    public final @NotNull RenderDoubleConstrainedBase renderConstrainedDouble(@NotNull final Tessellator tessellator, final boolean b, final double x, final double y, final double maxWidth, final double maxHeight) { return method_renderConstrainedDouble.init(this, tessellator, Boolean.toString(b), x, y, maxWidth, maxHeight, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleConstrainedBase renderConstrainedDouble(@NotNull final Tessellator tessellator, final int i, final double x, final double y, final double maxWidth, final double maxHeight) { return method_renderConstrainedDouble.init(this, tessellator, Integer.toString(i), x, y, maxWidth, maxHeight, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleConstrainedBase renderConstrainedDouble(@NotNull final Tessellator tessellator, final long l, final double x, final double y, final double maxWidth, final double maxHeight) { return method_renderConstrainedDouble.init(this, tessellator, Long.toString(l), x, y, maxWidth, maxHeight, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleConstrainedBase renderConstrainedDouble(@NotNull final Tessellator tessellator, final char c, final double x, final double y, final double maxWidth, final double maxHeight) { return method_renderConstrainedDouble.init(this, tessellator, String.valueOf(c), x, y, maxWidth, maxHeight, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleConstrainedBase renderConstrainedDouble(@NotNull final Tessellator tessellator, final float f, final double x, final double y, final double maxWidth, final double maxHeight) { return method_renderConstrainedDouble.init(this, tessellator, Float.toString(f), x, y, maxWidth, maxHeight, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleConstrainedBase renderConstrainedDouble(@NotNull final Tessellator tessellator, final double d, final double x, final double y, final double maxWidth, final double maxHeight) { return method_renderConstrainedDouble.init(this, tessellator, Double.toString(d), x, y, maxWidth, maxHeight, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleConstrainedBase renderConstrainedDouble(@NotNull final Tessellator tessellator, final char @Nullable [] cArr, final double x, final double y, final double maxWidth, final double maxHeight) { return method_renderConstrainedDouble.init(this, tessellator, cArr == null ? NULL_STRING : new String(cArr), x, y, maxWidth, maxHeight, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+    public final @NotNull RenderDoubleConstrainedBase renderConstrainedDouble(@NotNull final Tessellator tessellator, @Nullable final CharSequence chars, final double x, final double y, final double maxWidth, final double maxHeight) {return method_renderConstrainedDouble.init(this, tessellator, chars == null ? NULL_STRING : chars, x, y, maxWidth, maxHeight, this.xPosBuffer, this.yPosBuffer, this.configBuffer); }
+
+    public final int getLastEndingX() {
+        return MathHelper.ceil(this.xPosBuffer[0]);
+    }
+    public final double getLastEndingXDouble() {
+        return this.xPosBuffer[0];
+    }
+    public final int getLastEndingY() {
+        return MathHelper.ceil(this.yPosBuffer[0]);
+    }
+    public final double getLastEndingYDouble() {
+        return this.yPosBuffer[0];
+    }
+    public final long getLastConfig() {
+        return this.configBuffer[0];
+    }
+
+    public abstract @NotNull List<String> splitCharsIntoLines(@NotNull Font font, @NotNull CharSequence chars, double maxWidth, @Nullable List<String> output);
+    public @NotNull List<String> splitCharsIntoLines(@NotNull final CharSequence chars, final double maxWidth, @Nullable final List<String> output) {
+        return splitCharsIntoLines(getFont(), chars, maxWidth, output);
+    }
+    public abstract @NotNull List<String> splitLinesIntoConstrainedLines(@NotNull Font font, @NotNull List<String> lines, double maxWidth, @Nullable List<String> output);
+    public @NotNull List<String> splitLinesIntoConstrainedLines(@NotNull final List<String> lines, final double maxWidth, @Nullable final List<String> output) {
+        return splitLinesIntoConstrainedLines(getFont(), lines, maxWidth, output);
+    }
+    public abstract double heightOfConstrainedChars(@NotNull Font font, @NotNull CharSequence chars, double maxWidth);
+    public double heightOfConstrainedChars(@NotNull final CharSequence chars, final double maxWidth) {
+        return heightOfConstrainedChars(getFont(), chars, maxWidth);
+    }
+    public abstract double heightOfLines(@NotNull Font font, @NotNull List<String> lines, double maxWidth);
+    public double heightOfLines(@NotNull final List<String> lines, final double maxWidth) {
+        return heightOfLines(getFont(), lines, maxWidth);
+    }
+
+    public abstract @NotNull Font getFont();
+
+    public abstract double stringWidthDouble(@NotNull Font font, @NotNull CharSequence chars);
+    public int stringWidth(@NotNull final Font font, final @NotNull CharSequence chars) {
+        return MathHelper.ceil(stringWidthDouble(font, chars));
+    }
+    public double stringWidthDouble(final @NotNull CharSequence chars) {
+        return stringWidthDouble(getFont(), chars);
+    }
+    public int stringWidth(final @NotNull CharSequence chars) {
+        return stringWidth(getFont(), chars);
     }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/render/font/FontRendererDefault.java b/game/client/src/main/java/net/minecraft/client/render/font/FontRendererDefault.java
index 4f7efce80..02809c47e 100644
--- a/game/client/src/main/java/net/minecraft/client/render/font/FontRendererDefault.java
+++ b/game/client/src/main/java/net/minecraft/client/render/font/FontRendererDefault.java
@@ -2,7 +2,6 @@ package net.minecraft.client.render.font;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.client.render.texturepack.TexturePackList;
 import net.minecraft.client.util.helper.Colors;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.util.helper.ChatAllowedCharacters;
@@ -15,9 +14,9 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
 
-public class FontRendererDefault implements FontRenderer {
+public class FontRendererDefault extends FontRenderer {
     public final @NotNull Font fallbackFont;
-    public final @NotNull Font font;
+    public final @Nullable Font font;
 
     protected final long @NotNull [] configStack = new long[32];
     protected byte stackIndex = 0;
@@ -31,15 +30,20 @@ public class FontRendererDefault implements FontRenderer {
     protected final double[] localYPosBuffer = new double[1];
     protected final long[] localConfigBuffer = new long[1];
 
-    public FontRendererDefault(@NotNull final Font font) {
-        this.fallbackFont = new FontUnicode(Minecraft.getMinecraft().textureManager);
+    public FontRendererDefault() {
+        this(null);
+    }
+
+    public FontRendererDefault(@Nullable final Font font) {
+        super();
+        this.fallbackFont = Fonts.UNICODE;
         this.font = font;
         this.random = new Random();
     }
 
-    protected void renderStringInternal(@NotNull final Tessellator tessellator, final @NotNull CharSequence chars, final double x, final double y, final double z, final boolean shadow, final long baseConfig, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
+    private static final StringBuilder renderStringInternal_colorValue = new StringBuilder();
+    protected void renderStringInternal(@NotNull final Font font, @NotNull final Tessellator tessellator, final @NotNull CharSequence chars, final double x, final double y, final double z, final boolean shadow, final long baseConfig, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
         double currX = x;
-        final double currY = y;
 
         this.random.setSeed(System.currentTimeMillis()/50);
 
@@ -50,22 +54,21 @@ public class FontRendererDefault implements FontRenderer {
                 final char cNext = chars.charAt(i + 1);
                 if (cNext == '<') {
                     int offAmount = 1;
-                    int j = i + 2; // First char after <
-                    final StringBuilder colorValue = new StringBuilder();
+                    renderStringInternal_colorValue.setLength(0);
                     boolean ended = false;
-                    while (j < chars.length()) {
+                    for (int j = 0; j < 8; j++) { // Maximum of 8 chars allowed in argb color code
                         offAmount++;
-                        if (chars.charAt(j) == '>'){
+                        final char pChar = chars.charAt(i + 2 + j);
+                        if (pChar == '>'){
                             ended = true;
                             break;
                         }
-                        colorValue.append(chars.charAt(j));
-                        j++;
+                        renderStringInternal_colorValue.append(pChar);
                     }
 
                     if (ended){
                         long colorInt = 0xFFFFFF;
-                        try { colorInt = decodeHexToLong(colorValue); } catch (final NumberFormatException ignored){}
+                        try { colorInt = decodeHexToLong(renderStringInternal_colorValue); } catch (final NumberFormatException ignored){}
 
                         this.currentConfig = SF.setColor(this.currentConfig, (colorInt & 0xFF_00_00_00L) == 0 ? (int) (colorInt & 0x00_FF_FF_FFL) | (SF.getColor(baseConfig) & 0xFF_00_00_00) : ((int)colorInt));
                         //noinspection AssignmentToForLoopParameter
@@ -128,82 +131,87 @@ public class FontRendererDefault implements FontRenderer {
                     }
                 }
             }
+            final Font charFont = font.canRenderChar(c) ? font : this.fallbackFont;
 
-            final int tex = textureForChar(c);
+            final int tex = charFont.textureForChar(c);
             if (this.currentTex != tex) {
                 this.currentTex = tex;
                 GL11.glBindTexture(GL11.GL_TEXTURE_2D, tex);
             }
 
-            currX += renderCharInternal(tessellator, c, currX, currY, z, SF.getColor(this.currentConfig), shadow);
+            currX += renderCharInternal(charFont, tessellator, c, currX, y, z, SF.getColor(this.currentConfig), shadow);
         }
 
         if (xPosBuffer != null) {
             xPosBuffer[0] = currX;
         }
         if (yPosBuffer != null) {
-            yPosBuffer[0] = currY + fontHeight() + 1;
+            yPosBuffer[0] = y + font.fontHeight() + 1;
         }
         if (configBuffer != null) {
             configBuffer[0] = this.currentConfig;
         }
     }
 
-    protected double renderCharInternal(@NotNull final Tessellator tessellator, final char c, final double x, final double y, final double z, final int color, final boolean shadow) {
+    protected double renderCharInternal(@NotNull final Font font, @NotNull final Tessellator tessellator, final char c, final double x, final double y, final double z, final int color, final boolean shadow) {
         final int rgb = color & 0xFFFFFF;
         final int shadowRGB = (color & 0xFCFCFC) >> 2; // Divide RGB by 4
         final int a = (color & 0xFF_00_00_00) != 0 ? (color >> 24) & 0xFF : 0xFF;
         tessellator.startDrawingQuads();
+
+        final double px = 1;
+        final double px2 = px * 2;
+
         double shift;
         final int fontIndex = ChatAllowedCharacters.ALLOWED_CHARACTERS.indexOf(c);
         if (SF.isObfuscated(this.currentConfig) && c != ' ' && fontIndex > 0) {
-            shift = charWidth(c);
-            final char randomChar = getObfuscatedChar(c, this.random);
+            shift = font.charWidth(c);
+            final char randomChar = font.getObfuscatedChar(c, this.random);
 
             if (shadow) {
                 tessellator.setColorRGBA_I(shadowRGB, a);
-                renderChar(tessellator, randomChar, x + 1, y + 1, z, SF.isItalic(this.currentConfig));
-                if (SF.isBold(this.currentConfig)) renderChar(tessellator, randomChar, x + 2, y + 1, z, SF.isItalic(this.currentConfig));
+                font.renderChar(tessellator, randomChar, x + px, y + px, z, SF.isItalic(this.currentConfig));
+                if (SF.isBold(this.currentConfig)) font.renderChar(tessellator, randomChar, x + px2, y + px, z, SF.isItalic(this.currentConfig));
             }
 
             tessellator.setColorRGBA_I(rgb, a);
-            renderChar(tessellator, randomChar, x, y, z, SF.isItalic(this.currentConfig));
+            font.renderChar(tessellator, randomChar, x, y, z, SF.isItalic(this.currentConfig));
             if (SF.isBold(this.currentConfig)) {
-                renderChar(tessellator, randomChar, x + 1, y, z, SF.isItalic(this.currentConfig));
-                shift++;
+                font.renderChar(tessellator, randomChar, x + px, y, z, SF.isItalic(this.currentConfig));
+                shift += px;
             }
 
         } else {
             if (shadow) {
                 tessellator.setColorRGBA_I(shadowRGB, a);
-                renderChar(tessellator, c, x + 1, y + 1, z, SF.isItalic(this.currentConfig));
-                if (SF.isBold(this.currentConfig)) renderChar(tessellator, c, x + 2, y + 1, z, SF.isItalic(this.currentConfig));
+                font.renderChar(tessellator, c, x + px, y + px, z, SF.isItalic(this.currentConfig));
+                if (SF.isBold(this.currentConfig)) font.renderChar(tessellator, c, x + px2, y + px, z, SF.isItalic(this.currentConfig));
             }
 
             tessellator.setColorRGBA_I(rgb, a);
-            shift = renderChar(tessellator, c, x, y, z, SF.isItalic(this.currentConfig));
+            shift = font.renderChar(tessellator, c, x, y, z, SF.isItalic(this.currentConfig));
             if (SF.isBold(this.currentConfig)) {
-                renderChar(tessellator, c, x + 1, y, z, SF.isItalic(this.currentConfig));
-                shift++;
+                font.renderChar(tessellator, c, x + px, y, z, SF.isItalic(this.currentConfig));
+                shift += px;
             }
         }
         tessellator.draw();
-
+        final int fontHeight = font.fontHeight();
         if (SF.isStrikethrough(this.currentConfig)) {
             GL11.glDisable(GL11.GL_TEXTURE_2D);
             tessellator.startDrawingQuads();
             if (shadow) {
                 tessellator.setColorRGBA_I(shadowRGB, a);
-                tessellator.addVertex(x + 1,        y + 1 + fontHeight() / 2d,       0.0D);
-                tessellator.addVertex(x + 1 + shift,y + 1 + fontHeight() / 2d,       0.0D);
-                tessellator.addVertex(x + 1 + shift,y + 1 + fontHeight() / 2d - 1.0F,0.0D);
-                tessellator.addVertex(x + 1,        y + 1 + fontHeight() / 2d - 1.0F,0.0D);
+                tessellator.addVertex(x + px,        y + px + fontHeight / 2d,     0.0D);
+                tessellator.addVertex(x + px + shift,y + px + fontHeight / 2d,     0.0D);
+                tessellator.addVertex(x + px + shift,y + px + fontHeight / 2d - px,0.0D);
+                tessellator.addVertex(x + px,        y + px + fontHeight / 2d - px,0.0D);
             }
             tessellator.setColorRGBA_I(rgb, a);
-            tessellator.addVertex(x,        y + fontHeight() / 2d,       0.0D);
-            tessellator.addVertex(x + shift,y + fontHeight() / 2d,       0.0D);
-            tessellator.addVertex(x + shift,y + fontHeight() / 2d - 1.0F,0.0D);
-            tessellator.addVertex(x,        y + fontHeight() / 2d - 1.0F,0.0D);
+            tessellator.addVertex(x,        y + fontHeight / 2d,     0.0D);
+            tessellator.addVertex(x + shift,y + fontHeight / 2d,     0.0D);
+            tessellator.addVertex(x + shift,y + fontHeight / 2d - px,0.0D);
+            tessellator.addVertex(x,        y + fontHeight / 2d - px,0.0D);
             tessellator.draw();
             GL11.glEnable(GL11.GL_TEXTURE_2D);
         }
@@ -213,46 +221,46 @@ public class FontRendererDefault implements FontRenderer {
             tessellator.startDrawingQuads();
             if (shadow) {
                 tessellator.setColorRGBA_I(shadowRGB, a);
-                tessellator.addVertex(x,            y + 2 + fontHeight(),        0.0D);
-                tessellator.addVertex(x + 1 + shift,y + 2 + fontHeight(),        0.0D);
-                tessellator.addVertex(x + 1 + shift,y + 2 + fontHeight() - 1.0F, 0.0D);
-                tessellator.addVertex(x,            y + 2 + fontHeight() - 1.0F, 0.0D);
+                tessellator.addVertex(x,             y + px2 + fontHeight,      0.0D);
+                tessellator.addVertex(x + px + shift,y + px2 + fontHeight,      0.0D);
+                tessellator.addVertex(x + px + shift,y + px2 + fontHeight - px, 0.0D);
+                tessellator.addVertex(x,             y + px2 + fontHeight - px, 0.0D);
             }
             tessellator.setColorRGBA_I(rgb, a);
-            tessellator.addVertex(x - 1,    y + 1 + fontHeight(),        0.0D);
-            tessellator.addVertex(x + shift,y + 1 + fontHeight(),        0.0D);
-            tessellator.addVertex(x + shift,y + 1 + fontHeight() - 1.0F, 0.0D);
-            tessellator.addVertex(x - 1,    y + 1 + fontHeight() - 1.0F, 0.0D);
+            tessellator.addVertex(x - px,    y + px + fontHeight,      0.0D);
+            tessellator.addVertex(x + shift, y + px + fontHeight,      0.0D);
+            tessellator.addVertex(x + shift, y + px + fontHeight - px, 0.0D);
+            tessellator.addVertex(x - px,    y + px + fontHeight - px, 0.0D);
             tessellator.draw();
             GL11.glEnable(GL11.GL_TEXTURE_2D);
         }
         return shift;
     }
     @Override
-    public void renderDouble(@NotNull final Tessellator tessellator, final @NotNull CharSequence chars, final double x, final double y, final double z, final boolean shadow, final long baseConfig, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
+    public void renderDoubleImpl(@NotNull final Font font, @NotNull final Tessellator tessellator, final @NotNull CharSequence chars, final double x, final double y, final double z, final boolean shadow, final long baseConfig, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
         this.currentTex = -1;
         this.currentConfig = baseConfig;
         this.stackIndex = 0;
-        renderStringInternal(tessellator, chars, x, y, z, shadow, baseConfig, xPosBuffer, yPosBuffer, configBuffer);
+        renderStringInternal(font, tessellator, chars, x, y, z, shadow, baseConfig, xPosBuffer, yPosBuffer, configBuffer);
     }
 
     @Override
-    public void render(@NotNull final Tessellator tessellator, final @NotNull CharSequence chars, final int x, final int y, final double z, final boolean shadow, final long baseConfig, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
-        renderDouble(tessellator, chars, x, y, z, shadow, baseConfig, xPosBuffer, yPosBuffer, configBuffer);
+    public void renderImpl(@NotNull final Font font, @NotNull final Tessellator tessellator, final @NotNull CharSequence chars, final int x, final int y, final double z, final boolean shadow, final long baseConfig, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
+        renderDoubleImpl(font, tessellator, chars, x, y, z, shadow, baseConfig, xPosBuffer, yPosBuffer, configBuffer);
     }
 
     @Override
-    public void renderCenteredDouble(@NotNull final Tessellator tessellator, final @NotNull CharSequence chars, final double x, final double y, final double z, final boolean shadow, final long baseConfig, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
-        renderDouble(tessellator, chars, x - stringWidthDouble(chars)/2d, y, z, shadow, baseConfig, xPosBuffer, yPosBuffer, configBuffer);
+    public void renderCenteredDoubleImpl(@NotNull final Font font, @NotNull final Tessellator tessellator, final @NotNull CharSequence chars, final double x, final double y, final double z, final boolean shadow, final long baseConfig, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
+        renderDoubleImpl(font, tessellator, chars, x - stringWidthDouble(chars)/2d, y, z, shadow, baseConfig, xPosBuffer, yPosBuffer, configBuffer);
     }
 
     @Override
-    public void renderCentered(@NotNull final Tessellator tessellator, final @NotNull CharSequence chars, final int x, final int y, final double z, final boolean shadow, final long baseConfig, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
-        render(tessellator, chars, x - stringWidth(chars)/2, y, z, shadow, baseConfig, xPosBuffer, yPosBuffer, configBuffer);
+    public void renderCenteredImpl(@NotNull final Font font, @NotNull final Tessellator tessellator, final @NotNull CharSequence chars, final int x, final int y, final double z, final boolean shadow, final long baseConfig, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
+        renderImpl(font, tessellator, chars, x - stringWidth(chars)/2, y, z, shadow, baseConfig, xPosBuffer, yPosBuffer, configBuffer);
     }
 
     @Override
-    public void renderWidthConstrainedDouble(@NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final double x, final double y, final double z, final boolean shadow, final long baseConfig, final double maxWidth, @NotNull final Alignment alignment, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
+    public void renderWidthConstrainedDoubleImpl(@NotNull final Font font, @NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final double x, final double y, final double z, final boolean shadow, final long baseConfig, final double maxWidth, @NotNull final Alignment alignment, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
         this.currentTex = -1;
         this.currentConfig = baseConfig;
         this.stackIndex = 0;
@@ -264,24 +272,24 @@ public class FontRendererDefault implements FontRenderer {
             case LEFT: {
                 for (int i = 0; i < lines.size(); i++) {
                     final String line = lines.get(i);
-                    renderStringInternal(tessellator, line, x, currY, z, shadow, baseConfig, this.localXPosBuffer, this.localYPosBuffer, this.localConfigBuffer);
-                    currY += fontHeight() + 1;
+                    renderStringInternal(font, tessellator, line, x, currY, z, shadow, baseConfig, this.localXPosBuffer, this.localYPosBuffer, this.localConfigBuffer);
+                    currY += font.fontHeight() + 1;
                 }
                 break;
             }
             case RIGHT: {
                 for (int i = 0; i < lines.size(); i++) {
                     final String line = lines.get(i);
-                    renderStringInternal(tessellator, line, x + (maxWidth - stringWidthDouble(line)), currY, z, shadow, baseConfig, this.localXPosBuffer, this.localYPosBuffer, this.localConfigBuffer);
-                    currY += fontHeight() + 1;
+                    renderStringInternal(font, tessellator, line, x + (maxWidth - stringWidthDouble(line)), currY, z, shadow, baseConfig, this.localXPosBuffer, this.localYPosBuffer, this.localConfigBuffer);
+                    currY += font.fontHeight() + 1;
                 }
                 break;
             }
             case CENTERED: {
                 for (int i = 0; i < lines.size(); i++) {
                     final String line = lines.get(i);
-                    renderStringInternal(tessellator, line, x + (maxWidth - stringWidthDouble(line))/2, currY, z, shadow, baseConfig, this.localXPosBuffer, this.localYPosBuffer, this.localConfigBuffer);
-                    currY += fontHeight() + 1;
+                    renderStringInternal(font, tessellator, line, x + (maxWidth - stringWidthDouble(line))/2, currY, z, shadow, baseConfig, this.localXPosBuffer, this.localYPosBuffer, this.localConfigBuffer);
+                    currY += font.fontHeight() + 1;
                 }
                 break;
             }
@@ -299,7 +307,7 @@ public class FontRendererDefault implements FontRenderer {
     }
 
     @Override
-    public void renderWidthConstrained(@NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final int x, final int y, final double z, final boolean shadow, final long baseConfig, final int maxWidth, @NotNull final Alignment alignment, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
+    public void renderWidthConstrainedImpl(@NotNull final Font font, @NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final int x, final int y, final double z, final boolean shadow, final long baseConfig, final int maxWidth, @NotNull final Alignment alignment, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
         this.currentTex = -1;
         this.currentConfig = baseConfig;
         this.stackIndex = 0;
@@ -311,24 +319,24 @@ public class FontRendererDefault implements FontRenderer {
             case LEFT: {
                 for (int i = 0; i < lines.size(); i++) {
                     final String line = lines.get(i);
-                    renderStringInternal(tessellator, line, x, currY, z, shadow, baseConfig, this.localXPosBuffer, this.localYPosBuffer, this.localConfigBuffer);
-                    currY += fontHeight() + 1;
+                    renderStringInternal(font, tessellator, line, x, currY, z, shadow, baseConfig, this.localXPosBuffer, this.localYPosBuffer, this.localConfigBuffer);
+                    currY += font.fontHeight() + 1;
                 }
                 break;
             }
             case RIGHT: {
                 for (int i = 0; i < lines.size(); i++) {
                     final String line = lines.get(i);
-                    renderStringInternal(tessellator, line, x + (maxWidth - stringWidth(line)), currY, z, shadow, baseConfig, this.localXPosBuffer, this.localYPosBuffer, this.localConfigBuffer);
-                    currY += fontHeight() + 1;
+                    renderStringInternal(font, tessellator, line, x + (maxWidth - stringWidth(line)), currY, z, shadow, baseConfig, this.localXPosBuffer, this.localYPosBuffer, this.localConfigBuffer);
+                    currY += font.fontHeight() + 1;
                 }
                 break;
             }
             case CENTERED: {
                 for (int i = 0; i < lines.size(); i++) {
                     final String line = lines.get(i);
-                    renderStringInternal(tessellator, line, (int)(x + (maxWidth - stringWidth(line))/2), currY, z, shadow, baseConfig, this.localXPosBuffer, this.localYPosBuffer, this.localConfigBuffer);
-                    currY += fontHeight() + 1;
+                    renderStringInternal(font, tessellator, line, (int)(x + (maxWidth - stringWidth(line))/2), currY, z, shadow, baseConfig, this.localXPosBuffer, this.localYPosBuffer, this.localConfigBuffer);
+                    currY += font.fontHeight() + 1;
                 }
                 break;
             }
@@ -346,7 +354,7 @@ public class FontRendererDefault implements FontRenderer {
     }
 
     @Override
-    public void renderConstrainedDouble(@NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final double x, final double y, final double z, final boolean shadow, final long baseConfig, final double maxWidth, final double maxHeight, @NotNull final Alignment alignment, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
+    public void renderConstrainedDoubleImpl(@NotNull final Font font, @NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final double x, final double y, final double z, final boolean shadow, final long baseConfig, final double maxWidth, final double maxHeight, @NotNull final Alignment alignment, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
         this.currentTex = -1;
         this.currentConfig = baseConfig;
         this.stackIndex = 0;
@@ -359,8 +367,8 @@ public class FontRendererDefault implements FontRenderer {
             case LEFT: {
                 for (int i = 0; i < lines.size(); i++) {
                     final String line = lines.get(i);
-                    renderStringInternal(tessellator, line, x, currY, z, shadow, baseConfig, null, null, this.localConfigBuffer);
-                    currY += fontHeight() + 1;
+                    renderStringInternal(font, tessellator, line, x, currY, z, shadow, baseConfig, null, null, this.localConfigBuffer);
+                    currY += font.fontHeight() + 1;
                     if ((currY - y) > maxHeight) break;
                 }
                 break;
@@ -368,8 +376,8 @@ public class FontRendererDefault implements FontRenderer {
             case RIGHT: {
                 for (int i = 0; i < lines.size(); i++) {
                     final String line = lines.get(i);
-                    renderStringInternal(tessellator, line, x + (maxWidth - stringWidthDouble(line)), currY, z, shadow, baseConfig, null, null, this.localConfigBuffer);
-                    currY += fontHeight() + 1;
+                    renderStringInternal(font, tessellator, line, x + (maxWidth - stringWidthDouble(line)), currY, z, shadow, baseConfig, null, null, this.localConfigBuffer);
+                    currY += font.fontHeight() + 1;
                     if ((currY - y) > maxHeight) break;
                 }
                 break;
@@ -377,8 +385,8 @@ public class FontRendererDefault implements FontRenderer {
             case CENTERED: {
                 for (int i = 0; i < lines.size(); i++) {
                     final String line = lines.get(i);
-                    renderCenteredDouble(tessellator, line, x + maxWidth/2, currY, z, shadow, baseConfig, null, null, this.localConfigBuffer);
-                    currY += fontHeight() + 1;
+                    renderCenteredDoubleImpl(font, tessellator, line, x + maxWidth/2, currY, z, shadow, baseConfig, null, null, this.localConfigBuffer);
+                    currY += font.fontHeight() + 1;
                     if ((currY - y) > maxHeight) break;
                 }
                 break;
@@ -397,15 +405,15 @@ public class FontRendererDefault implements FontRenderer {
     }
 
     @Override
-    public void renderConstrained(@NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final int x, final int y, final double z, final boolean shadow, final long baseConfig, final int maxWidth, final int maxHeight, @NotNull final Alignment alignment, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
-        renderConstrainedDouble(tessellator, chars, x, y, z, shadow, baseConfig, maxWidth, maxHeight, alignment, xPosBuffer, yPosBuffer, configBuffer);
+    public void renderConstrainedImpl(@NotNull final Font font, @NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final int x, final int y, final double z, final boolean shadow, final long baseConfig, final int maxWidth, final int maxHeight, @NotNull final Alignment alignment, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
+        renderConstrainedDoubleImpl(font, tessellator, chars, x, y, z, shadow, baseConfig, maxWidth, maxHeight, alignment, xPosBuffer, yPosBuffer, configBuffer);
     }
 
     private static final StringBuilder splitLineIntoConstrainedLine_lineBuilder = new StringBuilder();
     private static final StringBuilder splitLineIntoConstrainedLine_wordBuilder = new StringBuilder();
-    protected void splitLineIntoConstrainedLine(final @NotNull CharSequence line, final double maxWidth, final @NotNull List<String> output) {
-        final double dashWidth = charWidthDouble('-');
-        final double spaceWidth = charWidthDouble(' ');
+    protected void splitLineIntoConstrainedLine(final @NotNull Font font, final @NotNull CharSequence line, final double maxWidth, final @NotNull List<String> output) {
+        final double dashWidth = font.charWidthDouble('-');
+        final double spaceWidth = font.charWidthDouble(' ');
 
         double currLineWidth = 0;
         double currWordWidth = 0;
@@ -438,15 +446,13 @@ public class FontRendererDefault implements FontRenderer {
                 final char cN = line.charAt(i + 1);
                 if (cN == '<') {
                     int offAmount = 1;
-                    int j = i + 2; // first char after '<'
                     boolean ended = false;
-                    while (j < length) {
+                    for (int j = 0; j < 8; j++) { // Maximum of 8 chars allowed in argb color code
                         offAmount++;
-                        if (line.charAt(j) == '>'){
+                        if (line.charAt(j + i + 2) == '>'){
                             ended = true;
                             break;
                         }
-                        j++;
                     }
 
                     if (ended){
@@ -465,7 +471,7 @@ public class FontRendererDefault implements FontRenderer {
                 }
             }
 
-            final double charWidth = charWidthDouble(c);
+            final double charWidth = font.canRenderChar(c) ? font.charWidthDouble(c) : this.fallbackFont.charWidthDouble(c);
             if (currWordWidth + charWidth + dashWidth > maxWidth) {
                 splitLineIntoConstrainedLine_wordBuilder.append('-');
                 splitLineIntoConstrainedLine_lineBuilder.append(splitLineIntoConstrainedLine_wordBuilder);
@@ -512,63 +518,37 @@ public class FontRendererDefault implements FontRenderer {
         }
     }
     @Override
-    public @NotNull List<String> splitCharsIntoLines(@NotNull final CharSequence chars, final double maxWidth, @Nullable final List<String> output) {
+    public @NotNull List<String> splitCharsIntoLines(@NotNull final Font font, @NotNull final CharSequence chars, final double maxWidth, @Nullable final List<String> output) {
         final @NotNull List<String> o = output == null ? new ArrayList<>() : output;
         o.clear();
-        splitLineIntoConstrainedLine(chars, maxWidth, o);
+        splitLineIntoConstrainedLine(font, chars, maxWidth, o);
         return o;
     }
 
     @Override
-    public @NotNull List<String> splitLinesIntoConstrainedLines(@NotNull final List<String> lines, final double maxWidth, @Nullable final List<String> output) {
+    public @NotNull List<String> splitLinesIntoConstrainedLines(@NotNull final Font font, @NotNull final List<String> lines, final double maxWidth, @Nullable final List<String> output) {
         final @NotNull List<String> o = output == null ? new ArrayList<>() : output;
         o.clear();
         for (int i = 0; i < lines.size(); i++) {
-            splitLineIntoConstrainedLine(lines.get(i), maxWidth, o);
+            splitLineIntoConstrainedLine(font, lines.get(i), maxWidth, o);
         }
         return o;
     }
 
     @Override
-    public double heightOfConstrainedChars(@NotNull final CharSequence chars, final double maxWidth) {
+    public double heightOfConstrainedChars(@NotNull final Font font, @NotNull final CharSequence chars, final double maxWidth) {
         splitCharsIntoLines(chars, maxWidth, this.localStringList);
-        return this.localStringList.size() * (fontHeight() + 1);
+        return this.localStringList.size() * (font.fontHeight() + 1);
     }
 
     @Override
-    public double heightOfLines(@NotNull final List<@NotNull String> lines, final double maxWidth) {
+    public double heightOfLines(@NotNull final Font font, @NotNull final List<@NotNull String> lines, final double maxWidth) {
         splitLinesIntoConstrainedLines(lines, maxWidth, this.localStringList);
-        return this.localStringList.size() * (fontHeight() + 1);
-    }
-
-    @Override
-    public void init(@NotNull final TexturePackList packList) {
-        this.font.init(packList);
-        this.fallbackFont.init(packList);
+        return this.localStringList.size() * (font.fontHeight() + 1);
     }
 
     @Override
-    public int textureForChar(final char c) {
-        return getFont(c).textureForChar(c);
-    }
-
-    @Override
-    public char getObfuscatedChar(final char c, final Random random) {
-        return getFont(c).getObfuscatedChar(c, random);
-    }
-
-    @Override
-    public boolean canRenderChar(final char c) {
-        return this.font.canRenderChar(c) || this.fallbackFont.canRenderChar(c);
-    }
-
-    @Override
-    public double charWidthDouble(final char c) {
-        return getFont(c).charWidthDouble(c);
-    }
-
-    @Override
-    public double stringWidthDouble(final CharSequence chars) {
+    public double stringWidthDouble(@NotNull final Font font, final @NotNull CharSequence chars) {
         double width = 0;
         final int length = chars.length();
         for (int i = 0; i < length; i++) {
@@ -601,29 +581,13 @@ public class FontRendererDefault implements FontRenderer {
                 }
             }
 
-            width += charWidthDouble(c);
+            width += font.canRenderChar(c) ? font.charWidthDouble(c) : this.fallbackFont.charWidthDouble(c);
         }
         return width;
     }
 
-    @Override
-    public int fontHeight() {
-        return getFont().fontHeight();
-    }
-
-    @Override
-    public double renderChar(final Tessellator tessellator, final char c, final double x, final double y, final double z, final boolean italics) {
-        return getFont(c).renderChar(tessellator, c, x, y, z, italics);
-    }
-
-    protected @NotNull Font getFont(final char c) {
-        if (Minecraft.getMinecraft().gameSettings.forceUnicodeFont.value || !this.font.canRenderChar(c)) return this.fallbackFont;
-        return this.font;
-    }
-
-    protected @NotNull Font getFont() {
-        if (Minecraft.getMinecraft().gameSettings.forceUnicodeFont.value) return this.fallbackFont;
-        return this.font;
+    public @NotNull Font getFont() {
+        return this.font == null ? Minecraft.getMinecraft().gameSettings.font.value : this.font;
     }
 
     public static int decodeHexToInt(final @NotNull CharSequence hexSequence) throws NumberFormatException {
diff --git a/game/client/src/main/java/net/minecraft/client/render/font/FontUnicode.java b/game/client/src/main/java/net/minecraft/client/render/font/FontUnicode.java
index 911b9c463..27d4ff1cc 100644
--- a/game/client/src/main/java/net/minecraft/client/render/font/FontUnicode.java
+++ b/game/client/src/main/java/net/minecraft/client/render/font/FontUnicode.java
@@ -1,15 +1,9 @@
 package net.minecraft.client.render.font;
 
-import net.minecraft.client.render.TextureManager;
 import org.jetbrains.annotations.NotNull;
 
 public class FontUnicode extends FontFile {
-    public FontUnicode(final @NotNull TextureManager textureManager) {
-        super(textureManager, "/font/glyph_%02X.png", "/font/glyph_sizes.bin");
+    public FontUnicode(@NotNull final String key) {
+        super(key, "/assets/minecraft/textures/gui/font/unicode/glyph_%02X.png", "/assets/minecraft/textures/gui/font/unicode/glyph_sizes.bin");
     }
-    @Override
-    public boolean canRenderChar(final char c) {
-        return c == ' ' || textureForChar(c) != 0;
-    }
-
 }
diff --git a/game/client/src/main/java/net/minecraft/client/render/font/Fonts.java b/game/client/src/main/java/net/minecraft/client/render/font/Fonts.java
new file mode 100644
index 000000000..140be015d
--- /dev/null
+++ b/game/client/src/main/java/net/minecraft/client/render/font/Fonts.java
@@ -0,0 +1,56 @@
+package net.minecraft.client.render.font;
+
+import net.minecraft.client.render.texturepack.TexturePackList;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class Fonts {
+    private static final @NotNull List<Font> permanentFonts = new ArrayList<>();
+    private static final @NotNull List<Font> availableFonts = new ArrayList<>();
+
+    private static final @NotNull Map<@NotNull String, @NotNull Font> fontMap = new HashMap<>();
+
+    public static final Font DEFAULT = registerFont(new FontDefault("default"), true);
+    public static final Font MONOSPACE = registerFont(new FontMonospace("monospace"), true);
+    public static final Font UNICODE = registerFont(new FontUnicode("unicode"), true);
+
+    public static @NotNull Font registerFont(@NotNull final Font font, final boolean permanent) {
+        fontMap.put(font.getKey(), font);
+        if (permanent && !permanentFonts.contains(font)) permanentFonts.add(font);
+        if (!availableFonts.contains(font)) availableFonts.add(font);
+        return font;
+    }
+
+    public static void refreshFonts(@NotNull final TexturePackList texturePackList) {
+        fontMap.clear();
+        availableFonts.clear();
+        availableFonts.addAll(permanentFonts);
+
+        for (final Font font : availableFonts) {
+            registerFont(font, false);
+        }
+
+        fontMap.values().forEach(font -> font.init(texturePackList));
+    }
+
+    public static int fontAmount() {
+        return availableFonts.size();
+    }
+
+    public static @NotNull Font fontAtIndex(final int index) {
+        if (index < 0 || index >= availableFonts.size()) return DEFAULT;
+        return availableFonts.get(index);
+    }
+
+    public static int indexForFont(final @NotNull Font font) {
+        return availableFonts.indexOf(font);
+    }
+
+    public static @NotNull Font fontWithKey(@NotNull final String key) {
+        return fontMap.getOrDefault(key, DEFAULT);
+    }
+}
diff --git a/game/client/src/main/java/net/minecraft/client/render/font/renderhelper/RenderDoubleBase.java b/game/client/src/main/java/net/minecraft/client/render/font/RenderDoubleBase.java
similarity index 71%
rename from game/client/src/main/java/net/minecraft/client/render/font/renderhelper/RenderDoubleBase.java
rename to game/client/src/main/java/net/minecraft/client/render/font/RenderDoubleBase.java
index bbf262aea..24e79b7a0 100644
--- a/game/client/src/main/java/net/minecraft/client/render/font/renderhelper/RenderDoubleBase.java
+++ b/game/client/src/main/java/net/minecraft/client/render/font/RenderDoubleBase.java
@@ -1,7 +1,5 @@
-package net.minecraft.client.render.font.renderhelper;
+package net.minecraft.client.render.font;
 
-import net.minecraft.client.render.font.SF;
-import net.minecraft.client.render.font.FontRenderer;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.util.helper.Color;
 import org.jetbrains.annotations.NotNull;
@@ -9,8 +7,10 @@ import org.jetbrains.annotations.Nullable;
 
 @SuppressWarnings("unused")
 public abstract class RenderDoubleBase {
+    protected @NotNull FontRenderer fontRenderer;
     protected @NotNull Tessellator tessellator;
     protected @NotNull CharSequence chars;
+    protected @NotNull Font font;
     protected double x;
     protected double y;
     protected double z;
@@ -19,11 +19,15 @@ public abstract class RenderDoubleBase {
     protected long @Nullable [] configBuffer;
     protected long config;
     protected boolean shadow;
+    protected boolean needCall;
     RenderDoubleBase() {
 
     }
 
-    public @NotNull RenderDoubleBase init(@NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final double x, final double y, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
+    public @NotNull RenderDoubleBase init(@NotNull final FontRenderer fontRenderer, @NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final double x, final double y, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
+        if (this.needCall) throw new IllegalStateException("Init called before prior draw call!");
+        this.fontRenderer = fontRenderer;
+        this.font = this.fontRenderer.getFont();
         this.tessellator = tessellator;
         this.chars = chars;
         this.x = x;
@@ -32,8 +36,10 @@ public abstract class RenderDoubleBase {
         this.xPosBuffer = xPosBuffer;
         this.yPosBuffer = yPosBuffer;
         this.configBuffer = configBuffer;
-        this.config = FontHelper.CONFIG_DEFAULT;
+        this.config = FontRenderer.CONFIG_DEFAULT;
         this.shadow = false;
+
+        this.needCall = true;
         return this;
     }
 
@@ -43,7 +49,7 @@ public abstract class RenderDoubleBase {
     }
 
     public @NotNull RenderDoubleBase resetConfig() {
-        this.config = FontHelper.CONFIG_DEFAULT;
+        this.config = FontRenderer.CONFIG_DEFAULT;
         this.shadow = false;
         this.z = 0;
         return this;
@@ -64,6 +70,11 @@ public abstract class RenderDoubleBase {
         return this;
     }
 
+    public @NotNull RenderDoubleBase setFont(final @NotNull Font font) {
+        this.font = font;
+        return this;
+    }
+
     public @NotNull RenderDoubleBase setItalic() {
         this.config = SF.setItalic(this.config);
         return this;
@@ -94,5 +105,5 @@ public abstract class RenderDoubleBase {
         return this;
     }
 
-    public abstract void call(@NotNull FontRenderer fontRenderer);
+    public abstract void call();
 }
diff --git a/game/client/src/main/java/net/minecraft/client/render/font/renderhelper/RenderDoubleConstrainedBase.java b/game/client/src/main/java/net/minecraft/client/render/font/RenderDoubleConstrainedBase.java
similarity index 75%
rename from game/client/src/main/java/net/minecraft/client/render/font/renderhelper/RenderDoubleConstrainedBase.java
rename to game/client/src/main/java/net/minecraft/client/render/font/RenderDoubleConstrainedBase.java
index 56904dfb6..078d8ab3d 100644
--- a/game/client/src/main/java/net/minecraft/client/render/font/renderhelper/RenderDoubleConstrainedBase.java
+++ b/game/client/src/main/java/net/minecraft/client/render/font/RenderDoubleConstrainedBase.java
@@ -1,8 +1,5 @@
-package net.minecraft.client.render.font.renderhelper;
+package net.minecraft.client.render.font;
 
-import net.minecraft.client.render.font.Alignment;
-import net.minecraft.client.render.font.SF;
-import net.minecraft.client.render.font.FontRenderer;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.util.helper.Color;
 import org.jetbrains.annotations.NotNull;
@@ -10,8 +7,10 @@ import org.jetbrains.annotations.Nullable;
 
 @SuppressWarnings("unused")
 public abstract class RenderDoubleConstrainedBase {
+    protected @NotNull FontRenderer fontRenderer;
     protected @NotNull Tessellator tessellator;
     protected @NotNull CharSequence chars;
+    protected @NotNull Font font;
     protected double x;
     protected double y;
     protected double z;
@@ -23,11 +22,15 @@ public abstract class RenderDoubleConstrainedBase {
     protected @NotNull Alignment alignment;
     protected long config;
     protected boolean shadow;
+    protected boolean needCall;
     RenderDoubleConstrainedBase() {
 
     }
 
-    public @NotNull RenderDoubleConstrainedBase init(@NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final double x, final double y, final double maxWidth, final double maxHeight, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
+    public @NotNull RenderDoubleConstrainedBase init(@NotNull final FontRenderer fontRenderer, @NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final double x, final double y, final double maxWidth, final double maxHeight, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
+        if (this.needCall) throw new IllegalStateException("Init called before prior draw call!");
+        this.fontRenderer = fontRenderer;
+        this.font = this.fontRenderer.getFont();
         this.tessellator = tessellator;
         this.chars = chars;
         this.x = x;
@@ -39,8 +42,10 @@ public abstract class RenderDoubleConstrainedBase {
         this.yPosBuffer = yPosBuffer;
         this.configBuffer = configBuffer;
         this.alignment = Alignment.LEFT;
-        this.config = FontHelper.CONFIG_DEFAULT;
+        this.config = FontRenderer.CONFIG_DEFAULT;
         this.shadow = false;
+
+        this.needCall = true;
         return this;
     }
 
@@ -50,7 +55,7 @@ public abstract class RenderDoubleConstrainedBase {
     }
 
     public @NotNull RenderDoubleConstrainedBase resetConfig() {
-        this.config = FontHelper.CONFIG_DEFAULT;
+        this.config = FontRenderer.CONFIG_DEFAULT;
         this.shadow = false;
         this.z = 0;
         return this;
@@ -71,6 +76,11 @@ public abstract class RenderDoubleConstrainedBase {
         return this;
     }
 
+    public @NotNull RenderDoubleConstrainedBase setFont(final @NotNull Font font) {
+        this.font = font;
+        return this;
+    }
+
     public @NotNull RenderDoubleConstrainedBase setItalic() {
         this.config = SF.setItalic(this.config);
         return this;
@@ -106,5 +116,5 @@ public abstract class RenderDoubleConstrainedBase {
         return this;
     }
 
-    public abstract void call(@NotNull FontRenderer fontRenderer);
+    public abstract void call();
 }
diff --git a/game/client/src/main/java/net/minecraft/client/render/font/renderhelper/RenderIntegerBase.java b/game/client/src/main/java/net/minecraft/client/render/font/RenderIntegerBase.java
similarity index 71%
rename from game/client/src/main/java/net/minecraft/client/render/font/renderhelper/RenderIntegerBase.java
rename to game/client/src/main/java/net/minecraft/client/render/font/RenderIntegerBase.java
index c92e2ad89..3282f48cd 100644
--- a/game/client/src/main/java/net/minecraft/client/render/font/renderhelper/RenderIntegerBase.java
+++ b/game/client/src/main/java/net/minecraft/client/render/font/RenderIntegerBase.java
@@ -1,7 +1,5 @@
-package net.minecraft.client.render.font.renderhelper;
+package net.minecraft.client.render.font;
 
-import net.minecraft.client.render.font.SF;
-import net.minecraft.client.render.font.FontRenderer;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.util.helper.Color;
 import org.jetbrains.annotations.NotNull;
@@ -9,8 +7,10 @@ import org.jetbrains.annotations.Nullable;
 
 @SuppressWarnings("unused")
 public abstract class RenderIntegerBase {
+    protected @NotNull FontRenderer fontRenderer;
     protected @NotNull Tessellator tessellator;
     protected @NotNull CharSequence chars;
+    protected @NotNull Font font;
     protected int x;
     protected int y;
     protected double z;
@@ -19,11 +19,15 @@ public abstract class RenderIntegerBase {
     protected long @Nullable [] configBuffer;
     protected long config;
     protected boolean shadow;
+    protected boolean needCall;
     RenderIntegerBase() {
 
     }
 
-    public @NotNull RenderIntegerBase init(@NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final int x, final int y, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
+    public @NotNull RenderIntegerBase init(@NotNull final FontRenderer fontRenderer, @NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final int x, final int y, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
+        if (this.needCall) throw new IllegalStateException("Init called before prior draw call!");
+        this.fontRenderer = fontRenderer;
+        this.font = this.fontRenderer.getFont();
         this.tessellator = tessellator;
         this.chars = chars;
         this.x = x;
@@ -32,8 +36,10 @@ public abstract class RenderIntegerBase {
         this.xPosBuffer = xPosBuffer;
         this.yPosBuffer = yPosBuffer;
         this.configBuffer = configBuffer;
-        this.config = FontHelper.CONFIG_DEFAULT;
+        this.config = FontRenderer.CONFIG_DEFAULT;
         this.shadow = false;
+
+        this.needCall = true;
         return this;
     }
 
@@ -43,7 +49,7 @@ public abstract class RenderIntegerBase {
     }
 
     public @NotNull RenderIntegerBase resetConfig() {
-        this.config = FontHelper.CONFIG_DEFAULT;
+        this.config = FontRenderer.CONFIG_DEFAULT;
         this.shadow = false;
         this.z = 0;
         return this;
@@ -64,6 +70,11 @@ public abstract class RenderIntegerBase {
         return this;
     }
 
+    public @NotNull RenderIntegerBase setFont(final @NotNull Font font) {
+        this.font = font;
+        return this;
+    }
+
     public @NotNull RenderIntegerBase setItalic() {
         this.config = SF.setItalic(this.config);
         return this;
@@ -94,5 +105,5 @@ public abstract class RenderIntegerBase {
         return this;
     }
 
-    public abstract void call(@NotNull FontRenderer fontRenderer);
+    public abstract void call();
 }
diff --git a/game/client/src/main/java/net/minecraft/client/render/font/renderhelper/RenderIntegerConstrainedBase.java b/game/client/src/main/java/net/minecraft/client/render/font/RenderIntegerConstrainedBase.java
similarity index 76%
rename from game/client/src/main/java/net/minecraft/client/render/font/renderhelper/RenderIntegerConstrainedBase.java
rename to game/client/src/main/java/net/minecraft/client/render/font/RenderIntegerConstrainedBase.java
index 2abb11678..daddc98e3 100644
--- a/game/client/src/main/java/net/minecraft/client/render/font/renderhelper/RenderIntegerConstrainedBase.java
+++ b/game/client/src/main/java/net/minecraft/client/render/font/RenderIntegerConstrainedBase.java
@@ -1,8 +1,5 @@
-package net.minecraft.client.render.font.renderhelper;
+package net.minecraft.client.render.font;
 
-import net.minecraft.client.render.font.Alignment;
-import net.minecraft.client.render.font.SF;
-import net.minecraft.client.render.font.FontRenderer;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.util.helper.Color;
 import org.jetbrains.annotations.NotNull;
@@ -10,8 +7,10 @@ import org.jetbrains.annotations.Nullable;
 
 @SuppressWarnings("unused")
 public abstract class RenderIntegerConstrainedBase {
+    protected @NotNull FontRenderer fontRenderer;
     protected @NotNull Tessellator tessellator;
     protected @NotNull CharSequence chars;
+    protected @NotNull Font font;
     protected int x;
     protected int y;
     protected double z;
@@ -23,11 +22,15 @@ public abstract class RenderIntegerConstrainedBase {
     protected @NotNull Alignment alignment;
     protected long config;
     protected boolean shadow;
+    protected boolean needCall;
     RenderIntegerConstrainedBase() {
 
     }
 
-    public @NotNull RenderIntegerConstrainedBase init(@NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final int x, final int y, final int maxWidth, final int maxHeight, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
+    public @NotNull RenderIntegerConstrainedBase init(@NotNull final FontRenderer fontRenderer, @NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final int x, final int y, final int maxWidth, final int maxHeight, final double @Nullable [] xPosBuffer, final double @Nullable [] yPosBuffer, final long @Nullable [] configBuffer) {
+        if (this.needCall) throw new IllegalStateException("Init called before prior draw call!");
+        this.fontRenderer = fontRenderer;
+        this.font = this.fontRenderer.getFont();
         this.tessellator = tessellator;
         this.chars = chars;
         this.x = x;
@@ -39,8 +42,10 @@ public abstract class RenderIntegerConstrainedBase {
         this.yPosBuffer = yPosBuffer;
         this.configBuffer = configBuffer;
         this.alignment = Alignment.LEFT;
-        this.config = FontHelper.CONFIG_DEFAULT;
+        this.config = FontRenderer.CONFIG_DEFAULT;
         this.shadow = false;
+
+        this.needCall = true;
         return this;
     }
 
@@ -50,7 +55,7 @@ public abstract class RenderIntegerConstrainedBase {
     }
 
     public @NotNull RenderIntegerConstrainedBase resetConfig() {
-        this.config = FontHelper.CONFIG_DEFAULT;
+        this.config = FontRenderer.CONFIG_DEFAULT;
         this.shadow = false;
         this.z = 0;
         return this;
@@ -71,6 +76,11 @@ public abstract class RenderIntegerConstrainedBase {
         return this;
     }
 
+    public @NotNull RenderIntegerConstrainedBase setFont(final @NotNull Font font) {
+        this.font = font;
+        return this;
+    }
+
     public @NotNull RenderIntegerConstrainedBase setItalic() {
         this.config = SF.setItalic(this.config);
         return this;
@@ -106,5 +116,5 @@ public abstract class RenderIntegerConstrainedBase {
         return this;
     }
 
-    public abstract void call(@NotNull FontRenderer fontRenderer);
+    public abstract void call();
 }
diff --git a/game/client/src/main/java/net/minecraft/client/render/font/renderhelper/FontHelper.java b/game/client/src/main/java/net/minecraft/client/render/font/renderhelper/FontHelper.java
deleted file mode 100644
index 0c01a0737..000000000
--- a/game/client/src/main/java/net/minecraft/client/render/font/renderhelper/FontHelper.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package net.minecraft.client.render.font.renderhelper;
-
-import net.minecraft.client.render.font.FontRenderer;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.util.helper.MathHelper;
-import org.jetbrains.annotations.NotNull;
-
-@SuppressWarnings("unused")
-public final class FontHelper {
-    public static final long CONFIG_DEFAULT = 0xFF_FF_FF_FFL;
-    private static final double @NotNull [] xPosBuffer = new double[1];
-    private static final double @NotNull [] yPosBuffer = new double[1];
-    private static final long @NotNull [] configBuffer = new long[1];
-
-    private static final RenderIntegerBase method_render = new RenderIntegerBase() { @Override public void call(@NotNull final FontRenderer fontRenderer) {
-        fontRenderer.render(this.tessellator, this.chars, this.x, this.y, this.z, this.shadow, this.config, this.xPosBuffer, this.yPosBuffer, this.configBuffer);}};
-
-    private static final RenderDoubleBase method_renderDouble = new RenderDoubleBase() { @Override public void call(@NotNull final FontRenderer fontRenderer) {
-        fontRenderer.renderDouble(this.tessellator, this.chars, this.x, this.y, this.z, this.shadow, this.config, this.xPosBuffer, this.yPosBuffer, this.configBuffer);}};
-
-    private static final RenderIntegerBase method_renderCentered = new RenderIntegerBase() { @Override public void call(@NotNull final FontRenderer fontRenderer) {
-        fontRenderer.renderCentered(this.tessellator, this.chars, this.x, this.y, this.z, this.shadow, this.config, this.xPosBuffer, this.yPosBuffer, this.configBuffer);}};
-
-    private static final RenderDoubleBase method_renderCenteredDouble = new RenderDoubleBase() { @Override public void call(@NotNull final FontRenderer fontRenderer) {
-        fontRenderer.renderCenteredDouble(this.tessellator, this.chars, this.x, this.y, this.z, this.shadow, this.config, this.xPosBuffer, this.yPosBuffer, this.configBuffer);}};
-
-    private static final RenderIntegerConstrainedBase method_renderWidthConstrained = new RenderIntegerConstrainedBase() { @Override public void call(@NotNull final FontRenderer fontRenderer) {
-        fontRenderer.renderWidthConstrained(this.tessellator, this.chars, this.x, this.y, this.z, this.shadow, this.config, this.maxWidth, this.alignment, this.xPosBuffer, this.yPosBuffer, this.configBuffer);}};
-
-    private static final RenderDoubleConstrainedBase method_renderWidthConstrainedDouble = new RenderDoubleConstrainedBase() { @Override public void call(@NotNull final FontRenderer fontRenderer) {
-        fontRenderer.renderWidthConstrainedDouble(this.tessellator, this.chars, this.x, this.y, this.z, this.shadow, this.config, this.maxWidth, this.alignment, this.xPosBuffer, this.yPosBuffer, this.configBuffer);}};
-
-    private static final RenderIntegerConstrainedBase method_renderConstrained = new RenderIntegerConstrainedBase() { @Override public void call(@NotNull final FontRenderer fontRenderer) {
-        fontRenderer.renderConstrained(this.tessellator, this.chars, this.x, this.y, this.z, this.shadow, this.config, this.maxWidth, this.maxHeight, this.alignment, this.xPosBuffer, this.yPosBuffer, this.configBuffer);}};
-
-    private static final RenderDoubleConstrainedBase method_renderConstrainedDouble = new RenderDoubleConstrainedBase() { @Override public void call(@NotNull final FontRenderer fontRenderer) {
-        fontRenderer.renderConstrainedDouble(this.tessellator, this.chars, this.x, this.y, this.z, this.shadow, this.config, this.maxWidth, this.maxHeight, this.alignment, this.xPosBuffer, this.yPosBuffer, this.configBuffer);}};
-
-    private FontHelper() {}
-
-    public static @NotNull RenderIntegerBase render(@NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final int x, final int y) {
-        return method_render.init(tessellator, chars, x, y, xPosBuffer, yPosBuffer, configBuffer);
-    }
-    public static @NotNull RenderDoubleBase renderDouble(@NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final double x, final double y) {
-        return method_renderDouble.init(tessellator, chars, x, y, xPosBuffer, yPosBuffer, configBuffer);
-    }
-    public static @NotNull RenderIntegerBase renderCentered(@NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final int x, final int y) {
-        return method_renderCentered.init(tessellator, chars, x, y, xPosBuffer, yPosBuffer, configBuffer);
-    }
-    public static @NotNull RenderDoubleBase renderDoubleCentered(@NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final double x, final double y) {
-        return method_renderCenteredDouble.init(tessellator, chars, x, y, xPosBuffer, yPosBuffer, configBuffer);
-    }
-    public static @NotNull RenderIntegerConstrainedBase renderWidthConstrained(@NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final int x, final int y, final int maxWidth) {
-        return method_renderWidthConstrained.init(tessellator, chars, x, y, maxWidth, Integer.MAX_VALUE, xPosBuffer, yPosBuffer, configBuffer);
-    }
-    public static @NotNull RenderDoubleConstrainedBase renderWidthConstrainedDouble(@NotNull final Tessellator tessellator, @NotNull final CharSequence chars, final double x, final double y, final double maxWidth) {
-        return method_renderWidthConstrainedDouble.init(tessellator, chars, x, y, maxWidth, Double.MAX_VALUE, xPosBuffer, yPosBuffer, configBuffer);
-    }
-
-    public static int getLastEndingX() {
-        return MathHelper.ceil(xPosBuffer[0]);
-    }
-    public static double getLastEndingXDouble() {
-        return xPosBuffer[0];
-    }
-    public static int getLastEndingY() {
-        return MathHelper.ceil(yPosBuffer[0]);
-    }
-    public static double getLastEndingYDouble() {
-        return yPosBuffer[0];
-    }
-    public static long getLastConfig() {
-        return configBuffer[0];
-    }
-}
diff --git a/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java b/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java
index 998a80791..96c185e2e 100644
--- a/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java
+++ b/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java
@@ -2,7 +2,6 @@ package net.minecraft.client.render.item.model;
 
 import net.minecraft.client.render.TextureManager;
 import net.minecraft.client.render.font.FontRenderer;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
@@ -210,7 +209,7 @@ public class ItemModelStandard extends ItemModel{
             final String s = override != null ? override : "" + itemstack.stackSize;
             GL11.glDisable(GL_LIGHTING);
             GL11.glDisable(GL_DEPTH_TEST);
-            FontHelper.render(tessellator, s, (x + 19) - 2 - fontRenderer.stringWidth(s), y + 6 + 3).setShadow().setColor(0xffffff | (a << 24)).call(fontRenderer);
+            fontRenderer.render(tessellator, s, (x + 19) - 2 - fontRenderer.stringWidth(s), y + 6 + 3).setShadow().setColor(0xffffff | (a << 24)).call();
             GL11.glEnable(GL_LIGHTING);
             GL11.glEnable(GL_DEPTH_TEST);
         }
diff --git a/game/client/src/main/java/net/minecraft/client/render/texturepack/TexturePackList.java b/game/client/src/main/java/net/minecraft/client/render/texturepack/TexturePackList.java
index 119be40f2..2df4fc084 100644
--- a/game/client/src/main/java/net/minecraft/client/render/texturepack/TexturePackList.java
+++ b/game/client/src/main/java/net/minecraft/client/render/texturepack/TexturePackList.java
@@ -236,7 +236,7 @@ public class TexturePackList
 		for (int i = 0; i < this.selectedPacks.size(); i++) {
 			if (this.selectedPacks.get(i).hasFile(path)) return true;
 		}
-		return false;
+		return this.defaultTexturePack.hasFile(path);
 	}
 
 	public @Nullable TexturePack getHighestPriorityTexturePackWithFile(String path) {
diff --git a/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java b/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java
index bd6b3d8ea..345adb7fa 100644
--- a/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java
+++ b/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java
@@ -3,7 +3,6 @@ package net.minecraft.client.render.tileentity;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.font.FontRenderer;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.client.render.model.ModelSign;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.render.texture.stitcher.IconCoordinate;
@@ -109,7 +108,7 @@ public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign>
             {
                 text = "> " + text + " <";
             }
-            FontHelper.render(t, text, -sr.stringWidth(text) / 2, line * 10 - tileEntity.signText.length * 5).setColor(color).call(sr);
+            sr.render(t, text, -sr.stringWidth(text) / 2, line * 10 - tileEntity.signText.length * 5).setColor(color).call();
         }
         GL11.glPopMatrix();
 
diff --git a/game/client/src/main/java/net/minecraft/client/util/debug/DebugRender.java b/game/client/src/main/java/net/minecraft/client/util/debug/DebugRender.java
index e70b289c2..8d1c17267 100644
--- a/game/client/src/main/java/net/minecraft/client/util/debug/DebugRender.java
+++ b/game/client/src/main/java/net/minecraft/client/util/debug/DebugRender.java
@@ -3,7 +3,6 @@ package net.minecraft.client.util.debug;
 import static org.lwjgl.opengl.GL11.*;
 
 import net.minecraft.client.render.font.FontRenderer;
-import net.minecraft.client.render.font.renderhelper.FontHelper;
 import net.minecraft.core.util.debug.Debug;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.opengl.Display;
@@ -119,10 +118,10 @@ public class DebugRender {
 		
 		int fps = Debug.getFps();
 		if(fps >= 0) {
-			FontHelper.render(t, "fps: " + fps, x1, y1 - 2 * lineHeight).call(sr);
+			sr.render(t, "fps: " + fps, x1, y1 - 2 * lineHeight).call();
 		}
-		FontHelper.render(t, "avg: " + (getAvgTime(frametimes) / 1000.0) + " ms", x1, y1 - lineHeight).call(sr);
-		FontHelper.render(t, selectedProfiler.name + ": ", x1, y1).call(sr);
+		sr.render(t, "avg: " + (getAvgTime(frametimes) / 1000.0) + " ms", x1, y1 - lineHeight).call();
+		sr.render(t, selectedProfiler.name + ": ", x1, y1).call();
 		for(int i=0; i < selectedProfiler.allProfilers.size(); i++) {
 			Profiler profiler = selectedProfiler.allProfilers.get(i);
 
@@ -130,7 +129,7 @@ public class DebugRender {
 			if(i == selection) {
 				color = 0xFF00FFFF;
 			}
-			FontHelper.render(t, i + ": " + profiler.name, x1, y1 + (i + 1) * lineHeight).setColor(color).call(sr);
+			sr.render(t, i + ": " + profiler.name, x1, y1 + (i + 1) * lineHeight).setColor(color).call();
 		}
 		glEnable(GL_ALPHA_TEST);
 	}
diff --git a/game/client/src/main/resources/font/font_00.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_00.png
similarity index 100%
rename from game/client/src/main/resources/font/font_00.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_00.png
diff --git a/game/client/src/main/resources/font/font_01.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_01.png
similarity index 100%
rename from game/client/src/main/resources/font/font_01.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_01.png
diff --git a/game/client/src/main/resources/font/font_02.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_02.png
similarity index 100%
rename from game/client/src/main/resources/font/font_02.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_02.png
diff --git a/game/client/src/main/resources/font/font_03.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_03.png
similarity index 100%
rename from game/client/src/main/resources/font/font_03.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_03.png
diff --git a/game/client/src/main/resources/font/font_04.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_04.png
similarity index 100%
rename from game/client/src/main/resources/font/font_04.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_04.png
diff --git a/game/client/src/main/resources/font/font_05.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_05.png
similarity index 100%
rename from game/client/src/main/resources/font/font_05.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_05.png
diff --git a/game/client/src/main/resources/font/font_06.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_06.png
similarity index 100%
rename from game/client/src/main/resources/font/font_06.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_06.png
diff --git a/game/client/src/main/resources/font/font_07.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_07.png
similarity index 100%
rename from game/client/src/main/resources/font/font_07.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_07.png
diff --git a/game/client/src/main/resources/font/font_08.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_08.png
similarity index 100%
rename from game/client/src/main/resources/font/font_08.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_08.png
diff --git a/game/client/src/main/resources/font/font_09.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_09.png
similarity index 100%
rename from game/client/src/main/resources/font/font_09.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_09.png
diff --git a/game/client/src/main/resources/font/font_0A.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_0A.png
similarity index 100%
rename from game/client/src/main/resources/font/font_0A.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_0A.png
diff --git a/game/client/src/main/resources/font/font_0B.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_0B.png
similarity index 100%
rename from game/client/src/main/resources/font/font_0B.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/default/font_0B.png
diff --git a/game/client/src/main/resources/font/glyph_sizes_default.bin b/game/client/src/main/resources/assets/minecraft/textures/gui/font/default/glyph_sizes.bin
similarity index 100%
rename from game/client/src/main/resources/font/glyph_sizes_default.bin
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/default/glyph_sizes.bin
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/font/fonts.json b/game/client/src/main/resources/assets/minecraft/textures/gui/font/fonts.json
new file mode 100644
index 000000000..e068c3d50
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/textures/gui/font/fonts.json
@@ -0,0 +1,8 @@
+{
+    "replace": false,
+    "fonts": [
+        "default",
+        "monospace",
+        "unicode"
+    ]
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/font/mono_00.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/monospace/mono_00.png
similarity index 100%
rename from game/client/src/main/resources/font/mono_00.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/monospace/mono_00.png
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/font/monospace/properties.json b/game/client/src/main/resources/assets/minecraft/textures/gui/font/monospace/properties.json
new file mode 100644
index 000000000..4d6512762
--- /dev/null
+++ b/game/client/src/main/resources/assets/minecraft/textures/gui/font/monospace/properties.json
@@ -0,0 +1,3 @@
+{
+    "size": 10
+}
\ No newline at end of file
diff --git a/game/client/src/main/resources/font/glyph_00.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_00.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_00.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_00.png
diff --git a/game/client/src/main/resources/font/glyph_01.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_01.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_01.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_01.png
diff --git a/game/client/src/main/resources/font/glyph_02.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_02.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_02.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_02.png
diff --git a/game/client/src/main/resources/font/glyph_03.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_03.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_03.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_03.png
diff --git a/game/client/src/main/resources/font/glyph_04.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_04.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_04.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_04.png
diff --git a/game/client/src/main/resources/font/glyph_05.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_05.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_05.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_05.png
diff --git a/game/client/src/main/resources/font/glyph_06.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_06.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_06.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_06.png
diff --git a/game/client/src/main/resources/font/glyph_07.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_07.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_07.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_07.png
diff --git a/game/client/src/main/resources/font/glyph_09.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_09.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_09.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_09.png
diff --git a/game/client/src/main/resources/font/glyph_0A.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_0A.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_0A.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_0A.png
diff --git a/game/client/src/main/resources/font/glyph_0B.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_0B.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_0B.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_0B.png
diff --git a/game/client/src/main/resources/font/glyph_0C.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_0C.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_0C.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_0C.png
diff --git a/game/client/src/main/resources/font/glyph_0D.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_0D.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_0D.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_0D.png
diff --git a/game/client/src/main/resources/font/glyph_0E.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_0E.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_0E.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_0E.png
diff --git a/game/client/src/main/resources/font/glyph_0F.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_0F.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_0F.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_0F.png
diff --git a/game/client/src/main/resources/font/glyph_10.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_10.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_10.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_10.png
diff --git a/game/client/src/main/resources/font/glyph_11.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_11.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_11.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_11.png
diff --git a/game/client/src/main/resources/font/glyph_12.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_12.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_12.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_12.png
diff --git a/game/client/src/main/resources/font/glyph_13.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_13.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_13.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_13.png
diff --git a/game/client/src/main/resources/font/glyph_14.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_14.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_14.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_14.png
diff --git a/game/client/src/main/resources/font/glyph_15.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_15.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_15.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_15.png
diff --git a/game/client/src/main/resources/font/glyph_16.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_16.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_16.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_16.png
diff --git a/game/client/src/main/resources/font/glyph_17.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_17.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_17.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_17.png
diff --git a/game/client/src/main/resources/font/glyph_18.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_18.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_18.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_18.png
diff --git a/game/client/src/main/resources/font/glyph_19.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_19.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_19.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_19.png
diff --git a/game/client/src/main/resources/font/glyph_1A.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_1A.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_1A.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_1A.png
diff --git a/game/client/src/main/resources/font/glyph_1B.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_1B.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_1B.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_1B.png
diff --git a/game/client/src/main/resources/font/glyph_1C.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_1C.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_1C.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_1C.png
diff --git a/game/client/src/main/resources/font/glyph_1D.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_1D.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_1D.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_1D.png
diff --git a/game/client/src/main/resources/font/glyph_1E.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_1E.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_1E.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_1E.png
diff --git a/game/client/src/main/resources/font/glyph_1F.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_1F.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_1F.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_1F.png
diff --git a/game/client/src/main/resources/font/glyph_20.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_20.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_20.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_20.png
diff --git a/game/client/src/main/resources/font/glyph_21.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_21.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_21.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_21.png
diff --git a/game/client/src/main/resources/font/glyph_22.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_22.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_22.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_22.png
diff --git a/game/client/src/main/resources/font/glyph_23.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_23.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_23.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_23.png
diff --git a/game/client/src/main/resources/font/glyph_24.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_24.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_24.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_24.png
diff --git a/game/client/src/main/resources/font/glyph_25.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_25.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_25.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_25.png
diff --git a/game/client/src/main/resources/font/glyph_26.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_26.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_26.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_26.png
diff --git a/game/client/src/main/resources/font/glyph_27.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_27.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_27.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_27.png
diff --git a/game/client/src/main/resources/font/glyph_28.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_28.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_28.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_28.png
diff --git a/game/client/src/main/resources/font/glyph_29.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_29.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_29.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_29.png
diff --git a/game/client/src/main/resources/font/glyph_2A.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_2A.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_2A.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_2A.png
diff --git a/game/client/src/main/resources/font/glyph_2B.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_2B.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_2B.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_2B.png
diff --git a/game/client/src/main/resources/font/glyph_2C.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_2C.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_2C.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_2C.png
diff --git a/game/client/src/main/resources/font/glyph_2D.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_2D.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_2D.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_2D.png
diff --git a/game/client/src/main/resources/font/glyph_2E.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_2E.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_2E.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_2E.png
diff --git a/game/client/src/main/resources/font/glyph_2F.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_2F.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_2F.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_2F.png
diff --git a/game/client/src/main/resources/font/glyph_30.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_30.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_30.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_30.png
diff --git a/game/client/src/main/resources/font/glyph_31.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_31.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_31.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_31.png
diff --git a/game/client/src/main/resources/font/glyph_32.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_32.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_32.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_32.png
diff --git a/game/client/src/main/resources/font/glyph_33.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_33.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_33.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_33.png
diff --git a/game/client/src/main/resources/font/glyph_34.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_34.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_34.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_34.png
diff --git a/game/client/src/main/resources/font/glyph_35.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_35.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_35.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_35.png
diff --git a/game/client/src/main/resources/font/glyph_36.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_36.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_36.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_36.png
diff --git a/game/client/src/main/resources/font/glyph_37.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_37.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_37.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_37.png
diff --git a/game/client/src/main/resources/font/glyph_38.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_38.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_38.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_38.png
diff --git a/game/client/src/main/resources/font/glyph_39.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_39.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_39.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_39.png
diff --git a/game/client/src/main/resources/font/glyph_3A.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_3A.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_3A.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_3A.png
diff --git a/game/client/src/main/resources/font/glyph_3B.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_3B.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_3B.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_3B.png
diff --git a/game/client/src/main/resources/font/glyph_3C.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_3C.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_3C.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_3C.png
diff --git a/game/client/src/main/resources/font/glyph_3D.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_3D.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_3D.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_3D.png
diff --git a/game/client/src/main/resources/font/glyph_3E.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_3E.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_3E.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_3E.png
diff --git a/game/client/src/main/resources/font/glyph_3F.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_3F.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_3F.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_3F.png
diff --git a/game/client/src/main/resources/font/glyph_40.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_40.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_40.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_40.png
diff --git a/game/client/src/main/resources/font/glyph_41.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_41.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_41.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_41.png
diff --git a/game/client/src/main/resources/font/glyph_42.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_42.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_42.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_42.png
diff --git a/game/client/src/main/resources/font/glyph_43.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_43.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_43.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_43.png
diff --git a/game/client/src/main/resources/font/glyph_44.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_44.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_44.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_44.png
diff --git a/game/client/src/main/resources/font/glyph_45.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_45.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_45.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_45.png
diff --git a/game/client/src/main/resources/font/glyph_46.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_46.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_46.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_46.png
diff --git a/game/client/src/main/resources/font/glyph_47.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_47.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_47.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_47.png
diff --git a/game/client/src/main/resources/font/glyph_48.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_48.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_48.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_48.png
diff --git a/game/client/src/main/resources/font/glyph_49.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_49.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_49.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_49.png
diff --git a/game/client/src/main/resources/font/glyph_4A.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_4A.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_4A.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_4A.png
diff --git a/game/client/src/main/resources/font/glyph_4B.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_4B.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_4B.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_4B.png
diff --git a/game/client/src/main/resources/font/glyph_4C.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_4C.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_4C.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_4C.png
diff --git a/game/client/src/main/resources/font/glyph_4D.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_4D.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_4D.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_4D.png
diff --git a/game/client/src/main/resources/font/glyph_4E.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_4E.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_4E.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_4E.png
diff --git a/game/client/src/main/resources/font/glyph_4F.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_4F.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_4F.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_4F.png
diff --git a/game/client/src/main/resources/font/glyph_50.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_50.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_50.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_50.png
diff --git a/game/client/src/main/resources/font/glyph_51.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_51.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_51.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_51.png
diff --git a/game/client/src/main/resources/font/glyph_52.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_52.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_52.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_52.png
diff --git a/game/client/src/main/resources/font/glyph_53.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_53.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_53.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_53.png
diff --git a/game/client/src/main/resources/font/glyph_54.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_54.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_54.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_54.png
diff --git a/game/client/src/main/resources/font/glyph_55.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_55.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_55.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_55.png
diff --git a/game/client/src/main/resources/font/glyph_56.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_56.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_56.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_56.png
diff --git a/game/client/src/main/resources/font/glyph_57.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_57.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_57.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_57.png
diff --git a/game/client/src/main/resources/font/glyph_58.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_58.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_58.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_58.png
diff --git a/game/client/src/main/resources/font/glyph_59.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_59.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_59.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_59.png
diff --git a/game/client/src/main/resources/font/glyph_5A.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_5A.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_5A.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_5A.png
diff --git a/game/client/src/main/resources/font/glyph_5B.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_5B.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_5B.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_5B.png
diff --git a/game/client/src/main/resources/font/glyph_5C.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_5C.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_5C.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_5C.png
diff --git a/game/client/src/main/resources/font/glyph_5D.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_5D.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_5D.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_5D.png
diff --git a/game/client/src/main/resources/font/glyph_5E.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_5E.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_5E.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_5E.png
diff --git a/game/client/src/main/resources/font/glyph_5F.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_5F.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_5F.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_5F.png
diff --git a/game/client/src/main/resources/font/glyph_60.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_60.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_60.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_60.png
diff --git a/game/client/src/main/resources/font/glyph_61.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_61.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_61.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_61.png
diff --git a/game/client/src/main/resources/font/glyph_62.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_62.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_62.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_62.png
diff --git a/game/client/src/main/resources/font/glyph_63.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_63.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_63.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_63.png
diff --git a/game/client/src/main/resources/font/glyph_64.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_64.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_64.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_64.png
diff --git a/game/client/src/main/resources/font/glyph_65.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_65.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_65.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_65.png
diff --git a/game/client/src/main/resources/font/glyph_66.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_66.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_66.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_66.png
diff --git a/game/client/src/main/resources/font/glyph_67.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_67.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_67.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_67.png
diff --git a/game/client/src/main/resources/font/glyph_68.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_68.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_68.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_68.png
diff --git a/game/client/src/main/resources/font/glyph_69.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_69.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_69.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_69.png
diff --git a/game/client/src/main/resources/font/glyph_6A.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_6A.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_6A.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_6A.png
diff --git a/game/client/src/main/resources/font/glyph_6B.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_6B.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_6B.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_6B.png
diff --git a/game/client/src/main/resources/font/glyph_6C.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_6C.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_6C.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_6C.png
diff --git a/game/client/src/main/resources/font/glyph_6D.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_6D.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_6D.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_6D.png
diff --git a/game/client/src/main/resources/font/glyph_6E.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_6E.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_6E.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_6E.png
diff --git a/game/client/src/main/resources/font/glyph_6F.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_6F.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_6F.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_6F.png
diff --git a/game/client/src/main/resources/font/glyph_70.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_70.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_70.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_70.png
diff --git a/game/client/src/main/resources/font/glyph_71.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_71.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_71.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_71.png
diff --git a/game/client/src/main/resources/font/glyph_72.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_72.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_72.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_72.png
diff --git a/game/client/src/main/resources/font/glyph_73.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_73.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_73.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_73.png
diff --git a/game/client/src/main/resources/font/glyph_74.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_74.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_74.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_74.png
diff --git a/game/client/src/main/resources/font/glyph_75.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_75.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_75.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_75.png
diff --git a/game/client/src/main/resources/font/glyph_76.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_76.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_76.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_76.png
diff --git a/game/client/src/main/resources/font/glyph_77.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_77.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_77.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_77.png
diff --git a/game/client/src/main/resources/font/glyph_78.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_78.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_78.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_78.png
diff --git a/game/client/src/main/resources/font/glyph_79.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_79.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_79.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_79.png
diff --git a/game/client/src/main/resources/font/glyph_7A.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_7A.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_7A.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_7A.png
diff --git a/game/client/src/main/resources/font/glyph_7B.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_7B.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_7B.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_7B.png
diff --git a/game/client/src/main/resources/font/glyph_7C.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_7C.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_7C.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_7C.png
diff --git a/game/client/src/main/resources/font/glyph_7D.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_7D.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_7D.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_7D.png
diff --git a/game/client/src/main/resources/font/glyph_7E.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_7E.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_7E.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_7E.png
diff --git a/game/client/src/main/resources/font/glyph_7F.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_7F.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_7F.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_7F.png
diff --git a/game/client/src/main/resources/font/glyph_80.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_80.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_80.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_80.png
diff --git a/game/client/src/main/resources/font/glyph_81.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_81.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_81.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_81.png
diff --git a/game/client/src/main/resources/font/glyph_82.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_82.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_82.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_82.png
diff --git a/game/client/src/main/resources/font/glyph_83.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_83.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_83.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_83.png
diff --git a/game/client/src/main/resources/font/glyph_84.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_84.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_84.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_84.png
diff --git a/game/client/src/main/resources/font/glyph_85.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_85.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_85.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_85.png
diff --git a/game/client/src/main/resources/font/glyph_86.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_86.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_86.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_86.png
diff --git a/game/client/src/main/resources/font/glyph_87.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_87.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_87.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_87.png
diff --git a/game/client/src/main/resources/font/glyph_88.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_88.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_88.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_88.png
diff --git a/game/client/src/main/resources/font/glyph_89.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_89.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_89.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_89.png
diff --git a/game/client/src/main/resources/font/glyph_8A.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_8A.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_8A.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_8A.png
diff --git a/game/client/src/main/resources/font/glyph_8B.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_8B.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_8B.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_8B.png
diff --git a/game/client/src/main/resources/font/glyph_8C.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_8C.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_8C.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_8C.png
diff --git a/game/client/src/main/resources/font/glyph_8D.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_8D.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_8D.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_8D.png
diff --git a/game/client/src/main/resources/font/glyph_8E.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_8E.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_8E.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_8E.png
diff --git a/game/client/src/main/resources/font/glyph_8F.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_8F.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_8F.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_8F.png
diff --git a/game/client/src/main/resources/font/glyph_90.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_90.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_90.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_90.png
diff --git a/game/client/src/main/resources/font/glyph_91.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_91.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_91.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_91.png
diff --git a/game/client/src/main/resources/font/glyph_92.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_92.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_92.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_92.png
diff --git a/game/client/src/main/resources/font/glyph_93.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_93.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_93.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_93.png
diff --git a/game/client/src/main/resources/font/glyph_94.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_94.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_94.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_94.png
diff --git a/game/client/src/main/resources/font/glyph_95.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_95.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_95.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_95.png
diff --git a/game/client/src/main/resources/font/glyph_96.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_96.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_96.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_96.png
diff --git a/game/client/src/main/resources/font/glyph_97.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_97.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_97.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_97.png
diff --git a/game/client/src/main/resources/font/glyph_98.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_98.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_98.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_98.png
diff --git a/game/client/src/main/resources/font/glyph_99.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_99.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_99.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_99.png
diff --git a/game/client/src/main/resources/font/glyph_9A.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_9A.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_9A.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_9A.png
diff --git a/game/client/src/main/resources/font/glyph_9B.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_9B.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_9B.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_9B.png
diff --git a/game/client/src/main/resources/font/glyph_9C.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_9C.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_9C.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_9C.png
diff --git a/game/client/src/main/resources/font/glyph_9D.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_9D.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_9D.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_9D.png
diff --git a/game/client/src/main/resources/font/glyph_9E.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_9E.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_9E.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_9E.png
diff --git a/game/client/src/main/resources/font/glyph_9F.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_9F.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_9F.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_9F.png
diff --git a/game/client/src/main/resources/font/glyph_A0.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A0.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_A0.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A0.png
diff --git a/game/client/src/main/resources/font/glyph_A1.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A1.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_A1.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A1.png
diff --git a/game/client/src/main/resources/font/glyph_A2.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A2.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_A2.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A2.png
diff --git a/game/client/src/main/resources/font/glyph_A3.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A3.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_A3.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A3.png
diff --git a/game/client/src/main/resources/font/glyph_A4.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A4.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_A4.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A4.png
diff --git a/game/client/src/main/resources/font/glyph_A5.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A5.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_A5.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A5.png
diff --git a/game/client/src/main/resources/font/glyph_A6.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A6.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_A6.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A6.png
diff --git a/game/client/src/main/resources/font/glyph_A7.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A7.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_A7.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A7.png
diff --git a/game/client/src/main/resources/font/glyph_A8.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A8.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_A8.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A8.png
diff --git a/game/client/src/main/resources/font/glyph_A9.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A9.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_A9.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_A9.png
diff --git a/game/client/src/main/resources/font/glyph_AA.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_AA.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_AA.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_AA.png
diff --git a/game/client/src/main/resources/font/glyph_AB.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_AB.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_AB.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_AB.png
diff --git a/game/client/src/main/resources/font/glyph_AC.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_AC.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_AC.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_AC.png
diff --git a/game/client/src/main/resources/font/glyph_AD.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_AD.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_AD.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_AD.png
diff --git a/game/client/src/main/resources/font/glyph_AE.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_AE.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_AE.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_AE.png
diff --git a/game/client/src/main/resources/font/glyph_AF.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_AF.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_AF.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_AF.png
diff --git a/game/client/src/main/resources/font/glyph_B0.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B0.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_B0.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B0.png
diff --git a/game/client/src/main/resources/font/glyph_B1.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B1.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_B1.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B1.png
diff --git a/game/client/src/main/resources/font/glyph_B2.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B2.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_B2.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B2.png
diff --git a/game/client/src/main/resources/font/glyph_B3.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B3.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_B3.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B3.png
diff --git a/game/client/src/main/resources/font/glyph_B4.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B4.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_B4.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B4.png
diff --git a/game/client/src/main/resources/font/glyph_B5.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B5.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_B5.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B5.png
diff --git a/game/client/src/main/resources/font/glyph_B6.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B6.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_B6.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B6.png
diff --git a/game/client/src/main/resources/font/glyph_B7.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B7.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_B7.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B7.png
diff --git a/game/client/src/main/resources/font/glyph_B8.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B8.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_B8.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B8.png
diff --git a/game/client/src/main/resources/font/glyph_B9.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B9.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_B9.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_B9.png
diff --git a/game/client/src/main/resources/font/glyph_BA.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_BA.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_BA.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_BA.png
diff --git a/game/client/src/main/resources/font/glyph_BB.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_BB.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_BB.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_BB.png
diff --git a/game/client/src/main/resources/font/glyph_BC.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_BC.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_BC.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_BC.png
diff --git a/game/client/src/main/resources/font/glyph_BD.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_BD.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_BD.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_BD.png
diff --git a/game/client/src/main/resources/font/glyph_BE.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_BE.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_BE.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_BE.png
diff --git a/game/client/src/main/resources/font/glyph_BF.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_BF.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_BF.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_BF.png
diff --git a/game/client/src/main/resources/font/glyph_C0.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C0.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_C0.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C0.png
diff --git a/game/client/src/main/resources/font/glyph_C1.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C1.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_C1.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C1.png
diff --git a/game/client/src/main/resources/font/glyph_C2.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C2.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_C2.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C2.png
diff --git a/game/client/src/main/resources/font/glyph_C3.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C3.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_C3.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C3.png
diff --git a/game/client/src/main/resources/font/glyph_C4.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C4.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_C4.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C4.png
diff --git a/game/client/src/main/resources/font/glyph_C5.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C5.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_C5.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C5.png
diff --git a/game/client/src/main/resources/font/glyph_C6.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C6.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_C6.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C6.png
diff --git a/game/client/src/main/resources/font/glyph_C7.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C7.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_C7.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C7.png
diff --git a/game/client/src/main/resources/font/glyph_C8.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C8.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_C8.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C8.png
diff --git a/game/client/src/main/resources/font/glyph_C9.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C9.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_C9.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_C9.png
diff --git a/game/client/src/main/resources/font/glyph_CA.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_CA.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_CA.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_CA.png
diff --git a/game/client/src/main/resources/font/glyph_CB.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_CB.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_CB.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_CB.png
diff --git a/game/client/src/main/resources/font/glyph_CC.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_CC.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_CC.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_CC.png
diff --git a/game/client/src/main/resources/font/glyph_CD.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_CD.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_CD.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_CD.png
diff --git a/game/client/src/main/resources/font/glyph_CE.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_CE.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_CE.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_CE.png
diff --git a/game/client/src/main/resources/font/glyph_CF.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_CF.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_CF.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_CF.png
diff --git a/game/client/src/main/resources/font/glyph_D0.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_D0.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_D0.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_D0.png
diff --git a/game/client/src/main/resources/font/glyph_D1.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_D1.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_D1.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_D1.png
diff --git a/game/client/src/main/resources/font/glyph_D2.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_D2.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_D2.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_D2.png
diff --git a/game/client/src/main/resources/font/glyph_D3.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_D3.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_D3.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_D3.png
diff --git a/game/client/src/main/resources/font/glyph_D4.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_D4.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_D4.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_D4.png
diff --git a/game/client/src/main/resources/font/glyph_D5.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_D5.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_D5.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_D5.png
diff --git a/game/client/src/main/resources/font/glyph_D6.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_D6.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_D6.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_D6.png
diff --git a/game/client/src/main/resources/font/glyph_D7.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_D7.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_D7.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_D7.png
diff --git a/game/client/src/main/resources/font/glyph_F9.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_F9.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_F9.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_F9.png
diff --git a/game/client/src/main/resources/font/glyph_FA.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_FA.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_FA.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_FA.png
diff --git a/game/client/src/main/resources/font/glyph_FB.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_FB.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_FB.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_FB.png
diff --git a/game/client/src/main/resources/font/glyph_FC.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_FC.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_FC.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_FC.png
diff --git a/game/client/src/main/resources/font/glyph_FD.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_FD.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_FD.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_FD.png
diff --git a/game/client/src/main/resources/font/glyph_FE.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_FE.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_FE.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_FE.png
diff --git a/game/client/src/main/resources/font/glyph_FF.png b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_FF.png
similarity index 100%
rename from game/client/src/main/resources/font/glyph_FF.png
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_FF.png
diff --git a/game/client/src/main/resources/font/glyph_sizes.bin b/game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_sizes.bin
similarity index 100%
rename from game/client/src/main/resources/font/glyph_sizes.bin
rename to game/client/src/main/resources/assets/minecraft/textures/gui/font/unicode/glyph_sizes.bin
diff --git a/game/core/src/main/java/net/minecraft/core/lang/text/Text.java b/game/core/src/main/java/net/minecraft/core/lang/text/Text.java
index fef4477b0..d5dfcc64e 100644
--- a/game/core/src/main/java/net/minecraft/core/lang/text/Text.java
+++ b/game/core/src/main/java/net/minecraft/core/lang/text/Text.java
@@ -1,9 +1,8 @@
 package net.minecraft.core.lang.text;
 
 import net.minecraft.core.net.command.TextFormatting;
-import org.jetbrains.annotations.NotNull;
 
-public abstract class Text implements CharSequence {
+public abstract class Text {
     public static Text text() {
         return new ChainText();
     }
@@ -36,21 +35,4 @@ public abstract class Text implements CharSequence {
     public Text fmt(TextFormatting formatting, Text text) {
         return new ChainText(this, new FormattedText(formatting, text));
     }
-
-    // TODO consider a more optimized implementation if we keep this as a char sequence
-    @Override
-    public int length() {
-        return toString().length();
-    }
-
-    @Override
-    public char charAt(int index) {
-        return toString().charAt(index);
-    }
-
-    @NotNull
-    @Override
-    public CharSequence subSequence(int start, int end) {
-        return toString().subSequence(start, end);
-    }
 }
diff --git a/game/core/src/main/resources/lang/en_US/options.lang b/game/core/src/main/resources/lang/en_US/options.lang
index f1e88401e..c8bb6b258 100644
--- a/game/core/src/main/resources/lang/en_US/options.lang
+++ b/game/core/src/main/resources/lang/en_US/options.lang
@@ -113,6 +113,7 @@ options.colorCorrection.low=Low
 options.colorCorrection.high=High
 options.sneakToggle=Toggle Sneaking
 options.tooltipStyle=Tooltip Style
+options.font=Font
 options.fog=Enable Fog
 options.hideUndiscoveredItems=Hide Undiscovered Items
 options.forceUnicodeFont=Force Unicode Font
@@ -197,6 +198,10 @@ options.tooltipStyle.redstone_goggles=Redstone Goggles
 options.tooltipStyle.creep-o-vision=Creep-o-Vision
 options.tooltipStyle.steve=Steve
 
+options.font.default=Default
+options.font.unicode=Unicode
+options.font.monospace=Monospace
+
 options.player.left.handed=Left Handed
 options.player.cape=Cape
 options.player.hat=Hat
diff --git a/gradle.properties b/gradle.properties
index 268d0615b..034fc56a7 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -4,7 +4,7 @@ org.gradle.caching = true
 
 bta.group = net.minecraft
 bta.version = 7.4
-bta.texturePackFormat = 3
+bta.texturePackFormat = 4
 bta.buildChannel = BuildChannel.DEVELOPMENT
 
 # Protocol version scheme:
