aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsyeyoung <cyoung06@naver.com>2023-01-20 16:52:54 +0900
committersyeyoung <cyoung06@naver.com>2023-01-20 16:52:54 +0900
commita5726156d3941d5b6b6c9c6a968212297fd112c4 (patch)
tree78089f2b72b8ece409d3bbca7b902c7c599f5882
parente1cdaf7b769abc115f2c2eb569c2bae775b2ede9 (diff)
downloadSkyblock-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>
-rw-r--r--loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/auth/AuthManager.java5
-rwxr-xr-xmod/src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/location/GuiGuiLocationConfig.java5
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/location/PanelDelegate.java5
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/discord/DiscordIntegrationManager.java41
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/AbstractGuiFeature.java9
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/AbstractHUDFeature.java141
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/GuiFeature.java85
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/text/TextHUDFeature.java79
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/text/TextStyle.java28
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/guiv2/elements/richtext/FlatTextSpan.java46
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/guiv2/elements/richtext/RichText.java8
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/guiv2/elements/richtext/TextSpan.java16
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/guiv2/elements/richtext/fonts/DefaultFontRenderer.java88
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/guiv2/elements/richtext/fonts/FontRenderer.java6
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/guiv2/elements/richtext/shaders/ChromaShader.java (renamed from mod/src/main/java/kr/syeyoung/dungeonsguide/mod/guiv2/elements/richtext/TextStyle.java)41
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/guiv2/elements/richtext/shaders/SingleColorShader.java2
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/guiv2/elements/richtext/styles/CompiledTextStyle.java148
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/guiv2/elements/richtext/styles/ITextStyle.java52
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/guiv2/elements/richtext/styles/ParentDelegatingTextStyle.java157
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