Skip to content

Commit 9eb278a

Browse files
authored
Merge pull request #9 from redstone-llc/7-migrate-text-renderer-to-mixin
7-migrate-text-renderer-to-mixin
2 parents 7b8bcc5 + 7b4ed08 commit 9eb278a

File tree

16 files changed

+922
-515
lines changed

16 files changed

+922
-515
lines changed

src/main/java/llc/redstone/hysentials/Hysentials.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
import llc.redstone.hysentials.macrowheel.MacroWheelData;
3434
import llc.redstone.hysentials.quest.Quest;
35+
import llc.redstone.hysentials.renderer.text.FancyFormattingKt;
3536
import llc.redstone.hysentials.util.*;
3637
import cc.polyfrost.oneconfig.utils.commands.CommandManager;
3738
import llc.redstone.hysentials.command.*;
@@ -150,10 +151,7 @@ public void onFMLPreInitialization(FMLPreInitializationEvent event) {
150151

151152
@Mod.EventHandler
152153
public void init(FMLInitializationEvent event) {
153-
registerImages();
154154
config = new HysentialsConfig();
155-
updateAndAdd();
156-
157155
File file = new File(modDir, "./config/hysentials");
158156
if (!file.exists() && !file.mkdirs()) {
159157
throw new RuntimeException("Failed to create config directory! Please report this to sinender on Discord");
@@ -240,11 +238,11 @@ public void postInit(FMLPostInitializationEvent event) {
240238
isHytils = Loader.isModLoaded("hytils-reborn");
241239
chatHandler.init();
242240

243-
imageIconRenderer = new ImageIconRenderer();
241+
// imageIconRenderer = new ImageIconRenderer();
244242
minecraftFont = Minecraft.getMinecraft().fontRendererObj;
245-
if (FormattingConfig.fancyRendering()) {
246-
Minecraft.getMinecraft().fontRendererObj = imageIconRenderer;
247-
}
243+
// if (FormattingConfig.fancyRendering()) {
244+
// Minecraft.getMinecraft().fontRendererObj = imageIconRenderer;
245+
// }
248246

249247
registerHandlers();
250248

@@ -257,6 +255,14 @@ public void postInit(FMLPostInitializationEvent event) {
257255
if (config.macroWheelHud.position.getX() == 0 && config.macroWheelHud.position.getY() == 0) {
258256
config.macroWheelHud.position.setPosition((Renderer.screen.getWidth() / 2f) - (34*5f) / 2, (Renderer.screen.getHeight() / 2f) - (34*5f) / 2);
259257
}
258+
259+
for (int i = 1000; 65000 > i ; i++) {
260+
if (Minecraft.getMinecraft().fontRendererObj.getCharWidth((char) i) > 0) {
261+
FancyFormattingKt.getChars().put((char) i, Minecraft.getMinecraft().fontRendererObj.getCharWidth((char) i));
262+
}
263+
}
264+
registerImages();
265+
updateAndAdd();
260266
}
261267
@Mod.EventHandler
262268
public void finishedStarting(FMLLoadCompleteEvent event) {

src/main/java/llc/redstone/hysentials/config/hysentialmods/FormattingConfig.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -263,21 +263,21 @@ public FormattingConfig() {
263263
addDependency("fancyRankInTab", "futuristicRanks");
264264
addDependency("fancyRankInChat", "futuristicRanks");
265265

266-
addListener("futuristicRanks", () -> {
267-
if (FormattingConfig.fancyRendering()) {
268-
Minecraft.getMinecraft().fontRendererObj = Hysentials.INSTANCE.imageIconRenderer;
269-
} else {
270-
Minecraft.getMinecraft().fontRendererObj = Hysentials.minecraftFont;
271-
}
272-
});
273-
274-
addListener("hexColors", () -> {
275-
if (FormattingConfig.fancyRendering()) {
276-
Minecraft.getMinecraft().fontRendererObj = Hysentials.INSTANCE.imageIconRenderer;
277-
} else {
278-
Minecraft.getMinecraft().fontRendererObj = Hysentials.minecraftFont;
279-
}
280-
});
266+
// addListener("futuristicRanks", () -> {
267+
// if (FormattingConfig.fancyRendering()) {
268+
// Minecraft.getMinecraft().fontRendererObj = Hysentials.INSTANCE.imageIconRenderer;
269+
// } else {
270+
// Minecraft.getMinecraft().fontRendererObj = Hysentials.minecraftFont;
271+
// }
272+
// });
273+
//
274+
// addListener("hexColors", () -> {
275+
// if (FormattingConfig.fancyRendering()) {
276+
// Minecraft.getMinecraft().fontRendererObj = Hysentials.INSTANCE.imageIconRenderer;
277+
// } else {
278+
// Minecraft.getMinecraft().fontRendererObj = Hysentials.minecraftFont;
279+
// }
280+
// });
281281
}
282282

283283
public void initialize() {

src/main/java/llc/redstone/hysentials/config/hysentialmods/ReplaceConfig.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.io.File;
1919
import java.lang.reflect.Field;
2020
import java.util.*;
21+
import java.util.concurrent.ConcurrentHashMap;
2122

2223
public class ReplaceConfig extends Config {
2324
@Switch(
@@ -86,8 +87,8 @@ protected BasicOption getCustomOption(Field field, CustomOption annotation, Opti
8687
return option;
8788
}
8889

89-
public HashMap<String, String> getAllActiveReplacements() {
90-
HashMap<String, String> replacements = new HashMap<>();
90+
public ConcurrentHashMap<String, String> getAllActiveReplacements() {
91+
ConcurrentHashMap<String, String> replacements = new ConcurrentHashMap<>();
9192
for (ReplaceStuff replaceStuff : globalReplacements) {
9293
replacements.putAll(replaceStuff.replacements);
9394
}

src/main/java/llc/redstone/hysentials/handlers/chat/modules/bwranks/BWSReplace.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public void onMessageReceived(@NotNull ClientChatReceivedEvent event) {
8585
boolean found = m1.find();
8686
if (found || m2.find()) {
8787
Matcher m = found ? m1 : m2;
88-
String color = C.toHex(m.group(1)).replace("#", "");
88+
String color = C.toHex(m.group(1), false);
8989
String num = C.removeColor(m.group(2));
9090
String symbol = m.group(3);
9191
if (ChatConfig.levelPrefixColors) {

src/main/java/llc/redstone/hysentials/handlers/imageicons/ImageIcon.java

Lines changed: 80 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@
2222
import java.io.InputStream;
2323
import java.util.*;
2424
import java.util.List;
25+
import java.util.concurrent.atomic.AtomicBoolean;
2526
import java.util.regex.Matcher;
2627
import java.util.regex.Pattern;
2728

29+
import static llc.redstone.hysentials.renderer.text.FancyFormattingKt.getChars;
30+
2831
public class ImageIcon {
2932
public static HashMap<String, ImageIcon> imageIcons = new HashMap<>();
3033
public static Random random = new Random();
@@ -36,6 +39,8 @@ public class ImageIcon {
3639
public int width;
3740
public int height;
3841
public boolean emoji;
42+
public Character firstChar = null;
43+
public String replacement = null;
3944

4045
public ImageIcon(String name, ResourceLocation resourceLocation, boolean emoji) {
4146
this.name = name;
@@ -61,6 +66,22 @@ public ImageIcon(String name, String path, boolean emoji) {
6166
ImageIcon.imageIcons.put(name, this);
6267
}
6368

69+
public ImageIcon(String name, String path, boolean emoji, boolean handles) {
70+
this.name = name;
71+
this.emoji = emoji;
72+
this.path = path;
73+
if (!handles) {
74+
ImageIcon.imageIcons.put(name, this);
75+
return;
76+
}
77+
try {
78+
handleImageIcon();
79+
} catch (IOException e) {
80+
throw new RuntimeException(e);
81+
}
82+
ImageIcon.imageIcons.put(name, this);
83+
}
84+
6485
public ImageIcon(String name, ResourceLocation resourceLocation) {
6586
this(name, resourceLocation, false);
6687
}
@@ -95,6 +116,7 @@ public void handleImageIcon() throws IOException {
95116
this.dynamicTexture = new DynamicTexture(image);
96117
// this.resourceLocation = Minecraft.getMinecraft().getTextureManager().getDynamicTextureLocation(this.name, this.dynamicTexture);
97118
}
119+
setReplacement();
98120
}
99121

100122
public static void reloadIcons() {
@@ -135,34 +157,81 @@ public int getHeight() {
135157
return height;
136158
}
137159

138-
public static Pattern stringPattern = Pattern.compile(":([a-z_\\-0-9?]+):", 2);
139-
140-
public int renderImage(float x, float y, boolean shadow, int oldColor, UUID uuid, float alpha) {
141-
if (emoji && uuid != null && !CosmeticManager.hasCosmetic(uuid, "hymojis")) {
142-
return -1;
160+
public void setReplacement() {
161+
int width = this.getWidth();
162+
int height = this.getHeight();
163+
float scaledHeight = 9.0f / height;
164+
float updatedWidth = width * scaledHeight;
165+
166+
int currentWidth = 0;
167+
boolean isFirst = true;
168+
StringBuilder string = new StringBuilder();
169+
while (currentWidth <= updatedWidth) {
170+
Integer charWidth = null;
171+
for (Map.Entry<Character, Integer> entry : getChars().entrySet()) {
172+
if (entry.getValue() + 1 + currentWidth <= updatedWidth) {
173+
charWidth = entry.getValue();
174+
break;
175+
}
176+
}
177+
if (charWidth == null) {
178+
break;
179+
}
180+
currentWidth += charWidth + 1;
181+
List<Character> charKeys = new ArrayList<>();
182+
for (Map.Entry<Character, Integer> entry : getChars().entrySet()) {
183+
if (entry.getValue().equals(charWidth)) {
184+
charKeys.add(entry.getKey());
185+
}
186+
}
187+
char charKey;
188+
if (isFirst) {
189+
charKey = charKeys.get(new Random().nextInt(charKeys.size()));
190+
for (ImageIcon icon : ImageIcon.imageIcons.values()) {
191+
if (icon.firstChar == charKey) {
192+
icon.setReplacement();
193+
break;
194+
}
195+
}
196+
firstChar = charKey;
197+
isFirst = false;
198+
} else if (!charKeys.isEmpty()) {
199+
charKey = charKeys.get(new Random().nextInt(charKeys.size()));
200+
} else {
201+
currentWidth -= charWidth + 1;
202+
continue;
203+
}
204+
string.append(charKey);
143205
}
206+
if (string.length() == 0) {
207+
setReplacement();
208+
return;
209+
}
210+
replacement = string.toString();
211+
}
212+
213+
public float renderImage(float x, float y, boolean shadow, int oldColor, float alpha) {
144214
int width = this.getWidth();
145215
int height = this.getHeight();
146216
float scaledHeight = 9.0f / height;
217+
float updatedHeight = height * scaledHeight;
218+
float updatedWidth = width * scaledHeight;
147219

148220
GlStateManager.pushMatrix();
149-
150221
dynamicTexture.updateDynamicTexture();
151222

152-
GlStateManager.scale(scaledHeight, scaledHeight, scaledHeight);
153223
int textColor = Integer.parseInt("FFFFFF", 16);
154224
if (shadow) {
155225
textColor = (textColor & 16579836) >> 2 | textColor & -16777216;
156226
}
157227
GlStateManager.color((float) (textColor >> 16) / 255.0F, (float) (textColor >> 8 & 255) / 255.0F, (float) (textColor & 255) / 255.0F, alpha);
158-
drawModalRectWithCustomSizedTexture(x * (1 / scaledHeight), y * (1 / scaledHeight), 0, 0, width, height, width, height);
159-
GlStateManager.color((float) (oldColor >> 16) / 255.0F, (float) (oldColor >> 8 & 255) / 255.0F, (float) (oldColor & 255) / 255.0F, alpha);
228+
drawModalRectWithCustomSizedTexture(x, y, 0f, 0f, updatedWidth, updatedHeight, updatedWidth, updatedHeight);
229+
// GlStateManager.color((float) (oldColor >> 16) / 255.0F, (float) (oldColor >> 8 & 255) / 255.0F, (float) (oldColor & 255) / 255.0F, alpha);
160230
GlStateManager.popMatrix();
161-
162231
return (int) (width * scaledHeight);
163232
}
164233

165-
public static void drawModalRectWithCustomSizedTexture(double x, double y, float u, float v, int width, int height, float textureWidth, float textureHeight) {
234+
public static void drawModalRectWithCustomSizedTexture(double x, double y, float u, float v, float width, float height, float textureWidth, float textureHeight) {
166235
float f = 1.0F / textureWidth;
167236
float g = 1.0F / textureHeight;
168237
GL11.glBegin(GL11.GL_QUADS);

src/main/java/llc/redstone/hysentials/hook/FontRendererAcessor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,7 @@ public interface FontRendererAcessor {
5353

5454
float renderChar(char c, boolean shadow);
5555

56+
void renderStringAtPosA(String text, boolean shadow);
57+
5658

5759
}

src/main/java/llc/redstone/hysentials/mixin/FontRendererMixin.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
/*
1515
Font Renderer Accessor Mixin
1616
*/
17-
@Mixin(value = FontRenderer.class, priority = Integer.MIN_VALUE)
17+
@Mixin(value = FontRenderer.class, priority = Integer.MAX_VALUE)
1818
public abstract class FontRendererMixin implements FontRendererAcessor {
1919

2020
@Shadow
@@ -71,6 +71,9 @@ public abstract class FontRendererMixin implements FontRendererAcessor {
7171
@Shadow
7272
public abstract float renderChar(char ch, boolean italic);
7373

74+
@Shadow
75+
public abstract void renderStringAtPos(String text, boolean shadow);
76+
7477
@Shadow
7578
protected abstract void doDraw(float f);
7679

src/main/java/llc/redstone/hysentials/mixin/GuiUtilRCMixin.java

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,54 @@
22

33
import llc.redstone.hysentials.Hysentials;
44
import llc.redstone.hysentials.config.hysentialmods.FormattingConfig;
5+
import llc.redstone.hysentials.renderer.text.FancyFormatting2;
6+
import llc.redstone.hysentials.renderer.text.FancyFormatting2Kt;
57
import llc.redstone.hysentials.util.ImageIconRenderer;
68
import net.minecraft.client.gui.FontRenderer;
79
import net.minecraft.client.gui.GuiUtilRenderComponents;
10+
import net.minecraft.util.IChatComponent;
811
import org.spongepowered.asm.mixin.Mixin;
912
import org.spongepowered.asm.mixin.injection.At;
13+
import org.spongepowered.asm.mixin.injection.Inject;
1014
import org.spongepowered.asm.mixin.injection.Redirect;
15+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
16+
17+
import java.util.ArrayList;
18+
import java.util.List;
1119

1220
@Mixin(value = GuiUtilRenderComponents.class)
1321
public class GuiUtilRCMixin {
14-
@Redirect(method = "splitText", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/FontRenderer;getFormatFromString(Ljava/lang/String;)Ljava/lang/String;"))
15-
private static String onGetStringWidth(String c0) {
16-
if (!FormattingConfig.fancyRendering()) {
17-
return FontRenderer.getFormatFromString(c0);
18-
}
19-
return ImageIconRenderer.getFormatFromString(c0);
20-
}
22+
// @Redirect(method = "splitText", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/FontRenderer;getFormatFromString(Ljava/lang/String;)Ljava/lang/String;"))
23+
// private static String getFormatString(String c0) {
24+
// if (!FormattingConfig.fancyRendering()) {
25+
// return FontRenderer.getFormatFromString(c0);
26+
// }
27+
// return FancyFormatting2.Companion.getLastFormat(c0);
28+
// }
29+
//
30+
// @Redirect(method = "splitText", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/FontRenderer;getStringWidth(Ljava/lang/String;)I"))
31+
// private static int onGetStringWidth(FontRenderer fr, String c0) {
32+
// if (!FormattingConfig.fancyRendering()) {
33+
// return fr.getStringWidth(c0);
34+
// }
35+
// c0 = FancyFormatting2.Companion.replaceString(c0, true);
36+
// return fr.getStringWidth(c0);
37+
// }
38+
//
39+
// @Redirect(method = "splitText", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/FontRenderer;trimStringToWidth(Ljava/lang/String;IZ)Ljava/lang/String;"))
40+
// private static String onTrimStringToWidth(FontRenderer fr, String c0, int c1, boolean c2) {
41+
// if (!FormattingConfig.fancyRendering()) {
42+
// return fr.trimStringToWidth(c0, c1, c2);
43+
// }
44+
// c0 = FancyFormatting2.Companion.replaceString(c0, true);
45+
// return fr.trimStringToWidth(c0, c1, c2);
46+
//// return fr.trimStringToWidth(c0, c1, c2);
47+
// }
2148

22-
@Redirect(method = "splitText", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/FontRenderer;trimStringToWidth(Ljava/lang/String;IZ)Ljava/lang/String;"))
23-
private static String onTrimStringToWidth(FontRenderer fr, String c0, int c1, boolean c2) {
24-
if (!FormattingConfig.fancyRendering()) {
25-
return fr.trimStringToWidth(c0, c1, c2);
49+
@Inject(method="splitText", at=@At("HEAD"), cancellable = true)
50+
private static void onSplitText(IChatComponent p_178908_0_, int p_178908_1_, FontRenderer p_178908_2_, boolean p_178908_3_, boolean p_178908_4_, CallbackInfoReturnable<List<IChatComponent>> cir) {
51+
if (FormattingConfig.fancyRendering()) {
52+
cir.setReturnValue(ImageIconRenderer.splitText(p_178908_0_, p_178908_1_, p_178908_2_, p_178908_3_, p_178908_4_));
2653
}
27-
return Hysentials.INSTANCE.imageIconRenderer.trimStringToWidth(c0, c1, c2);
2854
}
2955
}

0 commit comments

Comments
 (0)