updated icons and added credits (secret)

This commit is contained in:
2026-07-14 10:46:09 +02:00
parent 11b223c562
commit f07ba798f4
7 changed files with 152 additions and 13 deletions
@@ -0,0 +1,107 @@
package de.fullrisk.citrusDev.UI;
import de.fullrisk.citrusDev.UIHelper.SettingsControls;
import io.wispforest.owo.ui.base.BaseOwoScreen;
import io.wispforest.owo.ui.component.UIComponents;
import io.wispforest.owo.ui.container.FlowLayout;
import io.wispforest.owo.ui.container.UIContainers;
import io.wispforest.owo.ui.core.*;
import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.sounds.SimpleSoundInstance;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.FontDescription;
import net.minecraft.sounds.SoundEvents;
import java.util.List;
import static de.fullrisk.citrusDev.UI.MainUI.buildPanelSurface;
import static de.fullrisk.citrusDev.UI.MainUI.MC_FIVE;
public class CreditsScreen extends BaseOwoScreen<FlowLayout> {
public static Surface PANEL_SURFACE = buildPanelSurface();
private static final int PANEL_WIDTH = 180;
private static final int PANEL_HEIGHT = 120;
private static final List<String> CREDITS = List.of(
"citrus team - testing",
"owo-ui - framework",
"nrc - inspiration"
);
public CreditsScreen() {
super(Component.literal("Credits"));
Minecraft.getInstance().getSoundManager().play(
SimpleSoundInstance.forUI(SoundEvents.UI_TOAST_IN, 1.5F, 2)
);
}
@Override
protected OwoUIAdapter<FlowLayout> createAdapter() {
return OwoUIAdapter.create(this, UIContainers::verticalFlow);
}
@Override
protected void build(FlowLayout rootComponent) {
rootComponent.horizontalAlignment(HorizontalAlignment.CENTER)
.verticalAlignment(VerticalAlignment.CENTER);
FlowLayout panel = UIContainers.verticalFlow(Sizing.fixed(PANEL_WIDTH), Sizing.fixed(PANEL_HEIGHT));
panel.gap(6);
panel.padding(Insets.of(8));
panel.horizontalAlignment(HorizontalAlignment.CENTER);
panel.verticalAlignment(VerticalAlignment.TOP);
panel.surface(PANEL_SURFACE);
var title = UIComponents.label(Component.literal("Credits")
.withStyle(s -> s.withFont(new FontDescription.Resource(MC_FIVE))))
.color(Color.ofRgb(0xFFFFFF))
.horizontalTextAlignment(HorizontalAlignment.CENTER);
panel.child(title);
FlowLayout list = UIContainers.verticalFlow(Sizing.fixed(PANEL_WIDTH - 16), Sizing.content());
list.gap(4);
list.horizontalAlignment(HorizontalAlignment.CENTER);
for (String entry : CREDITS) {
var line = UIComponents.label(Component.literal(entry)
.withStyle(s -> s.withFont(new FontDescription.Resource(MC_FIVE))))
.color(Color.ofRgb(0xB0B6C0))
.horizontalTextAlignment(HorizontalAlignment.CENTER);
list.child(line);
}
panel.child(list);
panel.child(UIComponents.spacer());
FlowLayout footer = UIContainers.horizontalFlow(Sizing.content(), Sizing.content());
footer.verticalAlignment(VerticalAlignment.CENTER);
footer.horizontalAlignment(HorizontalAlignment.CENTER);
footer.gap(4);
// eig hab ichs ja gemacht... egal mein name bleibt da
var madeBy = UIComponents.label(Component.literal("made by fullrisk")
.withStyle(s -> s.withFont(new FontDescription.Resource(MC_FIVE))))
.color(Color.ofRgb(0xB0B6C0));
footer.child(madeBy);
var heart = UIComponents.texture(
net.minecraft.resources.Identifier.fromNamespaceAndPath("minecraft", "textures/gui/sprites/hud/heart/full.png"),
0, 0, 9, 9, 9, 9
);
footer.child(heart);
panel.child(footer);
panel.child(SettingsControls.makeTextButton(PANEL_SURFACE, "Back", () ->
Minecraft.getInstance().setScreen(new MainUI())
));
rootComponent.child(panel);
}
@Override
public boolean isPauseScreen() { return false; }
}
@@ -26,7 +26,7 @@ public class MainUI extends BaseOwoScreen<FlowLayout> {
public static Surface DISABLED = buildDisabledSurface(); public static Surface DISABLED = buildDisabledSurface();
public static Surface FLAT = buildFlatSurface(); public static Surface FLAT = buildFlatSurface();
private static Surface buildPanelSurface() { static Surface buildPanelSurface() {
float blur = Config.get().panelBlur; float blur = Config.get().panelBlur;
int fill = Config.get().darkMode ? 0x601c1c1c : 0x40FFFFFF; int fill = Config.get().darkMode ? 0x601c1c1c : 0x40FFFFFF;
if (blur <= 0f) return Surface.flat(fill).and(Surface.outline(0x64de4b)); if (blur <= 0f) return Surface.flat(fill).and(Surface.outline(0x64de4b));
@@ -60,6 +60,8 @@ public class MainUI extends BaseOwoScreen<FlowLayout> {
private static int bright() { return 0xFFFFFF; } private static int bright() { return 0xFFFFFF; }
private static int tabText() { return 0xCCCCCC; } private static int tabText() { return 0xCCCCCC; }
//sowwwy wenn sich das wer anschaut, ik ist hässlich aber kann man nix machen
public static final int PANEL_WIDTH = 320; public static final int PANEL_WIDTH = 320;
public static final int PANEL_HEIGHT = 190; public static final int PANEL_HEIGHT = 190;
public static final int INNER_WIDTH = PANEL_WIDTH - 4; public static final int INNER_WIDTH = PANEL_WIDTH - 4;
@@ -128,6 +130,10 @@ public class MainUI extends BaseOwoScreen<FlowLayout> {
var logo = UIComponents.texture(Identifier.fromNamespaceAndPath("citrus-dev", "textures/icons/citrus-logo.png"), 0, 0, 30, 30, 30, 30); var logo = UIComponents.texture(Identifier.fromNamespaceAndPath("citrus-dev", "textures/icons/citrus-logo.png"), 0, 0, 30, 30, 30, 30);
logo.positioning(Positioning.absolute(4, (NAVBAR_HEIGHT - 30) / 2)); logo.positioning(Positioning.absolute(4, (NAVBAR_HEIGHT - 30) / 2));
logo.mouseDown().subscribe((click, doubled) -> {
Minecraft.getInstance().setScreen(new CreditsScreen());
return true;
});
navbar.child(logo); navbar.child(logo);
for (TabDef tab : List.of( for (TabDef tab : List.of(
@@ -211,6 +217,8 @@ public class MainUI extends BaseOwoScreen<FlowLayout> {
private static int sidebarBtnOutline() { return Config.get().darkMode ? 0xFF888888 : 0xFFFFFFFF; } private static int sidebarBtnOutline() { return Config.get().darkMode ? 0xFF888888 : 0xFFFFFFFF; }
private static int sidebarBtnHoverOutline() { return Config.get().darkMode ? 0xFFcccccc : 0xFFFFFFFF; } private static int sidebarBtnHoverOutline() { return Config.get().darkMode ? 0xFFcccccc : 0xFFFFFFFF; }
// 3h für darkmode btw (ich hasse mein leben)
private FlowLayout buildSidebar() { private FlowLayout buildSidebar() {
FlowLayout sidebar = UIContainers.verticalFlow(Sizing.fixed(SIDEBAR_WIDTH), Sizing.fixed(ROW_HEIGHT)); FlowLayout sidebar = UIContainers.verticalFlow(Sizing.fixed(SIDEBAR_WIDTH), Sizing.fixed(ROW_HEIGHT));
sidebar.horizontalAlignment(HorizontalAlignment.CENTER); sidebar.horizontalAlignment(HorizontalAlignment.CENTER);
@@ -240,6 +248,8 @@ public class MainUI extends BaseOwoScreen<FlowLayout> {
return sidebar; return sidebar;
} }
// sorry awa i schär mi nd dass i des wo anders hin dua
private ScalableButton makeSidebarButton(String symbol, int animateDelay) { private ScalableButton makeSidebarButton(String symbol, int animateDelay) {
var button = new ScalableButton(Component.literal(symbol), btn -> var button = new ScalableButton(Component.literal(symbol), btn ->
Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK.value(), 2.0F, 2)), Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK.value(), 2.0F, 2)),
@@ -52,7 +52,7 @@ public class ModuleRows {
"Module Disabled", "KeyStrokes is now inactive")), "Module Disabled", "KeyStrokes is now inactive")),
entry("FPS", ModuleRow.build( entry("FPS", ModuleRow.build(
GLASS_PANEL, DISABLED, FLAT, GLASS_PANEL, DISABLED, FLAT,
Identifier.fromNamespaceAndPath("citrus-dev", "textures/icons/fps.png"), 18, 18, MC_FIVE, Identifier.fromNamespaceAndPath("minecraft", "textures/item/clock_00.png"), 20, 20, MC_FIVE,
"FPS", "Displays your FPS", "FPS", "Displays your FPS",
toggleState(Module_FPS::isEnabled, Module_FPS::setEnabled), toggleState(Module_FPS::isEnabled, Module_FPS::setEnabled),
SETTINGS_ICON, () -> { Config.get().lastModule = "FPS"; Config.get().save(); openSettingsByKey.accept("FPS"); }, SETTINGS_ICON, () -> { Config.get().lastModule = "FPS"; Config.get().save(); openSettingsByKey.accept("FPS"); },
@@ -43,7 +43,7 @@ public class ModuleSettings {
return List.of( return List.of(
new SettingRow("Position", SettingsControls.makeCyclingButton(GLASS_PANEL, positionStates, positionIndex(Config.get().fpsX, Config.get().fpsY))), new SettingRow("Position", SettingsControls.makeCyclingButton(GLASS_PANEL, positionStates, positionIndex(Config.get().fpsX, Config.get().fpsY))),
new SettingRow("", SettingsControls.makeSectionHeader(CONTENT_WIDTH - 8, "Display Options")), new SettingRow("", SettingsControls.makeSectionHeader(CONTENT_WIDTH - 8, "Visual")),
new SettingRow("Padding", paddingSlider) new SettingRow("Padding", paddingSlider)
); );
} }
@@ -109,6 +109,7 @@ public class ModuleSettings {
return List.of( return List.of(
new SettingRow("Position", SettingsControls.makeCyclingButton(GLASS_PANEL, positionStates, positionIndex(Config.get().effectsX, Config.get().effectsY))), new SettingRow("Position", SettingsControls.makeCyclingButton(GLASS_PANEL, positionStates, positionIndex(Config.get().effectsX, Config.get().effectsY))),
new SettingRow("", SettingsControls.makeSectionHeader(CONTENT_WIDTH - 8, "Visual")),
new SettingRow("Show Background", SettingsControls.makeCheckbox(FLAT, GLASS_PANEL, Module_Effects.isBackgroundEnabled(), Module_Effects::setBackgroundEnabled)), new SettingRow("Show Background", SettingsControls.makeCheckbox(FLAT, GLASS_PANEL, Module_Effects.isBackgroundEnabled(), Module_Effects::setBackgroundEnabled)),
new SettingRow("Show Timer", SettingsControls.makeCheckbox(FLAT, GLASS_PANEL, Module_Effects.isTimerEnabled(), Module_Effects::setTimerEnabled)), new SettingRow("Show Timer", SettingsControls.makeCheckbox(FLAT, GLASS_PANEL, Module_Effects.isTimerEnabled(), Module_Effects::setTimerEnabled)),
new SettingRow("Show Name", SettingsControls.makeCheckbox(FLAT, GLASS_PANEL, Module_Effects.isNameEnabled(), Module_Effects::setNameEnabled)) new SettingRow("Show Name", SettingsControls.makeCheckbox(FLAT, GLASS_PANEL, Module_Effects.isNameEnabled(), Module_Effects::setNameEnabled))
@@ -24,7 +24,7 @@ public class SettingsControls {
private static final Identifier MC_FIVE = Identifier.fromNamespaceAndPath("citrus-dev", "minecraft_five"); private static final Identifier MC_FIVE = Identifier.fromNamespaceAndPath("citrus-dev", "minecraft_five");
private static int secColor() { private static int secColor() {
return Config.get().darkMode ? 0xFFd0d4da : 0xFFb0b6c0; return Config.get().darkMode ? 0xFF7a7979 : 0xFFb0b6c0;
} }
public record ButtonState(String label, Runnable onSelect) {} public record ButtonState(String label, Runnable onSelect) {}
@@ -194,19 +194,36 @@ public class SettingsControls {
row.horizontalAlignment(HorizontalAlignment.LEFT); row.horizontalAlignment(HorizontalAlignment.LEFT);
row.gap(4); row.gap(4);
FlowLayout shortLine = UIContainers.horizontalFlow(Sizing.fixed(10), Sizing.fixed(1)); int shortLineWidth = 12;
shortLine.surface(Surface.flat(0x80FFFFFF)); row.child(makeDottedLine(0x90636363, shortLineWidth));
row.child(shortLine);
var label = UIComponents.label(Component.literal(text.toUpperCase()) var label = UIComponents.label(Component.literal(text.toUpperCase())
.withStyle(style -> style.withFont(new FontDescription.Resource(MC_FIVE)))) .withStyle(style -> style.withFont(new FontDescription.Resource(MC_FIVE))))
.color(Color.ofRgb(secColor())); .color(Color.ofRgb(secColor()));
row.child(label); row.child(label);
FlowLayout longLine = UIContainers.horizontalFlow(Sizing.fill(100), Sizing.fixed(1)); int textWidth = Minecraft.getInstance().font.width(text.toUpperCase());
longLine.surface(Surface.flat(0x80FFFFFF)); int gapTotal = 4 + 4; // gap(4) appears twice: before label, after label
row.child(longLine); int longLineWidth = width - shortLineWidth - textWidth - gapTotal;
row.child(makeDottedLine(0x90636363, Math.max(longLineWidth, 20)));
return row; return row;
} }
private static FlowLayout makeDottedLine(int color, int targetWidth) {
FlowLayout dotted = UIContainers.horizontalFlow(Sizing.fixed(targetWidth), Sizing.fixed(1));
dotted.verticalAlignment(VerticalAlignment.CENTER);
dotted.gap(3);
int segmentWidth = 3;
int segmentCount = Math.max(1, targetWidth / (segmentWidth + 3));
for (int i = 0; i < segmentCount; i++) {
FlowLayout dot = UIContainers.horizontalFlow(Sizing.fixed(segmentWidth), Sizing.fixed(1));
dot.surface(Surface.flat(color));
dotted.child(dot);
}
return dotted;
}
} }
@@ -27,11 +27,15 @@ public abstract class SliderComponentMixin {
OwoUIGraphics owo = OwoUIGraphics.of(graphics); OwoUIGraphics owo = OwoUIGraphics.of(graphics);
owo.fill(RenderPipelines.GUI, x, y, x + w, y + h, 0x40FFFFFF); int trackHeight = Math.max(2, h / 3);
int trackY = y + (h - trackHeight) / 2;
owo.fill(RenderPipelines.GUI, x, trackY, x + w, trackY + trackHeight, 0x40FFFFFF);
int handleWidth = 4; int handleWidth = 3;
int handleHeight = h;
int handleY = y + (h - handleHeight) / 2;
int handleX = x + (int) (slider.value() * (w - handleWidth)); int handleX = x + (int) (slider.value() * (w - handleWidth));
owo.fill(RenderPipelines.GUI, handleX, y, handleX + handleWidth, y + h, 0xFFFFFFFF); owo.fill(RenderPipelines.GUI, handleX, handleY, handleX + handleWidth, handleY + handleHeight, 0xFF64de4b);
ci.cancel(); ci.cancel();
} }
Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 190 B