Skip to content

Commit

Permalink
feat: add hud element background (#206)
Browse files Browse the repository at this point in the history
* feat: add hud element background
* fix: some issues that occurred while testing
  • Loading branch information
Morazzer authored Nov 21, 2024
1 parent 71fdfdc commit 3141254
Show file tree
Hide file tree
Showing 11 changed files with 123 additions and 40 deletions.
12 changes: 6 additions & 6 deletions src/main/java/codes/cookies/mod/config/data/HudData.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,29 @@
import java.util.Map;

import codes.cookies.mod.render.hud.HudManager;
import codes.cookies.mod.render.hud.internal.HudPosition;
import codes.cookies.mod.render.hud.internal.HudElementSettings;
import codes.cookies.mod.utils.json.CodecJsonSerializable;
import com.mojang.serialization.Codec;
import org.slf4j.Logger;

import net.minecraft.util.Identifier;

public class HudData implements CodecJsonSerializable<Map<Identifier, HudPosition>> {
public class HudData implements CodecJsonSerializable<Map<Identifier, HudElementSettings>> {

private static final Codec<Map<Identifier, HudPosition>> CODEC = Codec.unboundedMap(Identifier.CODEC, HudPosition.CODEC);
private static final Codec<Map<Identifier, HudElementSettings>> CODEC = Codec.unboundedMap(Identifier.CODEC, HudElementSettings.CODEC);

@Override
public Codec<Map<Identifier, HudPosition>> getCodec() {
public Codec<Map<Identifier, HudElementSettings>> getCodec() {
return CODEC;
}

@Override
public void load(Map<Identifier, HudPosition> value) {
public void load(Map<Identifier, HudElementSettings> value) {
HudManager.applyAll(value);
}

@Override
public Map<Identifier, HudPosition> getValue() {
public Map<Identifier, HudElementSettings> getValue() {
return HudManager.getSettings();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@ public Text getName() {

@Override
public void buildSettings(HudElementSettingBuilder builder) {
super.buildSettings(builder);
addBasicSetting(builder);
addConfigSetting(builder);
}

public DungeonInstance getMockInstance() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public boolean shouldRender() {
return this.hudEditAction == HudEditAction.SHOW_ALL;
}

if (this.hudEditAction == HudEditAction.ALL_ENABLED) {
if (this.hudEditAction == HudEditAction.ALL_ENABLED || this.hudEditAction == HudEditAction.SHOW_ALL) {
return true;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import codes.cookies.mod.services.mining.CrystalStatusService;
import codes.cookies.mod.utils.items.ItemUtils;
import codes.cookies.mod.utils.skyblock.LocationUtils;

import org.apache.commons.lang3.StringUtils;

import net.minecraft.text.MutableText;
Expand Down Expand Up @@ -158,7 +159,11 @@ public boolean shouldRender() {

@Override
public int getWidth() {
return 170;
if (this.hudEditAction != HudEditAction.NONE) {
return 170;
}

return super.lastWidth;
}

@Override
Expand Down
14 changes: 8 additions & 6 deletions src/main/java/codes/cookies/mod/render/hud/HudEditScreen.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import codes.cookies.mod.render.hud.internal.Action;
import codes.cookies.mod.render.hud.internal.BoundingBox;
import codes.cookies.mod.render.hud.internal.HudEditAction;
import codes.cookies.mod.render.hud.internal.HudPosition;
import codes.cookies.mod.render.hud.internal.HudElementSettings;
import codes.cookies.mod.render.hud.settings.HudElementSetting;
import codes.cookies.mod.render.hud.settings.HudElementSettingBuilder;
import codes.cookies.mod.utils.RenderUtils;
Expand Down Expand Up @@ -131,10 +131,12 @@ private void renderElement(DrawContext context, HudElement hudElement, float del
context.cm$withMatrix(stack -> {
stack.translate(elementX, elementY, 0);
stack.scale(hudElement.getScale(), hudElement.getScale(), 0);
if (currentlyHovered == hudElement) {
hudElement.getNormalizedBoundingBox().fill(context, 0xFFABABAB);
} else {
hudElement.getNormalizedBoundingBox().fill(context, 0xAB000000);
if (!hudElement.getPosition().isBackground()) {
if (currentlyHovered == hudElement) {
hudElement.getNormalizedBoundingBox().fill(context, 0xFFABABAB);
} else {
hudElement.getNormalizedBoundingBox().fill(context, 0xAB000000);
}
}
hudElement.renderChecks(
context,
Expand Down Expand Up @@ -180,7 +182,7 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
@Override
public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
if (action == Action.MOVE && currentlyHovered != null) {
final HudPosition position = currentlyHovered.getPosition();
final HudElementSettings position = currentlyHovered.getPosition();
final float relativeDeltaX = (float) (deltaX / width);
final float relativeDeltaY = (float) (deltaY / height);
position.applyDelta(relativeDeltaX, relativeDeltaY);
Expand Down
16 changes: 8 additions & 8 deletions src/main/java/codes/cookies/mod/render/hud/HudManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import codes.cookies.mod.render.hud.elements.HudElement;

import codes.cookies.mod.render.hud.internal.HudPosition;
import codes.cookies.mod.render.hud.internal.HudElementSettings;

import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
Expand All @@ -21,16 +21,16 @@
public class HudManager {

static final List<HudElement> elements = new ArrayList<>();
private static final Map<Identifier, HudPosition> value = new HashMap<>();
private static final Map<Identifier, HudElementSettings> value = new HashMap<>();

public static void load() {
HudRenderCallback.EVENT.register(HudManager::render);
for (HudElement element : elements) {
final HudPosition hudPosition = value.get(element.getIdentifier());
if (hudPosition == null) {
final HudElementSettings hudElementSettings = value.get(element.getIdentifier());
if (hudElementSettings == null) {
continue;
}
element.load(hudPosition);
element.load(hudElementSettings);
}
}

Expand Down Expand Up @@ -67,12 +67,12 @@ private static TextRenderer getTextRenderer() {
return MinecraftClient.getInstance().textRenderer;
}

public static void applyAll(Map<Identifier, HudPosition> value) {
public static void applyAll(Map<Identifier, HudElementSettings> value) {
HudManager.value.putAll(value);
}

public static Map<Identifier, HudPosition> getSettings() {
Map<Identifier, HudPosition> value = new HashMap<>();
public static Map<Identifier, HudElementSettings> getSettings() {
Map<Identifier, HudElementSettings> value = new HashMap<>();
for (HudElement element : elements) {
value.put(element.getIdentifier(), element.getPosition());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,16 @@
import codes.cookies.mod.config.system.Option;
import codes.cookies.mod.render.hud.internal.BoundingBox;
import codes.cookies.mod.render.hud.internal.HudEditAction;
import codes.cookies.mod.render.hud.internal.HudPosition;
import codes.cookies.mod.render.hud.internal.HudElementSettings;
import codes.cookies.mod.render.hud.settings.BooleanSetting;
import codes.cookies.mod.render.hud.settings.ColorSetting;
import codes.cookies.mod.render.hud.settings.EnumCycleSetting;
import codes.cookies.mod.render.hud.settings.HudElementSettingBuilder;
import codes.cookies.mod.render.hud.settings.HudElementSettingType;
import codes.cookies.mod.render.hud.settings.LiteralSetting;
import codes.cookies.mod.render.hud.settings.ValueSetting;
import lombok.Getter;
import lombok.Setter;
import org.jetbrains.annotations.MustBeInvokedByOverriders;

import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
Expand All @@ -25,7 +26,7 @@
public abstract class HudElement {

private final Identifier identifier;
private final HudPosition position = new HudPosition();
private final HudElementSettings position = new HudElementSettings();
@Setter
protected HudEditAction hudEditAction = HudEditAction.NONE;

Expand All @@ -35,6 +36,12 @@ public HudElement(Identifier identifier) {

public abstract void render(DrawContext drawContext, TextRenderer textRenderer, float ticks);

public void renderBackground(DrawContext drawContext) {
if (this.position.isBackground()) {
this.getNormalizedBoundingBox().fill(drawContext, this.position.getBackgroundColor());
}
}

public abstract boolean shouldRender();

public final void renderChecks(DrawContext drawContext, TextRenderer textRenderer, float partialTicks) {
Expand All @@ -50,8 +57,7 @@ public final void renderChecks(DrawContext drawContext, TextRenderer textRendere

public abstract Text getName();

@MustBeInvokedByOverriders
public void buildSettings(HudElementSettingBuilder builder) {
protected void addBasicSetting(HudElementSettingBuilder builder) {
builder.prependSetting(new EnumCycleSetting<>(
Text.literal("Alignment"),
Text.literal(""),
Expand All @@ -62,11 +68,36 @@ public void buildSettings(HudElementSettingBuilder builder) {
builder.prependSetting(new ValueSetting(Text.literal("Y: " + this.getY())));
builder.prependSetting(new ValueSetting(Text.literal("X: " + this.getX())));
builder.prependSetting(new LiteralSetting(getName(), HudElementSettingType.METADATA));
}

protected void addConfigSetting(HudElementSettingBuilder builder) {
final List<Option<?, ?>> hudSettings = ConfigManager.getConfigReader().getHudSettings(this);
hudSettings.forEach(builder::addOption);
}

protected void addBackgroundSetting(HudElementSettingBuilder builder) {
builder.addSetting(new BooleanSetting(
Text.literal("Enable Background"),
Text.literal("Enables a background for the hud element"),
this.position::isBackground, this.position::setBackground)
);
builder.addSetting(
new ColorSetting(
Text.literal("Background Color"),
Text.literal("The background color for the hud element"),
this.position::getColorValue,
this.position::setColorValue,
true
)
);
}

public void buildSettings(HudElementSettingBuilder builder) {
addBasicSetting(builder);
addBackgroundSetting(builder);
addConfigSetting(builder);
}

public int getX() {
return this.position.clampX(getWidth());
}
Expand All @@ -75,11 +106,13 @@ public int getY() {
return this.position.clampY(getHeight());
}

public void load(HudPosition value) {
public void load(HudElementSettings value) {
this.position.setScale(value.getScale());
this.position.setX(value.getRelativeX());
this.position.setY(value.getRelativeY());
this.position.setAlignment(value.getAlignment());
this.position.setBackground(value.isBackground());
this.position.setBackgroundColor(value.getBackgroundColor());
}

public float getScale() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,40 @@

import java.util.List;

import codes.cookies.mod.render.hud.internal.HudEditAction;

import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;

public abstract class MultiLineTextHudElement extends HudElement {
protected int lastWidth;
protected int lastHeight;
public MultiLineTextHudElement(Identifier identifier) {
super(identifier);
}

@Override
public void render(DrawContext drawContext, TextRenderer textRenderer, float ticks) {
this.renderBackground(drawContext);
int yOffset = 0;
lastWidth = 0;
for (Text text : getText()) {
lastHeight = MinecraftClient.getInstance().textRenderer.fontHeight;
final List<Text> lines = getText();
if (lines.isEmpty()) {
if (hudEditAction != HudEditAction.NONE) {
renderSingleText(drawContext, textRenderer, getName(), yOffset);
lastWidth += 10;
}

return;
}
for (Text text : lines) {
renderSingleText(drawContext, textRenderer, text, yOffset);
yOffset += 10;
lastWidth += 10;
}
}

Expand All @@ -30,6 +46,10 @@ protected void renderSingleText(DrawContext drawContext, TextRenderer textRender

@Override
public int getHeight() {
if (hudEditAction == HudEditAction.NONE) {
return lastHeight;
}

return getMaxRows() * 10;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public TextHudElement(Identifier identifier) {

@Override
public void render(DrawContext drawContext, TextRenderer textRenderer, float ticks) {
this.renderBackground(drawContext);
drawContext.drawText(textRenderer, this.getDisplayText(), 1,1, -1, false);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,17 @@

import net.minecraft.client.MinecraftClient;

public class HudPosition {
public static Codec<HudPosition> CODEC = RecordCodecBuilder.create(instance -> instance.group(
Codec.FLOAT.fieldOf("x").forGetter(HudPosition::getRelativeX),
Codec.FLOAT.fieldOf("y").forGetter(HudPosition::getRelativeY),
Codec.FLOAT.fieldOf("scale").forGetter(HudPosition::getScale),
Alignment.CODEC.fieldOf("alignment").forGetter(HudPosition::getAlignment)
).apply(instance, HudPosition::new));
import java.awt.*;

public class HudElementSettings {
public static Codec<HudElementSettings> CODEC = RecordCodecBuilder.create(instance -> instance.group(
Codec.FLOAT.fieldOf("x").forGetter(HudElementSettings::getRelativeX),
Codec.FLOAT.fieldOf("y").forGetter(HudElementSettings::getRelativeY),
Codec.FLOAT.fieldOf("scale").forGetter(HudElementSettings::getScale),
Alignment.CODEC.fieldOf("alignment").forGetter(HudElementSettings::getAlignment),
Codec.BOOL.optionalFieldOf("background", false).forGetter(HudElementSettings::isBackground),
Codec.INT.optionalFieldOf("background_color", 0xFFFFFFFF).forGetter(HudElementSettings::getBackgroundColor)
).apply(instance, HudElementSettings::new));

@Setter
private float x;
Expand All @@ -24,14 +28,22 @@ public class HudPosition {
@Getter
@Setter
private Alignment alignment = Alignment.LEFT;
@Getter
@Setter
private boolean background = false;
@Getter
@Setter
private int backgroundColor = 0xFFFFFFFF;

public HudPosition() {}
public HudElementSettings() {}

public HudPosition(float x, float y, float scale, Alignment alignment) {
public HudElementSettings(float x, float y, float scale, Alignment alignment, boolean background, int backgroundColor) {
this.x = x;
this.y = y;
this.scale = scale;
this.alignment = alignment;
this.background = background;
this.backgroundColor = backgroundColor;
}

public float getRelativeX() {
Expand Down Expand Up @@ -78,4 +90,12 @@ private int getScreenWidth() {
private int getScreenHeight() {
return MinecraftClient.getInstance().getWindow().getScaledHeight();
}

public Color getColorValue() {
return new Color(getBackgroundColor(), true);
}

public void setColorValue(Color color) {
this.backgroundColor = color.getRGB();
}
}
Loading

0 comments on commit 3141254

Please sign in to comment.