diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
new file mode 100644
index 0000000..797acea
--- /dev/null
+++ b/.idea/runConfigurations.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 7843136..0314c48 100644
--- a/build.gradle
+++ b/build.gradle
@@ -61,7 +61,7 @@ dependencies {
}
compile('org.spongepowered:mixin:0.7.11-SNAPSHOT')
- compile fileTree(include: ['*.jar'], dir: './libs')
+ compile fileTree(dir: 'libs', include: ['*.jar'])
}
mixin {
diff --git a/src/main/java/net/silentclient/client/Client.java b/src/main/java/net/silentclient/client/Client.java
index cf95082..0f00386 100644
--- a/src/main/java/net/silentclient/client/Client.java
+++ b/src/main/java/net/silentclient/client/Client.java
@@ -3,7 +3,6 @@ package net.silentclient.client;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.resources.data.IMetadataSerializer;
@@ -23,7 +22,6 @@ import net.silentclient.client.gui.silentmainmenu.SilentMainMenu;
import net.silentclient.client.gui.util.BackgroundPanorama;
import net.silentclient.client.keybinds.KeyBindManager;
import net.silentclient.client.mixin.accessors.MinecraftAccessor;
-import net.silentclient.client.mixin.ducks.FontRendererExt;
import net.silentclient.client.mods.ModInstances;
import net.silentclient.client.mods.SettingsManager;
import net.silentclient.client.mods.settings.FPSBoostMod;
@@ -89,8 +87,6 @@ public class Client {
private GlobalSettings globalSettings;
private File globalSettingsFile;
- private boolean loadedGalacticFontRenderer;
-
public static void memoryDebug(String paramString) {
LogManager.getLogger().info("-- Start Memory Debug -- " + paramString);
long l1 = Runtime.getRuntime().maxMemory();
@@ -316,13 +312,6 @@ public class Client {
logger.info("STARTING > ERROR: " + err.getMessage());
throw err;
}
- if (!loadedGalacticFontRenderer) {
- loadedGalacticFontRenderer = true;
- FontRenderer galacticFontRenderer = Minecraft.getMinecraft().standardGalacticFontRenderer;
- if (galacticFontRenderer instanceof FontRendererExt) {
- ((FontRendererExt) galacticFontRenderer).silent$getFontRendererHook().create();
- }
- }
logger.info("-------------------------------------------------");
memoryDebug("CLIENT_POST_INIT");
}
diff --git a/src/main/java/net/silentclient/client/gui/GuiMultiplayerInGame.java b/src/main/java/net/silentclient/client/gui/GuiMultiplayerInGame.java
index 4f50c6a..eaea9fc 100644
--- a/src/main/java/net/silentclient/client/gui/GuiMultiplayerInGame.java
+++ b/src/main/java/net/silentclient/client/gui/GuiMultiplayerInGame.java
@@ -8,7 +8,6 @@ import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.client.resources.I18n;
import net.silentclient.client.Client;
import net.silentclient.client.mixin.accessors.GuiMultiplayerAccessor;
-import net.silentclient.client.mixin.wrappers.ServerDataWrapper;
import java.io.IOException;
import java.lang.reflect.Field;
@@ -32,11 +31,11 @@ public class GuiMultiplayerInGame extends GuiMultiplayer {
Object cc = clazz.newInstance();
Field f1 = cc.getClass().getSuperclass().getDeclaredField("selectedServer");
f1.setAccessible(true);
- f1.set(cc, null);
+ f1.set(cc, new ServerData(I18n.format("selectServer.defaultName"), "", false));
+ this.mc.displayGuiScreen(new GuiScreenServerList(this, (ServerData) f1.get(cc)));
} catch (Exception err) {
Client.logger.catching(err);
}
- this.mc.displayGuiScreen(new GuiScreenServerList(this, ((GuiMultiplayerAccessor) this).silent$getSelectedServer().getServerData()));
}
super.actionPerformed(button);
diff --git a/src/main/java/net/silentclient/client/gui/modmenu/ModSettings.java b/src/main/java/net/silentclient/client/gui/modmenu/ModSettings.java
index 3b92b29..50cc017 100644
--- a/src/main/java/net/silentclient/client/gui/modmenu/ModSettings.java
+++ b/src/main/java/net/silentclient/client/gui/modmenu/ModSettings.java
@@ -209,6 +209,7 @@ public class ModSettings extends SilentScreen {
if(Checkbox.isHovered(mouseX, mouseY, 3, settingY)) {
Sounds.playButtonSound();
setting.setValBoolean(!setting.getValBoolean());
+ mod.onChangeSettingValue(setting);
}
}
diff --git a/src/main/java/net/silentclient/client/mixin/ducks/FontRendererExt.java b/src/main/java/net/silentclient/client/mixin/ducks/FontRendererExt.java
index 7536ab4..9ff24c5 100644
--- a/src/main/java/net/silentclient/client/mixin/ducks/FontRendererExt.java
+++ b/src/main/java/net/silentclient/client/mixin/ducks/FontRendererExt.java
@@ -1,9 +1,7 @@
package net.silentclient.client.mixin.ducks;
import net.silentclient.client.cosmetics.StaticResourceLocation;
-import net.silentclient.client.utils.FontRendererHook;
public interface FontRendererExt {
- FontRendererHook silent$getFontRendererHook();
StaticResourceLocation silent$getFontTextures();
}
diff --git a/src/main/java/net/silentclient/client/mixin/mixins/FontRendererMixin.java b/src/main/java/net/silentclient/client/mixin/mixins/FontRendererMixin.java
index 3139eef..6108d97 100644
--- a/src/main/java/net/silentclient/client/mixin/mixins/FontRendererMixin.java
+++ b/src/main/java/net/silentclient/client/mixin/mixins/FontRendererMixin.java
@@ -5,54 +5,21 @@ import net.minecraft.util.ResourceLocation;
import net.silentclient.client.cosmetics.StaticResourceLocation;
import net.silentclient.client.event.impl.EventText;
import net.silentclient.client.mixin.ducks.FontRendererExt;
-import net.silentclient.client.mods.settings.FPSBoostMod;
-import net.silentclient.client.utils.FontRendererHook;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
-import java.util.Map;
-
@Mixin(value = FontRenderer.class, priority = 1100)
public abstract class FontRendererMixin implements FontRendererExt {
- @Unique
- private final FontRendererHook silent$fontRendererHook = new FontRendererHook((FontRenderer) (Object) this);
-
- @Inject(method = "getStringWidth", at = @At("HEAD"), cancellable = true)
- public void getStringWidth(String text, CallbackInfoReturnable cir) {
- if (FPSBoostMod.basicEnabled()) {
- cir.setReturnValue(this.silent$fontRendererHook.getStringWidth(text));
- } else {
- Map cache = this.silent$fontRendererHook.getEnhancedFontRenderer().getStringWidthCache();
- if (cache.size() != 0) {
- cache.clear();
- }
- }
- }
-
@Override
public StaticResourceLocation silent$getFontTextures() {
return new StaticResourceLocation(this.locationFontTexture);
}
- @Inject(method = "renderStringAtPos", at = @At("HEAD"), cancellable = true)
- private void silent$useOptimizedRendering(String text, boolean shadow, CallbackInfo ci) throws NoSuchFieldException, IllegalAccessException {
- if (this.silent$fontRendererHook.renderStringAtPos(text, shadow)) {
- ci.cancel();
- }
- }
-
- @Override
- public FontRendererHook silent$getFontRendererHook() {
- return silent$fontRendererHook;
- }
-
@ModifyVariable(method = "renderString", at = @At("HEAD"), ordinal = 0)
public String renderString(String text) {
if(text == null) {
diff --git a/src/main/java/net/silentclient/client/utils/FontRendererHook.java b/src/main/java/net/silentclient/client/utils/FontRendererHook.java
deleted file mode 100644
index b13674f..0000000
--- a/src/main/java/net/silentclient/client/utils/FontRendererHook.java
+++ /dev/null
@@ -1,578 +0,0 @@
-package net.silentclient.client.utils;
-
-import kotlin.Pair;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.FontRenderer;
-import net.minecraft.client.renderer.GlStateManager;
-import net.minecraft.client.renderer.texture.DynamicTexture;
-import net.minecraft.util.ResourceLocation;
-import net.silentclient.client.Client;
-import net.silentclient.client.hooks.OptiFineHook;
-import net.silentclient.client.mixin.accessors.FontRendererAccessor;
-import net.silentclient.client.mixin.ducks.FontRendererExt;
-import net.silentclient.client.mixin.optifine.OptiFineFontRendererHandler;
-import net.silentclient.client.mods.settings.FPSBoostMod;
-import net.silentclient.client.utils.enhancement.EnhancementManager;
-import net.silentclient.client.utils.enhancement.hash.StringHash;
-import net.silentclient.client.utils.enhancement.text.CachedString;
-import net.silentclient.client.utils.enhancement.text.EnhancedFontRenderer;
-import org.lwjgl.opengl.GL11;
-
-import javax.imageio.ImageIO;
-import java.awt.*;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Field;
-import java.util.*;
-
-public final class FontRendererHook {
-
- public static boolean forceRefresh = false;
- public static final String characterDictionary = "\u00c0\u00c1\u00c2\u00c8\u00ca\u00cb\u00cd\u00d3\u00d4\u00d5\u00da\u00df\u00e3\u00f5\u011f\u0130\u0131\u0152\u0153\u015e\u015f\u0174\u0175\u017e\u0207\u0000\u0000\u0000\u0000\u0000\u0000\u0000 !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u0000\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8\u00a3\u00d8\u00d7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u00ae\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u03b2\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u2205\u2208\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u0000";
- private final EnhancedFontRenderer enhancedFontRenderer = EnhancementManager.getInstance().getEnhancement(EnhancedFontRenderer.class);
- private final FontRenderer fontRenderer;
- private final FontRendererAccessor fontRendererAccessor;
- private final Minecraft mc = Minecraft.getMinecraft();
- private OptiFineHook hook = new OptiFineHook();
- public int glTextureId = -1;
- private int texSheetDim = 256;
- private float fontTexHeight = 16 * texSheetDim + 128;
- private float fontTexWidth = 16 * texSheetDim;
- private int regularCharDim = 128;
- private boolean drawing = false;
- private static final String COLOR_RESET_PHRASE = '\u00a7' + "r";
-
- public FontRendererHook(FontRenderer fontRenderer) {
- this.fontRenderer = fontRenderer;
- this.fontRendererAccessor = (FontRendererAccessor) fontRenderer;
- }
-
- private void establishSize() {
- int regWidth = 256;
- for (int i = 0; i < 256; i++) {
- try (final InputStream stream = mc.getResourceManager().getResource(new ResourceLocation(String.format("textures/font/unicode_page_%02x.png", i))).getInputStream()) {
- regWidth = ImageIO.read(stream).getWidth();
- break;
- } catch (Exception ignored) {
- }
- }
-
- texSheetDim = regWidth;
- int specWidth = 128;
-
- try (final InputStream stream = mc.getResourceManager().getResource(((FontRendererExt) fontRenderer).silent$getFontTextures().getLocation()).getInputStream()) {
- specWidth = ImageIO.read(stream).getWidth();
- } catch (IOException e) {
- Client.logger.error("Failed to read font texture while establishing size.", e);
- }
-
- regularCharDim = specWidth;
- fontTexHeight = 16 * texSheetDim + specWidth;
- fontTexWidth = 16 * texSheetDim;
- }
-
- public void create() {
- establishSize();
- hook = new OptiFineHook();
- forceRefresh = false;
-
- if (glTextureId != -1) {
- GlStateManager.deleteTexture(glTextureId);
- }
-
- final BufferedImage bufferedImage = new BufferedImage((int) fontTexWidth, (int) fontTexHeight, BufferedImage.TYPE_INT_ARGB);
- for (int i = 0; i < 256; i++) {
- try (final InputStream stream = mc.getResourceManager().getResource(new ResourceLocation(String.format("textures/font/unicode_page_%02x.png", i))).getInputStream()) {
- bufferedImage.getGraphics().drawImage(ImageIO.read(stream), i / 16 * texSheetDim, i % 16 * texSheetDim, null);
- if (i == 0x0d) {
- try (final InputStream sustream = FontRendererHook.class.getResourceAsStream("/assets/patcher/font_glyph_data.bin")) {
- Graphics2D graphics = bufferedImage.createGraphics();
- graphics.setComposite(AlphaComposite.Src);
- graphics.drawImage(ImageIO.read(Objects.requireNonNull(sustream)), 0x9DE % 16 * 16 /* 224 */, (i % 16 * texSheetDim) + (0x9DE / 16 - 16 /* 141 */), null);
- fontRendererAccessor.getGlyphWidth()[0xD9E] = 14;
- }
- }
- } catch (Exception ignored) {
- }
- }
-
- try (final InputStream stream = mc.getResourceManager().getResource(((FontRendererExt) fontRenderer).silent$getFontTextures().getLocation()).getInputStream()) {
- bufferedImage.getGraphics().drawImage(ImageIO.read(stream), 0, 16 * texSheetDim, null);
- } catch (IOException e) {
- Client.logger.error("Failed to draw texture sheet.", e);
- }
-
- glTextureId = new DynamicTexture(bufferedImage).getGlTextureId();
- }
-
- private void deleteTextureId() {
- if (glTextureId != -1) {
- GlStateManager.deleteTexture(glTextureId);
- glTextureId = -1;
- }
- }
-
- public static String clearColorReset(String text) {
- int startIndex = 0;
- int endIndex = text.length();
-
- while (text.indexOf(COLOR_RESET_PHRASE, startIndex) == startIndex) {
- startIndex += 2;
- }
- int e;
- while ((e = text.lastIndexOf(COLOR_RESET_PHRASE, endIndex - 1)) == endIndex - 2 && e != -1) {
- endIndex -= 2;
- }
-
- if (endIndex < startIndex) endIndex = startIndex;
-
- return text.substring(startIndex, endIndex);
- }
-
- @SuppressWarnings({"unused"})
- public boolean renderStringAtPos(String text, boolean shadow) throws NoSuchFieldException, IllegalAccessException {
- if (Minecraft.getMinecraft().getTextureManager() == null || !FPSBoostMod.basicEnabled()) {
- this.deleteTextureId();
- return false;
- }
-
- if (glTextureId == -1 || forceRefresh) {
- create();
- }
-
- text = clearColorReset(text);
-
- if (text.isEmpty()) {
- return false;
- }
-
- float posX = this.fontRendererAccessor.getPosX();
- float posY = this.fontRendererAccessor.getPosY();
- this.fontRendererAccessor.setPosY(0.0f);
- this.fontRendererAccessor.setPosX(0.0f);
-
- float red = this.fontRendererAccessor.getRed();
- float green = this.fontRendererAccessor.getGreen();
- float blue = this.fontRendererAccessor.getBlue();
- float alpha = this.fontRendererAccessor.getAlpha();
-
- GlStateManager.bindTexture(glTextureId);
- GlStateManager.translate(posX, posY, 0F);
- Field field = GlStateManager.class.getDeclaredField(ClientUtils.isDevelopment() ? "textureState" : "p");
- field.setAccessible(true);
-
- Field field2 = GlStateManager.class.getDeclaredField(ClientUtils.isDevelopment() ? "activeTextureUnit" : "o");
- field2.setAccessible(true);
-
- final GlStateManager.TextureState[] textureStates = (GlStateManager.TextureState[]) field.get(new GlStateManager());
- final GlStateManager.TextureState textureState = textureStates[(int) field2.get(new GlStateManager())];
-
- final StringHash hash = new StringHash(text, red, green, blue, alpha, shadow);
- final CachedString cachedString = FPSBoostMod.advancedEnabled() ? this.enhancedFontRenderer.get(hash) : null;
-
- if (cachedString != null) {
- GlStateManager.color(red, green, blue, alpha);
- GlStateManager.callList(cachedString.getListId());
-
- // Call so states in game know the texture was changed.
- // Otherwise, the game won't know the active texture was changed on the GPU
- textureState.textureName = glTextureId;
- Field colorStateField = GlStateManager.class.getDeclaredField(ClientUtils.isDevelopment() ? "colorState" : "t");
- colorStateField.setAccessible(true);
-
- // Save thing as texture, it updated in GL, so we need to update the MC cache of that value
- GlStateManager.Color colorState = (GlStateManager.Color) colorStateField.get(new GlStateManager());
- colorState.red = cachedString.getLastRed();
- colorState.green = cachedString.getLastGreen();
- colorState.blue = cachedString.getLastBlue();
- colorState.alpha = cachedString.getLastAlpha();
- GlStateManager.translate(-posX, -posY, 0.0f);
- GlStateManager.resetColor();
- GlStateManager.color(1, 1, 1, 1);
-
- this.fontRendererAccessor.setPosX(posX + cachedString.getWidth());
- this.fontRendererAccessor.setPosY(posY + cachedString.getHeight());
- return true;
- }
-
- int list = 0;
- textureState.textureName = glTextureId;
- GlStateManager.resetColor();
- if (FPSBoostMod.advancedEnabled()) {
- list = enhancedFontRenderer.getGlList();
- GL11.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE);
- }
-
- boolean obfuscated = false;
- final CachedString value = new CachedString(text, list, this.fontRendererAccessor.getPosX() - posX, this.fontRendererAccessor.getPosY() - posY);
- final Deque underline = new LinkedList<>();
- final Deque strikethrough = new LinkedList<>();
-
- value.setLastRed(red);
- value.setLastGreen(green);
- value.setLastBlue(blue);
- value.setLastAlpha(alpha);
-
- for (int messageChar = 0; messageChar < text.length(); ++messageChar) {
- char letter = text.charAt(messageChar);
-
- if (letter == 167 && messageChar + 1 < text.length()) {
- int styleIndex = "0123456789abcdefklmnor".indexOf(text.toLowerCase(Locale.ENGLISH).charAt(messageChar + 1));
-
- if (styleIndex < 16) {
- this.fontRendererAccessor.setStrikethroughStyle(false);
- this.fontRendererAccessor.setUnderlineStyle(false);
- this.fontRendererAccessor.setItalicStyle(false);
- this.fontRendererAccessor.setRandomStyle(false);
- this.fontRendererAccessor.setBoldStyle(false);
-
- if (styleIndex < 0) {
- styleIndex = 15;
- }
-
- if (shadow) {
- styleIndex += 16;
- }
-
- int currentColor = fontRendererAccessor.getColorCode()[styleIndex];
- currentColor = OptiFineFontRendererHandler.getTextColor(styleIndex, currentColor);
- this.fontRendererAccessor.setTextColor(currentColor);
-
- final float colorRed = (float) (currentColor >> 16) / 255.0F;
- final float colorGreen = (float) (currentColor >> 8 & 255) / 255.0F;
- final float colorBlue = (float) (currentColor & 255) / 255.0F;
-
- GlStateManager.color(colorRed, colorGreen, colorBlue, alpha);
-
- value.setLastAlpha(alpha);
- value.setLastGreen(colorGreen);
- value.setLastBlue(colorBlue);
- value.setLastRed(colorRed);
- } else if (styleIndex == 16) {
- this.fontRendererAccessor.setRandomStyle(true);
- obfuscated = true;
- } else if (styleIndex == 17) {
- this.fontRendererAccessor.setBoldStyle(true);
- } else if (styleIndex == 18) {
- this.fontRendererAccessor.setStrikethroughStyle(true);
- } else if (styleIndex == 19) {
- this.fontRendererAccessor.setUnderlineStyle(true);
- } else if (styleIndex == 20) {
- this.fontRendererAccessor.setItalicStyle(true);
- } else {
- this.fontRendererAccessor.setRandomStyle(false);
- this.fontRendererAccessor.setBoldStyle(false);
- this.fontRendererAccessor.setStrikethroughStyle(false);
- this.fontRendererAccessor.setUnderlineStyle(false);
- this.fontRendererAccessor.setItalicStyle(false);
- GlStateManager.color(red, green, blue, alpha);
-
- value.setLastGreen(green);
- value.setLastAlpha(alpha);
- value.setLastBlue(blue);
- value.setLastRed(red);
- }
-
- ++messageChar;
- } else {
- int index = characterDictionary.indexOf(letter);
-
- if (this.fontRendererAccessor.isRandomStyle() && index != -1) {
- final float charWidthFloat = getCharWidthFloat(letter);
- char charIndex;
-
- do {
- index = this.fontRenderer.fontRandom.nextInt(characterDictionary.length());
- charIndex = characterDictionary.charAt(index);
- } while (charWidthFloat != getCharWidthFloat(charIndex));
-
- letter = charIndex;
- }
-
- final boolean unicode = this.fontRenderer.getUnicodeFlag();
- final float boldWidth = getBoldOffset(index);
- final boolean small = (letter == 0 || index == -1 || unicode) && shadow;
-
- if (small) {
- this.fontRendererAccessor.setPosX(fontRendererAccessor.getPosX() - boldWidth);
- this.fontRendererAccessor.setPosY(fontRendererAccessor.getPosY() - boldWidth);
- }
-
- float effectiveWidth = this.renderChar(letter, this.fontRendererAccessor.isItalicStyle());
- if (small) {
- this.fontRendererAccessor.setPosX(fontRendererAccessor.getPosX() + boldWidth);
- this.fontRendererAccessor.setPosY(fontRendererAccessor.getPosY() + boldWidth);
- }
-
- if (this.fontRendererAccessor.isBoldStyle()) {
- this.fontRendererAccessor.setPosX(fontRendererAccessor.getPosX() + boldWidth);
-
- if (small) {
- this.fontRendererAccessor.setPosX(fontRendererAccessor.getPosX() - boldWidth);
- this.fontRendererAccessor.setPosY(fontRendererAccessor.getPosY() - boldWidth);
- }
-
- this.renderChar(letter, this.fontRendererAccessor.isItalicStyle());
- this.fontRendererAccessor.setPosX(fontRendererAccessor.getPosX() -boldWidth);
-
- if (small) {
- this.fontRendererAccessor.setPosX(fontRendererAccessor.getPosX() + boldWidth);
- this.fontRendererAccessor.setPosY(fontRendererAccessor.getPosY() + boldWidth);
- }
-
- ++effectiveWidth;
- }
-
- if (this.fontRendererAccessor.isStrikethroughStyle()) {
- adjustOrAppend(strikethrough, this.fontRendererAccessor.getPosX(), effectiveWidth, value.getLastRed(), value.getLastGreen(), value.getLastBlue(), value.getLastAlpha());
- }
-
- if (this.fontRendererAccessor.isUnderlineStyle()) {
- adjustOrAppend(underline, this.fontRendererAccessor.getPosX(), effectiveWidth, value.getLastRed(), value.getLastGreen(), value.getLastBlue(), value.getLastAlpha());
- }
-
- // Intentional cast to int to round down, see FontRenderer#doDraw
- this.fontRendererAccessor.setPosX(fontRendererAccessor.getPosX() + (int) effectiveWidth);
- }
- }
-
- endDrawing();
- final boolean hasStyle = underline.size() > 0 || strikethrough.size() > 0;
-
- if (hasStyle) {
- GlStateManager.disableTexture2D();
- GL11.glBegin(GL11.GL_QUADS);
-
- for (final RenderPair renderPair : strikethrough) {
- GlStateManager.color(renderPair.red, renderPair.green, renderPair.blue, renderPair.alpha);
- GL11.glVertex2f(renderPair.posX, this.fontRendererAccessor.getPosY() + 4.0f);
- GL11.glVertex2f(renderPair.posX + renderPair.width, this.fontRendererAccessor.getPosY() + 4.0f);
- GL11.glVertex2f(renderPair.posX + renderPair.width, this.fontRendererAccessor.getPosY() + 3.0f);
- GL11.glVertex2f(renderPair.posX, this.fontRendererAccessor.getPosY() + 3.0f);
- }
-
- for (final RenderPair renderPair : underline) {
- GlStateManager.color(renderPair.red, renderPair.green, renderPair.blue, renderPair.alpha);
- GL11.glVertex2f(renderPair.posX - 1.0f, this.fontRendererAccessor.getPosY() + 9);
- GL11.glVertex2f(renderPair.posX + renderPair.width, this.fontRendererAccessor.getPosY() + 9);
- GL11.glVertex2f(renderPair.posX + renderPair.width, this.fontRendererAccessor.getPosY() + 9 - 1.0F);
- GL11.glVertex2f(renderPair.posX - 1.0f, this.fontRendererAccessor.getPosY() + 9 - 1.0F);
- }
-
- GL11.glEnd();
- GlStateManager.enableTexture2D();
- }
-
- if (FPSBoostMod.advancedEnabled()) {
- GL11.glEndList();
- this.enhancedFontRenderer.cache(hash, value);
- }
-
- value.setWidth(this.fontRendererAccessor.getPosX());
-
- this.fontRendererAccessor.setPosY(posY + value.getHeight());
- this.fontRendererAccessor.setPosX(posX + value.getWidth());
-
- if (obfuscated) {
- this.enhancedFontRenderer.getObfuscated().add(hash);
- }
-
- GlStateManager.translate(-posX, -posY, 0F);
- return true;
- }
-
- private void adjustOrAppend(Deque style, float posX, float effectiveWidth, float lastRed, float lastGreen, float lastBlue, float lastAlpha) {
- final RenderPair lastStart = style.peekLast();
- if (lastStart != null && lastStart.red == lastRed && lastStart.green == lastGreen && lastStart.blue == lastBlue && lastStart.alpha == lastAlpha) {
- if (lastStart.posX + lastStart.width >= posX - 1) {
- lastStart.width = posX + effectiveWidth - lastStart.posX;
- return;
- }
- }
- style.add(new RenderPair(posX, effectiveWidth, lastRed, lastGreen, lastBlue, lastAlpha));
- }
-
- private float getBoldOffset(int index) {
- return index == -1 || fontRenderer.getUnicodeFlag() ? 0.5F : getOptifineBoldOffset();
- }
-
- private float getOptifineBoldOffset() {
- return hook.getOptifineBoldOffset(fontRenderer);
- }
-
- public float renderChar(char ch, boolean italic) {
- if (ch == 32 || ch == 160) {
- return fontRenderer.getUnicodeFlag() ? 4.0F : getCharWidthFloat(ch);
- } else {
- final int charIndex = characterDictionary.indexOf(ch);
- return charIndex != -1 && !this.fontRenderer.getUnicodeFlag() ? this.renderDefaultChar(charIndex, italic, ch) : this.renderUnicodeChar(ch, italic);
- }
- }
-
- /**
- * Render a single character with the default.png font at current (posX,posY) location...
- */
- private float renderDefaultChar(int characterIndex, boolean italic, char ch) {
- final float characterX = (characterIndex % 16 * 8 * regularCharDim >> 7) + .01f;
- final float characterY = ((characterIndex >> 4) * 8 * regularCharDim >> 7) + 16 * texSheetDim + .01f;
-
- final int italicStyle = italic ? 1 : 0;
- final float charWidth = getCharWidthFloat(ch);
- final float smallCharWidth = charWidth - 0.01F;
-
- startDrawing();
- final float uvHeight = 7.99F * regularCharDim / 128;
- final float uvWidth = smallCharWidth * regularCharDim / 128;
-
- GL11.glTexCoord2f(characterX / fontTexWidth, characterY / fontTexHeight);
- GL11.glVertex2f(this.fontRendererAccessor.getPosX() + (float) italicStyle, this.fontRendererAccessor.getPosY());
-
- GL11.glTexCoord2f(characterX / fontTexWidth, (characterY + uvHeight) / fontTexHeight);
- GL11.glVertex2f(this.fontRendererAccessor.getPosX() - (float) italicStyle, this.fontRendererAccessor.getPosY() + 7.99F);
-
- final int offset = regularCharDim / 128;
- GL11.glTexCoord2f((characterX + uvWidth - offset) / fontTexWidth, (characterY + uvHeight) / fontTexHeight);
- GL11.glVertex2f(this.fontRendererAccessor.getPosX() + smallCharWidth - 1.0F - (float) italicStyle, this.fontRendererAccessor.getPosY() + 7.99F);
-
- GL11.glTexCoord2f((characterX + uvWidth - offset) / fontTexWidth, characterY / fontTexHeight);
- GL11.glVertex2f(this.fontRendererAccessor.getPosX() + smallCharWidth - 1.0F + (float) italicStyle, this.fontRendererAccessor.getPosY());
-
- return charWidth;
- }
-
- private void startDrawing() {
- if (!drawing) {
- drawing = true;
- GL11.glBegin(GL11.GL_QUADS);
- }
- }
-
- private void endDrawing() {
- if (drawing) {
- drawing = false;
- GL11.glEnd();
- }
- }
-
- private Pair getUV(char characterIndex) {
- final int page = characterIndex / 256;
- final int row = page >> 4;
- final int column = page % 16;
- final int glyphWidth = this.fontRendererAccessor.getGlyphWidth()[characterIndex] >>> 4;
- final float charX = (float) (characterIndex % 16 << 4) + glyphWidth + (.05f * page / 39f);
- final float charY = (float) (((characterIndex & 255) >> 4) * 16) + (.05f * page / 39f);
- return new Pair<>((row * texSheetDim + charX) / fontTexWidth, (column * texSheetDim + charY) / fontTexHeight); //16 rows each with a size of 64px
- }
-
- /**
- * Render a single Unicode character at current (posX,posY) location using one of the /font/glyph_XX.png files...
- */
- private float renderUnicodeChar(char ch, boolean italic) {
- if (this.fontRendererAccessor.getGlyphWidth()[ch] == 0) {
- return 0.0F;
- } else {
- final Pair uv = getUV(ch);
- final int glyphX = this.fontRendererAccessor.getGlyphWidth()[ch] >>> 4;
- final int glyphY = this.fontRendererAccessor.getGlyphWidth()[ch] & 15;
- final float floatGlyphX = (float) glyphX;
- final float modifiedY = (float) glyphY + 1;
- final float combinedGlyphSize = modifiedY - floatGlyphX - 0.02F;
- final float italicStyle = italic ? 1.0F : 0.0F;
- startDrawing();
-
- final float v = 15.98F * texSheetDim / 256;
- GL11.glTexCoord2f(uv.component1(), uv.component2());
- GL11.glVertex2f(this.fontRendererAccessor.getPosX() + italicStyle, this.fontRendererAccessor.getPosY());
-
- GL11.glTexCoord2f(uv.component1(), uv.component2() + v / fontTexHeight);
- GL11.glVertex2f(this.fontRendererAccessor.getPosX() - italicStyle, this.fontRendererAccessor.getPosY() + 7.99F);
-
- final float texAdj = combinedGlyphSize + .5f;
- GL11.glTexCoord2f(uv.component1() + texAdj / fontTexHeight, uv.component2() + v / fontTexHeight);
- GL11.glVertex2f(this.fontRendererAccessor.getPosX() + combinedGlyphSize / 2.0F - italicStyle, this.fontRendererAccessor.getPosY() + 7.99F);
-
- GL11.glTexCoord2f(uv.component1() + texAdj / fontTexHeight, uv.component2());
- GL11.glVertex2f(this.fontRendererAccessor.getPosX() + combinedGlyphSize / 2.0F + italicStyle, this.fontRendererAccessor.getPosY());
-
- return (modifiedY - floatGlyphX) / 2.0F + 1.0F;
- }
- }
-
- private float getCharWidthFloat(char c) { //Remapped to optifine's stuff if needed
- return hook.getCharWidth(fontRenderer, c);
- }
-
- @SuppressWarnings("unused")
- public int getStringWidth(String text) {
- if (text == null) {
- return 0;
- }
-
- Map stringWidthCache = enhancedFontRenderer.getStringWidthCache();
- if (stringWidthCache.size() > 5000) {
- stringWidthCache.clear();
- }
-
- return stringWidthCache.computeIfAbsent(text, width -> getUncachedWidth(text));
- }
-
- private int getUncachedWidth(String text) {
- if (text == null) {
- return 0;
- } else {
- float width = 0;
- boolean bold = false;
-
- for (int messageChar = 0; messageChar < text.length(); ++messageChar) {
- char character = text.charAt(messageChar);
- float characterWidth = getCharWidthFloat(character);
-
- if (characterWidth < 0 && messageChar < text.length() - 1) {
- ++messageChar;
- character = text.charAt(messageChar);
-
- if (character != 108 && character != 76) {
- if (character == 114 || character == 82) {
- bold = false;
- }
- } else {
- bold = true;
- }
-
- characterWidth = 0;
- }
-
- width += characterWidth;
-
- if (bold && characterWidth > 0) {
- width += getOptifineBoldOffset();
- }
- }
-
- return (int) width;
- }
- }
-
- public EnhancedFontRenderer getEnhancedFontRenderer() {
- return enhancedFontRenderer;
- }
-
- static class RenderPair {
- private final float red;
- private final float green;
- private final float blue;
- private final float alpha;
- float posX;
- float width;
-
- public RenderPair(float posX, float width, float red, float green, float blue, float alpha) {
- this.posX = posX;
- this.width = width;
- this.red = red;
- this.green = green;
- this.blue = blue;
- this.alpha = alpha;
- }
- }
-}
\ No newline at end of file