added Coords, Hitbox and more Settings
This commit is contained in:
@@ -35,6 +35,16 @@ public class Config {
|
||||
public boolean hitboxEnabled = false;
|
||||
public int hitboxHue = 0;
|
||||
|
||||
public int effectsX = 1;
|
||||
public int effectsY = 1;
|
||||
public int effectsP = 4;
|
||||
public boolean effectsEnabled = true;
|
||||
public boolean effectsBgEnabled = true;
|
||||
public boolean effectsTimerEnabled = true;
|
||||
public boolean effectsNameEnabled = true;
|
||||
|
||||
public float panelBlur = 5.0f;
|
||||
|
||||
|
||||
private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
|
||||
private static final Path PATH = FabricLoader.getInstance().getConfigDir().resolve("citrus-dev.json");
|
||||
|
||||
@@ -35,8 +35,6 @@ public class Module_Coords {
|
||||
private static final Surface GLASS_PANEL = Surface.blur(5f, 15f)
|
||||
.and(Surface.flat(0x40FFFFFF));
|
||||
|
||||
// ---- coords toggle ----
|
||||
|
||||
public static boolean isEnabled() {
|
||||
return toggle;
|
||||
}
|
||||
@@ -47,8 +45,6 @@ public class Module_Coords {
|
||||
CONFIG.save();
|
||||
}
|
||||
|
||||
// ---- biome toggle ----
|
||||
|
||||
public static boolean isBiomeEnabled() {
|
||||
return toggleBiome;
|
||||
}
|
||||
@@ -59,8 +55,6 @@ public class Module_Coords {
|
||||
CONFIG.save();
|
||||
}
|
||||
|
||||
// ---- positioning ----
|
||||
|
||||
public static void setPosition(int x, int y) {
|
||||
if (coordinates != null) {
|
||||
coordinates.positioning(Positioning.relative(x, y));
|
||||
@@ -82,8 +76,6 @@ public class Module_Coords {
|
||||
return coordinates;
|
||||
}
|
||||
|
||||
// ---- HUD registration ----
|
||||
|
||||
public static void register() {
|
||||
Hud.add(Identifier.fromNamespaceAndPath("citrus-dev", "coords_display"), () -> {
|
||||
if (coordinates == null) {
|
||||
@@ -104,8 +96,6 @@ public class Module_Coords {
|
||||
});
|
||||
}
|
||||
|
||||
// ---- data getters ----
|
||||
|
||||
public static Vec3 getPlayerPosition() {
|
||||
LocalPlayer player = Minecraft.getInstance().player;
|
||||
return player != null ? player.position() : null;
|
||||
@@ -145,8 +135,6 @@ public class Module_Coords {
|
||||
.orElse("Unknown");
|
||||
}
|
||||
|
||||
// ---- tick ----
|
||||
|
||||
public static void tick() {
|
||||
if (coordinates == null) return;
|
||||
|
||||
|
||||
@@ -0,0 +1,222 @@
|
||||
package de.fullrisk.citrusDev.UI;
|
||||
|
||||
import io.wispforest.owo.ui.component.LabelComponent;
|
||||
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 io.wispforest.owo.ui.hud.Hud;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.player.LocalPlayer;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.resources.Identifier;
|
||||
import net.minecraft.world.effect.MobEffectInstance;
|
||||
import de.fullrisk.citrusDev.Config;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class Module_Effects {
|
||||
|
||||
public static FlowLayout effectsContainer;
|
||||
private static final List<FlowLayout> rows = new ArrayList<>();
|
||||
private static List<MobEffectInstance> lastEffects = List.of();
|
||||
|
||||
private static final Config CONFIG = Config.get();
|
||||
|
||||
static boolean toggle = CONFIG.effectsEnabled;
|
||||
static boolean bgToggle = CONFIG.effectsBgEnabled;
|
||||
static boolean timerToggle = CONFIG.effectsTimerEnabled;
|
||||
static boolean nameToggle = CONFIG.effectsNameEnabled;
|
||||
private static boolean shown = false;
|
||||
|
||||
private static final Surface GLASS_PANEL = Surface.blur(5f, 15f)
|
||||
.and(Surface.flat(0x40FFFFFF));
|
||||
|
||||
public static boolean isEnabled() {
|
||||
return toggle;
|
||||
}
|
||||
|
||||
public static void setEnabled(boolean value) {
|
||||
toggle = value;
|
||||
CONFIG.effectsEnabled = value;
|
||||
CONFIG.save();
|
||||
}
|
||||
|
||||
public static boolean isBackgroundEnabled() {
|
||||
return bgToggle;
|
||||
}
|
||||
|
||||
public static void setBackgroundEnabled(boolean value) {
|
||||
bgToggle = value;
|
||||
CONFIG.effectsBgEnabled = value;
|
||||
CONFIG.save();
|
||||
updateSurface();
|
||||
}
|
||||
|
||||
public static boolean isTimerEnabled() {
|
||||
return timerToggle;
|
||||
}
|
||||
|
||||
public static void setTimerEnabled(boolean value) {
|
||||
timerToggle = value;
|
||||
CONFIG.effectsTimerEnabled = value;
|
||||
CONFIG.save();
|
||||
rebuildRows();
|
||||
}
|
||||
|
||||
public static boolean isNameEnabled() {
|
||||
return nameToggle;
|
||||
}
|
||||
|
||||
public static void setNameEnabled(boolean value) {
|
||||
nameToggle = value;
|
||||
CONFIG.effectsNameEnabled = value;
|
||||
CONFIG.save();
|
||||
rebuildRows();
|
||||
}
|
||||
|
||||
private static void rebuildRows() {
|
||||
if (effectsContainer == null || !shown) return;
|
||||
List<MobEffectInstance> current = lastEffects;
|
||||
if (current.isEmpty()) return;
|
||||
effectsContainer.clearChildren();
|
||||
rows.clear();
|
||||
for (MobEffectInstance instance : current) {
|
||||
FlowLayout row = makeEffectRow(instance);
|
||||
rows.add(row);
|
||||
effectsContainer.child(row);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static void updateSurface() {
|
||||
if (effectsContainer == null || !shown) return;
|
||||
effectsContainer.surface(bgToggle ? GLASS_PANEL : Surface.flat(0));
|
||||
}
|
||||
|
||||
public static void setPosition(int x, int y) {
|
||||
if (effectsContainer != null) {
|
||||
effectsContainer.positioning(Positioning.relative(x, y));
|
||||
}
|
||||
CONFIG.effectsX = x;
|
||||
CONFIG.effectsY = y;
|
||||
CONFIG.save();
|
||||
}
|
||||
|
||||
public static void setEffectsPadding(int padding) {
|
||||
CONFIG.effectsP = padding;
|
||||
CONFIG.save();
|
||||
|
||||
if (effectsContainer == null) return;
|
||||
effectsContainer.padding(Insets.of(padding));
|
||||
}
|
||||
|
||||
public static FlowLayout getEffectsContainer() {
|
||||
return effectsContainer;
|
||||
}
|
||||
|
||||
public static void register() {
|
||||
Hud.add(Identifier.fromNamespaceAndPath("citrus-dev", "effects_display"), () -> {
|
||||
if (effectsContainer == null) {
|
||||
effectsContainer = UIContainers.verticalFlow(Sizing.content(), Sizing.content());
|
||||
effectsContainer.gap(2);
|
||||
effectsContainer.verticalAlignment(VerticalAlignment.CENTER);
|
||||
effectsContainer.horizontalAlignment(HorizontalAlignment.LEFT);
|
||||
effectsContainer.padding(Insets.of(0));
|
||||
|
||||
effectsContainer.positioning(Positioning.relative(CONFIG.effectsX, CONFIG.effectsY));
|
||||
}
|
||||
return effectsContainer;
|
||||
});
|
||||
}
|
||||
|
||||
private static FlowLayout makeEffectRow(MobEffectInstance instance) {
|
||||
FlowLayout row = UIContainers.horizontalFlow(Sizing.content(), Sizing.content());
|
||||
row.gap(4);
|
||||
row.verticalAlignment(VerticalAlignment.CENTER);
|
||||
row.horizontalAlignment(HorizontalAlignment.CENTER);
|
||||
|
||||
Identifier iconId = Identifier.fromNamespaceAndPath(
|
||||
"minecraft",
|
||||
"textures/mob_effect/" + BuiltInRegistries.MOB_EFFECT.getKey(instance.getEffect().value()).getPath() + ".png"
|
||||
);
|
||||
row.child(UIComponents.texture(iconId, 0, 0, 18, 18, 18, 18));
|
||||
|
||||
if (nameToggle) {
|
||||
var effectLabel = UIComponents.label(instance.getEffect().value().getDisplayName());
|
||||
row.child(effectLabel);
|
||||
}
|
||||
|
||||
if (timerToggle) {
|
||||
var durationLabel = UIComponents.label(Component.literal(formatDuration(instance.getDuration())));
|
||||
durationLabel.color(Color.ofRgb(0xAAAAAA));
|
||||
row.child(durationLabel);
|
||||
}
|
||||
|
||||
return row;
|
||||
}
|
||||
|
||||
private static String formatDuration(int ticks) {
|
||||
int totalSeconds = ticks / 20;
|
||||
int minutes = totalSeconds / 60;
|
||||
int seconds = totalSeconds % 60;
|
||||
return String.format("%d:%02d", minutes, seconds);
|
||||
}
|
||||
|
||||
public static void tick() {
|
||||
if (effectsContainer == null) return;
|
||||
|
||||
LocalPlayer player = Minecraft.getInstance().player;
|
||||
|
||||
if (toggle && !shown) {
|
||||
effectsContainer.surface(bgToggle ? GLASS_PANEL : Surface.flat(0));
|
||||
effectsContainer.padding(Insets.of(CONFIG.effectsP));
|
||||
shown = true;
|
||||
} else if (!toggle && shown) {
|
||||
effectsContainer.clearChildren();
|
||||
rows.clear();
|
||||
lastEffects = List.of();
|
||||
effectsContainer.surface(Surface.flat(0));
|
||||
effectsContainer.padding(Insets.of(0));
|
||||
shown = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!toggle || player == null) return;
|
||||
|
||||
List<MobEffectInstance> current = new ArrayList<>(player.getActiveEffects());
|
||||
|
||||
boolean changed = current.size() != lastEffects.size();
|
||||
if (!changed) {
|
||||
for (int i = 0; i < current.size(); i++) {
|
||||
if (!current.get(i).getEffect().equals(lastEffects.get(i).getEffect())) {
|
||||
changed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
effectsContainer.clearChildren();
|
||||
rows.clear();
|
||||
for (MobEffectInstance instance : current) {
|
||||
FlowLayout row = makeEffectRow(instance);
|
||||
rows.add(row);
|
||||
effectsContainer.child(row);
|
||||
}
|
||||
} else {
|
||||
int durationIdx = nameToggle ? 2 : 1;
|
||||
for (int i = 0; i < current.size(); i++) {
|
||||
if (timerToggle && rows.get(i).children().size() > durationIdx) {
|
||||
var label = (LabelComponent) rows.get(i).children().get(durationIdx);
|
||||
label.text(Component.literal(formatDuration(current.get(i).getDuration())));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
lastEffects = current;
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@ import de.fullrisk.citrusDev.Config;
|
||||
|
||||
public class Module_Hitbox {
|
||||
private static boolean enabled = Config.get().hitboxEnabled;
|
||||
private static int hue = Config.get().hitboxHue; // 0-360
|
||||
private static int hue = Config.get().hitboxHue;
|
||||
public static volatile int color = hueToArgb(hue);
|
||||
|
||||
public static boolean isEnabled() {
|
||||
@@ -31,6 +31,6 @@ public class Module_Hitbox {
|
||||
private static int hueToArgb(int hueDegrees) {
|
||||
float h = (hueDegrees % 360) / 360.0F;
|
||||
int rgb = java.awt.Color.HSBtoRGB(h, 1.0F, 1.0F);
|
||||
return 0xFF000000 | (rgb & 0x00FFFFFF); // force opaque
|
||||
return 0xFF000000 | (rgb & 0x00FFFFFF);
|
||||
}
|
||||
}
|
||||
@@ -26,16 +26,36 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
|
||||
static final Identifier MC_FIVE = Identifier.fromNamespaceAndPath("citrus-dev", "minecraft_five");
|
||||
|
||||
static final Surface GLASS_PANEL = Surface.blur(5f, 15f)
|
||||
static Surface PANEL_SURFACE = buildPanelSurface();
|
||||
|
||||
static Surface GLASS_PANEL = Surface.blur(5f, 15f)
|
||||
.and(Surface.flat(0x40FFFFFF))
|
||||
.and(Surface.outline(0x64de4b));
|
||||
|
||||
private static final Surface DISABLED = Surface.blur(5f, 15f)
|
||||
private static Surface DISABLED = Surface.blur(5f, 15f)
|
||||
.and(Surface.flat(0x401c1c1c));
|
||||
|
||||
private static final Surface FLAT = Surface.blur(5f, 15f)
|
||||
private static Surface FLAT = Surface.blur(5f, 15f)
|
||||
.and(Surface.flat(0x40FFFFFF));
|
||||
|
||||
private static Surface buildPanelSurface() {
|
||||
float blur = Config.get().panelBlur;
|
||||
if (blur <= 0f) {
|
||||
return Surface.flat(0x40FFFFFF)
|
||||
.and(Surface.outline(0x64de4b));
|
||||
}
|
||||
return Surface.blur(blur, 15f)
|
||||
.and(Surface.flat(0x40FFFFFF))
|
||||
.and(Surface.outline(0x64de4b));
|
||||
}
|
||||
|
||||
public static void rebuildSurfaces() {
|
||||
PANEL_SURFACE = buildPanelSurface();
|
||||
if (panelRef != null) {
|
||||
panelRef.surface(PANEL_SURFACE);
|
||||
}
|
||||
}
|
||||
|
||||
private static final int PANEL_WIDTH = 250;
|
||||
private static final int PANEL_HEIGHT = 150;
|
||||
private static final int INNER_WIDTH = PANEL_WIDTH - 4;
|
||||
@@ -56,6 +76,7 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
|
||||
private FlowLayout content;
|
||||
private final String initialModule;
|
||||
private static FlowLayout panelRef;
|
||||
|
||||
|
||||
public MyScreen() {
|
||||
@@ -83,6 +104,7 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
.verticalAlignment(VerticalAlignment.CENTER);
|
||||
|
||||
FlowLayout panel = UIContainers.verticalFlow(Sizing.content(), Sizing.content());
|
||||
panelRef = panel;
|
||||
panel.gap(0);
|
||||
panel.padding(Insets.of(2));
|
||||
panel.horizontalAlignment(HorizontalAlignment.CENTER);
|
||||
@@ -91,7 +113,7 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
panel.verticalSizing(Sizing.fixed(0));
|
||||
panel.horizontalSizing().animate(300, Easing.CUBIC, Sizing.fixed(PANEL_WIDTH)).forwards();
|
||||
panel.verticalSizing().animate(300, Easing.CUBIC, Sizing.fixed(PANEL_HEIGHT)).forwards();
|
||||
panel.surface(GLASS_PANEL);
|
||||
panel.surface(PANEL_SURFACE);
|
||||
|
||||
FlowLayout navbar = UIContainers.horizontalFlow(Sizing.fixed(INNER_WIDTH), Sizing.fixed(NAVBAR_HEIGHT));
|
||||
buildNavbar(navbar);
|
||||
@@ -281,8 +303,8 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
|
||||
FlowLayout fpsRow = ModuleRow.build(
|
||||
GLASS_PANEL, DISABLED, FLAT,
|
||||
Identifier.fromNamespaceAndPath("citrus-dev", "textures/icons/block_culling_file.png"),
|
||||
18, 12,
|
||||
Identifier.fromNamespaceAndPath("citrus-dev", "textures/icons/fps.png"),
|
||||
18, 18,
|
||||
MC_FIVE,
|
||||
"FPS",
|
||||
"Displays your FPS",
|
||||
@@ -302,8 +324,8 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
|
||||
FlowLayout keyStrokesRow = ModuleRow.build(
|
||||
GLASS_PANEL, DISABLED, FLAT,
|
||||
Identifier.fromNamespaceAndPath("citrus-dev", "textures/icons/block_culling_file.png"),
|
||||
18, 12,
|
||||
Identifier.fromNamespaceAndPath("citrus-dev", "textures/icons/keystrokes.png"),
|
||||
24, 24,
|
||||
MC_FIVE,
|
||||
"Keystrokes",
|
||||
"Current Key Presses",
|
||||
@@ -323,8 +345,8 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
|
||||
FlowLayout coordinatesRow = ModuleRow.build(
|
||||
GLASS_PANEL, DISABLED, FLAT,
|
||||
Identifier.fromNamespaceAndPath("citrus-dev", "textures/icons/block_culling_file.png"),
|
||||
18, 12,
|
||||
Identifier.fromNamespaceAndPath("minecraft", "textures/item/map.png"),
|
||||
18, 18,
|
||||
MC_FIVE,
|
||||
"Coordinates",
|
||||
"Shows your Position",
|
||||
@@ -348,8 +370,8 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
|
||||
FlowLayout fullbrightRow = ModuleRow.build(
|
||||
GLASS_PANEL, DISABLED, FLAT,
|
||||
Identifier.fromNamespaceAndPath("citrus-dev", "textures/icons/block_culling_file.png"),
|
||||
18, 12,
|
||||
Identifier.fromNamespaceAndPath("citrus-dev", "textures/icons/fullbright.png"),
|
||||
18, 18,
|
||||
MC_FIVE,
|
||||
"Fullbright",
|
||||
"Max brightness",
|
||||
@@ -387,11 +409,33 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
"Module Disabled", "Hitbox color is now inactive"
|
||||
);
|
||||
|
||||
FlowLayout effectsRow = ModuleRow.build(
|
||||
GLASS_PANEL, DISABLED, FLAT,
|
||||
Identifier.fromNamespaceAndPath("citrus-dev", "textures/icons/effect.png"),
|
||||
18, 18,
|
||||
MC_FIVE,
|
||||
"Effects",
|
||||
"Shows active effects",
|
||||
new ModuleRow.ToggleState() {
|
||||
public boolean get() { return Module_Effects.isEnabled(); }
|
||||
public void set(boolean value) { Module_Effects.setEnabled(value); }
|
||||
},
|
||||
Identifier.fromNamespaceAndPath("citrus-dev", "textures/icons/settings.png"),
|
||||
() -> {
|
||||
Config.get().lastModule = "Effects";
|
||||
Config.get().save();
|
||||
openModuleSettings("Effects", effectsSettings());
|
||||
},
|
||||
"Module Enabled", "Effects display is now active",
|
||||
"Module Disabled", "Effects display is now inactive"
|
||||
);
|
||||
|
||||
FlowLayout rowsContainer = UIContainers.verticalFlow(Sizing.fixed(CONTENT_WIDTH - 8), Sizing.content());
|
||||
rowsContainer.gap(4);
|
||||
rowsContainer.verticalAlignment(VerticalAlignment.TOP);
|
||||
rowsContainer.horizontalAlignment(HorizontalAlignment.CENTER);
|
||||
|
||||
rowsContainer.child(effectsRow);
|
||||
rowsContainer.child(hitboxRow);
|
||||
rowsContainer.child(coordinatesRow);
|
||||
rowsContainer.child(keyStrokesRow);
|
||||
@@ -423,10 +467,35 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
editButton.horizontalSizing(Sizing.fixed(CONTENT_WIDTH - 8));
|
||||
rowsContainer.child(editButton);
|
||||
|
||||
FlowLayout blurSlider = SettingsControls.makeSlider(
|
||||
FLAT,
|
||||
80,
|
||||
0.0, 15.0,
|
||||
Config.get().panelBlur,
|
||||
value -> (int) value + "px",
|
||||
value -> {
|
||||
Config.get().panelBlur = (float) (double) value;
|
||||
Config.get().save();
|
||||
rebuildSurfaces();
|
||||
}
|
||||
);
|
||||
|
||||
FlowLayout blurRow = UIContainers.horizontalFlow(Sizing.fixed(CONTENT_WIDTH - 8), Sizing.fixed(16));
|
||||
blurRow.verticalAlignment(VerticalAlignment.CENTER);
|
||||
blurRow.horizontalAlignment(HorizontalAlignment.LEFT);
|
||||
blurRow.padding(Insets.of(0));
|
||||
blurRow.gap(4);
|
||||
blurRow.child(UIComponents.label(Component.literal("Panel Blur")
|
||||
.withStyle(style -> style.withFont(new FontDescription.Resource(MC_FIVE))))
|
||||
.color(Color.ofRgb(0xFF5c5c66)));
|
||||
blurRow.child(UIComponents.spacer());
|
||||
blurRow.child(blurSlider);
|
||||
rowsContainer.child(blurRow);
|
||||
|
||||
FlowLayout hintRow = UIContainers.verticalFlow(Sizing.fixed(CONTENT_WIDTH - 8), Sizing.content());
|
||||
hintRow.padding(Insets.of(4, 0, 0, 0));
|
||||
hintRow.child(UIComponents.label(Component.literal("Drag HUD modules to reposition. Press ESC to stop."))
|
||||
.color(Color.ofRgb(0x797b86)));
|
||||
.color(Color.ofRgb(0xFF5c5c66)));
|
||||
rowsContainer.child(hintRow);
|
||||
|
||||
content.child(rowsContainer);
|
||||
@@ -452,7 +521,7 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
|
||||
header.child(UIComponents.label(Component.literal(title)
|
||||
.withStyle(style -> style.withFont(new FontDescription.Resource(MC_FIVE))))
|
||||
.color(Color.ofRgb(0xCCCCCC)));
|
||||
.color(Color.ofRgb(0x80FFFFFF)));
|
||||
|
||||
content.child(header);
|
||||
|
||||
@@ -464,7 +533,7 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
|
||||
for (SettingRow row : rows) {
|
||||
FlowLayout settingRow = makeSettingRow(row);
|
||||
settingRow.verticalSizing(Sizing.fixed(16)); // pin each row to a compact fixed height
|
||||
settingRow.verticalSizing(Sizing.fixed(16));
|
||||
rowsContainer.child(settingRow);
|
||||
}
|
||||
|
||||
@@ -482,6 +551,7 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
case "Key" -> openModuleSettings("Keystrokes", keyStrokesSettings());
|
||||
case "Coords" -> openModuleSettings("Coordinates", CoordsSettings());
|
||||
case "Hitbox" -> openModuleSettings("Hitbox", hitboxSettings());
|
||||
case "Effects" -> openModuleSettings("Effects", effectsSettings());
|
||||
default -> buildGeneralPanel(content);
|
||||
}
|
||||
}
|
||||
@@ -493,8 +563,9 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
row.padding(Insets.of(0));
|
||||
row.gap(4);
|
||||
|
||||
row.child(UIComponents.label(Component.literal(setting.label()))
|
||||
.color(Color.ofRgb(0xa3a3ac)));
|
||||
row.child(UIComponents.label(Component.literal(setting.label())
|
||||
.withStyle(style -> style.withFont(new FontDescription.Resource(MC_FIVE))))
|
||||
.color(Color.ofRgb(0xFF5c5c66)));
|
||||
row.child(UIComponents.spacer());
|
||||
row.child(setting.control());
|
||||
|
||||
@@ -523,7 +594,8 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
|
||||
return List.of(
|
||||
new SettingRow("Position", SettingsControls.makeCyclingButton(GLASS_PANEL, positionStates, currentIndex)),
|
||||
new SettingRow("Size", paddingSlider)
|
||||
new SettingRow("", SettingsControls.makeSectionHeader(CONTENT_WIDTH - 8, "Display Options")),
|
||||
new SettingRow("Padding", paddingSlider)
|
||||
|
||||
);
|
||||
}
|
||||
@@ -561,7 +633,6 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
new SettingsControls.ButtonState("L-BOTTOM", () -> Module_Coords.setPosition(1, 99))
|
||||
);
|
||||
|
||||
|
||||
int currentIndex = positionIndex(Config.get().fpsX, Config.get().fpsY);
|
||||
|
||||
FlowLayout biomeCheckbox = SettingsControls.makeCheckbox(
|
||||
@@ -571,11 +642,20 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
Module_Coords::setBiomeEnabled
|
||||
);
|
||||
|
||||
return List.of(
|
||||
new SettingRow("Position", SettingsControls.makeCyclingButton(GLASS_PANEL, positionStates, currentIndex)),
|
||||
new SettingRow("Show Biome", biomeCheckbox)
|
||||
FlowLayout sizeSlider = SettingsControls.makeSlider(
|
||||
FLAT,
|
||||
80,
|
||||
0.0, 15.0,
|
||||
Config.get().coordsP,
|
||||
value -> (int) value + "px",
|
||||
value -> Module_Coords.setCoordsPadding((int) value)
|
||||
);
|
||||
|
||||
return List.of(
|
||||
new SettingRow("Position", SettingsControls.makeCyclingButton(GLASS_PANEL, positionStates, currentIndex)),
|
||||
new SettingRow("Show Biome", biomeCheckbox),
|
||||
new SettingRow("Padding", sizeSlider)
|
||||
);
|
||||
}
|
||||
|
||||
private List<SettingRow> hitboxSettings() {
|
||||
@@ -586,7 +666,7 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
Module_Hitbox.isEnabled(),
|
||||
value -> {
|
||||
Module_Hitbox.setEnabled(value);
|
||||
openModuleSettings("Hitbox", hitboxSettings()); // rebuild panel so slider appears/disappears
|
||||
openModuleSettings("Hitbox", hitboxSettings());
|
||||
}
|
||||
);
|
||||
|
||||
@@ -608,13 +688,52 @@ public class MyScreen extends BaseOwoScreen<FlowLayout> {
|
||||
return rows;
|
||||
}
|
||||
|
||||
private List<SettingRow> effectsSettings() {
|
||||
List<SettingsControls.ButtonState> positionStates = List.of(
|
||||
new SettingsControls.ButtonState("L-TOP", () -> Module_Effects.setPosition(1, 1)),
|
||||
new SettingsControls.ButtonState("R-TOP", () -> Module_Effects.setPosition(99, 1)),
|
||||
new SettingsControls.ButtonState("R-BOTTOM", () -> Module_Effects.setPosition(99, 99)),
|
||||
new SettingsControls.ButtonState("L-BOTTOM", () -> Module_Effects.setPosition(1, 99))
|
||||
);
|
||||
|
||||
int currentIndex = positionIndex(Config.get().effectsX, Config.get().effectsY);
|
||||
|
||||
FlowLayout bgCheck = SettingsControls.makeCheckbox(
|
||||
FLAT,
|
||||
GLASS_PANEL,
|
||||
Module_Effects.isBackgroundEnabled(),
|
||||
Module_Effects::setBackgroundEnabled
|
||||
);
|
||||
|
||||
FlowLayout timerCheck = SettingsControls.makeCheckbox(
|
||||
FLAT,
|
||||
GLASS_PANEL,
|
||||
Module_Effects.isTimerEnabled(),
|
||||
Module_Effects::setTimerEnabled
|
||||
);
|
||||
|
||||
FlowLayout nameCheck = SettingsControls.makeCheckbox(
|
||||
FLAT,
|
||||
GLASS_PANEL,
|
||||
Module_Effects.isNameEnabled(),
|
||||
Module_Effects::setNameEnabled
|
||||
);
|
||||
|
||||
return List.of(
|
||||
new SettingRow("Position", SettingsControls.makeCyclingButton(GLASS_PANEL, positionStates, currentIndex)),
|
||||
new SettingRow("Show Background", bgCheck),
|
||||
new SettingRow("Show Timer", timerCheck),
|
||||
new SettingRow("Show Name", nameCheck)
|
||||
);
|
||||
}
|
||||
|
||||
private int positionIndex(int x, int y) {
|
||||
boolean right = x > 50;
|
||||
boolean bottom = y > 50;
|
||||
if (!right && !bottom) return 0; // L-TOP
|
||||
if (right && !bottom) return 1; // R-TOP
|
||||
if (right && bottom) return 2; // R-BOTTOM
|
||||
return 3; // L-BOTTOM
|
||||
if (!right && !bottom) return 0;
|
||||
if (right && !bottom) return 1;
|
||||
if (right && bottom) return 2;
|
||||
return 3;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -113,7 +113,7 @@ public class QuestsPanel {
|
||||
summaryRow.child(UIComponents.label(
|
||||
Component.literal("quests " + unlockedCount + "/" + quests.size())
|
||||
.withStyle(style -> style.withFont(new FontDescription.Resource(MyScreen.MC_FIVE))))
|
||||
.color(Color.ofRgb(0xa3a3ac)));
|
||||
.color(Color.ofRgb(0xFF5c5c66)));
|
||||
|
||||
content.child(summaryRow);
|
||||
|
||||
@@ -140,22 +140,12 @@ public class QuestsPanel {
|
||||
return handle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Call this once per client tick (e.g. from ClientTickEvents.END_CLIENT_TICK)
|
||||
* to keep the open panel's playtime/progress/quest state live.
|
||||
* Throttled to once every 20 ticks (~1x/sec) since playtime itself only
|
||||
* updates that often server-side.
|
||||
*/
|
||||
public static void tick() {
|
||||
if (activeHandle != null && tickCounter++ % 20 == 0) {
|
||||
activeHandle.refresh();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Call this from the screen's onClose() so a closed panel stops being
|
||||
* refreshed and can be garbage collected.
|
||||
*/
|
||||
public static void clearActiveHandle() {
|
||||
activeHandle = null;
|
||||
}
|
||||
@@ -216,7 +206,7 @@ public class QuestsPanel {
|
||||
textStack.child(titleLabel);
|
||||
|
||||
var descLabel = UIComponents.label(Component.literal(quest.description()))
|
||||
.color(Color.ofRgb(0xa3a3ac))
|
||||
.color(Color.ofRgb(0xFF5c5c66))
|
||||
.maxWidth(entryWidth - 24);
|
||||
textStack.child(descLabel);
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package de.fullrisk.citrusDev.UIHelper;
|
||||
|
||||
import de.fullrisk.citrusDev.Config;
|
||||
import de.fullrisk.citrusDev.UI.Module_Coords;
|
||||
import de.fullrisk.citrusDev.UI.Module_Effects;
|
||||
import de.fullrisk.citrusDev.UI.Module_FPS;
|
||||
import de.fullrisk.citrusDev.UI.Module_KeyStrokes;
|
||||
import io.wispforest.owo.ui.container.FlowLayout;
|
||||
@@ -191,6 +192,12 @@ public class DraggableHud {
|
||||
() -> c.fpsX, v -> c.fpsX = v,
|
||||
() -> c.fpsY, v -> c.fpsY = v,
|
||||
Module_FPS::isEnabled
|
||||
),
|
||||
new ModuleDragConfig(
|
||||
Module_Effects::getEffectsContainer, 120, 50,
|
||||
() -> c.effectsX, v -> c.effectsX = v,
|
||||
() -> c.effectsY, v -> c.effectsY = v,
|
||||
Module_Effects::isEnabled
|
||||
)
|
||||
};
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ public class ModuleRow {
|
||||
textStack.child(titleLabel);
|
||||
|
||||
textStack.child(UIComponents.label(Component.literal(description))
|
||||
.color(Color.ofRgb(0xa3a3ac))
|
||||
.color(Color.ofRgb(0xFF5c5c66))
|
||||
.maxWidth(130));
|
||||
|
||||
row.child(textStack);
|
||||
|
||||
@@ -7,6 +7,7 @@ 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.resources.Identifier;
|
||||
import net.minecraft.sounds.SoundEvents;
|
||||
|
||||
@@ -18,6 +19,8 @@ import java.util.function.DoubleFunction;
|
||||
|
||||
public class SettingsControls {
|
||||
|
||||
private static final Identifier MC_FIVE = Identifier.fromNamespaceAndPath("citrus-dev", "minecraft_five");
|
||||
|
||||
private static final Surface GLASS_PANEL = Surface.blur(5f, 15f)
|
||||
.and(Surface.flat(0x40FFFFFF))
|
||||
.and(Surface.outline(0x64de4b));
|
||||
@@ -55,7 +58,9 @@ public class SettingsControls {
|
||||
button.horizontalAlignment(HorizontalAlignment.CENTER);
|
||||
button.padding(Insets.of(2, 2, 4, 4));
|
||||
button.surface(baseSurface);
|
||||
button.child(UIComponents.label(Component.literal(text)).color(Color.ofRgb(0xFFFFFF)));
|
||||
button.child(UIComponents.label(Component.literal(text)
|
||||
.withStyle(style -> style.withFont(new FontDescription.Resource(MC_FIVE))))
|
||||
.color(Color.ofRgb(0xFFFFFF)));
|
||||
|
||||
button.mouseEnter().subscribe(() -> button.surface(
|
||||
Surface.blur(5f, 15f).and(Surface.flat(0x70FFFFFF)).and(Surface.outline(0xFFFFFFFF))
|
||||
@@ -81,7 +86,8 @@ public class SettingsControls {
|
||||
button.horizontalAlignment(HorizontalAlignment.CENTER);
|
||||
button.surface(baseSurface);
|
||||
|
||||
var label = UIComponents.label(Component.literal(states.get(initialIndex).label()))
|
||||
var label = UIComponents.label(Component.literal(states.get(initialIndex).label())
|
||||
.withStyle(style -> style.withFont(new FontDescription.Resource(MC_FIVE))))
|
||||
.color(Color.ofRgb(0xFFFFFF));
|
||||
button.child(label);
|
||||
|
||||
@@ -93,7 +99,8 @@ public class SettingsControls {
|
||||
currentIndex[0] = (currentIndex[0] + 1) % states.size();
|
||||
ButtonState newState = states.get(currentIndex[0]);
|
||||
|
||||
label.text(Component.literal(newState.label()));
|
||||
label.text(Component.literal(newState.label())
|
||||
.withStyle(style -> style.withFont(new FontDescription.Resource(MC_FIVE))));
|
||||
newState.onSelect().run();
|
||||
|
||||
return true;
|
||||
@@ -154,7 +161,8 @@ public class SettingsControls {
|
||||
wrapper.padding(Insets.of(2, 2, 4, 0));
|
||||
wrapper.gap(2);
|
||||
|
||||
var valueLabel = UIComponents.label(Component.literal(labelFormatter.apply(initial)));
|
||||
var valueLabel = UIComponents.label(Component.literal(labelFormatter.apply(initial))
|
||||
.withStyle(style -> style.withFont(new FontDescription.Resource(MC_FIVE))));
|
||||
valueLabel.color(Color.ofRgb(0xFFFFFF));
|
||||
valueLabel.horizontalSizing(Sizing.fixed(labelWidth));
|
||||
wrapper.child(valueLabel);
|
||||
@@ -168,7 +176,8 @@ public class SettingsControls {
|
||||
return doubled;
|
||||
});
|
||||
slider.onChanged().subscribe(value -> {
|
||||
valueLabel.text(Component.literal(labelFormatter.apply(value)));
|
||||
valueLabel.text(Component.literal(labelFormatter.apply(value))
|
||||
.withStyle(style -> style.withFont(new FontDescription.Resource(MC_FIVE))));
|
||||
onChange.accept(value);
|
||||
});
|
||||
|
||||
@@ -176,4 +185,26 @@ public class SettingsControls {
|
||||
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
public static FlowLayout makeSectionHeader(int width, String text) {
|
||||
FlowLayout row = UIContainers.horizontalFlow(Sizing.fixed(width), Sizing.fixed(12));
|
||||
row.verticalAlignment(VerticalAlignment.CENTER);
|
||||
row.horizontalAlignment(HorizontalAlignment.LEFT);
|
||||
row.gap(4);
|
||||
|
||||
FlowLayout shortLine = UIContainers.horizontalFlow(Sizing.fixed(10), Sizing.fixed(1));
|
||||
shortLine.surface(Surface.flat(0x80FFFFFF));
|
||||
row.child(shortLine);
|
||||
|
||||
var label = UIComponents.label(Component.literal(text.toUpperCase())
|
||||
.withStyle(style -> style.withFont(new FontDescription.Resource(MC_FIVE))))
|
||||
.color(Color.ofRgb(0x9a9aa5));
|
||||
row.child(label);
|
||||
|
||||
FlowLayout longLine = UIContainers.horizontalFlow(Sizing.fill(100), Sizing.fixed(1));
|
||||
longLine.surface(Surface.flat(0x80FFFFFF));
|
||||
row.child(longLine);
|
||||
|
||||
return row;
|
||||
}
|
||||
}
|
||||
@@ -30,6 +30,7 @@ public class CitrusDevClient implements ClientModInitializer {
|
||||
Module_FPS.register();
|
||||
Module_KeyStrokes.register();
|
||||
Module_Coords.register();
|
||||
Module_Effects.register();
|
||||
|
||||
|
||||
KeyMapping.Category category = KeyMapping.Category.register(
|
||||
@@ -57,6 +58,7 @@ public class CitrusDevClient implements ClientModInitializer {
|
||||
Module_KeyStrokes.tick();
|
||||
Module_Coords.tick();
|
||||
DraggableHud.tick();
|
||||
Module_Effects.tick();
|
||||
|
||||
while (openScreenKey.consumeClick()) {
|
||||
if (client.player != null && client.player.isShiftKeyDown()) {
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 444 B |
Binary file not shown.
|
After Width: | Height: | Size: 288 B |
Binary file not shown.
|
After Width: | Height: | Size: 476 B |
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
Reference in New Issue
Block a user