/* * 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 . */ package kr.syeyoung.dungeonsguide.features.text; import com.google.common.base.Supplier; import com.google.gson.JsonObject; import kr.syeyoung.dungeonsguide.config.guiconfig.nyu.ConfigPanelCreator; import kr.syeyoung.dungeonsguide.config.guiconfig.nyu.MFeatureEdit; import kr.syeyoung.dungeonsguide.config.guiconfig.nyu.MParameterEdit; import kr.syeyoung.dungeonsguide.config.guiconfig.nyu.RootConfigPanel; import kr.syeyoung.dungeonsguide.config.guiconfig.location.GuiGuiLocationConfig; import kr.syeyoung.dungeonsguide.config.types.AColor; import kr.syeyoung.dungeonsguide.config.types.TypeConverter; import kr.syeyoung.dungeonsguide.config.types.TypeConverterRegistry; import kr.syeyoung.dungeonsguide.features.AbstractFeature; import kr.syeyoung.dungeonsguide.features.FeatureParameter; import kr.syeyoung.dungeonsguide.features.GuiFeature; import kr.syeyoung.dungeonsguide.gui.MPanel; import kr.syeyoung.dungeonsguide.gui.elements.MFloatSelectionButton; import kr.syeyoung.dungeonsguide.gui.elements.MPassiveLabelAndElement; import kr.syeyoung.dungeonsguide.gui.elements.MStringSelectionButton; import kr.syeyoung.dungeonsguide.gui.elements.MToggleButton; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.GlStateManager; import java.util.*; import java.util.List; public abstract class TextHUDFeature extends GuiFeature 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); this.parameters.put("textStylesNEW", new FeatureParameter>("textStylesNEW", "", "", new ArrayList(), "list_textStyle")); this.parameters.put("alignment", new FeatureParameter("alignment", "Alignment", "Alignment", "LEFT", "string")); this.parameters.put("scale", new FeatureParameter("scale", "Scale", "Scale", 1.0f, "float")); } @Override public void drawHUD(float partialTicks) { if (isHUDViewable()) { List asd = getText(); double scale = 1; if (doesScaleWithHeight()) { FontRenderer fr = getFontRenderer(); scale = getFeatureRect().getRectangle().getHeight() / (fr.FONT_HEIGHT* countLines(asd)); } else { scale = this.getParameter("scale").getValue(); } GlStateManager.scale(scale, scale, 0); StyledTextRenderer.drawTextWithStylesAssociated(asd, 0, 0, (int) (Math.abs(getFeatureRect().getWidth())/scale), getStylesMap(), StyledTextRenderer.Alignment.valueOf(TextHUDFeature.this.getParameter("alignment").getValue())); } } public boolean doesScaleWithHeight() { return true; } @Override public void drawDemo(float partialTicks) { List asd = getDummyText(); double scale = 1; if (doesScaleWithHeight()) { FontRenderer fr = getFontRenderer(); scale = getFeatureRect().getRectangle().getHeight() / (fr.FONT_HEIGHT* countLines(asd)); } else { scale = this.getParameter("scale").getValue(); } GlStateManager.scale(scale, scale, 0); StyledTextRenderer.drawTextWithStylesAssociated(asd, 0, 0, (int) (Math.abs(getFeatureRect().getWidth())/scale), getStylesMap(), StyledTextRenderer.Alignment.valueOf(TextHUDFeature.this.getParameter("alignment").getValue())); } public int countLines(List texts) { StringBuilder things = new StringBuilder(); for (StyledText text : texts) { things.append(text.getText()); } String things2 = things.toString().trim(); int lines = 1; for (char c : things2.toCharArray()) { if (c == '\n') lines++; } return lines; } public abstract boolean isHUDViewable(); public abstract List getUsedTextStyle(); public List getDummyText() { return getText(); } public abstract List getText(); public List getStyles() { return this.>getParameter("textStylesNEW").getValue(); } private Map stylesMap; public Map getStylesMap() { if (stylesMap == null) { List styles = getStyles(); Map res = new HashMap(); for (TextStyle ts : styles) { res.put(ts.getGroupName(), ts); } for (String str : getUsedTextStyle()) { if (!res.containsKey(str)) res.put(str, new TextStyle(str, new AColor(0xffffffff, true), new AColor(0x00777777, true), false)); } stylesMap = res; } return stylesMap; } @Override public String getEditRoute(RootConfigPanel rootConfigPanel) { ConfigPanelCreator.map.put("base." + getKey() , new Supplier() { @Override public MPanel get() { MFeatureEdit featureEdit = new MFeatureEdit(TextHUDFeature.this, rootConfigPanel); featureEdit.addParameterEdit("textStyleNEW", new PanelTextParameterConfig(TextHUDFeature.this)); StyledTextRenderer.Alignment alignment = StyledTextRenderer.Alignment.valueOf(TextHUDFeature.this.getParameter("alignment").getValue()); MStringSelectionButton mStringSelectionButton = new MStringSelectionButton(Arrays.asList("LEFT", "CENTER", "RIGHT"), alignment.name()); mStringSelectionButton.setOnUpdate(() -> { TextHUDFeature.this.getParameter("alignment").setValue(mStringSelectionButton.getSelected()); }); featureEdit.addParameterEdit("alignment", new MParameterEdit(TextHUDFeature.this, TextHUDFeature.this.getParameter("alignment"), rootConfigPanel, mStringSelectionButton)); for (FeatureParameter parameter: getParameters()) { if (parameter.getKey().equals("textStylesNEW")) continue; if (parameter.getKey().equals("alignment")) continue; featureEdit.addParameterEdit(parameter.getKey(), new MParameterEdit(TextHUDFeature.this, parameter, rootConfigPanel)); } return featureEdit; } }); return "base." + getKey() ; } @Override public List getTooltipForEditor(GuiGuiLocationConfig guiGuiLocationConfig) { List mPanels = super.getTooltipForEditor(guiGuiLocationConfig); StyledTextRenderer.Alignment alignment = StyledTextRenderer.Alignment.valueOf(this.getParameter("alignment").getValue()); MStringSelectionButton mStringSelectionButton = new MStringSelectionButton(Arrays.asList("LEFT", "CENTER", "RIGHT"), alignment.name()); mStringSelectionButton.setOnUpdate(() -> { TextHUDFeature.this.getParameter("alignment").setValue(mStringSelectionButton.getSelected()); }); mPanels.add(new MPassiveLabelAndElement("Alignment", mStringSelectionButton)); if (!doesScaleWithHeight()) { mPanels.add(new MPassiveLabelAndElement("Scale", new MFloatSelectionButton(TextHUDFeature.this.getParameter("scale").getValue()) {{ setOnUpdate(() ->{ TextHUDFeature.this.getParameter("scale").setValue(this.getData()); }); } })); } return mPanels; } @Override public void onParameterReset() { stylesMap = null; } @Override public void loadConfig(JsonObject jsonObject) { super.loadConfig(jsonObject); StyledTextRenderer.Alignment alignment; try { alignment = StyledTextRenderer.Alignment.valueOf(TextHUDFeature.this.getParameter("alignment").getValue()); } catch (Exception e) {alignment = StyledTextRenderer.Alignment.LEFT;} TextHUDFeature.this.getParameter("alignment").setValue(alignment.name()); } }