diff options
| author | syeyoung <cyoung06@naver.com> | 2023-01-20 16:52:54 +0900 |
|---|---|---|
| committer | syeyoung <cyoung06@naver.com> | 2023-01-20 16:52:54 +0900 |
| commit | a5726156d3941d5b6b6c9c6a968212297fd112c4 (patch) | |
| tree | 78089f2b72b8ece409d3bbca7b902c7c599f5882 | |
| parent | e1cdaf7b769abc115f2c2eb569c2bae775b2ede9 (diff) | |
| download | Skyblock-Dungeons-Guide-a5726156d3941d5b6b6c9c6a968212297fd112c4.tar.gz Skyblock-Dungeons-Guide-a5726156d3941d5b6b6c9c6a968212297fd112c4.tar.bz2 Skyblock-Dungeons-Guide-a5726156d3941d5b6b6c9c6a968212297fd112c4.zip | |
- Do not post events asynchronously
- Text HUD Features now use rich text!!
- FASSSSSTTTT rendering
Signed-off-by: syeyoung <cyoung06@naver.com>
19 files changed, 757 insertions, 205 deletions
diff --git a/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/auth/AuthManager.java b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/auth/AuthManager.java index db9f7513..cf47d9b9 100644 --- a/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/auth/AuthManager.java +++ b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/auth/AuthManager.java @@ -121,7 +121,10 @@ public class AuthManager { String token = DgAuthUtil.requestAuth(); byte[] encSecret = DgAuthUtil.checkSessionAuthenticityAndReturnEncryptedSecret(token); currentToken = DgAuthUtil.verifyAuth(token, encSecret); - MinecraftForge.EVENT_BUS.post(new AuthChangedEvent(currentToken)); + Minecraft.getMinecraft().addScheduledTask(() -> { + MinecraftForge.EVENT_BUS.post(new AuthChangedEvent(currentToken)); + }); + if (currentToken instanceof PrivacyPolicyRequiredToken) { GuiDisplayer.INSTANCE.displayGui(new GuiPrivacyPolicy()); diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/location/GuiGuiLocationConfig.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/location/GuiGuiLocationConfig.java index ca15128d..0f0846b5 100755 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/location/GuiGuiLocationConfig.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/location/GuiGuiLocationConfig.java @@ -19,6 +19,7 @@ package kr.syeyoung.dungeonsguide.mod.config.guiconfig.location; import kr.syeyoung.dungeonsguide.mod.features.AbstractFeature; +import kr.syeyoung.dungeonsguide.mod.features.AbstractHUDFeature; import kr.syeyoung.dungeonsguide.mod.features.FeatureRegistry; import kr.syeyoung.dungeonsguide.mod.features.GuiFeature; import kr.syeyoung.dungeonsguide.mod.gui.MGui; @@ -56,8 +57,8 @@ public class GuiGuiLocationConfig extends MGui { public GuiGuiLocationConfig(final GuiScreen before, AbstractFeature featureWhitelist) { this.before = before; for (AbstractFeature feature : FeatureRegistry.getFeatureList()) { - if (feature instanceof GuiFeature && feature.isEnabled()) { - getMainPanel().add(new PanelDelegate((GuiFeature) feature, featureWhitelist == null || feature == featureWhitelist, this)); + if (feature instanceof AbstractHUDFeature && feature.isEnabled()) { + getMainPanel().add(new PanelDelegate((AbstractHUDFeature) feature, featureWhitelist == null || feature == featureWhitelist, this)); } } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/location/PanelDelegate.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/location/PanelDelegate.java index 28cea414..6b639749 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/location/PanelDelegate.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/location/PanelDelegate.java @@ -20,6 +20,7 @@ package kr.syeyoung.dungeonsguide.mod.config.guiconfig.location; import kr.syeyoung.dungeonsguide.mod.config.types.GUIRectangle; +import kr.syeyoung.dungeonsguide.mod.features.AbstractHUDFeature; import kr.syeyoung.dungeonsguide.mod.features.GuiFeature; import kr.syeyoung.dungeonsguide.mod.gui.MPanel; import kr.syeyoung.dungeonsguide.mod.gui.elements.MPopupMenu; @@ -41,12 +42,12 @@ import java.util.List; import java.util.*; public class PanelDelegate extends MPanel { - private final GuiFeature guiFeature; + private final AbstractHUDFeature guiFeature; private boolean draggable = false; private GuiGuiLocationConfig guiGuiLocationConfig; private Set<Marker> markerSet = new HashSet<>(); - public PanelDelegate(GuiFeature guiFeature, boolean draggable, GuiGuiLocationConfig guiGuiLocationConfig) { + public PanelDelegate(AbstractHUDFeature guiFeature, boolean draggable, GuiGuiLocationConfig guiGuiLocationConfig) { this.guiFeature = guiFeature; this.draggable = draggable; this.guiGuiLocationConfig = guiGuiLocationConfig; diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/discord/DiscordIntegrationManager.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/discord/DiscordIntegrationManager.java index 1f638faf..601783cd 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/discord/DiscordIntegrationManager.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/discord/DiscordIntegrationManager.java @@ -34,6 +34,7 @@ import kr.syeyoung.dungeonsguide.mod.features.impl.discord.inviteViewer.Reply; import kr.syeyoung.dungeonsguide.mod.party.PartyContext; import kr.syeyoung.dungeonsguide.mod.party.PartyManager; import lombok.Getter; +import net.minecraft.client.Minecraft; import net.minecraftforge.common.MinecraftForge; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; @@ -133,7 +134,9 @@ public class DiscordIntegrationManager implements IPCListener { JSONObject data = packet.getJson().getJSONObject("data"); JDiscordRelation relation = JDiscordRelation.parse(data); JDiscordRelation old = relationMap.put(relation.getDiscordUser().getIdLong(), relation); - MinecraftForge.EVENT_BUS.post(new DiscordUserUpdateEvent(old, relation)); + Minecraft.getMinecraft().addScheduledTask(() -> { + MinecraftForge.EVENT_BUS.post(new DiscordUserUpdateEvent(old, relation)); + }); } private void onActivityJoinRequest(Packet packet) { JSONObject data = packet.getJson().getJSONObject("data"); @@ -145,27 +148,31 @@ public class DiscordIntegrationManager implements IPCListener { .getString("id")), data.getJSONObject("user") .getString("avatar")); - MinecraftForge.EVENT_BUS.post(new DiscordUserJoinRequestEvent(user)); + Minecraft.getMinecraft().addScheduledTask(() -> { + MinecraftForge.EVENT_BUS.post(new DiscordUserJoinRequestEvent(user)); + }); } private void onActivityInvite(Packet packet) { JSONObject data = packet.getJson().getJSONObject("data"); if (!data.getJSONObject("activity").getString("application_id").equals("816298079732498473")) return; - MinecraftForge.EVENT_BUS.post(new DiscordUserInvitedEvent( - new User(data.getJSONObject("user") - .getString("username"), - data.getJSONObject("user") - .getString("discriminator"), - Long.parseUnsignedLong(data.getJSONObject("user") - .getString("id")), - data.getJSONObject("user") - .getString("avatar")), - new InviteHandle( - data.getJSONObject("user").getString("id"), - data.getJSONObject("activity").getString("session_id"), - data.getString("channel_id"), - data.getString("message_id") - ))); + Minecraft.getMinecraft().addScheduledTask(() -> { + MinecraftForge.EVENT_BUS.post(new DiscordUserInvitedEvent( + new User(data.getJSONObject("user") + .getString("username"), + data.getJSONObject("user") + .getString("discriminator"), + Long.parseUnsignedLong(data.getJSONObject("user") + .getString("id")), + data.getJSONObject("user") + .getString("avatar")), + new InviteHandle( + data.getJSONObject("user").getString("id"), + data.getJSONObject("activity").getString("session_id"), + data.getString("channel_id"), + data.getString("message_id") + ))); + }); } private void onRelationshipLoad(Packet object) { diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/AbstractGuiFeature.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/AbstractGuiFeature.java index c8112dbe..420b1329 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/AbstractGuiFeature.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/AbstractGuiFeature.java @@ -39,15 +39,18 @@ public abstract class AbstractGuiFeature extends AbstractFeature { private boolean wasVisible = false; private OverlayWidget widget; public OverlayWidget getWidget() { - if (widget == null) widget = instantiateWidget(); + if (widget == null || widget.wrappingWidget == null) widget = instantiateWidget(); + if (widget.wrappingWidget == null) return null; return widget; } public void checkVisibility() { boolean shouldBeVisible = isVisible(); + OverlayWidget widget = getWidget(); + if (widget == null) return; if (!wasVisible && shouldBeVisible) { - OverlayManager.getInstance().addOverlay(getWidget()); + OverlayManager.getInstance().addOverlay(widget); } else if (wasVisible && !shouldBeVisible) { - OverlayManager.getInstance().removeOverlay(getWidget()); + OverlayManager.getInstance().removeOverlay(widget); } wasVisible = shouldBeVisible; } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/AbstractHUDFeature.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/AbstractHUDFeature.java new file mode 100644 index 00000000..55c6499c --- /dev/null +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/AbstractHUDFeature.java @@ -0,0 +1,141 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2021 cyoung06 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +package kr.syeyoung.dungeonsguide.mod.features; + +import com.google.gson.JsonObject; +import kr.syeyoung.dungeonsguide.mod.config.guiconfig.GuiConfigV2; +import kr.syeyoung.dungeonsguide.mod.config.guiconfig.location.GuiGuiLocationConfig; +import kr.syeyoung.dungeonsguide.mod.config.types.GUIRectangle; +import kr.syeyoung.dungeonsguide.mod.config.types.TypeConverterRegistry; +import kr.syeyoung.dungeonsguide.mod.gui.MPanel; +import kr.syeyoung.dungeonsguide.mod.gui.elements.MButton; +import kr.syeyoung.dungeonsguide.mod.gui.elements.MLabel; +import kr.syeyoung.dungeonsguide.mod.gui.elements.MPassiveLabelAndElement; +import kr.syeyoung.dungeonsguide.mod.gui.elements.MToggleButton; +import kr.syeyoung.dungeonsguide.mod.guiv2.DomElement; +import kr.syeyoung.dungeonsguide.mod.guiv2.Widget; +import kr.syeyoung.dungeonsguide.mod.guiv2.layouter.Layouter; +import kr.syeyoung.dungeonsguide.mod.guiv2.primitive.ConstraintBox; +import kr.syeyoung.dungeonsguide.mod.guiv2.primitive.Rect; +import kr.syeyoung.dungeonsguide.mod.guiv2.primitive.Size; +import kr.syeyoung.dungeonsguide.mod.guiv2.renderer.Renderer; +import kr.syeyoung.dungeonsguide.mod.guiv2.renderer.RenderingContext; +import kr.syeyoung.dungeonsguide.mod.overlay.OverlayType; +import kr.syeyoung.dungeonsguide.mod.overlay.OverlayWidget; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiScreen; +import org.lwjgl.opengl.GL11; + +import java.awt.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@Getter +public abstract class AbstractHUDFeature extends AbstractGuiFeature { + private GUIRectangle featureRect; + + public void setFeatureRect(GUIRectangle featureRect) { + this.featureRect = featureRect; + updatePosition(); + } + + @Setter(value = AccessLevel.PROTECTED) + private boolean keepRatio; + @Setter(value = AccessLevel.PROTECTED) + private double defaultWidth; + @Setter(value = AccessLevel.PROTECTED) + private double defaultHeight; + private final double defaultRatio; + + protected AbstractHUDFeature(String category, String name, String description, String key, boolean keepRatio, int width, int height) { + super(category, name, description, key); + this.keepRatio = keepRatio; + this.defaultWidth = width; + this.defaultHeight = height; + this.defaultRatio = defaultWidth / defaultHeight; + this.featureRect = new GUIRectangle(0, 0, width, height); + } + + + public Rect getWidgetPosition() { + Rectangle loc = featureRect.getRectangleNoScale(); + return new Rect(loc.x, loc.y, loc.width, loc.height); + } + public abstract void drawDemo(float partialTicks); + + @Override + public void loadConfig(JsonObject jsonObject) { + super.loadConfig(jsonObject); + this.featureRect = TypeConverterRegistry.getTypeConverter("guirect",GUIRectangle.class).deserialize(jsonObject.get("$bounds")); + updatePosition(); + } + + @Override + public JsonObject saveConfig() { + JsonObject object = super.saveConfig(); + object.add("$bounds", TypeConverterRegistry.getTypeConverter("guirect", GUIRectangle.class).serialize(featureRect)); + return object; + } + + public List<MPanel> getTooltipForEditor(GuiGuiLocationConfig guiGuiLocationConfig) { + ArrayList<MPanel> mPanels = new ArrayList<>(); + mPanels.add(new MLabel(){ + { + setText(getName()); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(Minecraft.getMinecraft().fontRendererObj.getStringWidth(getName()), 20); + } + }); + mPanels.add(new MButton() { + { + setText("Edit"); + setOnActionPerformed(() -> { + GuiScreen guiScreen = guiGuiLocationConfig.getBefore(); + if (guiScreen == null) { + guiScreen = new GuiConfigV2(); + } + Minecraft.getMinecraft().displayGuiScreen(guiScreen); + if (guiScreen instanceof GuiConfigV2) { + ((GuiConfigV2) guiScreen).getRootConfigPanel().setCurrentPageAndPushHistory(getEditRoute(((GuiConfigV2) guiScreen).getRootConfigPanel())); + } + }); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(100,20); + } + }); + mPanels.add(new MPassiveLabelAndElement("Enabled", new MToggleButton() {{ + setEnabled(AbstractHUDFeature.this.isEnabled()); + setOnToggle(() ->{ + AbstractHUDFeature.this.setEnabled(isEnabled()); + }); } + })); + return mPanels; + } +} diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/GuiFeature.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/GuiFeature.java index fba7aa86..d0de4225 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/GuiFeature.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/GuiFeature.java @@ -58,29 +58,10 @@ import java.util.Collections; import java.util.List; @Getter -public abstract class GuiFeature extends AbstractGuiFeature { - private GUIRectangle featureRect; - - public void setFeatureRect(GUIRectangle featureRect) { - this.featureRect = featureRect; - updatePosition(); - } - - @Setter(value = AccessLevel.PROTECTED) - private boolean keepRatio; - @Setter(value = AccessLevel.PROTECTED) - private double defaultWidth; - @Setter(value = AccessLevel.PROTECTED) - private double defaultHeight; - private final double defaultRatio; +public abstract class GuiFeature extends AbstractHUDFeature { protected GuiFeature(String category, String name, String description, String key, boolean keepRatio, int width, int height) { - super(category, name, description, key); - this.keepRatio = keepRatio; - this.defaultWidth = width; - this.defaultHeight = height; - this.defaultRatio = defaultWidth / defaultHeight; - this.featureRect = new GUIRectangle(0, 0, width, height); + super(category, name, description, key, keepRatio, width, height); } public class WidgetFeatureWrapper extends Widget implements Renderer, Layouter { @@ -104,15 +85,12 @@ public abstract class GuiFeature extends AbstractGuiFeature { return new OverlayWidget( new WidgetFeatureWrapper(), OverlayType.UNDER_CHAT, - () -> { - Rectangle loc = featureRect.getRectangleNoScale(); - return new Rect(loc.x, loc.y, loc.width, loc.height); - } + this::getWidgetPosition ); } public void drawScreen(float partialTicks) { - Rectangle featureRect = this.featureRect.getRectangleNoScale(); + Rectangle featureRect = this.getFeatureRect().getRectangleNoScale(); clip(featureRect.x, featureRect.y, featureRect.width, featureRect.height); GL11.glEnable(GL11.GL_SCISSOR_TEST); drawHUD(partialTicks); @@ -136,59 +114,4 @@ public abstract class GuiFeature extends AbstractGuiFeature { FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; return fr; } - - @Override - public void loadConfig(JsonObject jsonObject) { - super.loadConfig(jsonObject); - this.featureRect = TypeConverterRegistry.getTypeConverter("guirect",GUIRectangle.class).deserialize(jsonObject.get("$bounds")); - updatePosition(); - } - - @Override - public JsonObject saveConfig() { - JsonObject object = super.saveConfig(); - object.add("$bounds", TypeConverterRegistry.getTypeConverter("guirect", GUIRectangle.class).serialize(featureRect)); - return object; - } - - public List<MPanel> getTooltipForEditor(GuiGuiLocationConfig guiGuiLocationConfig) { - ArrayList<MPanel> mPanels = new ArrayList<>(); - mPanels.add(new MLabel(){ - { - setText(getName()); - } - - @Override - public Dimension getPreferredSize() { - return new Dimension(Minecraft.getMinecraft().fontRendererObj.getStringWidth(getName()), 20); - } - }); - mPanels.add(new MButton() { - { - setText("Edit"); - setOnActionPerformed(() -> { - GuiScreen guiScreen = guiGuiLocationConfig.getBefore(); - if (guiScreen == null) { - guiScreen = new GuiConfigV2(); - } - Minecraft.getMinecraft().displayGuiScreen(guiScreen); - if (guiScreen instanceof GuiConfigV2) { - ((GuiConfigV2) guiScreen).getRootConfigPanel().setCurrentPageAndPushHistory(getEditRoute(((GuiConfigV2) guiScreen).getRootConfigPanel())); - } - }); - } - - @Override - public Dimension getPreferredSize() { - return new Dimension(100,20); - } - }); - mPanels.add(new MPassiveLabelAndElement("Enabled", new MToggleButton() {{ - setEnabled(GuiFeature.this.isEnabled()); - setOnToggle(() ->{ - GuiFeature.this.setEnabled(isEnabled()); - }); } - })); - return mPanels; - } } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/text/TextHUDFeature.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/text/TextHUDFeature.java index 73f33898..28143c40 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/text/TextHUDFeature.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/text/TextHUDFeature.java @@ -26,18 +26,31 @@ import kr.syeyoung.dungeonsguide.mod.config.guiconfig.MParameterEdit; import kr.syeyoung.dungeonsguide.mod.config.guiconfig.RootConfigPanel; import kr.syeyoung.dungeonsguide.mod.config.guiconfig.location.GuiGuiLocationConfig; import kr.syeyoung.dungeonsguide.mod.config.types.AColor; +import kr.syeyoung.dungeonsguide.mod.events.annotations.DGEventHandler; +import kr.syeyoung.dungeonsguide.mod.events.impl.DGTickEvent; +import kr.syeyoung.dungeonsguide.mod.features.AbstractHUDFeature; import kr.syeyoung.dungeonsguide.mod.features.FeatureParameter; import kr.syeyoung.dungeonsguide.mod.features.GuiFeature; import kr.syeyoung.dungeonsguide.mod.gui.MPanel; import kr.syeyoung.dungeonsguide.mod.gui.elements.MFloatSelectionButton; import kr.syeyoung.dungeonsguide.mod.gui.elements.MPassiveLabelAndElement; import kr.syeyoung.dungeonsguide.mod.gui.elements.MStringSelectionButton; +import kr.syeyoung.dungeonsguide.mod.guiv2.DomElement; +import kr.syeyoung.dungeonsguide.mod.guiv2.Widget; +import kr.syeyoung.dungeonsguide.mod.guiv2.elements.richtext.BreakWord; +import kr.syeyoung.dungeonsguide.mod.guiv2.elements.richtext.RichText; +import kr.syeyoung.dungeonsguide.mod.guiv2.elements.richtext.TextSpan; +import kr.syeyoung.dungeonsguide.mod.guiv2.elements.richtext.styles.ITextStyle; +import kr.syeyoung.dungeonsguide.mod.guiv2.elements.richtext.styles.ParentDelegatingTextStyle; +import kr.syeyoung.dungeonsguide.mod.overlay.OverlayType; +import kr.syeyoung.dungeonsguide.mod.overlay.OverlayWidget; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.GlStateManager; import java.util.*; -public abstract class TextHUDFeature extends GuiFeature implements StyledTextProvider { +public abstract class TextHUDFeature extends AbstractHUDFeature implements StyledTextProvider { protected TextHUDFeature(String category, String name, String description, String key, boolean keepRatio, int width, int height) { super(category, name, description, key, keepRatio, width, height); addParameter("textStylesNEW", new FeatureParameter<List<TextStyle>>("textStylesNEW", "", "", new ArrayList<TextStyle>(), "list_textStyle")); @@ -46,23 +59,55 @@ public abstract class TextHUDFeature extends GuiFeature implements StyledTextPro } @Override - public void drawHUD(float partialTicks) { - if (isHUDViewable()) { - List<StyledText> asd = getText(); - - double scale = 1; - if (doesScaleWithHeight()) { - FontRenderer fr = getFontRenderer(); - scale = getFeatureRect().getRectangle().getHeight() / (fr.FONT_HEIGHT* countLines(asd)); - } else { - scale = this.<Float>getParameter("scale").getValue(); + public boolean isVisible() { + return super.isVisible() && isHUDViewable(); + } + + private final RichText richText = new RichText(new TextSpan( + ParentDelegatingTextStyle.ofDefault(), + "" + ), BreakWord.WORD, true, RichText.TextAlign.LEFT); + + @Override + public OverlayWidget instantiateWidget() { + return new OverlayWidget(richText, OverlayType.UNDER_CHAT, this::getWidgetPosition); + } + + private Map<String, ParentDelegatingTextStyle> builtTextStyles = new HashMap<>(); + + @DGEventHandler + public void onTick(DGTickEvent dgTickEvent) { + try { + checkVisibility(); + if (isHUDViewable()) { + List<StyledText> asd = getText(); + + ParentDelegatingTextStyle defaultStyle = ParentDelegatingTextStyle.ofDefault(); + if (doesScaleWithHeight()) { + if (getWidget() == null || getWidget().getDomElement() == null || getWidget().getDomElement().getSize() == null) return; + defaultStyle.setSize(getFeatureRect().getRectangleNoScale().getHeight() / countLines(asd)); + } else { + defaultStyle.setSize((double) (this.<Float>getParameter("scale").getValue() * 8)); + } + + TextSpan span = new TextSpan(defaultStyle, ""); + + for (StyledText styledText : asd) { + TextStyle style = getStylesMap().get(styledText.getGroup()); + TextSpan textSpan = new TextSpan(style.getLinked(), styledText.getText()); + span.addChild(textSpan); + } + richText.setRootSpan(span); } - GlStateManager.scale(scale, scale, 0); - StyledTextRenderer.drawTextWithStylesAssociated(asd, 0, 0, (int) (Math.abs(getFeatureRect().getWidth())/scale), getStylesMap(), - StyledTextRenderer.Alignment.valueOf(TextHUDFeature.this.<String>getParameter("alignment").getValue())); + } catch (Exception e) { + e.printStackTrace(); } } + public static FontRenderer getFontRenderer() { + return Minecraft.getMinecraft().fontRendererObj; + } + public boolean doesScaleWithHeight() { return true; } @@ -72,7 +117,7 @@ public abstract class TextHUDFeature extends GuiFeature implements StyledTextPro List<StyledText> asd = getDummyText(); double scale = 1; if (doesScaleWithHeight()) { - FontRenderer fr = getFontRenderer(); + FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; scale = getFeatureRect().getRectangle().getHeight() / (fr.FONT_HEIGHT* countLines(asd)); } else { scale = this.<Float>getParameter("scale").getValue(); @@ -107,6 +152,8 @@ public abstract class TextHUDFeature extends GuiFeature implements StyledTextPro public List<TextStyle> getStyles() { return this.<List<TextStyle>>getParameter("textStylesNEW").getValue(); } + + private Map<String, TextStyle> stylesMap; public Map<String, TextStyle> getStylesMap() { if (stylesMap == null) { @@ -117,7 +164,7 @@ public abstract class TextHUDFeature extends GuiFeature implements StyledTextPro } for (String str : getUsedTextStyle()) { if (!res.containsKey(str)) - res.put(str, new TextStyle(str, new AColor(0xffffffff, true), new AColor(0x00777777, true), false)); + res.put(str, new TextStyle(str, new AColor(0xffffffff, true), new AColor(0x00777777, true), false, new ParentDelegatingTextStyle())); } stylesMap = res; } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/text/TextStyle.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/text/TextStyle.java index 16cb4b66..8a89ae25 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/text/TextStyle.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/text/TextStyle.java @@ -19,6 +19,9 @@ package kr.syeyoung.dungeonsguide.mod.features.text; import kr.syeyoung.dungeonsguide.mod.config.types.AColor; +import kr.syeyoung.dungeonsguide.mod.guiv2.elements.richtext.shaders.ChromaShader; +import kr.syeyoung.dungeonsguide.mod.guiv2.elements.richtext.shaders.SingleColorShader; +import kr.syeyoung.dungeonsguide.mod.guiv2.elements.richtext.styles.ParentDelegatingTextStyle; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -31,4 +34,29 @@ public class TextStyle { private AColor color; private AColor background; private boolean shadow = false; + + public TextStyle(String groupName, AColor color, AColor background, boolean shadow) { + this.groupName = groupName; + this.color = color; + this.background = background; + this.shadow = shadow; + } + + public void setColor(AColor color) { + this.color = color; + if (!color.isChroma()) + linked.textShader = new SingleColorShader(color.getRGB()); + else + linked.textShader = new ChromaShader(color.getChromaSpeed(), color.getRGB()); + } + + public void setBackground(AColor background) { + this.background = background; + if (!background.isChroma()) + linked.backgroundShader = new SingleColorShader(background.getRGB()); + else + linked.backgroundShader = new ChromaShader(background.getChromaSpeed(), background.getRGB()); + } + + private ParentDelegatingTextStyle linked = new ParentDelegatingTextStyle(); } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/guiv2/elements/richtext/FlatTextSpan.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/guiv2/elements/richtext/FlatTextSpan.java index f4ba08c8..71f3ca0e 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/guiv2/elements/richtext/FlatTextSpan.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/guiv2/elements/richtext/FlatTextSpan.java @@ -18,12 +18,14 @@ package kr.syeyoung.dungeonsguide.mod.guiv2.elements.richtext; +import kr.syeyoung.dungeonsguide.mod.guiv2.elements.richtext.styles.ITextStyle; + public class FlatTextSpan { - public final TextStyle textStyle; + public final ITextStyle textStyle; public final char[] value; - public FlatTextSpan(TextStyle textStyle, char[] value) { + public FlatTextSpan(ITextStyle textStyle, char[] value) { this.textStyle = textStyle; this.value = value; } @@ -36,10 +38,10 @@ public class FlatTextSpan { return sum; } public double getHeight() { - return textStyle.getSize() * textStyle.getLineHeight(); + return (1 + textStyle.getTopAscent() + textStyle.getBottomAscent()) * textStyle.getSize(); } public double getBaseline() { - return textStyle.getSize() * (textStyle.getLineHeight()-1) + textStyle.getFontRenderer().getBaselineHeight(textStyle); + return textStyle.getSize() * (textStyle.getFontRenderer().getBaselineHeight(textStyle) + textStyle.getTopAscent()); } p |
