1
mirror of https://github.com/Shiewk/Widgets.git synced 2026-04-28 11:34:17 +02:00

Support Minecraft 26.1

This commit is contained in:
Shy
2026-04-01 12:17:13 +02:00
parent 169355db9a
commit c107c5ba44
59 changed files with 1130 additions and 1506 deletions
+7 -16
View File
@@ -1,6 +1,5 @@
plugins {
id 'fabric-loom' version '1.14-SNAPSHOT'
id 'maven-publish'
id 'net.fabricmc.fabric-loom' version "${loom_version}"
}
version = "${project.mod_version}-${project.minecraft_version}"
@@ -11,7 +10,7 @@ base {
}
loom {
accessWidenerPath = file("src/main/resources/widgets.accesswidener")
accessWidenerPath = file("src/main/resources/widgets.classtweaker")
}
repositories {
@@ -34,21 +33,17 @@ repositories {
}
dependencies {
// To change the versions see the gradle.properties file
minecraft "com.mojang:minecraft:${project.minecraft_version}"
mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
// Fabric API. This is technically optional, but you probably want it anyway.
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
modImplementation "maven.modrinth:modmenu:${project.modmenu_version}"
implementation "net.fabricmc:fabric-loader:${project.loader_version}"
implementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
implementation "maven.modrinth:modmenu:${project.modmenu_version}"
}
processResources {
inputs.property "version", project.version
inputs.property "minecraft_version", project.minecraft_version
inputs.property "loader_version", project.loader_version
filteringCharset "UTF-8"
filteringCharset = "UTF-8"
filesMatching("fabric.mod.json") {
expand "version": project.version,
@@ -57,7 +52,7 @@ processResources {
}
}
def targetJavaVersion = 21
def targetJavaVersion = 25
tasks.withType(JavaCompile).configureEach {
// ensure that the encoding is set to UTF-8, no matter what the system default is
// this fixes some edge cases with special characters not displaying correctly
@@ -74,10 +69,6 @@ java {
if (JavaVersion.current() < javaVersion) {
toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion)
}
// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
// if it is present.
// If you remove this line, sources will not be generated.
withSourcesJar()
}
jar {
+7 -7
View File
@@ -1,15 +1,15 @@
# Done to increase the memory available to Gradle.
org.gradle.jvmargs=-Xmx1G
# Fabric Properties
# check these on https://modmuss50.me/fabric.html
minecraft_version=1.21.11
yarn_mappings=1.21.11+build.4
loader_version=0.17.3
# check these on https://fabricmc.net/develop/
minecraft_version=26.1
loader_version=0.18.4
loom_version=1.15-SNAPSHOT
# Mod Properties
mod_version=2.4.0
maven_group=de.shiewk
archives_base_name=Widgets
# Dependencies
# check this on https://modmuss50.me/fabric.html
fabric_version=0.139.4+1.21.11
modmenu_version=17.0.0-beta.1
# check this on https://fabricmc.net/develop/
fabric_version=0.144.0+26.1
modmenu_version=18.0.0-alpha.8
@@ -1,13 +1,12 @@
package de.shiewk.widgets;
import de.shiewk.widgets.widgets.settings.WidgetSettingOption;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import java.util.List;
import java.util.Objects;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
public abstract class ModWidget {
@@ -31,10 +30,10 @@ public abstract class ModWidget {
public final WidgetSettings getSettings() {
return settings;
}
public abstract void render(DrawContext context, long measuringTimeNano, TextRenderer textRenderer, int posX, int posY);
public abstract void render(GuiGraphicsExtractor context, long measuringTimeNano, Font textRenderer, int posX, int posY);
public abstract void tick();
public abstract Text getName();
public abstract Text getDescription();
public abstract Component getName();
public abstract Component getDescription();
public abstract void onSettingsChanged(WidgetSettings settings);
public void onSettingsChanged() {
@@ -6,10 +6,9 @@ import com.google.gson.JsonSyntaxException;
import de.shiewk.widgets.client.WidgetManager;
import de.shiewk.widgets.widgets.settings.WidgetSettingOption;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.minecraft.util.Identifier;
import java.util.List;
import java.util.Objects;
import net.minecraft.resources.Identifier;
import static de.shiewk.widgets.WidgetsMod.LOGGER;
import static de.shiewk.widgets.client.WidgetManager.gson;
@@ -7,8 +7,6 @@ import com.google.gson.stream.JsonWriter;
import de.shiewk.widgets.ModWidget;
import de.shiewk.widgets.WidgetsMod;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.minecraft.client.MinecraftClient;
import net.minecraft.util.Identifier;
import org.jetbrains.annotations.Nullable;
import java.io.File;
@@ -17,6 +15,8 @@ import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import java.util.function.Function;
import net.minecraft.client.Minecraft;
import net.minecraft.resources.Identifier;
public class WidgetManager {
@@ -46,7 +46,7 @@ public class WidgetManager {
enabled.remove(widget);
}
static Function<Identifier, File> saveFileFactory = id -> new File(MinecraftClient.getInstance().runDirectory.getPath() + "/config/widgets/" + id.getNamespace() + "/" + id.getPath() + ".json");
static Function<Identifier, File> saveFileFactory = id -> new File(Minecraft.getInstance().gameDirectory.getPath() + "/config/widgets/" + id.getNamespace() + "/" + id.getPath() + ".json");
public static final Gson gson = new Gson();
public static void saveWidgets(List<ModWidget> widgets) {
@@ -8,19 +8,20 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.rendering.v1.hud.HudElementRegistry;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.RenderTickCounter;
import net.minecraft.util.Identifier;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.resources.Identifier;
import net.minecraft.util.Util;
import net.minecraft.util.profiler.Profiler;
import net.minecraft.util.profiler.Profilers;
import net.minecraft.util.profiling.Profiler;
import net.minecraft.util.profiling.ProfilerFiller;
import org.jspecify.annotations.NonNull;
public class WidgetRenderer implements ClientTickEvents.StartTick, ClientLifecycleEvents.ClientStarted {
public static final Identifier LAYER_ID = Identifier.of(WidgetsMod.MOD_ID, "widgets-hud-layer");
private static MinecraftClient client;
public static final Identifier LAYER_ID = Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "widgets-hud-layer");
private static Minecraft client;
public static int guiScale = 1;
public WidgetRenderer(){
@@ -30,15 +31,15 @@ public class WidgetRenderer implements ClientTickEvents.StartTick, ClientLifecyc
);
}
public void renderWidgets(DrawContext drawContext, RenderTickCounter tickCounter) {
if (client.options.hudHidden) return;
if (client.currentScreen instanceof WidgetVisibilityToggle vt && !vt.shouldRenderWidgets()) return;
final Profiler profiler = Profilers.get();
public void renderWidgets(GuiGraphicsExtractor drawContext, DeltaTracker tickCounter) {
if (client.options.hideGui) return;
if (client.screen instanceof WidgetVisibilityToggle vt && !vt.shouldRenderWidgets()) return;
final ProfilerFiller profiler = Profiler.get();
profiler.push("widgets");
final TextRenderer textRenderer = client.textRenderer;
final long timeNano = Util.getMeasuringTimeNano();
final int windowWidth = drawContext.getScaledWindowWidth();
final int windowHeight = drawContext.getScaledWindowHeight();
final Font textRenderer = client.font;
final long timeNano = Util.getNanos();
final int windowWidth = drawContext.guiWidth();
final int windowHeight = drawContext.guiHeight();
final ObjectArrayList<ModWidget> enabled = WidgetManager.enabled;
for (int i = 0, enabledSize = enabled.size(); i < enabledSize; i++) {
@@ -57,11 +58,11 @@ public class WidgetRenderer implements ClientTickEvents.StartTick, ClientLifecyc
}
@Override
public void onStartTick(MinecraftClient client) {
public void onStartTick(Minecraft client) {
WidgetRenderer.client = client;
final Profiler profiler = Profilers.get();
final ProfilerFiller profiler = Profiler.get();
profiler.push("widgets");
guiScale = client.getWindow().getScaleFactor();
guiScale = client.getWindow().getGuiScale();
final ObjectArrayList<ModWidget> enabled = WidgetManager.enabled;
for (int i = 0, enabledSize = enabled.size(); i < enabledSize; i++) {
@@ -73,13 +74,13 @@ public class WidgetRenderer implements ClientTickEvents.StartTick, ClientLifecyc
profiler.pop();
if (WidgetsModClient.configKeyBinding.wasPressed()){
client.setScreen(new WidgetConfigScreen(client.currentScreen));
if (WidgetsModClient.configKeyBinding.consumeClick()){
client.setScreen(new WidgetConfigScreen(client.screen));
}
}
@Override
public void onClientStarted(MinecraftClient client) {
public void onClientStarted(@NonNull Minecraft client) {
for (ModWidget widget : WidgetManager.getAllWidgets()) {
widget.onSettingsChanged();
}
@@ -1,25 +1,25 @@
package de.shiewk.widgets.client;
import com.mojang.blaze3d.platform.InputConstants;
import de.shiewk.widgets.WidgetsMod;
import de.shiewk.widgets.client.screen.WidgetConfigScreen;
import de.shiewk.widgets.widgets.*;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
import net.fabricmc.fabric.api.client.command.v2.ClientCommands;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientEntityEvents;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.fabricmc.fabric.api.client.keymapping.v1.KeyMappingHelper;
import net.fabricmc.fabric.api.event.player.AttackEntityCallback;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil;
import net.minecraft.util.Identifier;
import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft;
import net.minecraft.resources.Identifier;
import org.lwjgl.glfw.GLFW;
public class WidgetsModClient implements ClientModInitializer {
static KeyBinding configKeyBinding;
static KeyMapping configKeyBinding;
@Override
public void onInitializeClient() {
@@ -28,52 +28,52 @@ public class WidgetsModClient implements ClientModInitializer {
ClientLifecycleEvents.CLIENT_STARTED.register(widgetRenderer);
// manage widgets keybind
configKeyBinding = KeyBindingHelper.registerKeyBinding(new KeyBinding(
configKeyBinding = KeyMappingHelper.registerKeyMapping(new KeyMapping(
"widgets.key.config",
InputUtil.Type.KEYSYM,
InputConstants.Type.KEYSYM,
GLFW.GLFW_KEY_RIGHT_SHIFT,
KeyBinding.Category.create(Identifier.of(WidgetsMod.MOD_ID, "main"))
KeyMapping.Category.register(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "main"))
));
// in-game /widgetsmod command
ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) ->
dispatcher.register(ClientCommandManager.literal("widgetsmod").executes(ctx -> {
ClientCommandRegistrationCallback.EVENT.register((dispatcher, _) ->
dispatcher.register(ClientCommands.literal("widgetsmod").executes(ctx -> {
WidgetsMod.LOGGER.info("Ran in-game command");
final MinecraftClient client = ctx.getSource().getClient();
client.send(() -> client.setScreen(new WidgetConfigScreen(client.currentScreen)));
final Minecraft client = ctx.getSource().getClient();
client.schedule(() -> client.setScreen(new WidgetConfigScreen(client.screen)));
return 0;
})
)
);
ClientEntityEvents.ENTITY_LOAD.register((entity, clientWorld) -> {
if (entity == MinecraftClient.getInstance().player){
ClientEntityEvents.ENTITY_LOAD.register((entity, _) -> {
if (entity == Minecraft.getInstance().player){
// player switched world
TPSWidget.worldChanged();
}
});
WidgetManager.register(new FPSWidget(Identifier.of(WidgetsMod.MOD_ID, "fps")));
WidgetManager.register(new ClockWidget(Identifier.of(WidgetsMod.MOD_ID, "clock")));
WidgetManager.register(new CoordinatesWidget(Identifier.of(WidgetsMod.MOD_ID, "coordinates")));
WidgetManager.register(new BandwidthWidget(Identifier.of(WidgetsMod.MOD_ID, "bandwidth")));
WidgetManager.register(new PingWidget(Identifier.of(WidgetsMod.MOD_ID, "ping")));
WidgetManager.register(new ServerIPWidget(Identifier.of(WidgetsMod.MOD_ID, "server_ip")));
WidgetManager.register(new PlayerCountWidget(Identifier.of(WidgetsMod.MOD_ID, "player_count")));
WidgetManager.register(new CPSWidget(Identifier.of(WidgetsMod.MOD_ID, "cps")));
WidgetManager.register(new PlayTimeWidget(Identifier.of(WidgetsMod.MOD_ID, "playtime")));
WidgetManager.register(new MemoryUsageWidget(Identifier.of(WidgetsMod.MOD_ID, "memory")));
WidgetManager.register(new KeyStrokesWidget(Identifier.of(WidgetsMod.MOD_ID, "keystrokes")));
WidgetManager.register(new PlainTextWidget(Identifier.of(WidgetsMod.MOD_ID, "plaintext")));
WidgetManager.register(new BiomeWidget(Identifier.of(WidgetsMod.MOD_ID, "biome")));
WidgetManager.register(new SpeedWidget(Identifier.of(WidgetsMod.MOD_ID, "speed")));
WidgetManager.register(new ArmorHudWidget(Identifier.of(WidgetsMod.MOD_ID, "armor")));
WidgetManager.register(new InventoryWidget(Identifier.of(WidgetsMod.MOD_ID, "inventory")));
WidgetManager.register(new WorldTimeWidget(Identifier.of(WidgetsMod.MOD_ID, "worldtime")));
WidgetManager.register(new DirectionWidget(Identifier.of(WidgetsMod.MOD_ID, "direction")));
WidgetManager.register(new FPSWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "fps")));
WidgetManager.register(new ClockWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "clock")));
WidgetManager.register(new CoordinatesWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "coordinates")));
WidgetManager.register(new BandwidthWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "bandwidth")));
WidgetManager.register(new PingWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "ping")));
WidgetManager.register(new ServerIPWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "server_ip")));
WidgetManager.register(new PlayerCountWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "player_count")));
WidgetManager.register(new CPSWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "cps")));
WidgetManager.register(new PlayTimeWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "playtime")));
WidgetManager.register(new MemoryUsageWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "memory")));
WidgetManager.register(new KeyStrokesWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "keystrokes")));
WidgetManager.register(new PlainTextWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "plaintext")));
WidgetManager.register(new BiomeWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "biome")));
WidgetManager.register(new SpeedWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "speed")));
WidgetManager.register(new ArmorHudWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "armor")));
WidgetManager.register(new InventoryWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "inventory")));
WidgetManager.register(new WorldTimeWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "worldtime")));
WidgetManager.register(new DirectionWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "direction")));
WidgetManager.register(TPSWidget.INSTANCE);
ComboWidget comboWidget = new ComboWidget(Identifier.of(WidgetsMod.MOD_ID, "combo"));
ComboWidget comboWidget = new ComboWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "combo"));
WidgetManager.register(comboWidget);
AttackEntityCallback.EVENT.register(comboWidget);
}
@@ -1,41 +1,42 @@
package de.shiewk.widgets.client.screen;
import de.shiewk.widgets.utils.WidgetUtils;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.text.Text;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import net.minecraft.util.Util;
import org.joml.Matrix3x2fStack;
import org.jspecify.annotations.NonNull;
public abstract class AnimatedScreen extends Screen {
protected final Screen parent;
private final int animationDurationMs;
private final long creationTime = Util.getMeasuringTimeNano();
protected AnimatedScreen(Text title, Screen parent, int animationDurationMs) {
private final long creationTime = Util.getNanos();
protected AnimatedScreen(Component title, Screen parent, int animationDurationMs) {
super(title);
this.parent = parent;
this.animationDurationMs = animationDurationMs;
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
double timeMs = (Util.getMeasuringTimeNano() - creationTime) / 1000000d;
public void extractRenderState(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY, float delta) {
double timeMs = (Util.getNanos() - creationTime) / 1000000d;
final boolean shouldAnimate = timeMs < animationDurationMs;
if (shouldAnimate){
double translation = WidgetUtils.computeEasing(timeMs / animationDurationMs) * this.width;
Matrix3x2fStack stack = context.getMatrices().pushMatrix();
Matrix3x2fStack stack = context.pose().pushMatrix();
stack.translate((float) -translation, 0, stack);
parent.render(context, -67, -67, delta);
parent.extractRenderState(context, -67, -67, delta);
stack.translate(this.width, 0, stack);
mouseX -= (int) translation;
}
super.render(context, mouseX, mouseY, delta);
super.extractRenderState(context, mouseX, mouseY, delta);
this.renderScreenContents(context, mouseX, mouseY, delta);
if (shouldAnimate){
context.getMatrices().popMatrix();
context.pose().popMatrix();
}
}
public abstract void renderScreenContents(DrawContext context, int mouseX, int mouseY, float delta);
public abstract void renderScreenContents(GuiGraphicsExtractor context, int mouseX, int mouseY, float delta);
}
@@ -1,20 +1,21 @@
package de.shiewk.widgets.client.screen;
import com.mojang.blaze3d.platform.cursor.CursorTypes;
import de.shiewk.widgets.utils.WidgetUtils;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.cursor.StandardCursors;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.sound.SoundEvents;
import net.minecraft.text.Text;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.input.MouseButtonEvent;
import net.minecraft.network.chat.Component;
import net.minecraft.sounds.SoundEvents;
import org.jspecify.annotations.NonNull;
import java.util.List;
public class ContextMenuScreen extends Screen implements WidgetVisibilityToggle {
public record Option(Text title, boolean highlighted, Runnable action){
public record Option(Component title, boolean highlighted, Runnable action){
public Option(Text title, Runnable action){
public Option(Component title, Runnable action){
this(title, false, action);
}
@@ -28,7 +29,7 @@ public class ContextMenuScreen extends Screen implements WidgetVisibilityToggle
private int menuWidth;
private int menuHeight;
public ContextMenuScreen(Text title, Screen parent, int menuX, int menuY, List<Option> options) {
public ContextMenuScreen(Component title, Screen parent, int menuX, int menuY, List<Option> options) {
super(title);
this.parent = parent;
this.menuX = menuX;
@@ -56,7 +57,7 @@ public class ContextMenuScreen extends Screen implements WidgetVisibilityToggle
private int computeMenuWidth() {
int max = 0;
for (Option option : options) {
int width = textRenderer.getWidth(option.title);
int width = font.width(option.title);
if (width > max){
max = width;
}
@@ -70,21 +71,21 @@ public class ContextMenuScreen extends Screen implements WidgetVisibilityToggle
}
@Override
public void close() {
client.setScreen(parent);
public void onClose() {
minecraft.setScreen(parent);
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(MouseButtonEvent click, boolean doubled) {
if (!isInBounds(click.x(), click.y())){
close();
onClose();
return false;
}
int opt = (int) (click.y() - menuY - 1) / 15;
if (opt < options.size()){
Option option = options.get(opt);
close();
WidgetUtils.playSound(SoundEvents.BLOCK_COPPER_BULB_TURN_OFF);
onClose();
WidgetUtils.playSound(SoundEvents.COPPER_BULB_TURN_OFF);
option.action.run();
}
return false;
@@ -95,10 +96,10 @@ public class ContextMenuScreen extends Screen implements WidgetVisibilityToggle
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, float deltaTicks) {
super.render(context, mouseX, mouseY, deltaTicks);
parent.render(context, -67, -67, deltaTicks);
context.drawStrokedRectangle(
public void extractRenderState(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY, float deltaTicks) {
super.extractRenderState(context, mouseX, mouseY, deltaTicks);
parent.extractRenderState(context, -67, -67, deltaTicks);
context.outline(
menuX,
menuY,
menuWidth,
@@ -115,7 +116,7 @@ public class ContextMenuScreen extends Screen implements WidgetVisibilityToggle
renderMenu(context, mouseX, mouseY);
}
public void renderMenu(DrawContext context, int mouseX, int mouseY){
public void renderMenu(GuiGraphicsExtractor context, int mouseX, int mouseY){
int y = menuY + 1;
for (Option option : options) {
boolean hover = isInBounds(mouseX, mouseY) && mouseY >= y && mouseY < y + 15;
@@ -127,9 +128,9 @@ public class ContextMenuScreen extends Screen implements WidgetVisibilityToggle
y + 15,
0x30_ff_ff_ff
);
context.setCursor(StandardCursors.POINTING_HAND);
context.requestCursor(CursorTypes.POINTING_HAND);
}
context.drawText(textRenderer, option.title, menuX + 5, y + 3, option.highlighted ? 0xff_00_ff_ff : 0xff_ff_ff_ff, false);
context.text(font, option.title, menuX + 5, y + 3, option.highlighted ? 0xff_00_ff_ff : 0xff_ff_ff_ff, false);
y += 15;
}
}
@@ -1,21 +1,21 @@
package de.shiewk.widgets.client.screen;
import com.mojang.blaze3d.platform.cursor.CursorTypes;
import de.shiewk.widgets.Anchor;
import de.shiewk.widgets.ModWidget;
import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.client.WidgetManager;
import de.shiewk.widgets.utils.WidgetUtils;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.cursor.StandardCursors;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.tooltip.Tooltip;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.sound.SoundEvents;
import net.minecraft.text.Text;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.Tooltip;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.input.MouseButtonEvent;
import net.minecraft.network.chat.Component;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.util.Mth;
import net.minecraft.util.Util;
import net.minecraft.util.math.MathHelper;
import org.joml.Vector2i;
import java.awt.*;
@@ -29,15 +29,14 @@ public class EditWidgetPositionsScreen extends AnimatedScreen implements WidgetV
private final Consumer<ModWidget> onEdit;
public EditWidgetPositionsScreen(Screen parent, Consumer<ModWidget> onEdit) {
super(Text.translatable("widgets.ui.editPositions"), parent, 500);
super(Component.translatable("widgets.ui.editPositions"), parent, 500);
this.parent = parent;
this.onEdit = onEdit;
}
@Override
public void close() {
assert client != null;
client.setScreen(parent);
public void onClose() {
minecraft.setScreen(parent);
}
@Override
@@ -58,21 +57,21 @@ public class EditWidgetPositionsScreen extends AnimatedScreen implements WidgetV
private int scaledWindowHeight = 1080;
@Override
public void renderScreenContents(DrawContext context, int mouseX, int mouseY, float delta) {
this.scaledWindowWidth = context.getScaledWindowWidth();
this.scaledWindowHeight = context.getScaledWindowHeight();
long mt = Util.getMeasuringTimeNano();
public void renderScreenContents(GuiGraphicsExtractor context, int mouseX, int mouseY, float delta) {
this.scaledWindowWidth = context.guiWidth();
this.scaledWindowHeight = context.guiHeight();
long mt = Util.getNanos();
renderAnchorArea(context, mouseX, mouseY);
for (ModWidget widget : WidgetManager.getEnabledWidgets()) {
final int ww = (int) (widget.width() * widget.getScaleFactor());
int wx = MathHelper.clamp(widget.getX(scaledWindowWidth), 0, this.width - ww);
int wx = Mth.clamp(widget.getX(scaledWindowWidth), 0, this.width - ww);
final int wh = (int) (widget.height() * widget.getScaleFactor());
int wy = MathHelper.clamp(widget.getY(scaledWindowHeight), 0, this.height - wh);
int wy = Mth.clamp(widget.getY(scaledWindowHeight), 0, this.height - wh);
if (selectedWidget == widget){
AlignResult alignedX = alignX(widget);
if (alignedX != null){
context.drawVerticalLine(
context.verticalLine(
(int) Math.round(alignedX.result),
0,
scaledWindowHeight,
@@ -81,7 +80,7 @@ public class EditWidgetPositionsScreen extends AnimatedScreen implements WidgetV
}
AlignResult alignedY = alignY(widget);
if (alignedY != null){
context.drawHorizontalLine(
context.horizontalLine(
0,
scaledWindowWidth,
(int) Math.round(alignedY.result),
@@ -99,14 +98,14 @@ public class EditWidgetPositionsScreen extends AnimatedScreen implements WidgetV
}
}
if (selectedWidget == null ? hoveredWidget == widget : selectedWidget == widget){
context.drawStrokedRectangle(wx-1,wy-1, ww+2, wh+2, SELECT_COLOR);
context.drawStrokedRectangle(wx, wy, ww, wh, SELECT_COLOR);
context.outline(wx-1,wy-1, ww+2, wh+2, SELECT_COLOR);
context.outline(wx, wy, ww, wh, SELECT_COLOR);
}
widget.render(context, mt, textRenderer, wx, wy);
widget.render(context, mt, font, wx, wy);
}
if (hoveredWidget != null){
context.setCursor(StandardCursors.RESIZE_ALL);
context.requestCursor(CursorTypes.RESIZE_ALL);
}
}
@@ -206,7 +205,7 @@ public class EditWidgetPositionsScreen extends AnimatedScreen implements WidgetV
return null;
}
private void renderAnchorArea(DrawContext context, int mouseX, int mouseY) {
private void renderAnchorArea(GuiGraphicsExtractor context, int mouseX, int mouseY) {
Anchor anchor = Anchor.getAnchor(
scaledWindowWidth,
scaledWindowHeight,
@@ -226,7 +225,7 @@ public class EditWidgetPositionsScreen extends AnimatedScreen implements WidgetV
}
@Override
public boolean mouseReleased(Click click) {
public boolean mouseReleased(MouseButtonEvent click) {
if (click.button() == 0 && selectedWidget != null){
if (align){
AlignResult alignedX = alignX(selectedWidget);
@@ -253,7 +252,7 @@ public class EditWidgetPositionsScreen extends AnimatedScreen implements WidgetV
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(MouseButtonEvent click, boolean doubled) {
if (click.button() == 0 && hoveredWidget != null){
selectedWidget = hoveredWidget;
focusedExtraX = (int) (click.x() - hoveredWidget.getX(scaledWindowWidth));
@@ -262,30 +261,29 @@ public class EditWidgetPositionsScreen extends AnimatedScreen implements WidgetV
int x = (int) click.x();
int y = (int) click.y();
ModWidget hovered = hoveredWidget;
WidgetUtils.playSound(SoundEvents.BLOCK_COPPER_BULB_TURN_ON);
assert client != null;
WidgetUtils.playSound(SoundEvents.COPPER_BULB_TURN_ON);
if (hovered != null){
client.setScreen(new ContextMenuScreen(
Text.empty(),
minecraft.setScreen(new ContextMenuScreen(
Component.empty(),
this,
x,
y,
List.of(
new ContextMenuScreen.Option(
Text.translatable("widgets.ui.editPositions.menu.widgetSettings"),
() -> client.setScreen(new WidgetSettingsScreen(
Component.translatable("widgets.ui.editPositions.menu.widgetSettings"),
() -> minecraft.setScreen(new WidgetSettingsScreen(
this,
hovered,
this.onEdit
))
),
new ContextMenuScreen.Option(
Text.translatable("widgets.ui.editPositions.menu.setAnchor"),
Component.translatable("widgets.ui.editPositions.menu.setAnchor"),
() -> {
List<ContextMenuScreen.Option> options = new ObjectArrayList<>(Anchor.values().length);
for (Anchor anchor : Anchor.values()) {
options.add(new ContextMenuScreen.Option(
Text.translatable("widgets.ui.anchor." + anchor.name().toLowerCase(Locale.ROOT)),
Component.translatable("widgets.ui.anchor." + anchor.name().toLowerCase(Locale.ROOT)),
hovered.getSettings().anchor == anchor,
() -> {
hovered.setPos(
@@ -298,8 +296,8 @@ public class EditWidgetPositionsScreen extends AnimatedScreen implements WidgetV
));
}
// Add widget context menu
client.setScreen(new ContextMenuScreen(
Text.empty(),
minecraft.setScreen(new ContextMenuScreen(
Component.empty(),
this,
x,
y,
@@ -308,7 +306,7 @@ public class EditWidgetPositionsScreen extends AnimatedScreen implements WidgetV
}
),
new ContextMenuScreen.Option(
Text.translatable("widgets.ui.editPositions.menu.removeWidget"),
Component.translatable("widgets.ui.editPositions.menu.removeWidget"),
() -> {
hovered.getSettings().toggleEnabled(hovered);
onEdit.accept(hovered);
@@ -317,14 +315,14 @@ public class EditWidgetPositionsScreen extends AnimatedScreen implements WidgetV
)
));
} else {
client.setScreen(new ContextMenuScreen(
Text.empty(),
minecraft.setScreen(new ContextMenuScreen(
Component.empty(),
this,
x,
y,
List.of(
new ContextMenuScreen.Option(
Text.translatable("widgets.ui.editPositions.menu.addWidget"),
Component.translatable("widgets.ui.editPositions.menu.addWidget"),
() -> {
List<ContextMenuScreen.Option> options = new ObjectArrayList<>();
for (ModWidget widget : WidgetManager.getAllWidgets()) {
@@ -340,8 +338,8 @@ public class EditWidgetPositionsScreen extends AnimatedScreen implements WidgetV
}
}
// Add widget context menu
client.setScreen(new ContextMenuScreen(
Text.empty(),
minecraft.setScreen(new ContextMenuScreen(
Component.empty(),
this,
x,
y,
@@ -357,16 +355,15 @@ public class EditWidgetPositionsScreen extends AnimatedScreen implements WidgetV
}
@Override
public boolean mouseDragged(Click click, double deltaX, double deltaY) {
public boolean mouseDragged(MouseButtonEvent click, double deltaX, double deltaY) {
if (click.button() == 0){
assert client != null;
final ModWidget widget = selectedWidget;
if (widget != null){
final WidgetSettings settings = widget.getSettings();
final int ww = (int) (widget.width() * widget.getScaleFactor());
int wx = MathHelper.clamp(widget.getX(scaledWindowWidth), 0, this.width - ww);
int wx = Mth.clamp(widget.getX(scaledWindowWidth), 0, this.width - ww);
final int wh = (int) (widget.height() * widget.getScaleFactor());
int wy = MathHelper.clamp(widget.getY(scaledWindowHeight), 0, this.height - wh);
int wy = Mth.clamp(widget.getY(scaledWindowHeight), 0, this.height - wh);
if (click.x() <= wx + ww + deltaX && click.x() >= wx + deltaX){
if (click.y() <= wy + wh + deltaY && click.y() >= wy + deltaY){
Anchor anchor = Anchor.getAnchor(scaledWindowWidth, scaledWindowHeight, (int) click.x(), (int) click.y());
@@ -407,28 +404,28 @@ public class EditWidgetPositionsScreen extends AnimatedScreen implements WidgetV
@Override
protected void init() {
super.init();
this.addDrawableChild(
new ButtonWidget.Builder(
Text.translatable(
this.addRenderableWidget(
new Button.Builder(
Component.translatable(
"widgets.ui.editPositions.snap",
align ?
Text.translatable("gui.yes") :
Text.translatable("gui.no")
Component.translatable("gui.yes") :
Component.translatable("gui.no")
), button -> {
align = !align;
button.setMessage(
Text.translatable(
Component.translatable(
"widgets.ui.editPositions.snap",
align ?
Text.translatable("gui.yes")
: Text.translatable("gui.no")
Component.translatable("gui.yes")
: Component.translatable("gui.no")
)
);
}).position(
}).pos(
this.width / 2 - 75,
this.height / 2 - 10
).tooltip(
Tooltip.of(Text.translatable("widgets.ui.editPositions.snap.help"))
Tooltip.create(Component.translatable("widgets.ui.editPositions.snap.help"))
).build()
);
}
@@ -5,15 +5,16 @@ import de.shiewk.widgets.client.WidgetManager;
import de.shiewk.widgets.client.screen.components.ScaledTextWidget;
import de.shiewk.widgets.client.screen.components.WidgetListWidget;
import de.shiewk.widgets.utils.WidgetUtils;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.GridWidget;
import net.minecraft.client.gui.widget.SimplePositioningWidget;
import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.text.Text;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.gui.layouts.FrameLayout;
import net.minecraft.client.gui.layouts.GridLayout;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import net.minecraft.util.Util;
import org.joml.Matrix3x2fStack;
import org.jspecify.annotations.NonNull;
import java.util.ArrayList;
import java.util.function.Consumer;
@@ -21,27 +22,26 @@ import java.util.function.Consumer;
public class WidgetConfigScreen extends Screen {
private final Screen parent;
private final long creationTime = Util.getMeasuringTimeNano();
private final long creationTime = Util.getNanos();
private final ArrayList<ModWidget> widgetsEdited = new ArrayList<>();
private final Consumer<ModWidget> onWidgetEdit = this::changedSettings;
private double getScreenTimeMs(){
return (Util.getMeasuringTimeNano() - creationTime) / 1000000d;
return (Util.getNanos() - creationTime) / 1000000d;
}
public WidgetConfigScreen(Screen parent) {
super(Text.translatable("widgets.ui.config"));
super(Component.translatable("widgets.ui.config"));
this.parent = parent;
}
@Override
public void close() {
public void onClose() {
WidgetManager.saveWidgets(widgetsEdited);
for (ModWidget widget : widgetsEdited) {
widget.onSettingsChanged();
}
assert client != null;
client.setScreen(parent);
minecraft.setScreen(parent);
}
int widgetListWidth;
@@ -54,55 +54,53 @@ public class WidgetConfigScreen extends Screen {
widgetListWidth = widgetColumns * WidgetListWidget.COLUMN_SIZE;
// Right side
final WidgetListWidget widgetList = new WidgetListWidget(width - widgetListWidth - 4, 0, widgetListWidth, height - 24, client, textRenderer, onWidgetEdit);
final WidgetListWidget widgetList = new WidgetListWidget(width - widgetListWidth - 4, 0, widgetListWidth, height - 24, minecraft, font, onWidgetEdit);
final TextFieldWidget searchField = new TextFieldWidget(textRenderer, widgetListWidth, 20, Text.empty());
searchField.setPlaceholder(Text.translatable("widgets.ui.search"));
searchField.setChangedListener(widgetList::search);
final EditBox searchField = new EditBox(font, widgetListWidth, 20, Component.empty());
searchField.setHint(Component.translatable("widgets.ui.search"));
searchField.setResponder(widgetList::search);
searchField.setX(width - widgetListWidth - 4);
searchField.setY(height - 24);
this.addDrawableChild(widgetList);
this.addDrawableChild(searchField);
this.addRenderableWidget(widgetList);
this.addRenderableWidget(searchField);
setInitialFocus(searchField);
// Left side
GridWidget gw = new GridWidget(0, 0);
gw.getMainPositioner().margin(4, 4, 4, 4);
GridWidget.Adder adder = gw.createAdder(1);
GridLayout gw = new GridLayout(0, 0);
gw.defaultCellSetting().padding(4, 4, 4, 4);
GridLayout.RowHelper adder = gw.createRowHelper(1);
{
ScaledTextWidget title = new ScaledTextWidget(0, 0, Text.literal("ᴡɪᴅɢᴇᴛѕ"), textRenderer, width < 600 ? 4 : 6);
adder.add(title);
ScaledTextWidget title = new ScaledTextWidget(0, 0, Component.literal("ᴡɪᴅɢᴇᴛѕ"), font, width < 600 ? 4 : 6);
adder.addChild(title);
ButtonWidget editPosButton = ButtonWidget.builder(Text.translatable("widgets.ui.editPositions"), this::switchToEditPositions).build();
adder.add(editPosButton);
Button editPosButton = Button.builder(Component.translatable("widgets.ui.editPositions"), this::switchToEditPositions).build();
adder.addChild(editPosButton);
}
gw.refreshPositions();
SimplePositioningWidget.setPos(gw, 0, 0, width - widgetListWidth, height, .5f, .5f);
gw.forEachChild(c -> c.setX((width - widgetListWidth) / 2 - (c.getWidth() / 2)));
gw.forEachChild(this::addDrawableChild);
gw.arrangeElements();
FrameLayout.alignInRectangle(gw, 0, 0, width - widgetListWidth, height, .5f, .5f);
gw.visitWidgets(c -> c.setX((width - widgetListWidth) / 2 - (c.getWidth() / 2)));
gw.visitWidgets(this::addRenderableWidget);
}
private void switchToEditPositions(ButtonWidget widget) {
private void switchToEditPositions(Button widget) {
widget.active = false;
assert client != null;
client.setScreen(new EditWidgetPositionsScreen(this, this.onWidgetEdit));
minecraft.setScreen(new EditWidgetPositionsScreen(this, this.onWidgetEdit));
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
assert client != null;
public void extractRenderState(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY, float delta) {
final double time = getScreenTimeMs();
if (time < 400){
Matrix3x2fStack stack = context.getMatrices().pushMatrix();
Matrix3x2fStack stack = context.pose().pushMatrix();
final float v = (float) WidgetUtils.computeEasing(time / 400d);
stack.translate((float) (width / 2d - (width * v / 2d)), (float) (height / 2d - (height * v / 2d)), stack);
stack.scale(v, v, stack);
}
super.render(context, mouseX, mouseY, delta);
super.extractRenderState(context, mouseX, mouseY, delta);
if (time < 400){
context.getMatrices().popMatrix();
context.pose().popMatrix();
}
}
@@ -2,22 +2,23 @@ package de.shiewk.widgets.client.screen;
import de.shiewk.widgets.ModWidget;
import de.shiewk.widgets.client.screen.components.WidgetSettingsEditWidget;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.text.Text;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.input.MouseButtonEvent;
import net.minecraft.network.chat.Component;
import net.minecraft.util.Util;
import org.jspecify.annotations.NonNull;
import java.util.function.Consumer;
public class WidgetSettingsScreen extends AnimatedScreen implements WidgetVisibilityToggle {
private static final Text previewText = Text.translatable("widgets.ui.preview");
private static final Component previewText = Component.translatable("widgets.ui.preview");
private final ModWidget widget;
private final Runnable onChange;
public WidgetSettingsScreen(Screen parent, ModWidget widget, Consumer<ModWidget> changedWidgetConsumer) {
super(Text.translatable("widgets.ui.widgetSettings", widget.getName()), parent, 500);
super(Component.translatable("widgets.ui.widgetSettings", widget.getName()), parent, 500);
this.widget = widget;
onChange = () -> {
widget.onSettingsChanged();
@@ -28,19 +29,19 @@ public class WidgetSettingsScreen extends AnimatedScreen implements WidgetVisibi
@Override
protected void init() {
super.init();
addDrawableChild(new WidgetSettingsEditWidget(0, 0, this.width / 2 - 8, this.height, textRenderer, widget, this.onChange));
addRenderableWidget(new WidgetSettingsEditWidget(0, 0, this.width / 2 - 8, this.height, font, widget, this.onChange));
}
@Override
public void renderScreenContents(DrawContext context, int mouseX, int mouseY, float delta) {
context.drawText(textRenderer, previewText, this.width * 3 / 4 - textRenderer.getWidth(previewText) / 2, this.height / 50, 0xffffffff, false);
widget.render(context, Util.getMeasuringTimeNano(), textRenderer, (int) ((float) (this.width * 3) / 4 - (widget.width() * widget.getScaleFactor()) / 2), (int) ((float) this.height / 2 - (widget.height() * widget.getScaleFactor()) / 2));
public void renderScreenContents(GuiGraphicsExtractor context, int mouseX, int mouseY, float delta) {
context.text(font, previewText, this.width * 3 / 4 - font.width(previewText) / 2, this.height / 50, 0xffffffff, false);
widget.render(context, Util.getNanos(), font, (int) ((float) (this.width * 3) / 4 - (widget.width() * widget.getScaleFactor()) / 2), (int) ((float) this.height / 2 - (widget.height() * widget.getScaleFactor()) / 2));
}
@Override
public boolean mouseReleased(Click click) {
for (Element child : children()) {
if (child instanceof ClickableWidget s){
public boolean mouseReleased(@NonNull MouseButtonEvent click) {
for (GuiEventListener child : children()) {
if (child instanceof AbstractWidget s){
s.mouseReleased(click);
}
}
@@ -48,9 +49,8 @@ public class WidgetSettingsScreen extends AnimatedScreen implements WidgetVisibi
}
@Override
public void close() {
assert client != null;
client.setScreen(parent);
public void onClose() {
minecraft.setScreen(parent);
}
@Override
@@ -1,42 +1,43 @@
package de.shiewk.widgets.client.screen.components;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.text.Text;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.narration.NarrationElementOutput;
import net.minecraft.client.input.MouseButtonEvent;
import net.minecraft.network.chat.Component;
import org.joml.Matrix3x2fStack;
import org.jspecify.annotations.NonNull;
public class ScaledTextWidget extends ClickableWidget {
public class ScaledTextWidget extends AbstractWidget {
private final TextRenderer textRenderer;
private final Font textRenderer;
private final float scale;
public ScaledTextWidget(int x, int y, Text message, TextRenderer textRenderer, float scale) {
super(x, y, 0, (int) (textRenderer.fontHeight * scale), message);
public ScaledTextWidget(int x, int y, Component message, Font textRenderer, float scale) {
super(x, y, 0, (int) (textRenderer.lineHeight * scale), message);
this.textRenderer = textRenderer;
this.scale = scale;
}
@Override
public int getWidth() {
return (int) (textRenderer.getWidth(getMessage()) * scale);
return (int) (textRenderer.width(getMessage()) * scale);
}
@Override
protected void renderWidget(DrawContext context, int mouseX, int mouseY, float deltaTicks) {
Matrix3x2fStack stack = context.getMatrices().pushMatrix();
protected void extractWidgetRenderState(GuiGraphicsExtractor context, int mouseX, int mouseY, float deltaTicks) {
Matrix3x2fStack stack = context.pose().pushMatrix();
stack.scale(scale);
context.drawText(textRenderer, getMessage(), (int) (getX() / scale), (int) (getY() / scale), 0xffffffff, true);
context.text(textRenderer, getMessage(), (int) (getX() / scale), (int) (getY() / scale), 0xffffffff, true);
stack.popMatrix();
}
@Override
protected void appendClickableNarrations(NarrationMessageBuilder builder) {}
protected void updateWidgetNarration(@NonNull NarrationElementOutput builder) {}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(@NonNull MouseButtonEvent click, boolean doubled) {
return false;
}
}
@@ -1,21 +1,22 @@
package de.shiewk.widgets.client.screen.components;
import de.shiewk.widgets.ModWidget;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
import net.minecraft.client.gui.screen.narration.NarrationPart;
import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.narration.NarratedElementType;
import net.minecraft.client.gui.narration.NarrationElementOutput;
import net.minecraft.util.Util;
import org.jspecify.annotations.NonNull;
public class WidgetDisplayWidget extends ClickableWidget {
public class WidgetDisplayWidget extends AbstractWidget {
protected final ModWidget widget;
protected final TextRenderer textRenderer;
protected final Font textRenderer;
protected final int centerX;
protected final int centerY;
public WidgetDisplayWidget(ModWidget widget, TextRenderer textRenderer, int centerX, int centerY) {
public WidgetDisplayWidget(ModWidget widget, Font textRenderer, int centerX, int centerY) {
super(0, 0, (int) widget.scaledWidth(), (int) widget.scaledHeight(), widget.getName());
this.widget = widget;
this.textRenderer = textRenderer;
@@ -44,12 +45,12 @@ public class WidgetDisplayWidget extends ClickableWidget {
}
@Override
protected void renderWidget(DrawContext context, int mouseX, int mouseY, float deltaTicks) {
widget.render(context, Util.getMeasuringTimeNano(), textRenderer, getX(), getY());
protected void extractWidgetRenderState(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY, float deltaTicks) {
widget.render(context, Util.getNanos(), textRenderer, getX(), getY());
}
@Override
protected void appendClickableNarrations(NarrationMessageBuilder builder) {
builder.put(NarrationPart.HINT, widget.getName());
protected void updateWidgetNarration(NarrationElementOutput builder) {
builder.add(NarratedElementType.HINT, widget.getName());
}
}
@@ -2,20 +2,21 @@ package de.shiewk.widgets.client.screen.components;
import de.shiewk.widgets.ModWidget;
import de.shiewk.widgets.client.WidgetManager;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
import net.minecraft.client.gui.screen.narration.NarrationPart;
import net.minecraft.client.gui.widget.GridWidget;
import net.minecraft.client.gui.widget.ScrollableWidget;
import net.minecraft.client.gui.widget.SimplePositioningWidget;
import net.minecraft.client.sound.PositionedSoundInstance;
import net.minecraft.sound.SoundEvents;
import net.minecraft.text.Text;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.gui.components.AbstractScrollArea;
import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.layouts.FrameLayout;
import net.minecraft.client.gui.layouts.GridLayout;
import net.minecraft.client.gui.narration.NarratedElementType;
import net.minecraft.client.gui.narration.NarrationElementOutput;
import net.minecraft.client.input.MouseButtonEvent;
import net.minecraft.client.resources.sounds.SimpleSoundInstance;
import net.minecraft.network.chat.Component;
import net.minecraft.sounds.SoundEvents;
import org.joml.Matrix3x2fStack;
import org.jspecify.annotations.NonNull;
import java.util.ArrayList;
import java.util.Comparator;
@@ -23,13 +24,13 @@ import java.util.List;
import java.util.Locale;
import java.util.function.Consumer;
public class WidgetListWidget extends ScrollableWidget {
public class WidgetListWidget extends AbstractScrollArea {
public static final int COLUMN_SIZE = 208;
private final MinecraftClient client;
private final Minecraft client;
private List<ModWidget> widgets;
private final List<WidgetWidget> elements = new ArrayList<>();
private final TextRenderer textRenderer;
private final Font textRenderer;
private final Consumer<ModWidget> onEdit;
public static boolean searchQueryMatches(String search, ModWidget widget) {
@@ -37,8 +38,8 @@ public class WidgetListWidget extends ScrollableWidget {
return widget.getName().getString().contains(search) || widget.getDescription().getString().contains(search) || widget.getId().toString().contains(search);
}
public WidgetListWidget(int x, int y, int width, int height, MinecraftClient client, TextRenderer textRenderer, Consumer<ModWidget> onEdit) {
super(x, y, width, height, Text.empty());
public WidgetListWidget(int x, int y, int width, int height, Minecraft client, Font textRenderer, Consumer<ModWidget> onEdit) {
super(x, y, width, height, Component.empty(), AbstractScrollArea.defaultSettings(35));
this.client = client;
this.widgets = loadWidgets(null);
this.textRenderer = textRenderer;
@@ -55,16 +56,16 @@ public class WidgetListWidget extends ScrollableWidget {
}
private void init(){
GridWidget gw = new GridWidget();
gw.getMainPositioner().margin(4, 4, 4, 4);
final GridWidget.Adder adder = gw.createAdder(getColumns());
GridLayout gw = new GridLayout();
gw.defaultCellSetting().padding(4, 4, 4, 4);
final GridLayout.RowHelper adder = gw.createRowHelper(getColumns());
for (ModWidget widget : widgets) {
adder.add(new WidgetWidget(0, 0, 200, 100, client, widget, textRenderer, onEdit));
adder.addChild(new WidgetWidget(0, 0, 200, 100, client, widget, textRenderer, onEdit));
}
SimplePositioningWidget.setPos(gw, getX(), getY(), this.getWidth(), this.getContentsHeightWithPadding(), 0, 0);
gw.refreshPositions();
FrameLayout.alignInRectangle(gw, getX(), getY(), this.getWidth(), this.contentHeight(), 0, 0);
gw.arrangeElements();
this.elements.clear();
gw.forEachChild(w -> this.addWidget((WidgetWidget) w));
gw.visitWidgets(w -> this.addWidget((WidgetWidget) w));
}
protected void addWidget(WidgetWidget drawableElement) {
@@ -72,7 +73,7 @@ public class WidgetListWidget extends ScrollableWidget {
}
@Override
protected int getContentsHeightWithPadding() {
protected int contentHeight() {
final int columns = getColumns();
final int rows = (int) Math.ceil((double) widgets.size() / columns);
return 10 + (rows * 108);
@@ -87,47 +88,42 @@ public class WidgetListWidget extends ScrollableWidget {
}
@Override
protected double getDeltaYPerScroll() {
return 35;
}
@Override
protected void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) {
protected void extractWidgetRenderState(GuiGraphicsExtractor context, int mouseX, int mouseY, float delta) {
context.enableScissor(getX(), getY(), getX()+width, getY()+height);
Matrix3x2fStack stack = context.getMatrices().pushMatrix();
stack.translate(0, (float) -getScrollY(), stack);
Matrix3x2fStack stack = context.pose().pushMatrix();
stack.translate(0, (float) -scrollAmount(), stack);
for (WidgetWidget element : elements) {
element.render(context, mouseX, (int) (mouseY + getScrollY()), delta);
element.extractRenderState(context, mouseX, (int) (mouseY + scrollAmount()), delta);
}
stack.popMatrix();
context.disableScissor();
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(MouseButtonEvent click, boolean doubled) {
double mouseY = click.y();
double mouseX = click.x();
mouseY += getScrollY();
Click newClick = new Click(mouseX, mouseY, click.buttonInfo());
for (Element element : elements) {
mouseY += scrollAmount();
MouseButtonEvent newClick = new MouseButtonEvent(mouseX, mouseY, click.buttonInfo());
for (GuiEventListener element : elements) {
if (element.mouseClicked(newClick, doubled)){
client.getSoundManager().play(PositionedSoundInstance.ui(SoundEvents.UI_BUTTON_CLICK, 1.0F));
client.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F));
return true;
}
}
return super.checkScrollbarDragged(newClick);
return super.updateScrolling(newClick);
}
@Override
protected void appendClickableNarrations(NarrationMessageBuilder builder) {
protected void updateWidgetNarration(@NonNull NarrationElementOutput builder) {
for (ModWidget widget : widgets) {
builder.put(NarrationPart.HINT, widget.getName());
builder.add(NarratedElementType.HINT, widget.getName());
}
}
public void search(String query) {
widgets = this.loadWidgets(query);
setScrollY(0);
setScrollAmount(0);
init();
}
}
@@ -2,28 +2,29 @@ package de.shiewk.widgets.client.screen.components;
import de.shiewk.widgets.ModWidget;
import de.shiewk.widgets.widgets.settings.WidgetSettingOption;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
import net.minecraft.client.gui.widget.ScrollableWidget;
import net.minecraft.client.input.CharInput;
import net.minecraft.client.input.KeyInput;
import net.minecraft.text.Text;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.gui.components.AbstractScrollArea;
import net.minecraft.client.gui.narration.NarrationElementOutput;
import net.minecraft.client.input.CharacterEvent;
import net.minecraft.client.input.KeyEvent;
import net.minecraft.client.input.MouseButtonEvent;
import net.minecraft.network.chat.Component;
import org.joml.Matrix3x2fStack;
import org.jspecify.annotations.NonNull;
import java.awt.*;
public class WidgetSettingsEditWidget extends ScrollableWidget {
public class WidgetSettingsEditWidget extends AbstractScrollArea {
private static final int COLOR_FG = Color.WHITE.getRGB(), COLOR_BG = new Color(0, 0, 0, 60).getRGB();
private final TextRenderer textRenderer;
private final Font textRenderer;
private final ModWidget widget;
private final Runnable onChange;
private WidgetSettingOption<?> focus = null;
private int contentsHeight = 10;
public WidgetSettingsEditWidget(int x, int y, int width, int height, TextRenderer textRenderer, ModWidget widget, Runnable onChange) {
super(x, y, width, height, Text.empty());
public WidgetSettingsEditWidget(int x, int y, int width, int height, Font textRenderer, ModWidget widget, Runnable onChange) {
super(x, y, width, height, Component.empty(), AbstractScrollArea.defaultSettings(20));
this.widget = widget;
this.textRenderer = textRenderer;
this.onChange = onChange;
@@ -43,39 +44,34 @@ public class WidgetSettingsEditWidget extends ScrollableWidget {
}
@Override
protected int getContentsHeightWithPadding() {
protected int contentHeight() {
return this.contentsHeight;
}
@Override
protected double getDeltaYPerScroll() {
return 20;
}
@Override
protected void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) {
protected void extractWidgetRenderState(GuiGraphicsExtractor context, int mouseX, int mouseY, float delta) {
context.fill(getX(), getY(), getX()+width, getY()+height, COLOR_BG);
Matrix3x2fStack matrices = context.getMatrices().pushMatrix();
matrices.translate(0, (float) -getScrollY(), matrices);
Matrix3x2fStack matrices = context.pose().pushMatrix();
matrices.translate(0, (float) -scrollAmount(), matrices);
matrices.pushMatrix();
matrices.scale(2, 2, matrices);
matrices.translate(0, (float) -getScrollY(), matrices);
context.drawText(textRenderer, widget.getName(), this.width / 4 - textRenderer.getWidth(widget.getName()) / 2, this.height / 100, COLOR_FG, true);
matrices.translate(0, (float) -scrollAmount(), matrices);
context.text(textRenderer, widget.getName(), this.width / 4 - textRenderer.width(widget.getName()) / 2, this.height / 100, COLOR_FG, true);
matrices.popMatrix();
int y = textRenderer.fontHeight * 2 + this.height / 50 + 5;
int y = textRenderer.lineHeight * 2 + this.height / 50 + 5;
for (WidgetSettingOption<?> setting : widget.getSettings().getCustomSettings()) {
if (!setting.shouldShow()) continue;
if (this.width - setting.getWidth() > textRenderer.getWidth(setting.getName()) + 20){
if (this.width - setting.getWidth() > textRenderer.width(setting.getName()) + 20){
setting.setX(this.getX() + this.width - setting.getWidth() - 5);
setting.setY(y);
context.drawText(textRenderer, setting.getName(), getX() + 10, y + (setting.getHeight() / 2), COLOR_FG, true);
context.text(textRenderer, setting.getName(), getX() + 10, y + (setting.getHeight() / 2), COLOR_FG, true);
} else {
setting.setX(this.getX() + this.width / 2 - setting.getWidth() / 2);
setting.setY(y + 9 + 5);
context.drawText(textRenderer, setting.getName(), getX() + getWidth() / 2 - textRenderer.getWidth(setting.getName()) / 2, y, COLOR_FG, true);
context.text(textRenderer, setting.getName(), getX() + getWidth() / 2 - textRenderer.width(setting.getName()) / 2, y, COLOR_FG, true);
y += 9 + 5;
}
setting.render(context, mouseX, (int) (mouseY + getScrollY()), delta);
setting.extractRenderState(context, mouseX, (int) (mouseY + scrollAmount()), delta);
y += setting.getHeight();
y += 5;
}
@@ -84,16 +80,16 @@ public class WidgetSettingsEditWidget extends ScrollableWidget {
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(MouseButtonEvent click, boolean doubled) {
double mouseY = click.y();
double mouseX = click.x();
mouseY += getScrollY();
mouseY += scrollAmount();
for (WidgetSettingOption<?> customSetting : widget.getSettings().getCustomSettings()) {
if (!customSetting.shouldShow()) continue;
if (customSetting.isHovered(mouseX, mouseY)){
focus = customSetting;
customSetting.setFocused(true);
if (customSetting.mouseClicked(new Click(mouseX, mouseY + getScrollY(), click.buttonInfo()), doubled)){
if (customSetting.mouseClicked(new MouseButtonEvent(mouseX, mouseY + scrollAmount(), click.buttonInfo()), doubled)){
onChange.run();
return true;
}
@@ -101,14 +97,14 @@ public class WidgetSettingsEditWidget extends ScrollableWidget {
customSetting.setFocused(false);
}
}
return checkScrollbarDragged(click);
return updateScrolling(click);
}
@Override
public boolean mouseReleased(Click click) {
public boolean mouseReleased(@NonNull MouseButtonEvent click) {
for (WidgetSettingOption<?> customSetting : widget.getSettings().getCustomSettings()) {
if (!customSetting.shouldShow()) continue;
if (customSetting.mouseReleased(new Click(click.x(), click.y() + getScrollY(), click.buttonInfo()))){
if (customSetting.mouseReleased(new MouseButtonEvent(click.x(), click.y() + scrollAmount(), click.buttonInfo()))){
onChange.run();
return true;
}
@@ -117,7 +113,7 @@ public class WidgetSettingsEditWidget extends ScrollableWidget {
}
@Override
public boolean charTyped(CharInput input) {
public boolean charTyped(@NonNull CharacterEvent input) {
if (this.focus != null){
if (this.focus.charTyped(input)){
onChange.run();
@@ -128,7 +124,7 @@ public class WidgetSettingsEditWidget extends ScrollableWidget {
}
@Override
public boolean keyPressed(KeyInput input) {
public boolean keyPressed(@NonNull KeyEvent input) {
if (this.focus != null){
if (this.focus.keyPressed(input)){
onChange.run();
@@ -139,7 +135,7 @@ public class WidgetSettingsEditWidget extends ScrollableWidget {
}
@Override
public boolean keyReleased(KeyInput input) {
public boolean keyReleased(@NonNull KeyEvent input) {
if (this.focus != null){
if (this.focus.keyReleased(input)){
onChange.run();
@@ -150,7 +146,7 @@ public class WidgetSettingsEditWidget extends ScrollableWidget {
}
@Override
protected void appendClickableNarrations(NarrationMessageBuilder builder) {
protected void updateWidgetNarration(@NonNull NarrationElementOutput builder) {
}
}
@@ -1,27 +1,26 @@
package de.shiewk.widgets.client.screen.components;
import com.mojang.blaze3d.platform.cursor.CursorTypes;
import de.shiewk.widgets.ModWidget;
import de.shiewk.widgets.client.screen.WidgetSettingsScreen;
import de.shiewk.widgets.utils.WidgetUtils;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.cursor.StandardCursors;
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.text.OrderedText;
import net.minecraft.text.Text;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.narration.NarrationElementOutput;
import net.minecraft.client.input.MouseButtonEvent;
import net.minecraft.network.chat.Component;
import net.minecraft.util.FormattedCharSequence;
import net.minecraft.util.Util;
import org.joml.Matrix3x2fStack;
import org.jspecify.annotations.NonNull;
import java.awt.*;
import java.util.Iterator;
import java.util.function.Consumer;
public class WidgetWidget extends ClickableWidget {
public class WidgetWidget extends AbstractWidget {
protected static final int COLOR_BG = new Color(0, 0, 0, 80).getRGB(),
COLOR_BG_HOVER = new Color(40, 40, 40, 80).getRGB(),
@@ -32,14 +31,14 @@ public class WidgetWidget extends ClickableWidget {
COLOR_ENABLED_HOVER = new Color(0, 255, 0, 200).getRGB(),
COLOR_BORDER = 0x80_ff_ff_ff;
private final MinecraftClient client;
private final Minecraft client;
private final ModWidget widget;
private final TextRenderer textRenderer;
private final Font textRenderer;
private final Consumer<ModWidget> onEdit;
private long toggleTime = 0;
public WidgetWidget(int x, int y, int width, int height, MinecraftClient client, ModWidget widget, TextRenderer textRenderer, Consumer<ModWidget> onEdit) {
public WidgetWidget(int x, int y, int width, int height, Minecraft client, ModWidget widget, Font textRenderer, Consumer<ModWidget> onEdit) {
super(x, y, width, height, widget.getName());
this.client = client;
this.widget = widget;
@@ -53,36 +52,36 @@ public class WidgetWidget extends ClickableWidget {
}
@Override
protected void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) {
protected void extractWidgetRenderState(GuiGraphicsExtractor context, int mouseX, int mouseY, float delta) {
boolean hover = this.isMouseOver(mouseX, mouseY);
boolean widgetEnabled = widget.getSettings().isEnabled();
context.fill(this.getX(), this.getY(), this.getX() + this.getWidth(), this.getY() + this.getHeight(), hover ? COLOR_BG_HOVER : COLOR_BG);
Matrix3x2fStack stack = context.getMatrices().pushMatrix();
Matrix3x2fStack stack = context.pose().pushMatrix();
stack.scale(2, 2, stack);
int titleSize = textRenderer.getWidth(widget.getName());
context.drawText(textRenderer, widget.getName(), getX() / 2 + getWidth() / 4 - titleSize / 2, getY() / 2 + 4, COLOR_FG, false);
int titleSize = textRenderer.width(widget.getName());
context.text(textRenderer, widget.getName(), getX() / 2 + getWidth() / 4 - titleSize / 2, getY() / 2 + 4, COLOR_FG, false);
stack.popMatrix();
int y = this.getY() + 12 + textRenderer.fontHeight * 2;
for (Iterator<OrderedText> it = textRenderer.wrapLines(widget.getDescription(), this.getWidth() - 10).iterator(); it.hasNext(); y += 9) {
OrderedText t = it.next();
context.drawText(textRenderer, t, getX() + 5 + ((getWidth() - 5) / 2) - (textRenderer.getWidth(t) / 2), y, COLOR_FG, false);
int y = this.getY() + 12 + textRenderer.lineHeight * 2;
for (Iterator<FormattedCharSequence> it = textRenderer.split(widget.getDescription(), this.getWidth() - 10).iterator(); it.hasNext(); y += 9) {
FormattedCharSequence t = it.next();
context.text(textRenderer, t, getX() + 5 + ((getWidth() - 5) / 2) - (textRenderer.width(t) / 2), y, COLOR_FG, false);
}
this.renderToggleButton(context, mouseX, mouseY, widgetEnabled);
if (hover || isMouseOverToggle(mouseX, mouseY)){
context.setCursor(StandardCursors.POINTING_HAND);
context.requestCursor(CursorTypes.POINTING_HAND);
}
context.drawHorizontalLine(getX(), getX() + getWidth() - 1, getY(), COLOR_BORDER);
context.drawHorizontalLine(getX() + 1, getX() + getWidth() - 1, getY() + getHeight() - 1, COLOR_BORDER);
context.drawVerticalLine(getX(), getY(), getY() + getHeight(), COLOR_BORDER);
context.drawVerticalLine(getX() + getWidth() - 1, getY(), getY() + getHeight() - 1, COLOR_BORDER);
context.horizontalLine(getX(), getX() + getWidth() - 1, getY(), COLOR_BORDER);
context.horizontalLine(getX() + 1, getX() + getWidth() - 1, getY() + getHeight() - 1, COLOR_BORDER);
context.verticalLine(getX(), getY(), getY() + getHeight(), COLOR_BORDER);
context.verticalLine(getX() + getWidth() - 1, getY(), getY() + getHeight() - 1, COLOR_BORDER);
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(MouseButtonEvent click, boolean doubled) {
if (isMouseOver(click.x(), click.y())){
client.setScreen(new WidgetSettingsScreen(client.currentScreen, widget, onEdit));
client.setScreen(new WidgetSettingsScreen(client.screen, widget, onEdit));
return true;
} else if (isMouseOverToggle(click.x(), click.y())){
this.toggleWidget();
@@ -93,11 +92,11 @@ public class WidgetWidget extends ClickableWidget {
private void toggleWidget() {
widget.getSettings().toggleEnabled(widget);
toggleTime = Util.getMeasuringTimeNano();
toggleTime = Util.getNanos();
onEdit.accept(widget);
}
private void renderToggleButton(DrawContext context, int mouseX, int mouseY, boolean widgetEnabled){
private void renderToggleButton(GuiGraphicsExtractor context, int mouseX, int mouseY, boolean widgetEnabled){
boolean hoverToggle = this.isMouseOverToggle(mouseX, mouseY);
final int toggleColor;
final int toggleColorInvert;
@@ -118,13 +117,13 @@ public class WidgetWidget extends ClickableWidget {
toggleColorInvert = COLOR_ENABLED;
}
}
if (toggleTime > Util.getMeasuringTimeNano() - 250000000){
if (toggleTime > Util.getNanos() - 250000000){
context.fill(this.getX(), this.getY() + this.getHeight() - 24, this.getX() + this.getWidth(), this.getY() + this.getHeight(), toggleColorInvert);
context.fill(this.getX(), this.getY() + this.getHeight() - 24, (int) (WidgetUtils.computeEasing((Util.getMeasuringTimeNano() - toggleTime) / 250000000d) * this.getWidth() + this.getX()), this.getY() + this.getHeight(), toggleColor);
context.fill(this.getX(), this.getY() + this.getHeight() - 24, (int) (WidgetUtils.computeEasing((Util.getNanos() - toggleTime) / 250000000d) * this.getWidth() + this.getX()), this.getY() + this.getHeight(), toggleColor);
} else {
context.fill(this.getX(), this.getY() + this.getHeight() - 24, this.getX() + this.getWidth(), this.getY() + this.getHeight(), toggleColor);
}
context.drawCenteredTextWithShadow(textRenderer, Text.translatable(widgetEnabled ? "widgets.ui.enabled" : "widgets.ui.disabled"), this.getX() + (this.getWidth() / 2), this.getY() + this.getHeight() - 16, COLOR_FG);
context.centeredText(textRenderer, Component.translatable(widgetEnabled ? "widgets.ui.enabled" : "widgets.ui.disabled"), this.getX() + (this.getWidth() / 2), this.getY() + this.getHeight() - 16, COLOR_FG);
}
private boolean isMouseOverToggle(double mouseX, double mouseY) {
@@ -132,7 +131,7 @@ public class WidgetWidget extends ClickableWidget {
}
@Override
protected void appendClickableNarrations(NarrationMessageBuilder builder) {
protected void updateWidgetNarration(@NonNull NarrationElementOutput builder) {
}
@@ -1,42 +1,43 @@
package de.shiewk.widgets.client.screen.gradienteditor;
import com.mojang.blaze3d.platform.cursor.CursorTypes;
import de.shiewk.widgets.WidgetsMod;
import de.shiewk.widgets.utils.WidgetUtils;
import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gl.RenderPipelines;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.cursor.StandardCursors;
import net.minecraft.client.gui.widget.AlwaysSelectedEntryListWidget;
import net.minecraft.sound.SoundEvents;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.gui.components.ObjectSelectionList;
import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.input.MouseButtonEvent;
import net.minecraft.client.renderer.RenderPipelines;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.sounds.SoundEvents;
import org.jetbrains.annotations.Nullable;
import org.jspecify.annotations.NonNull;
import java.util.List;
import java.util.function.IntSupplier;
import static net.minecraft.text.Text.empty;
import static net.minecraft.text.Text.translatable;
import static net.minecraft.network.chat.Component.empty;
import static net.minecraft.network.chat.Component.translatable;
public class GradientEditorColorSection extends AlwaysSelectedEntryListWidget<GradientEditorColorSection.ListEntry> {
public class GradientEditorColorSection extends ObjectSelectionList<GradientEditorColorSection.ListEntry> {
private final GradientEditorScreen editor;
private static final Identifier TEXTURE_BUTTON_PLUS = Identifier.of(WidgetsMod.MOD_ID, "textures/gui/button_plus.png"),
TEXTURE_ARROW_DOWN = Identifier.of(WidgetsMod.MOD_ID, "textures/gui/arrow_down.png");
private static final Identifier TEXTURE_BUTTON_PLUS = Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "textures/gui/button_plus.png"),
TEXTURE_ARROW_DOWN = Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "textures/gui/arrow_down.png");
private final List<ColorEntry> colorEntries;
public GradientEditorColorSection(GradientEditorScreen editor, MinecraftClient client, int x, int y, int width, int height, int focusedIndex) {
public GradientEditorColorSection(GradientEditorScreen editor, Minecraft client, int x, int y, int width, int height, int focusedIndex) {
super(client, width, height, y, 64);
setX(x);
this.editor = editor;
colorEntries = new ObjectArrayList<>(editor.colors.size());
addEntry(new HeadingEntry(client.textRenderer), 18);
addEntry(new HeadingEntry(client.font), 18);
IntArrayList colors = editor.colors;
for (int i = 0; i < colors.size(); i++) {
@@ -57,26 +58,26 @@ public class GradientEditorColorSection extends AlwaysSelectedEntryListWidget<Gr
}
@Override
protected void drawSelectionHighlight(DrawContext context, ListEntry entry, int color) {}
protected void extractSelection(@NonNull GuiGraphicsExtractor context, @NonNull ListEntry entry, int color) {}
@Override
protected void drawMenuListBackground(DrawContext context) {
protected void extractListBackground(GuiGraphicsExtractor context) {
context.fill(getX(), getY(), getX()+getWidth(), getY()+getHeight(), 0x50_00_00_00);
}
@Override
protected void drawHeaderAndFooterSeparators(DrawContext context) {}
protected void extractListSeparators(@NonNull GuiGraphicsExtractor context) {}
@Override
protected void drawScrollbar(DrawContext context, int mouseX, int mouseY) {}
protected void extractScrollbar(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY) {}
@Override
public void setFocused(@Nullable Element focused) {
public void setFocused(@Nullable GuiEventListener focused) {
if (focused == null) return;
if (focused instanceof ListEntry se && !se.canFocus()) return;
if (super.getFocused() != focused){
WidgetUtils.playSound(SoundEvents.BLOCK_COPPER_BULB_TURN_ON);
WidgetUtils.playSound(SoundEvents.COPPER_BULB_TURN_ON);
}
if (focused instanceof ColorEntry color){
editor.setCurrentColorIndex(colorEntries.indexOf(color));
@@ -88,14 +89,14 @@ public class GradientEditorColorSection extends AlwaysSelectedEntryListWidget<Gr
setFocused(colorEntries.getLast());
}
public abstract static class ListEntry extends AlwaysSelectedEntryListWidget.Entry<ListEntry> {
public abstract static class ListEntry extends ObjectSelectionList.Entry<ListEntry> {
public boolean canFocus(){
return false;
}
@Override
public Text getNarration() {
public @NonNull Component getNarration() {
return empty();
}
}
@@ -109,13 +110,13 @@ public class GradientEditorColorSection extends AlwaysSelectedEntryListWidget<Gr
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
public void extractContent(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
int color = this.color.getAsInt();
int x = this.getX();
int y = this.getContentY();
if (hovered && !isFocused()){
context.setCursor(StandardCursors.POINTING_HAND);
context.requestCursor(CursorTypes.POINTING_HAND);
context.fill(x, y, x+getWidth(), y+getHeight(), 0x30_ff_ff_ff);
}
@@ -144,8 +145,8 @@ public class GradientEditorColorSection extends AlwaysSelectedEntryListWidget<Gr
private static class ArrowDownEntry extends ListEntry {
@Override
public void render(DrawContext context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
context.drawTexture(
public void extractContent(GuiGraphicsExtractor context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
context.blit(
RenderPipelines.GUI_TEXTURED,
TEXTURE_ARROW_DOWN,
getX() + 16,
@@ -163,29 +164,29 @@ public class GradientEditorColorSection extends AlwaysSelectedEntryListWidget<Gr
private static class HeadingEntry extends ListEntry {
private final TextRenderer textRenderer;
private final Font textRenderer;
private HeadingEntry(TextRenderer textRenderer) {
private HeadingEntry(Font textRenderer) {
this.textRenderer = textRenderer;
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
Text text = translatable("widgets.ui.gradientEditor.colors");
public void extractContent(GuiGraphicsExtractor context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
Component text = translatable("widgets.ui.gradientEditor.colors");
int y = this.getContentY() + 2;
int rowWidth = 64;
int textWidth = textRenderer.getWidth(text);
int textWidth = textRenderer.width(text);
int textX = getX() + (rowWidth - textWidth) / 2;
context.drawText(textRenderer, text, textX, y, 0xffffffff, true);
context.text(textRenderer, text, textX, y, 0xffffffff, true);
}
}
private class AddButtonEntry extends ListEntry {
@Override
public void render(DrawContext context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
context.drawTexture(
public void extractContent(GuiGraphicsExtractor context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
context.blit(
RenderPipelines.GUI_TEXTURED,
TEXTURE_BUTTON_PLUS,
getX(),
@@ -199,8 +200,8 @@ public class GradientEditorColorSection extends AlwaysSelectedEntryListWidget<Gr
hovered ? 0xff_cf_cf_cf : 0xff_8d_8d_8d
);
if (hovered){
context.setCursor(StandardCursors.POINTING_HAND);
context.drawTooltip(client.textRenderer, List.of(
context.requestCursor(CursorTypes.POINTING_HAND);
context.setComponentTooltipForNextFrame(minecraft.font, List.of(
translatable("widgets.ui.gradientEditor.colors.add.tooltip.0"),
translatable("widgets.ui.gradientEditor.colors.add.tooltip.1")
), mouseX, mouseY);
@@ -208,7 +209,7 @@ public class GradientEditorColorSection extends AlwaysSelectedEntryListWidget<Gr
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(@NonNull MouseButtonEvent click, boolean doubled) {
editor.addNewColor(editor.getCurrentColor());
return true;
}
@@ -7,13 +7,14 @@ import de.shiewk.widgets.color.GradientMode;
import de.shiewk.widgets.color.GradientOptions;
import de.shiewk.widgets.widgets.settings.GradientWidgetSetting;
import it.unimi.dsi.fastutil.ints.IntArrayList;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.text.Text;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import net.minecraft.util.Util;
import org.joml.Matrix3x2fStack;
import org.jspecify.annotations.NonNull;
import static net.minecraft.text.Text.translatable;
import static net.minecraft.network.chat.Component.translatable;
public class GradientEditorScreen extends Screen implements WidgetVisibilityToggle {
@@ -54,35 +55,35 @@ public class GradientEditorScreen extends Screen implements WidgetVisibilityTogg
}
private int getTopBarHeight() {
return 8 + this.textRenderer.fontHeight * 2;
return 8 + this.font.lineHeight * 2;
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, float deltaTicks) {
super.render(context, mouseX, mouseY, deltaTicks);
public void extractRenderState(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY, float deltaTicks) {
super.extractRenderState(context, mouseX, mouseY, deltaTicks);
Matrix3x2fStack matrices = context.getMatrices();
long timeNanos = Util.getMeasuringTimeNano();
Matrix3x2fStack matrices = context.pose();
long timeNanos = Util.getNanos();
// Render top bar
topBarGradient.fillHorizontal(context, timeNanos, 0, 0, this.width, this.getTopBarHeight());
Text topBarText = translatable("widgets.ui.gradientEditor");
int width = textRenderer.getWidth(topBarText);
Component topBarText = translatable("widgets.ui.gradientEditor");
int width = font.width(topBarText);
matrices.pushMatrix().translate(this.width / 2f - width, 5).scale(2);
context.drawText(textRenderer, topBarText, 0, 0, 0xff_ff_ff_ff, true);
context.text(font, topBarText, 0, 0, 0xff_ff_ff_ff, true);
matrices.popMatrix();
}
public void reloadComponents(){
clearChildren();
clearWidgets();
double colorScrollY = 0;
double settingsScrollY = 0;
if (this.colorSection != null){
colorScrollY = colorSection.getScrollY();
settingsScrollY = settingsSection.getScrollY();
colorScrollY = colorSection.scrollAmount();
settingsScrollY = settingsSection.scrollAmount();
}
int topBarHeight = getTopBarHeight();
@@ -93,29 +94,29 @@ public class GradientEditorScreen extends Screen implements WidgetVisibilityTogg
int mainAreaHeight = this.height - topBarHeight;
// sidebar
this.colorSection = new GradientEditorColorSection(this, this.client, 0, topBarHeight, colorSectionWidth, mainAreaHeight, this.getCurrentColorIndex());
this.settingsSection = new GradientEditorSettingsSection(this, this.client, colorSectionWidth, topBarHeight, settingsSectionWidth, mainAreaHeight);
addDrawableChild(this.colorSection);
addDrawableChild(this.settingsSection);
colorSection.setScrollY(colorScrollY);
settingsSection.setScrollY(settingsScrollY);
this.colorSection = new GradientEditorColorSection(this, this.minecraft, 0, topBarHeight, colorSectionWidth, mainAreaHeight, this.getCurrentColorIndex());
this.settingsSection = new GradientEditorSettingsSection(this, this.minecraft, colorSectionWidth, topBarHeight, settingsSectionWidth, mainAreaHeight);
addRenderableWidget(this.colorSection);
addRenderableWidget(this.settingsSection);
colorSection.setScrollAmount(colorScrollY);
settingsSection.setScrollAmount(settingsScrollY);
// main area
int mainAreaX = colorSectionWidth + settingsSectionWidth;
int mainAreaCenterX = mainAreaX + (mainAreaWidth / 2);
addDrawable(new WidgetDisplayWidget(this.widget, this.textRenderer, mainAreaCenterX, (mainAreaHeight) / 2 + topBarHeight));
addRenderableOnly(new WidgetDisplayWidget(this.widget, this.font, mainAreaCenterX, (mainAreaHeight) / 2 + topBarHeight));
}
@Override
public void renderBackground(DrawContext context, int mouseX, int mouseY, float deltaTicks) {
super.renderBackground(context, mouseX, mouseY, deltaTicks);
public void extractBackground(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY, float deltaTicks) {
super.extractBackground(context, mouseX, mouseY, deltaTicks);
}
@Override
public void close() {
public void onClose() {
refreshSettingValue();
client.setScreen(parent);
minecraft.setScreen(parent);
}
private void refreshSettingValue() {
@@ -1,30 +1,28 @@
package de.shiewk.widgets.client.screen.gradienteditor;
import com.mojang.blaze3d.platform.NativeImage;
import com.mojang.blaze3d.platform.cursor.CursorTypes;
import de.shiewk.widgets.WidgetsMod;
import de.shiewk.widgets.client.WidgetManager;
import de.shiewk.widgets.client.screen.ContextMenuScreen;
import de.shiewk.widgets.color.GradientOptions;
import de.shiewk.widgets.color.GradientPreset;
import de.shiewk.widgets.widgets.settings.GradientWidgetSetting;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gl.RenderPipelines;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.cursor.StandardCursors;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.tooltip.Tooltip;
import net.minecraft.client.gui.widget.AlwaysSelectedEntryListWidget;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.SliderWidget;
import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.client.input.CharInput;
import net.minecraft.client.input.KeyInput;
import net.minecraft.client.texture.NativeImage;
import net.minecraft.client.texture.NativeImageBackedTexture;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.MathHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.gui.components.*;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.input.CharacterEvent;
import net.minecraft.client.input.KeyEvent;
import net.minecraft.client.input.MouseButtonEvent;
import net.minecraft.client.renderer.RenderPipelines;
import net.minecraft.client.renderer.texture.DynamicTexture;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.util.Mth;
import org.jetbrains.annotations.NotNull;
import org.jspecify.annotations.NonNull;
import java.awt.*;
import java.util.Arrays;
@@ -32,16 +30,16 @@ import java.util.function.IntConsumer;
import java.util.function.IntFunction;
import static de.shiewk.widgets.utils.WidgetUtils.colorARGBToHexRGBA;
import static net.minecraft.text.Text.empty;
import static net.minecraft.text.Text.translatable;
import static net.minecraft.network.chat.Component.empty;
import static net.minecraft.network.chat.Component.translatable;
public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget<GradientEditorSettingsSection.ListEntry> {
public class GradientEditorSettingsSection extends ObjectSelectionList<GradientEditorSettingsSection.ListEntry> {
private final GradientEditorScreen editor;
private final HexValueInputEntry hexInput;
private final ColorPickerHueSliderEntry hueSlider;
public GradientEditorSettingsSection(GradientEditorScreen editor, MinecraftClient client, int x, int y, int width, int height) {
public GradientEditorSettingsSection(GradientEditorScreen editor, Minecraft client, int x, int y, int width, int height) {
super(client, width, height, y, 110);
setX(x);
this.editor = editor;
@@ -77,18 +75,18 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
}
@Override
protected void drawMenuListBackground(DrawContext context) {
protected void extractListBackground(GuiGraphicsExtractor context) {
context.fill(getX(), getY(), getX()+getWidth(), getY()+getHeight(), 0x20_00_00_00);
}
@Override protected void drawHeaderAndFooterSeparators(DrawContext context) {}
@Override protected void drawSelectionHighlight(DrawContext context, ListEntry entry, int color) {}
@Override protected void drawScrollbar(DrawContext context, int mouseX, int mouseY) {}
@Override protected void extractListSeparators(@NonNull GuiGraphicsExtractor context) {}
@Override protected void extractSelection(@NonNull GuiGraphicsExtractor context, @NonNull ListEntry entry, int color) {}
@Override protected void extractScrollbar(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY) {}
public abstract static class ListEntry extends Entry<ListEntry> {
@Override
public Text getNarration() {
public @NonNull Component getNarration() {
return empty();
}
}
@@ -111,59 +109,59 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
private class HeadingEntry extends ListEntry {
private final Text text;
private final Component text;
private HeadingEntry(Text text) {
private HeadingEntry(Component text) {
this.text = text;
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
public void extractContent(GuiGraphicsExtractor context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
int y = this.getContentY() + 2;
int rowWidth = 110;
int textWidth = client.textRenderer.getWidth(text);
int textWidth = minecraft.font.width(text);
int textX = getX() + (rowWidth - textWidth) / 2;
context.drawText(client.textRenderer, text, textX, y, 0xffffffff, true);
context.text(minecraft.font, text, textX, y, 0xffffffff, true);
}
}
private class SliderEntry extends ListEntry {
private final SliderWidget slider;
private final AbstractSliderButton slider;
private SliderEntry(int min, int max, int initial, IntFunction<Text> textGetter, IntConsumer onUpdateValue) {
private SliderEntry(int min, int max, int initial, IntFunction<Component> textGetter, IntConsumer onUpdateValue) {
double value = (double) (initial - min) / (max - min);
slider = new Slider(textGetter, value, onUpdateValue, min, max);
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
public void extractContent(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
slider.active = editor.colors.size() > 1;
slider.setDimensionsAndPosition(getContentWidth(), getContentHeight(), getContentX(), getContentY());
slider.render(context, mouseX, mouseY, deltaTicks);
slider.setRectangle(getContentWidth(), getContentHeight(), getContentX(), getContentY());
slider.extractRenderState(context, mouseX, mouseY, deltaTicks);
if (hovered && !slider.active) {
context.setCursor(StandardCursors.NOT_ALLOWED);
slider.setTooltip(Tooltip.of(translatable("widgets.ui.gradientEditor.gradientSettings.addMoreColors")));
context.requestCursor(CursorTypes.NOT_ALLOWED);
slider.setTooltip(Tooltip.create(translatable("widgets.ui.gradientEditor.gradientSettings.addMoreColors")));
} else {
slider.setTooltip(null);
}
}
@Override public boolean mouseClicked(Click click, boolean doubled) { return slider.mouseClicked(click, doubled); }
@Override public boolean mouseDragged(Click click, double offsetX, double offsetY) { return slider.mouseDragged(click, offsetX, offsetY); }
@Override public boolean mouseReleased(Click click) { return slider.mouseReleased(click); }
@Override public boolean mouseClicked(@NonNull MouseButtonEvent click, boolean doubled) { return slider.mouseClicked(click, doubled); }
@Override public boolean mouseDragged(@NonNull MouseButtonEvent click, double offsetX, double offsetY) { return slider.mouseDragged(click, offsetX, offsetY); }
@Override public boolean mouseReleased(@NonNull MouseButtonEvent click) { return slider.mouseReleased(click); }
@Override public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { return slider.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount); }
@Override public void mouseMoved(double mouseX, double mouseY) { slider.mouseMoved(mouseX, mouseY); }
private static class Slider extends SliderWidget {
private static class Slider extends AbstractSliderButton {
private final IntFunction<Text> textGetter;
private final IntFunction<Component> textGetter;
private final IntConsumer onUpdateValue;
private final int min;
private final int max;
public Slider(IntFunction<Text> textGetter, double value, IntConsumer onUpdateValue, int min, int max) {
public Slider(IntFunction<Component> textGetter, double value, IntConsumer onUpdateValue, int min, int max) {
super(0, 0, 0, 0, empty(), value);
this.textGetter = textGetter;
this.onUpdateValue = onUpdateValue;
@@ -191,13 +189,13 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
private class ToggleModeButtonEntry extends ListEntry {
private final ButtonWidget button = new ButtonWidget.Builder(empty(), this::press).build();
private final Button button = new Button.Builder(empty(), this::press).build();
public ToggleModeButtonEntry() {
refreshButtonValues();
}
private void press(ButtonWidget button) {
private void press(Button button) {
editor.cycleMode();
refreshButtonValues();
}
@@ -205,34 +203,34 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
private void refreshButtonValues() {
button.setMessage(translatable("widgets.ui.gradientEditor.mode", editor.mode.name));
if (editor.colors.size() > 1){
button.setTooltip(Tooltip.of(editor.mode.description));
button.setTooltip(Tooltip.create(editor.mode.description));
} else {
button.setTooltip(Tooltip.of(translatable("widgets.ui.gradientEditor.gradientSettings.addMoreColors")));
button.setTooltip(Tooltip.create(translatable("widgets.ui.gradientEditor.gradientSettings.addMoreColors")));
}
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
public void extractContent(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
button.active = editor.colors.size() > 1;
button.setDimensionsAndPosition(getContentWidth(), getContentHeight(), getContentX(), getContentY());
button.render(context, mouseX, mouseY, deltaTicks);
button.setRectangle(getContentWidth(), getContentHeight(), getContentX(), getContentY());
button.extractRenderState(context, mouseX, mouseY, deltaTicks);
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(@NonNull MouseButtonEvent click, boolean doubled) {
return button.mouseClicked(click, doubled);
}
}
private class ImportButtonEntry extends ListEntry {
private final ButtonWidget button = new ButtonWidget.Builder(translatable("widgets.ui.gradientEditor.importOther"), this::press).build();
private final Button button = new Button.Builder(translatable("widgets.ui.gradientEditor.importOther"), this::press).build();
private void press(ButtonWidget button) {
Screen currentScreen = client.currentScreen;
int menuX = (int) client.mouse.getScaledX(client.getWindow());
int menuY = (int) client.mouse.getScaledY(client.getWindow());
client.setScreen(new ContextMenuScreen(
private void press(Button button) {
Screen currentScreen = minecraft.screen;
int menuX = (int) minecraft.mouseHandler.getScaledXPos(minecraft.getWindow());
int menuY = (int) minecraft.mouseHandler.getScaledYPos(minecraft.getWindow());
minecraft.setScreen(new ContextMenuScreen(
button.getMessage(),
currentScreen,
menuX, menuY,
@@ -240,7 +238,7 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
.stream()
.map(widget -> new ContextMenuScreen.Option(
widget.getName(),
() -> client.setScreen(new ContextMenuScreen(
() -> minecraft.setScreen(new ContextMenuScreen(
widget.getName(),
currentScreen,
menuX,
@@ -258,26 +256,26 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
button.setDimensionsAndPosition(getContentWidth(), getContentHeight(), getContentX(), getContentY());
button.render(context, mouseX, mouseY, deltaTicks);
public void extractContent(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
button.setRectangle(getContentWidth(), getContentHeight(), getContentX(), getContentY());
button.extractRenderState(context, mouseX, mouseY, deltaTicks);
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(@NonNull MouseButtonEvent click, boolean doubled) {
return button.mouseClicked(click, doubled);
}
}
private class UsePresetButtonEntry extends ListEntry {
private final ButtonWidget button = new ButtonWidget.Builder(translatable("widgets.ui.gradientEditor.usePreset"), this::press).build();
private final Button button = new Button.Builder(translatable("widgets.ui.gradientEditor.usePreset"), this::press).build();
private void press(ButtonWidget button) {
Screen currentScreen = client.currentScreen;
int menuX = (int) client.mouse.getScaledX(client.getWindow());
int menuY = (int) client.mouse.getScaledY(client.getWindow());
client.setScreen(new ContextMenuScreen(
private void press(Button button) {
Screen currentScreen = minecraft.screen;
int menuX = (int) minecraft.mouseHandler.getScaledXPos(minecraft.getWindow());
int menuY = (int) minecraft.mouseHandler.getScaledYPos(minecraft.getWindow());
minecraft.setScreen(new ContextMenuScreen(
translatable("widgets.ui.gradientEditor.usePreset"),
currentScreen,
menuX, menuY,
@@ -289,13 +287,13 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
button.setDimensionsAndPosition(getContentWidth(), getContentHeight(), getContentX(), getContentY());
button.render(context, mouseX, mouseY, deltaTicks);
public void extractContent(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
button.setRectangle(getContentWidth(), getContentHeight(), getContentX(), getContentY());
button.extractRenderState(context, mouseX, mouseY, deltaTicks);
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(@NonNull MouseButtonEvent click, boolean doubled) {
return button.mouseClicked(click, doubled);
}
@@ -316,7 +314,7 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
public void extractContent(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
double sliderProg = getComponentValue() / 255d;
GradientOptions bg = new GradientOptions(100, 0, new int[]{getBackgroundStartColor(), getBackgroundEndColor()});
@@ -327,14 +325,14 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
bg.fillHorizontal(context, 0, contentX, contentY + 1, contentX + contentWidth, contentY + contentHeight - 1);
context.drawVerticalLine((int) (contentX + (contentWidth * sliderProg)), contentY - 1, contentY + contentHeight, 0xff_ff_ff_ff);
context.verticalLine((int) (contentX + (contentWidth * sliderProg)), contentY - 1, contentY + contentHeight, 0xff_ff_ff_ff);
if (showLabel){
String label = getLabelWithValue();
int w = client.textRenderer.getWidth(label);
context.drawText(client.textRenderer, label, contentX + (contentWidth - w) / 2, contentY + 5, 0xffffffff, true);
int w = minecraft.font.width(label);
context.text(minecraft.font, label, contentX + (contentWidth - w) / 2, contentY + 5, 0xffffffff, true);
}
if (hovered){
context.setCursor(StandardCursors.RESIZE_EW);
context.requestCursor(CursorTypes.RESIZE_EW);
}
}
@@ -350,7 +348,7 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
}
@Override
public boolean mouseDragged(Click click, double offsetX, double offsetY) {
public boolean mouseDragged(MouseButtonEvent click, double offsetX, double offsetY) {
double mouseX = click.x();
int newComponentValue = (int) ((mouseX - getContentX()) / getContentWidth() * 255);
setComponentValue(newComponentValue);
@@ -358,12 +356,12 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(@NonNull MouseButtonEvent click, boolean doubled) {
return mouseDragged(click, 0, 0);
}
@Override
public boolean keyPressed(KeyInput input) {
public boolean keyPressed(KeyEvent input) {
if (input.isLeft()) {
setComponentValue(getComponentValue() - 1);
} else if (input.isRight()) {
@@ -373,7 +371,7 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
}
private void setComponentValue(int val) {
val = MathHelper.clamp(val, 0, 255);
val = Mth.clamp(val, 0, 255);
final int currentColor = editor.getCurrentColor();
int newColor = switch (component){
case 0 -> (currentColor & 0xff_00_ff_ff) | val << 16;
@@ -420,29 +418,29 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
private class RemoveColorButtonEntry extends ListEntry {
private final ButtonWidget button = new ButtonWidget.Builder(translatable("widgets.ui.gradientEditor.removeColor"), this::press).build();
private final Button button = new Button.Builder(translatable("widgets.ui.gradientEditor.removeColor"), this::press).build();
private void press(ButtonWidget button) {
private void press(Button button) {
button.active = false;
editor.removeCurrentColor();
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
public void extractContent(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
button.active = editor.colors.size() > 1;
button.setDimensionsAndPosition(getContentWidth(), getContentHeight(), getContentX(), getContentY());
button.render(context, mouseX, mouseY, deltaTicks);
button.setRectangle(getContentWidth(), getContentHeight(), getContentX(), getContentY());
button.extractRenderState(context, mouseX, mouseY, deltaTicks);
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(@NonNull MouseButtonEvent click, boolean doubled) {
return button.mouseClicked(click, doubled);
}
}
private class HexValueInputEntry extends ListEntry {
private final TextFieldWidget inputField = new TextFieldWidget(client.textRenderer, 0, 0, empty());
private final EditBox inputField = new EditBox(minecraft.font, 0, 0, empty());
public HexValueInputEntry() {
this.refreshText();
@@ -470,21 +468,21 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
} catch (NumberFormatException ignored) {}
}
inputField.setEditableColor(valid ? 0xffffffff : 0xffff0000);
inputField.setTextColor(valid ? 0xffffffff : 0xffff0000);
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
inputField.setDimensionsAndPosition(getContentWidth(), getContentHeight(), getContentX(), getContentY());
inputField.render(context, mouseX, mouseY, deltaTicks);
public void extractContent(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
inputField.setRectangle(getContentWidth(), getContentHeight(), getContentX(), getContentY());
inputField.extractRenderState(context, mouseX, mouseY, deltaTicks);
}
public void refreshText(){
inputField.setChangedListener(null);
inputField.setText('#' + colorARGBToHexRGBA(editor.getCurrentColor()));
inputField.setCursorToStart(false);
inputField.setEditableColor(0xffffffff);
inputField.setChangedListener(this::onChangeInputField);
inputField.setResponder(_ -> {});
inputField.setValue('#' + colorARGBToHexRGBA(editor.getCurrentColor()));
inputField.moveCursorToStart(false);
inputField.setTextColor(0xffffffff);
inputField.setResponder(this::onChangeInputField);
}
@Override
@@ -492,20 +490,20 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
inputField.setFocused(focused);
}
@Override public boolean mouseClicked(Click click, boolean doubled) { return inputField.mouseClicked(click, doubled); }
@Override public boolean mouseDragged(Click click, double offsetX, double offsetY) { return inputField.mouseDragged(click, offsetX, offsetY); }
@Override public boolean mouseReleased(Click click) { return inputField.mouseReleased(click); }
@Override public boolean mouseClicked(@NonNull MouseButtonEvent click, boolean doubled) { return inputField.mouseClicked(click, doubled); }
@Override public boolean mouseDragged(@NonNull MouseButtonEvent click, double offsetX, double offsetY) { return inputField.mouseDragged(click, offsetX, offsetY); }
@Override public boolean mouseReleased(@NonNull MouseButtonEvent click) { return inputField.mouseReleased(click); }
@Override public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { return inputField.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount); }
@Override public void mouseMoved(double mouseX, double mouseY) { inputField.mouseMoved(mouseX, mouseY); }
@Override public boolean charTyped(CharInput input) { return inputField.charTyped(input); }
@Override public boolean keyReleased(KeyInput input) { return inputField.keyReleased(input); }
@Override public boolean keyPressed(KeyInput input) { return inputField.keyPressed(input); }
@Override public boolean charTyped(@NonNull CharacterEvent input) { return inputField.charTyped(input); }
@Override public boolean keyReleased(@NonNull KeyEvent input) { return inputField.keyReleased(input); }
@Override public boolean keyPressed(@NonNull KeyEvent input) { return inputField.keyPressed(input); }
}
private class ColorPickerEntry extends ListEntry {
@Override
public void render(DrawContext context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
public void extractContent(GuiGraphicsExtractor context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
context.fill(
getContentX(),
getContentY(),
@@ -513,7 +511,7 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
getContentY() + getContentHeight(),
getBackgroundFillColor()
);
context.drawTexture(
context.blit(
RenderPipelines.GUI_TEXTURED,
getOverlayTextureIdentifier(),
getContentX(), getContentY(),
@@ -537,12 +535,12 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
);
if (hovered){
context.setCursor(StandardCursors.ARROW);
context.requestCursor(CursorTypes.ARROW);
}
}
@Override
public boolean mouseDragged(Click click, double offsetX, double offsetY) {
public boolean mouseDragged(MouseButtonEvent click, double offsetX, double offsetY) {
double x = click.x() - getContentX();
double y = click.y() - getContentY();
float saturation = (float) Math.clamp(x / getContentWidth(), 0d, 1d);
@@ -556,7 +554,7 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(@NonNull MouseButtonEvent click, boolean doubled) {
return mouseDragged(click, 0, 0);
}
@@ -568,16 +566,16 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
public Identifier getOverlayTextureIdentifier(){
if (OVERLAY_TEXTURE_ID == null){
NativeImageBackedTexture texture = generateOverlayTexture();
OVERLAY_TEXTURE_ID = Identifier.of(WidgetsMod.MOD_ID, "textures/gui/generated/color-picker-overlay");
client.getTextureManager().registerTexture(OVERLAY_TEXTURE_ID, texture);
DynamicTexture texture = generateOverlayTexture();
OVERLAY_TEXTURE_ID = Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "textures/gui/generated/color-picker-overlay");
minecraft.getTextureManager().register(OVERLAY_TEXTURE_ID, texture);
}
return OVERLAY_TEXTURE_ID;
}
private NativeImageBackedTexture generateOverlayTexture() {
NativeImageBackedTexture texture = new NativeImageBackedTexture("widgets:textures/gui/generated/color-picker-overlay", 256, 256, false);
NativeImage image = texture.getImage();
private DynamicTexture generateOverlayTexture() {
DynamicTexture texture = new DynamicTexture("widgets:textures/gui/generated/color-picker-overlay", 256, 256, false);
NativeImage image = texture.getPixels();
for (int x = 0; x < 256; x++) {
for (int y = 0; y < 256; y++) {
@@ -588,7 +586,7 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
int rgb = (int) Math.round(outAlpha > 0 ? (255d * alphaWhite * (1d - alphaBlack)) / outAlpha : 0);
int a = (int) Math.round(outAlpha * 255.0);
image.setColorArgb(x, y, new Color(rgb, rgb, rgb, a).getRGB());
image.setPixel(x, y, new Color(rgb, rgb, rgb, a).getRGB());
}
}
@@ -612,17 +610,17 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
public void extractContent(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY, boolean hovered, float deltaTicks) {
sliderGradient.fillHorizontal(context, 0, getContentX(), getContentY() + 1, getContentX() + getContentWidth(), getContentY() + getContentHeight() - 1);
context.drawVerticalLine((int) (getContentX() + (getContentWidth() * sliderProgress)), getContentY() - 1, getContentY() + getContentHeight(), 0xff_ff_ff_ff);
context.verticalLine( (int) (getContentX() + (getContentWidth() * sliderProgress)), getContentY() - 1, getContentY() + getContentHeight(), 0xff_ff_ff_ff);
if (hovered){
context.setCursor(StandardCursors.RESIZE_EW);
context.requestCursor(CursorTypes.RESIZE_EW);
}
}
@Override
public boolean mouseDragged(Click click, double offsetX, double offsetY) {
public boolean mouseDragged(MouseButtonEvent click, double offsetX, double offsetY) {
double x = click.x() - getContentX();
float newHue = (float) Math.clamp(x / getContentWidth(), 0, 1);
this.sliderProgress = newHue;
@@ -639,7 +637,7 @@ public class GradientEditorSettingsSection extends AlwaysSelectedEntryListWidget
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(@NonNull MouseButtonEvent click, boolean doubled) {
return this.mouseDragged(click, 0, 0);
}
@@ -1,17 +1,17 @@
package de.shiewk.widgets.color;
import net.minecraft.text.Text;
import static net.minecraft.network.chat.Component.translatable;
import static net.minecraft.text.Text.translatable;
import net.minecraft.network.chat.Component;
public enum GradientMode {
SWEEP(translatable("widgets.gradient.sweep"), translatable("widgets.gradient.sweep.description")),
PULSE(translatable("widgets.gradient.pulse"), translatable("widgets.gradient.pulse.description"));
public final Text name;
public final Text description;
public final Component name;
public final Component description;
GradientMode(Text name, Text description) {
GradientMode(Component name, Component description) {
this.name = name;
this.description = description;
}
@@ -1,9 +1,9 @@
package de.shiewk.widgets.color;
import de.shiewk.widgets.render.state.HorizontalGradientGuiRenderState;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.text.Text;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.network.chat.Component;
import org.joml.Matrix3x2fStack;
import java.util.Objects;
@@ -23,7 +23,7 @@ public record GradientOptions(GradientMode mode, float gradientSize, float gradi
this(GradientMode.SWEEP, gradientSize, gradientSpeed, colors);
}
public void fillHorizontal(DrawContext context, long timeNanos, int x, int y, int endX, int endY) {
public void fillHorizontal(GuiGraphicsExtractor context, long timeNanos, int x, int y, int endX, int endY) {
if (colors.length == 1) {
context.fill(x, y, endX, endY, colors[0]);
return;
@@ -34,7 +34,7 @@ public record GradientOptions(GradientMode mode, float gradientSize, float gradi
}
}
private void fillHorizonalSweep(DrawContext context, long timeNanos, int x, int y, int endX, int endY) {
private void fillHorizonalSweep(GuiGraphicsExtractor context, long timeNanos, int x, int y, int endX, int endY) {
context.enableScissor(x, y, endX, endY);
int width = endX - x;
@@ -47,7 +47,7 @@ public record GradientOptions(GradientMode mode, float gradientSize, float gradi
float timeSeconds = timeNanos / 1_000_000_000f;
float offset = gradientSpeed == 0 ? 0 : (timeSeconds * speedPxPerSec + x) % totalGradientCycle;
Matrix3x2fStack matrices = context.getMatrices().pushMatrix();
Matrix3x2fStack matrices = context.pose().pushMatrix();
matrices.translate(-offset, 0);
int currentPos = 0;
@@ -70,7 +70,7 @@ public record GradientOptions(GradientMode mode, float gradientSize, float gradi
context.disableScissor();
}
private void fillHorizonalPulse(DrawContext context, long timeNanos, int x, int y, int endX, int endY) {
private void fillHorizonalPulse(GuiGraphicsExtractor context, long timeNanos, int x, int y, int endX, int endY) {
context.fill(x, y, endX, endY, getCurrentPulseColor(timeNanos));
}
@@ -82,13 +82,13 @@ public record GradientOptions(GradientMode mode, float gradientSize, float gradi
return fadeColor(color1, color2, delta);
}
public void drawHorizontalLine(DrawContext context, long mt, int posX, int endX, int posY) {
public void drawHorizontalLine(GuiGraphicsExtractor context, long mt, int posX, int endX, int posY) {
this.fillHorizontal(context, mt, posX, posY, endX, posY + 1);
}
public void drawText(DrawContext context, TextRenderer textRenderer, long timeNanos, String displayText, int x, int y, boolean shadow) {
public void drawText(GuiGraphicsExtractor context, Font textRenderer, long timeNanos, String displayText, int x, int y, boolean shadow) {
if (colors.length == 1){
context.drawText(textRenderer, displayText, x, y, colors[0], shadow);
context.text(textRenderer, displayText, x, y, colors[0], shadow);
} else {
switch (mode){
case SWEEP -> drawTextSweep(context, textRenderer, timeNanos, displayText, x, y, shadow);
@@ -97,20 +97,20 @@ public record GradientOptions(GradientMode mode, float gradientSize, float gradi
}
}
public void drawText(DrawContext context, TextRenderer textRenderer, long timeNanos, Text displayText, int x, int y, boolean shadow) {
public void drawText(GuiGraphicsExtractor context, Font textRenderer, long timeNanos, Component displayText, int x, int y, boolean shadow) {
if (colors.length == 1){
context.drawText(textRenderer, displayText, x, y, colors[0], shadow);
context.text(textRenderer, displayText, x, y, colors[0], shadow);
}
this.drawText(context, textRenderer, timeNanos, displayText.getString(), x, y, shadow);
}
private void drawTextSweep(DrawContext context, TextRenderer textRenderer, long timeNanos, String displayText, int x, int y, boolean shadow) {
private void drawTextSweep(GuiGraphicsExtractor context, Font textRenderer, long timeNanos, String displayText, int x, int y, boolean shadow) {
int pos = 0;
for (int i = 0; i < displayText.length(); i++) {
String s = String.valueOf(displayText.charAt(i));
int w = textRenderer.getWidth(s);
int w = textRenderer.width(s);
int col = computeSweepTextColorAt(gradientSpeed == 0 ? pos : pos + x, timeNanos);
context.drawText(textRenderer, s, x +pos, y, col, shadow);
context.text(textRenderer, s, x +pos, y, col, shadow);
pos += w;
}
}
@@ -128,15 +128,15 @@ public record GradientOptions(GradientMode mode, float gradientSize, float gradi
return fadeColor(color1, color2, off);
}
private void drawTextPulse(DrawContext context, TextRenderer textRenderer, long timeNanos, String displayText, int x, int y, boolean shadow) {
context.drawText(textRenderer, displayText, x, y, getCurrentPulseColor(timeNanos), shadow);
private void drawTextPulse(GuiGraphicsExtractor context, Font textRenderer, long timeNanos, String displayText, int x, int y, boolean shadow) {
context.text(textRenderer, displayText, x, y, getCurrentPulseColor(timeNanos), shadow);
}
public static GradientOptions solidColor(int color) {
return new GradientOptions(1, 0, new int[]{color});
}
public void drawVerticalLine(DrawContext context, long timeNanos, int posX, int posY, int endY) {
public void drawVerticalLine(GuiGraphicsExtractor context, long timeNanos, int posX, int posY, int endY) {
fillHorizontal(context, timeNanos, posX, posY, posX + 1, endY);
}
@@ -1,10 +1,10 @@
package de.shiewk.widgets.color;
import net.minecraft.text.Text;
import static net.minecraft.network.chat.Component.translatable;
import static net.minecraft.text.Text.translatable;
import net.minecraft.network.chat.Component;
public record GradientPreset(Text name, GradientOptions gradient) {
public record GradientPreset(Component name, GradientOptions gradient) {
public static final GradientPreset[] presets = new GradientPreset[]{
new GradientPreset(
@@ -2,41 +2,41 @@ package de.shiewk.widgets.mixin;
import de.shiewk.widgets.widgets.ComboWidget;
import de.shiewk.widgets.widgets.TPSWidget;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.network.packet.s2c.play.DamageTiltS2CPacket;
import net.minecraft.network.packet.s2c.play.EntityDamageS2CPacket;
import net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientPacketListener;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.network.protocol.game.ClientboundDamageEventPacket;
import net.minecraft.network.protocol.game.ClientboundHurtAnimationPacket;
import net.minecraft.network.protocol.game.ClientboundSetTimePacket;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(ClientPlayNetworkHandler.class)
@Mixin(ClientPacketListener.class)
public class MixinClientPlayNetworkHandler {
@Inject(at = @At("HEAD"), method = "onWorldTimeUpdate")
public void onWorldTimeUpdate(WorldTimeUpdateS2CPacket packet, CallbackInfo ci){
if (MinecraftClient.getInstance().isOnThread()) return; // run this on the networking thread as soon as possible
@Inject(at = @At("HEAD"), method = "handleSetTime")
public void onWorldTimeUpdate(ClientboundSetTimePacket packet, CallbackInfo ci){
if (Minecraft.getInstance().isSameThread()) return; // run this on the networking thread as soon as possible
// server sends this packet every 20 ticks
TPSWidget.worldTimeUpdated(System.nanoTime());
}
@Inject(at = @At("HEAD"), method = "onDamageTilt")
public void onDamageTilt(DamageTiltS2CPacket packet, CallbackInfo ci){
if (MinecraftClient.getInstance().isOnThread()) return;
@Inject(at = @At("HEAD"), method = "handleHurtAnimation")
public void onDamageTilt(ClientboundHurtAnimationPacket packet, CallbackInfo ci){
if (Minecraft.getInstance().isSameThread()) return;
int entityId = packet.id();
ClientPlayerEntity player = MinecraftClient.getInstance().player;
LocalPlayer player = Minecraft.getInstance().player;
int playerId = player == null ? Integer.MIN_VALUE : player.getId();
ComboWidget.entityTakeDamage(playerId, entityId);
}
@Inject(at = @At("HEAD"), method = "onEntityDamage")
public void onEntityDamage(EntityDamageS2CPacket packet, CallbackInfo ci){
if (MinecraftClient.getInstance().isOnThread()) return;
@Inject(at = @At("HEAD"), method = "handleDamageEvent")
public void onEntityDamage(ClientboundDamageEventPacket packet, CallbackInfo ci){
if (Minecraft.getInstance().isSameThread()) return;
int entityId = packet.entityId();
ClientPlayerEntity player = MinecraftClient.getInstance().player;
LocalPlayer player = Minecraft.getInstance().player;
int playerId = player == null ? Integer.MIN_VALUE : player.getId();
ComboWidget.entityTakeDamage(playerId, entityId);
}
@@ -1,28 +1,29 @@
package de.shiewk.widgets.mixin;
import de.shiewk.widgets.widgets.CPSWidget;
import net.minecraft.client.Mouse;
import net.minecraft.client.input.MouseInput;
import net.minecraft.client.MouseHandler;
import net.minecraft.client.input.MouseButtonInfo;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(Mouse.class)
@Mixin(MouseHandler.class)
public class MixinMouse {
@Inject(at = @At(value = "FIELD", target = "Lnet/minecraft/client/Mouse;leftButtonClicked:Z"), method = "onMouseButton")
public void onLeftClick(long window, MouseInput input, int action, CallbackInfo ci){
@Inject(at = @At(value = "FIELD", target = "Lnet/minecraft/client/MouseHandler;isLeftPressed:Z", opcode = Opcodes.PUTFIELD), method = "onButton")
public void onLeftClick(long handle, MouseButtonInfo rawButtonInfo, int action, CallbackInfo ci){
if (action == 1) CPSWidget.clickLeft();
}
@Inject(at = @At(value = "FIELD", target = "Lnet/minecraft/client/Mouse;middleButtonClicked:Z"), method = "onMouseButton")
public void onMiddleClick(long window, MouseInput input, int action, CallbackInfo ci){
@Inject(at = @At(value = "FIELD", target = "Lnet/minecraft/client/MouseHandler;isMiddlePressed:Z", opcode = Opcodes.PUTFIELD), method = "onButton")
public void onMiddleClick(long handle, MouseButtonInfo rawButtonInfo, int action, CallbackInfo ci){
if (action == 1) CPSWidget.clickMiddle();
}
@Inject(at = @At(value = "FIELD", target = "Lnet/minecraft/client/Mouse;rightButtonClicked:Z"), method = "onMouseButton")
public void onRightClick(long window, MouseInput input, int action, CallbackInfo ci){
@Inject(at = @At(value = "FIELD", target = "Lnet/minecraft/client/MouseHandler;isRightPressed:Z", opcode = Opcodes.PUTFIELD), method = "onButton")
public void onRightClick(long handle, MouseButtonInfo rawButtonInfo, int action, CallbackInfo ci){
if (action == 1) CPSWidget.clickRight();
}
}
@@ -1,25 +1,26 @@
package de.shiewk.widgets.render.state;
import com.mojang.blaze3d.pipeline.RenderPipeline;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.gl.RenderPipelines;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.ScreenRect;
import net.minecraft.client.gui.render.state.SimpleGuiElementRenderState;
import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.texture.TextureSetup;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.gui.navigation.ScreenRectangle;
import net.minecraft.client.gui.render.TextureSetup;
import net.minecraft.client.renderer.state.gui.GuiElementRenderState;
import net.minecraft.client.renderer.RenderPipelines;
import org.jetbrains.annotations.Nullable;
import org.joml.Matrix3x2f;
import org.jspecify.annotations.NonNull;
@Environment(EnvType.CLIENT)
public final class HorizontalGradientGuiRenderState implements SimpleGuiElementRenderState {
public final class HorizontalGradientGuiRenderState implements GuiElementRenderState {
private final RenderPipeline pipeline;
private final TextureSetup textureSetup;
private final Matrix3x2f pose;
private final ScreenRect scissorArea;
private final ScreenRect bounds;
private final ScreenRectangle scissorArea;
private final ScreenRectangle bounds;
private final int x;
private final int y;
@@ -34,7 +35,7 @@ public final class HorizontalGradientGuiRenderState implements SimpleGuiElementR
RenderPipeline pipeline,
TextureSetup textureSetup,
Matrix3x2f pose,
ScreenRect scissorArea,
ScreenRectangle scissorArea,
int x,
int y,
int endX,
@@ -54,46 +55,46 @@ public final class HorizontalGradientGuiRenderState implements SimpleGuiElementR
}
@Override
public void setupVertices(VertexConsumer vertices) {
vertices.vertex(pose, x, y).color(colorLeft);
vertices.vertex(pose, x, endY).color(colorLeft);
vertices.vertex(pose, endX, endY).color(colorRight);
vertices.vertex(pose, endX, y).color(colorRight);
public void buildVertices(VertexConsumer vertices) {
vertices.addVertexWith2DPose(pose, x, y).setColor(colorLeft);
vertices.addVertexWith2DPose(pose, x, endY).setColor(colorLeft);
vertices.addVertexWith2DPose(pose, endX, endY).setColor(colorRight);
vertices.addVertexWith2DPose(pose, endX, y).setColor(colorRight);
}
@Override
public RenderPipeline pipeline() {
public @NonNull RenderPipeline pipeline() {
return pipeline;
}
@Override
public TextureSetup textureSetup() {
public @NonNull TextureSetup textureSetup() {
return textureSetup;
}
@Override
public @Nullable ScreenRect scissorArea() {
public @Nullable ScreenRectangle scissorArea() {
return scissorArea;
}
@Nullable
private static ScreenRect createBounds(int x0, int y0, int x1, int y1, Matrix3x2f pose, @Nullable ScreenRect scissorArea) {
ScreenRect screenRect = (new ScreenRect(x0, y0, x1 - x0 + 1, y1 - y0)).transformEachVertex(pose);
private static ScreenRectangle createBounds(int x0, int y0, int x1, int y1, Matrix3x2f pose, @Nullable ScreenRectangle scissorArea) {
ScreenRectangle screenRect = (new ScreenRectangle(x0, y0, x1 - x0 + 1, y1 - y0)).transformMaxBounds(pose);
return scissorArea != null ? scissorArea.intersection(screenRect) : screenRect;
}
@Override
public @Nullable ScreenRect bounds() {
public @Nullable ScreenRectangle bounds() {
return bounds;
}
public static void draw(DrawContext context, int x, int y, int endX, int endY, int colorLeft, int colorRight) {
context.state.addSimpleElement(
public static void draw(GuiGraphicsExtractor context, int x, int y, int endX, int endY, int colorLeft, int colorRight) {
context.guiRenderState.addGuiElement(
new HorizontalGradientGuiRenderState(
RenderPipelines.GUI,
TextureSetup.empty(),
new Matrix3x2f(context.getMatrices()),
context.scissorStack.peekLast(),
TextureSetup.noTexture(),
new Matrix3x2f(context.pose()),
context.scissorStack.peek(),
x, y, endX, endY,
colorLeft, colorRight
)
@@ -1,12 +1,11 @@
package de.shiewk.widgets.utils;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.sound.PositionedSoundInstance;
import net.minecraft.sound.SoundEvent;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.tick.TickManager;
import java.util.function.BooleanSupplier;
import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.sounds.SimpleSoundInstance;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.util.Mth;
import net.minecraft.world.TickRateManager;
public class WidgetUtils {
@@ -17,30 +16,30 @@ public class WidgetUtils {
}
public static boolean isInSingleplayer(){
return MinecraftClient.getInstance().isInSingleplayer();
return Minecraft.getInstance().isLocalServer();
}
public static float getClientTickRate(){
float tickRate = 20f;
MinecraftClient client = MinecraftClient.getInstance();
if (client.world != null) {
TickManager tickManager = client.world.getTickManager();
Minecraft client = Minecraft.getInstance();
if (client.level != null) {
TickRateManager tickManager = client.level.tickRateManager();
if (!tickManager.isFrozen()){
tickRate = Math.min(tickManager.getTickRate(), 20);
tickRate = Math.min(tickManager.tickrate(), 20);
}
}
return tickRate;
}
public static void playSound(SoundEvent ev){
MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.ui(ev, 1f, 1f));
Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(ev, 1f, 1f));
}
public static int fadeColor(int color1, int color2, double delta) {
int alpha = (int) MathHelper.lerp(delta, (color1 >> 24) & 0xff, (color2 >> 24) & 0xff);
int red = (int) MathHelper.lerp(delta, (color1 >> 16) & 0xff, (color2 >> 16) & 0xff);
int green = (int) MathHelper.lerp(delta, (color1 >> 8) & 0xff, (color2 >> 8) & 0xff);
int blue = (int) MathHelper.lerp(delta, color1 & 0xff, color2 & 0xff);
int alpha = (int) Mth.lerp(delta, (color1 >> 24) & 0xff, (color2 >> 24) & 0xff);
int red = (int) Mth.lerp(delta, (color1 >> 16) & 0xff, (color2 >> 16) & 0xff);
int green = (int) Mth.lerp(delta, (color1 >> 8) & 0xff, (color2 >> 8) & 0xff);
int blue = (int) Mth.lerp(delta, color1 & 0xff, color2 & 0xff);
return (alpha << 24) | (red << 16) | (green << 8) | blue;
}
@@ -2,21 +2,24 @@ package de.shiewk.widgets.widgets;
import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.color.GradientOptions;
import de.shiewk.widgets.widgets.settings.*;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import de.shiewk.widgets.widgets.settings.EnumWidgetSetting;
import de.shiewk.widgets.widgets.settings.GradientWidgetSetting;
import de.shiewk.widgets.widgets.settings.IntSliderWidgetSetting;
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.core.component.DataComponents;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.item.ItemStack;
import java.util.List;
import java.util.Locale;
import static net.minecraft.text.Text.translatable;
import static net.minecraft.network.chat.Component.translatable;
public class ArmorHudWidget extends ResizableWidget {
@@ -39,7 +42,7 @@ public class ArmorHudWidget extends ResizableWidget {
NUMBER,
PERCENT;
public Text getDisplayName() {
public Component getDisplayName() {
return translatable("widgets.widgets.armorHud.durabilityStyle." + name().toLowerCase(Locale.ROOT));
}
}
@@ -56,7 +59,7 @@ public class ArmorHudWidget extends ResizableWidget {
protected GradientOptions backgroundColor, textColor;
@Override
public void renderScaled(DrawContext context, long measuringTimeNano, TextRenderer textRenderer, int posX, int posY) {
public void renderScaled(GuiGraphicsExtractor context, long measuringTimeNano, Font textRenderer, int posX, int posY) {
backgroundColor.fillHorizontal(
context,
measuringTimeNano,
@@ -77,29 +80,29 @@ public class ArmorHudWidget extends ResizableWidget {
}
}
private void renderItem(DrawContext context, long mt, TextRenderer textRenderer, ItemStack stack, int posX, int posY){
context.drawItemWithoutEntity(stack, posX, posY);
context.drawStackOverlay(textRenderer, stack, posX, posY);
private void renderItem(GuiGraphicsExtractor context, long mt, Font textRenderer, ItemStack stack, int posX, int posY){
context.fakeItem(stack, posX, posY);
context.itemDecorations(textRenderer, stack, posX, posY);
if (showDurability){
renderDurability(context, mt, textRenderer, stack, posX, posY);
}
}
private void renderDurability(DrawContext context, long mt, TextRenderer textRenderer, ItemStack stack, int posX, int posY) {
Integer maxDamage = stack.get(DataComponentTypes.MAX_DAMAGE);
private void renderDurability(GuiGraphicsExtractor context, long mt, Font textRenderer, ItemStack stack, int posX, int posY) {
Integer maxDamage = stack.get(DataComponents.MAX_DAMAGE);
if (maxDamage != null) {
int damage = stack.getOrDefault(DataComponentTypes.DAMAGE, 0);
int damage = stack.getOrDefault(DataComponents.DAMAGE, 0);
String text = switch (durabilityStyle){
case NUMBER -> String.valueOf(maxDamage - damage);
case PERCENT -> ((maxDamage - damage) * 100 / maxDamage) + "%";
};
switch (textAlignment){
case RIGHT -> {
int width = textRenderer.getWidth(text);
int width = textRenderer.width(text);
textColor.drawText(context, textRenderer, mt, text, posX + width() - width - padding * 2, posY + 5, true);
}
case CENTER -> {
int width = textRenderer.getWidth(text);
int width = textRenderer.width(text);
textColor.drawText(context, textRenderer, mt, text, posX + ((preferredWidth + padding*2) - width) / 2 + 8, posY + 5, true);
}
case LEFT -> {
@@ -111,25 +114,25 @@ public class ArmorHudWidget extends ResizableWidget {
@Override
public void tick() {
ClientPlayerEntity player = MinecraftClient.getInstance().player;
LocalPlayer player = Minecraft.getInstance().player;
if (player != null) {
PlayerInventory inventory = player.getInventory();
helmet = inventory.getStack(39);
chestplate = inventory.getStack(38);
leggings = inventory.getStack(37);
boots = inventory.getStack(36);
Inventory inventory = player.getInventory();
helmet = inventory.getItem(39);
chestplate = inventory.getItem(38);
leggings = inventory.getItem(37);
boots = inventory.getItem(36);
} else {
helmet = chestplate = leggings = boots = null;
}
}
@Override
public Text getName() {
public Component getName() {
return translatable("widgets.widgets.armorHud");
}
@Override
public Text getDescription() {
public Component getDescription() {
return translatable("widgets.widgets.armorHud.description");
}
@@ -5,16 +5,15 @@ import de.shiewk.widgets.color.GradientOptions;
import de.shiewk.widgets.utils.WidgetUtils;
import de.shiewk.widgets.widgets.settings.EnumWidgetSetting;
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
import net.minecraft.client.MinecraftClient;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.util.profiler.MultiValueDebugSampleLogImpl;
import java.util.List;
import java.util.function.LongFunction;
import net.minecraft.client.Minecraft;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.util.debugchart.LocalSampleLogger;
import static net.minecraft.text.Text.literal;
import static net.minecraft.text.Text.translatable;
import static net.minecraft.network.chat.Component.literal;
import static net.minecraft.network.chat.Component.translatable;
public class BandwidthWidget extends BasicTextWidget {
@@ -48,9 +47,9 @@ public class BandwidthWidget extends BasicTextWidget {
public BandwidthWidget(Identifier id) {
super(id, List.of(
new ToggleWidgetSetting("dynamic_color", Text.translatable("widgets.widgets.bandwidth.dynamicColor"), true),
new ToggleWidgetSetting("hide_in_singleplayer", Text.translatable("widgets.widgets.common.hideInSingleplayer"), false),
new EnumWidgetSetting<>("unit", Text.translatable("widgets.widgets.bandwidth.unit"), Unit.class, Unit.KB, unit -> literal(unit.name)),
new ToggleWidgetSetting("dynamic_color", Component.translatable("widgets.widgets.bandwidth.dynamicColor"), true),
new ToggleWidgetSetting("hide_in_singleplayer", Component.translatable("widgets.widgets.common.hideInSingleplayer"), false),
new EnumWidgetSetting<>("unit", Component.translatable("widgets.widgets.bandwidth.unit"), Unit.class, Unit.KB, unit -> literal(unit.name)),
new ToggleWidgetSetting("fastupdate", translatable("widgets.widgets.bandwidth.fastupdate"), false)
));
getSettings().optionById("textcolor").setShowCondition(() -> !this.dynamicColor);
@@ -70,7 +69,7 @@ public class BandwidthWidget extends BasicTextWidget {
t++;
if (t >= tickRate || fastUpdate){
t = 0;
long avgBytesPerSecond = getAvgBytesPerSecond(MinecraftClient.getInstance(), tickRate);
long avgBytesPerSecond = getAvgBytesPerSecond(Minecraft.getInstance(), tickRate);
formatAndSetRenderText(unit.sizeFormatter.apply(avgBytesPerSecond));
if (this.dynamicColor){
if (avgBytesPerSecond < 100000){
@@ -84,9 +83,9 @@ public class BandwidthWidget extends BasicTextWidget {
}
}
private static long getAvgBytesPerSecond(MinecraftClient client, float tickRate) {
final MultiValueDebugSampleLogImpl packetSizeLog = client.getDebugHud().getPacketSizeLog();
final int logLength = packetSizeLog.getLength();
private static long getAvgBytesPerSecond(Minecraft client, float tickRate) {
final LocalSampleLogger packetSizeLog = client.getDebugOverlay().getBandwidthLogger();
final int logLength = packetSizeLog.size();
final int avgCompileLength = (int) (3 * tickRate);
long size = 0;
for (int i = logLength-1; i > logLength-avgCompileLength; i--) {
@@ -106,12 +105,12 @@ public class BandwidthWidget extends BasicTextWidget {
}
@Override
public Text getName() {
return Text.translatable("widgets.widgets.bandwidth");
public Component getName() {
return Component.translatable("widgets.widgets.bandwidth");
}
@Override
public Text getDescription() {
return Text.translatable("widgets.widgets.bandwidth.description");
public Component getDescription() {
return Component.translatable("widgets.widgets.bandwidth.description");
}
}
@@ -1,21 +1,20 @@
package de.shiewk.widgets.widgets;
import de.shiewk.widgets.color.GradientOptions;
import de.shiewk.widgets.widgets.settings.*;
import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.client.WidgetRenderer;
import de.shiewk.widgets.color.GradientOptions;
import de.shiewk.widgets.widgets.settings.*;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import org.joml.Matrix3x2fStack;
import java.awt.*;
import java.util.List;
import java.util.function.UnaryOperator;
import static net.minecraft.text.Text.*;
import static net.minecraft.network.chat.Component.*;
public abstract class BasicTextWidget extends ResizableWidget {
@@ -30,7 +29,7 @@ public abstract class BasicTextWidget extends ResizableWidget {
this.key = key;
}
public Text displayText(){
public Component displayText(){
return translatable("widgets.widgets.basictext.alignment." + key);
}
}
@@ -41,28 +40,28 @@ public abstract class BasicTextWidget extends ResizableWidget {
PARENTHESES("parentheses", t -> surround("(", t, ")"));
public final String key;
public final UnaryOperator<Text> operator;
public final UnaryOperator<Component> operator;
TextStyle(String key, UnaryOperator<Text> operator) {
TextStyle(String key, UnaryOperator<Component> operator) {
this.key = key;
this.operator = operator;
}
public Text displayText(){
public Component displayText(){
return translatable("widgets.widgets.basictext.style." + key);
}
public static Text surround(String prefix, Text subject, String suffix){
public static Component surround(String prefix, Component subject, String suffix){
return literal(prefix).append(subject).append(literal(suffix));
}
}
protected Text renderText = empty();
protected Component renderText = empty();
protected boolean shouldRender = true;
private float textX = 0;
private float textY = 0;
private int padding = 0;
private TextRenderer renderer = null;
private Font renderer = null;
private boolean textShadow = true;
private static ObjectArrayList<WidgetSettingOption<?>> getCustomSettings(List<WidgetSettingOption<?>> otherCustomOptions) {
@@ -102,11 +101,11 @@ public abstract class BasicTextWidget extends ResizableWidget {
}
@Override
public void renderScaled(DrawContext context, long n, TextRenderer textRenderer, int posX, int posY) {
public void renderScaled(GuiGraphicsExtractor context, long n, Font textRenderer, int posX, int posY) {
if (!shouldRender) return;
renderer = textRenderer;
this.backgroundColor.fillHorizontal(context, n, posX, posY, posX + width(), posY + height());
Matrix3x2fStack matrices = context.getMatrices()
Matrix3x2fStack matrices = context.pose()
.pushMatrix();
matrices.translate(posX + textX, posY + textY, matrices);
this.textColor.drawText(context, textRenderer, n, renderText, 0, 0, textShadow);
@@ -117,7 +116,7 @@ public abstract class BasicTextWidget extends ResizableWidget {
public final void tick() {
tickWidget();
if (renderer != null){
int textWidth = renderer.getWidth(renderText);
int textWidth = renderer.width(renderText);
switch (textAlignment){
case LEFT -> textX = padding;
case CENTER -> {
@@ -138,7 +137,7 @@ public abstract class BasicTextWidget extends ResizableWidget {
}
}
protected void formatAndSetRenderText(Text renderText) {
protected void formatAndSetRenderText(Component renderText) {
if (textStyle != TextStyle.PLAIN){
this.renderText = textStyle.operator.apply(renderText);
} else {
@@ -2,17 +2,16 @@ package de.shiewk.widgets.widgets;
import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.registry.entry.RegistryEntry;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.world.biome.Biome;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.core.Holder;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.world.level.biome.Biome;
import static net.minecraft.text.Text.translatable;
import static net.minecraft.network.chat.Component.translatable;
public class BiomeWidget extends BasicTextWidget {
@@ -28,17 +27,17 @@ public class BiomeWidget extends BasicTextWidget {
@Override
public void tickWidget() {
if (++tickCounter % 20 == 0){
MinecraftClient client = MinecraftClient.getInstance();
ClientPlayerEntity player = client.player;
ClientWorld world = client.world;
Minecraft client = Minecraft.getInstance();
LocalPlayer player = client.player;
ClientLevel world = client.level;
if (world != null && player != null){
RegistryEntry<Biome> biome = world.getBiome(player.getBlockPos());
String text = biome.getKeyOrValue().map(
Holder<Biome> biome = world.getBiome(player.blockPosition());
String text = biome.unwrap().map(
(biomeKey) -> {
if (showLabel){
return translatable("widgets.widgets.biome.label", translatable(biomeKey.getValue().toTranslationKey("biome"))).getString();
return translatable("widgets.widgets.biome.label", translatable(biomeKey.identifier().toLanguageKey("biome"))).getString();
} else {
return translatable(biomeKey.getValue().toTranslationKey("biome")).getString();
return translatable(biomeKey.identifier().toLanguageKey("biome")).getString();
}
},
(b) -> "[unregistered " + b + "]"
@@ -55,12 +54,12 @@ public class BiomeWidget extends BasicTextWidget {
}
@Override
public Text getName() {
public Component getName() {
return translatable("widgets.widgets.biome");
}
@Override
public Text getDescription() {
public Component getDescription() {
return translatable("widgets.widgets.biome.description");
}
@@ -4,21 +4,21 @@ import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.widgets.settings.EnumWidgetSetting;
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.util.Util;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import static net.minecraft.text.Text.literal;
import static net.minecraft.text.Text.translatable;
import static net.minecraft.network.chat.Component.literal;
import static net.minecraft.network.chat.Component.translatable;
public class CPSWidget extends BasicTextWidget {
public static class Click {
public int ticks = 0;
public final long expiresAt = Util.getMeasuringTimeMs() + 1000;
public final long expiresAt = Util.getMillis() + 1000;
@Deprecated(forRemoval = true, since = "1.2.1")
public int tick(){
@@ -92,7 +92,7 @@ public class CPSWidget extends BasicTextWidget {
int left = 0;
int right = 0;
int middle = 0;
long mtime = Util.getMeasuringTimeMs();
long mtime = Util.getMillis();
if (countLeftClicks) {
leftClicks.removeIf(click -> click.expiresAt <= mtime);
left = leftClicks.size();
@@ -149,12 +149,12 @@ public class CPSWidget extends BasicTextWidget {
}
@Override
public Text getName() {
public Component getName() {
return translatable("widgets.widgets.cps");
}
@Override
public Text getDescription() {
public Component getDescription() {
return translatable("widgets.widgets.cps.description");
}
}
@@ -4,13 +4,12 @@ import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.widgets.settings.EnumWidgetSetting;
import de.shiewk.widgets.widgets.settings.IntSliderWidgetSetting;
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.util.Date;
import java.util.List;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
public class ClockWidget extends BasicTextWidget {
@@ -25,8 +24,8 @@ public class ClockWidget extends BasicTextWidget {
this.key = key;
}
public Text getName() {
return Text.translatable("widgets.widgets.clock.hourFormat."+key);
public Component getName() {
return Component.translatable("widgets.widgets.clock.hourFormat."+key);
}
}
@@ -51,8 +50,8 @@ public class ClockWidget extends BasicTextWidget {
this.format = format;
}
public Text getName(){
return this.format == null ? Text.translatable("widgets.widgets.clock.dateFormat.none") : Text.of(new SimpleDateFormat(format).format(Date.from(Instant.now())));
public Component getName(){
return this.format == null ? Component.translatable("widgets.widgets.clock.dateFormat.none") : Component.nullToEmpty(new SimpleDateFormat(format).format(Date.from(Instant.now())));
}
}
@@ -67,27 +66,27 @@ public class ClockWidget extends BasicTextWidget {
this.format = format;
}
public Text getName(){
return this.format == null ? Text.translatable("widgets.widgets.clock.weekFormat.none") : Text.of(new SimpleDateFormat(format).format(Date.from(Instant.now())));
public Component getName(){
return this.format == null ? Component.translatable("widgets.widgets.clock.weekFormat.none") : Component.nullToEmpty(new SimpleDateFormat(format).format(Date.from(Instant.now())));
}
}
public ClockWidget(Identifier id) {
super(id, List.of(
new EnumWidgetSetting<>("hour_format",
Text.translatable("widgets.widgets.clock.hourFormat"),
Component.translatable("widgets.widgets.clock.hourFormat"),
TimeOption.class,
TimeOption.HOUR_24,
TimeOption::getName),
new ToggleWidgetSetting("show_seconds",
Text.translatable("widgets.widgets.clock.showSeconds"),
Component.translatable("widgets.widgets.clock.showSeconds"),
true),
new EnumWidgetSetting<>("date_format",
Text.translatable("widgets.widgets.clock.dateFormat"),
Component.translatable("widgets.widgets.clock.dateFormat"),
DateOption.class,
DateOption.NO_DATE,
DateOption::getName),
new EnumWidgetSetting<>("week_format",
Text.translatable("widgets.widgets.clock.weekFormat"),
Component.translatable("widgets.widgets.clock.weekFormat"),
WeekOption.class,
WeekOption.NO_DAY_OF_WEEK,
WeekOption::getName)
@@ -135,12 +134,12 @@ public class ClockWidget extends BasicTextWidget {
}
@Override
public Text getName() {
return Text.translatable("widgets.widgets.clock");
public Component getName() {
return Component.translatable("widgets.widgets.clock");
}
@Override
public Text getDescription() {
return Text.translatable("widgets.widgets.clock.description");
public Component getDescription() {
return Component.translatable("widgets.widgets.clock.description");
}
}
@@ -4,20 +4,20 @@ import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.widgets.settings.IntSliderWidgetSetting;
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
import net.fabricmc.fabric.api.event.player.AttackEntityCallback;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.text.Text;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.Identifier;
import net.minecraft.util.hit.EntityHitResult;
import net.minecraft.world.World;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.EntityHitResult;
import org.jetbrains.annotations.Nullable;
import org.jspecify.annotations.NonNull;
import java.util.List;
import static net.minecraft.text.Text.translatable;
import static net.minecraft.network.chat.Component.translatable;
public class ComboWidget extends BasicTextWidget implements AttackEntityCallback {
@@ -40,9 +40,9 @@ public class ComboWidget extends BasicTextWidget implements AttackEntityCallback
private int displayThreshold = 0;
@Override
public @NonNull ActionResult interact(@NonNull PlayerEntity playerEntity, @NonNull World world, @NonNull Hand hand, Entity entity, @Nullable EntityHitResult entityHitResult) {
public @NonNull InteractionResult interact(@NonNull Player playerEntity, @NonNull Level world, @NonNull InteractionHand hand, Entity entity, @Nullable EntityHitResult entityHitResult) {
clientHitEntity(entity.getId());
return ActionResult.PASS;
return InteractionResult.PASS;
}
private void clientHitEntity(int targetEntityId) {
@@ -94,12 +94,12 @@ public class ComboWidget extends BasicTextWidget implements AttackEntityCallback
}
@Override
public Text getName() {
public Component getName() {
return translatable("widgets.widgets.combo");
}
@Override
public Text getDescription() {
public Component getDescription() {
return translatable("widgets.widgets.combo.description");
}
@@ -3,17 +3,16 @@ package de.shiewk.widgets.widgets;
import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.color.GradientOptions;
import de.shiewk.widgets.widgets.settings.*;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import java.awt.*;
import java.util.List;
import static net.minecraft.text.Text.translatable;
import static net.minecraft.network.chat.Component.translatable;
public class CoordinatesWidget extends ResizableWidget {
public CoordinatesWidget(Identifier id) {
@@ -71,7 +70,7 @@ public class CoordinatesWidget extends ResizableWidget {
protected DirectionWidget.DisplayFormat directionFormat;
@Override
public void renderScaled(DrawContext context, long mt, TextRenderer textRenderer, int posX, int posY) {
public void renderScaled(GuiGraphicsExtractor context, long mt, Font textRenderer, int posX, int posY) {
this.backgroundColor.fillHorizontal(context, mt, posX, posY, posX + width(), posY + height());
int y = this.paddingY + 1;
if (showX){
@@ -97,8 +96,8 @@ public class CoordinatesWidget extends ResizableWidget {
@Override
public void tick() {
final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
final ClientPlayerEntity player = MinecraftClient.getInstance().player;
final Font textRenderer = Minecraft.getInstance().font;
final LocalPlayer player = Minecraft.getInstance().player;
if (hideCoordinates){
textX = textHiddenX;
textY = textHiddenY;
@@ -114,19 +113,19 @@ public class CoordinatesWidget extends ResizableWidget {
}
textDirection = directionFormat.format().getString();
txc = width() - textRenderer.getWidth(textX) - paddingX;
tyc = width() - textRenderer.getWidth(textY) - paddingX;
tzc = width() - textRenderer.getWidth(textZ) - paddingX;
tdc = width() - textRenderer.getWidth(textDirection) - paddingX;
txc = width() - textRenderer.width(textX) - paddingX;
tyc = width() - textRenderer.width(textY) - paddingX;
tzc = width() - textRenderer.width(textZ) - paddingX;
tdc = width() - textRenderer.width(textDirection) - paddingX;
}
@Override
public Text getName() {
public Component getName() {
return translatable("widgets.widgets.coordinates");
}
@Override
public Text getDescription() {
public Component getDescription() {
return translatable("widgets.widgets.coordinates.description");
}
@@ -5,19 +5,18 @@ import de.shiewk.widgets.utils.WidgetUtils;
import de.shiewk.widgets.widgets.settings.EnumWidgetSetting;
import de.shiewk.widgets.widgets.settings.IntSliderWidgetSetting;
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.MathHelper;
import java.util.List;
import java.util.Locale;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.util.Mth;
import static net.minecraft.text.Text.literal;
import static net.minecraft.text.Text.translatable;
import static net.minecraft.network.chat.Component.literal;
import static net.minecraft.network.chat.Component.translatable;
public class DirectionWidget extends BasicTextWidget {
@@ -36,13 +35,13 @@ public class DirectionWidget extends BasicTextWidget {
this.showsYaw = showsYaw;
}
public Text format(int digits) {
public Component format(int digits) {
String yaw = "0";
String direction = "unknown";
ClientPlayerEntity player = MinecraftClient.getInstance().player;
LocalPlayer player = Minecraft.getInstance().player;
if (player != null) {
yaw = WidgetUtils.reduceDigits(MathHelper.wrapDegrees(player.getYaw()), digits);
direction = player.getHorizontalFacing().name().toLowerCase(Locale.ROOT);
yaw = WidgetUtils.reduceDigits(Mth.wrapDegrees(player.getYRot()), digits);
direction = player.getDirection().name().toLowerCase(Locale.ROOT);
}
return switch (this){
case YAW_ONLY -> literal(yaw);
@@ -55,7 +54,7 @@ public class DirectionWidget extends BasicTextWidget {
};
}
public Text format(){
public Component format(){
return format(1);
}
}
@@ -85,7 +84,7 @@ public class DirectionWidget extends BasicTextWidget {
}
@Override
public void renderScaled(DrawContext context, long n, TextRenderer textRenderer, int posX, int posY) {
public void renderScaled(GuiGraphicsExtractor context, long n, Font textRenderer, int posX, int posY) {
if (realtime) refresh();
super.renderScaled(context, n, textRenderer, posX, posY);
}
@@ -95,12 +94,12 @@ public class DirectionWidget extends BasicTextWidget {
}
@Override
public Text getName() {
public Component getName() {
return translatable("widgets.widgets.direction");
}
@Override
public Text getDescription() {
public Component getDescription() {
return translatable("widgets.widgets.direction.description");
}
@@ -2,16 +2,15 @@ package de.shiewk.widgets.widgets;
import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
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;
import java.util.LinkedList;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import static net.minecraft.text.Text.translatable;
import static net.minecraft.network.chat.Component.translatable;
public class FPSWidget extends BasicTextWidget {
@@ -25,7 +24,7 @@ public class FPSWidget extends BasicTextWidget {
}
@Override
public void renderScaled(DrawContext context, long n, TextRenderer textRenderer, int posX, int posY) {
public void renderScaled(GuiGraphicsExtractor context, long n, Font textRenderer, int posX, int posY) {
if (realtime){
timedFrames.add(n);
while (timedFrames.getFirst() < n - 500_000_100L){
@@ -39,17 +38,17 @@ public class FPSWidget extends BasicTextWidget {
@Override
public void tickWidget() {
if (!realtime){
formatAndSetRenderText(MinecraftClient.getInstance().getCurrentFps() + " FPS");
formatAndSetRenderText(Minecraft.getInstance().getFps() + " FPS");
}
}
@Override
public Text getName() {
public Component getName() {
return translatable("widgets.widgets.fps");
}
@Override
public Text getDescription() {
public Component getDescription() {
return translatable("widgets.widgets.fps.description");
}
@@ -2,26 +2,28 @@ package de.shiewk.widgets.widgets;
import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.color.GradientOptions;
import de.shiewk.widgets.widgets.settings.*;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gl.RenderPipelines;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import de.shiewk.widgets.widgets.settings.EnumWidgetSetting;
import de.shiewk.widgets.widgets.settings.GradientWidgetSetting;
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.client.renderer.RenderPipelines;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.item.ItemStack;
import java.util.List;
import java.util.Locale;
import static net.minecraft.text.Text.translatable;
import static net.minecraft.network.chat.Component.translatable;
public class InventoryWidget extends ResizableWidget {
private static final Identifier VANILLA_INVENTORY = Identifier.of("widgets", "textures/vanilla_inventory.png");
private static final Identifier TEXTURE_PACK_INVENTORY = Identifier.ofVanilla("textures/gui/container/inventory.png");
private static final Identifier VANILLA_INVENTORY = Identifier.fromNamespaceAndPath("widgets", "textures/vanilla_inventory.png");
private static final Identifier TEXTURE_PACK_INVENTORY = Identifier.withDefaultNamespace("textures/gui/container/inventory.png");
public enum InventoryMode {
VANILLA,
@@ -40,7 +42,7 @@ public class InventoryWidget extends ResizableWidget {
this.canDisableHotbar = canDisableHotbar;
}
public Text display() {
public Component display() {
return translatable("widgets.widgets.inventory.mode." + name().toLowerCase(Locale.ROOT));
}
}
@@ -58,13 +60,13 @@ public class InventoryWidget extends ResizableWidget {
}
private InventoryMode mode = InventoryMode.TEXTURE_PACK;
private PlayerInventory inventory;
private Inventory inventory;
private GradientOptions gridColor, boxColor;
private boolean showHotbar = false;
@Override
public void renderScaled(DrawContext context, long measuringTimeNano, TextRenderer textRenderer, int posX, int posY) {
public void renderScaled(GuiGraphicsExtractor context, long measuringTimeNano, Font textRenderer, int posX, int posY) {
drawBackground(context, measuringTimeNano, posX, posY);
if (inventory != null){
drawItems(context, textRenderer, switch (mode){
@@ -79,15 +81,15 @@ public class InventoryWidget extends ResizableWidget {
}
}
private void drawBackground(DrawContext context, long mt, int posX, int posY) {
private void drawBackground(GuiGraphicsExtractor context, long mt, int posX, int posY) {
switch (mode){
case VANILLA -> context.drawTexture(RenderPipelines.GUI_TEXTURED, VANILLA_INVENTORY, posX, posY, 0, 0, 176, 91, 176, 91);
case VANILLA -> context.blit(RenderPipelines.GUI_TEXTURED, VANILLA_INVENTORY, posX, posY, 0, 0, 176, 91, 176, 91);
case TEXTURE_PACK -> {
context.enableScissor(posX, posY, posX + width(), posY + 6);
context.drawTexture(RenderPipelines.GUI_TEXTURED, TEXTURE_PACK_INVENTORY, posX, posY, 0, 0, 256, 256, 256, 256);
context.blit(RenderPipelines.GUI_TEXTURED, TEXTURE_PACK_INVENTORY, posX, posY, 0, 0, 256, 256, 256, 256);
context.disableScissor();
context.enableScissor(posX, posY + 6, posX + width(), posY + height());
context.drawTexture(RenderPipelines.GUI_TEXTURED, TEXTURE_PACK_INVENTORY, posX, posY - 75, 0, 0, 256, 256, 256, 256);
context.blit(RenderPipelines.GUI_TEXTURED, TEXTURE_PACK_INVENTORY, posX, posY - 75, 0, 0, 256, 256, 256, 256);
context.disableScissor();
}
case GRID -> {
@@ -127,40 +129,39 @@ public class InventoryWidget extends ResizableWidget {
}
}
private void drawItems(DrawContext context, TextRenderer textRenderer, int posX, int posY) {
private void drawItems(GuiGraphicsExtractor context, Font textRenderer, int posX, int posY) {
for (int ry = 0; ry < 4; ry++) {
if (ry == 0 && !showHotbar) continue;
for (int rx = 0; rx < 9; rx++) {
int slot = ry * 9 + rx;
ItemStack stack = inventory.getStack(slot);
ItemStack stack = inventory.getItem(slot);
if (stack.isEmpty()) continue;
int itemY = ry == 0 ? posY + 58 : posY + (ry-1) * 18;
int itemX = posX + rx * 18;
context.drawItem(stack, itemX, itemY);
context.drawStackOverlay(textRenderer, stack, itemX, itemY);
context.item(stack, itemX, itemY);
context.itemDecorations(textRenderer, stack, itemX, itemY);
}
}
}
@Override
public void tick() {
ClientPlayerEntity player = MinecraftClient.getInstance().player;
LocalPlayer player = Minecraft.getInstance().player;
if (player != null) {
PlayerInventory clientPlayerEntityInventory = player.getInventory();
if (clientPlayerEntityInventory != null) inventory = clientPlayerEntityInventory;
inventory = player.getInventory();
}
}
@Override
public Text getName() {
public Component getName() {
return translatable("widgets.widgets.inventory");
}
@Override
public Text getDescription() {
public Component getDescription() {
return translatable("widgets.widgets.inventory.description");
}
@@ -4,12 +4,12 @@ import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.color.GradientOptions;
import de.shiewk.widgets.widgets.settings.GradientWidgetSetting;
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.util.Util;
import java.util.List;
@@ -18,11 +18,11 @@ import java.util.Objects;
public class KeyStrokesWidget extends ResizableWidget {
public KeyStrokesWidget(Identifier id) {
super(id, List.of(
new ToggleWidgetSetting("showjump", Text.translatable("widgets.widgets.keystrokes.showJumpKey"), true),
new GradientWidgetSetting("bgpressed", Text.translatable("widgets.widgets.keystrokes.colorBackgroundPressed"), 0x50ffffff),
new GradientWidgetSetting("bgunpressed", Text.translatable("widgets.widgets.keystrokes.colorBackgroundUnpressed"), 0x50000000),
new GradientWidgetSetting("keypressed", Text.translatable("widgets.widgets.keystrokes.colorKeyPressed"), 0xffffffff),
new GradientWidgetSetting("keyunpressed", Text.translatable("widgets.widgets.keystrokes.colorKeyUnpressed"), 0xffffffff)
new ToggleWidgetSetting("showjump", Component.translatable("widgets.widgets.keystrokes.showJumpKey"), true),
new GradientWidgetSetting("bgpressed", Component.translatable("widgets.widgets.keystrokes.colorBackgroundPressed"), 0x50ffffff),
new GradientWidgetSetting("bgunpressed", Component.translatable("widgets.widgets.keystrokes.colorBackgroundUnpressed"), 0x50000000),
new GradientWidgetSetting("keypressed", Component.translatable("widgets.widgets.keystrokes.colorKeyPressed"), 0xffffffff),
new GradientWidgetSetting("keyunpressed", Component.translatable("widgets.widgets.keystrokes.colorKeyUnpressed"), 0xffffffff)
));
}
@@ -30,11 +30,11 @@ public class KeyStrokesWidget extends ResizableWidget {
private boolean showJumpKey = true;
protected static class Key {
protected final KeyBinding binding;
protected final KeyMapping binding;
protected boolean isPressed;
protected long lastChanged;
private Key(KeyBinding binding) {
private Key(KeyMapping binding) {
Objects.requireNonNull(binding);
this.binding = binding;
}
@@ -44,7 +44,7 @@ public class KeyStrokesWidget extends ResizableWidget {
protected String boundToKey;
protected int boundToLength;
private KeyLarge(KeyBinding binding) {
private KeyLarge(KeyMapping binding) {
super(binding);
}
}
@@ -53,7 +53,7 @@ public class KeyStrokesWidget extends ResizableWidget {
private Key KEY_JUMP;
@Override
public void renderScaled(DrawContext context, long measuringTimeNano, TextRenderer textRenderer, int posX, int posY) {
public void renderScaled(GuiGraphicsExtractor context, long measuringTimeNano, Font textRenderer, int posX, int posY) {
if (KEY_JUMP == null) return;
renderKeyStroke(context, textRenderer, measuringTimeNano, posX + 22, posY, KEY_FWD);
renderKeyStroke(context, textRenderer, measuringTimeNano, posX, posY + 22, KEY_LEFT);
@@ -62,7 +62,7 @@ public class KeyStrokesWidget extends ResizableWidget {
if (showJumpKey) renderSpaceBar(context, measuringTimeNano, posX, posY + 44, KEY_JUMP);
}
protected void renderSpaceBar(final DrawContext context, long mt, int posX, int posY, Key key){
protected void renderSpaceBar(final GuiGraphicsExtractor context, long mt, int posX, int posY, Key key){
long l = mt - key.lastChanged;
if (l < 100000000){
double alpha = 0.00000001d * l;
@@ -74,7 +74,7 @@ public class KeyStrokesWidget extends ResizableWidget {
(key.isPressed ? colorKeyPressed : colorKeyUnpressed).fillHorizontal(context, mt, posX + 5, posY + 4, posX + 59, posY + 5);
}
protected void renderKeyStroke(DrawContext context, TextRenderer textRenderer, long mt, int posX, int posY, KeyLarge key){
protected void renderKeyStroke(GuiGraphicsExtractor context, Font textRenderer, long mt, int posX, int posY, KeyLarge key){
long l = mt - key.lastChanged;
if (l < 100000000){
double alpha = 0.00000001d * l;
@@ -88,43 +88,43 @@ public class KeyStrokesWidget extends ResizableWidget {
@Override
public void tick() {
if (KEY_FWD == null) KEY_FWD = new KeyLarge(MinecraftClient.getInstance().options.forwardKey);
if (KEY_BWD == null) KEY_BWD = new KeyLarge(MinecraftClient.getInstance().options.backKey);
if (KEY_LEFT == null) KEY_LEFT = new KeyLarge(MinecraftClient.getInstance().options.leftKey);
if (KEY_RIGHT == null) KEY_RIGHT = new KeyLarge(MinecraftClient.getInstance().options.rightKey);
if (KEY_JUMP == null) KEY_JUMP = new Key(MinecraftClient.getInstance().options.jumpKey);
TextRenderer renderer = MinecraftClient.getInstance().textRenderer;
if (KEY_FWD == null) KEY_FWD = new KeyLarge(Minecraft.getInstance().options.keyUp);
if (KEY_BWD == null) KEY_BWD = new KeyLarge(Minecraft.getInstance().options.keyDown);
if (KEY_LEFT == null) KEY_LEFT = new KeyLarge(Minecraft.getInstance().options.keyLeft);
if (KEY_RIGHT == null) KEY_RIGHT = new KeyLarge(Minecraft.getInstance().options.keyRight);
if (KEY_JUMP == null) KEY_JUMP = new Key(Minecraft.getInstance().options.keyJump);
Font renderer = Minecraft.getInstance().font;
for (Key key : new Key[]{KEY_FWD, KEY_BWD, KEY_LEFT, KEY_RIGHT, KEY_JUMP}){
if (key instanceof KeyLarge keyLarge){
keyLarge.boundToKey = getKeyName(key);
keyLarge.boundToLength = renderer.getWidth(keyLarge.boundToKey);
keyLarge.boundToLength = renderer.width(keyLarge.boundToKey);
}
final boolean pressed = key.binding.isPressed();
final boolean pressed = key.binding.isDown();
if (pressed != key.isPressed){
key.isPressed = pressed;
key.lastChanged = Util.getMeasuringTimeNano();
key.lastChanged = Util.getNanos();
}
}
}
private static String getKeyName(Key key) {
return switch (key.binding.getBoundKeyTranslationKey()) {
return switch (key.binding.saveString()) {
case "key.keyboard.up" -> "\u2191";
case "key.keyboard.down" -> "\u2193";
case "key.keyboard.left" -> "\u2190";
case "key.keyboard.right" -> "\u2192";
default -> key.binding.getBoundKeyLocalizedText().getString();
default -> key.binding.getTranslatedKeyMessage().getString();
};
}
@Override
public Text getName() {
return Text.translatable("widgets.widgets.keystrokes");
public Component getName() {
return Component.translatable("widgets.widgets.keystrokes");
}
@Override
public Text getDescription() {
return Text.translatable("widgets.widgets.keystrokes.description");
public Component getDescription() {
return Component.translatable("widgets.widgets.keystrokes.description");
}
@Override
@@ -2,14 +2,13 @@ package de.shiewk.widgets.widgets;
import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import java.util.List;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import static net.minecraft.text.Text.translatable;
import static net.minecraft.network.chat.Component.translatable;
public class MemoryUsageWidget extends BasicTextWidget {
@@ -26,7 +25,7 @@ public class MemoryUsageWidget extends BasicTextWidget {
}
@Override
public void renderScaled(DrawContext context, long n, TextRenderer textRenderer, int posX, int posY) {
public void renderScaled(GuiGraphicsExtractor context, long n, Font textRenderer, int posX, int posY) {
if (realtime) refresh();
super.renderScaled(context, n, textRenderer, posX, posY);
}
@@ -58,12 +57,12 @@ public class MemoryUsageWidget extends BasicTextWidget {
}
@Override
public Text getName() {
public Component getName() {
return translatable("widgets.widgets.memory");
}
@Override
public Text getDescription() {
public Component getDescription() {
return translatable("widgets.widgets.memory.description");
}
@@ -4,21 +4,20 @@ import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.color.GradientOptions;
import de.shiewk.widgets.utils.WidgetUtils;
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientPacketListener;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.util.Util;
import net.minecraft.util.profiler.MultiValueDebugSampleLogImpl;
import net.minecraft.util.debugchart.LocalSampleLogger;
import java.util.List;
public class PingWidget extends BasicTextWidget {
public PingWidget(Identifier id) {
super(id, List.of(
new ToggleWidgetSetting("dynamic_color", Text.translatable("widgets.widgets.ping.dynamicColor"), true),
new ToggleWidgetSetting("hide_in_singleplayer", Text.translatable("widgets.widgets.common.hideInSingleplayer"), false)
new ToggleWidgetSetting("dynamic_color", Component.translatable("widgets.widgets.ping.dynamicColor"), true),
new ToggleWidgetSetting("hide_in_singleplayer", Component.translatable("widgets.widgets.common.hideInSingleplayer"), false)
));
getSettings().optionById("textcolor").setShowCondition(() -> !this.dynamicColor);
}
@@ -32,14 +31,14 @@ public class PingWidget extends BasicTextWidget {
public void tickWidget() {
shouldRender = !(hideInSingleplayer && WidgetUtils.isInSingleplayer());
if (!shouldRender) return;
final ClientPlayNetworkHandler networkHandler = MinecraftClient.getInstance().getNetworkHandler();
final ClientPacketListener networkHandler = Minecraft.getInstance().getConnection();
if (networkHandler != null){
if (lastPingQuery < Util.getMeasuringTimeMs() - 5000){
networkHandler.pingMeasurer.ping();
lastPingQuery = Util.getMeasuringTimeMs();
if (lastPingQuery < Util.getMillis() - 5000){
networkHandler.pingDebugMonitor.tick();
lastPingQuery = Util.getMillis();
}
final MultiValueDebugSampleLogImpl pingLog = networkHandler.pingMeasurer.log;
final int logLength = pingLog.getLength();
final LocalSampleLogger pingLog = networkHandler.pingDebugMonitor.delayTimer;
final int logLength = pingLog.size();
final int avgCompileLength = 3;
long ping = 0;
int valuesRead = 0;
@@ -75,12 +74,12 @@ public class PingWidget extends BasicTextWidget {
}
@Override
public Text getName() {
return Text.translatable("widgets.widgets.ping");
public Component getName() {
return Component.translatable("widgets.widgets.ping");
}
@Override
public Text getDescription() {
return Text.translatable("widgets.widgets.ping.description");
public Component getDescription() {
return Component.translatable("widgets.widgets.ping.description");
}
}
@@ -2,15 +2,14 @@ package de.shiewk.widgets.widgets;
import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.widgets.settings.TextFieldWidgetSettingOption;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import java.util.List;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
public class PlainTextWidget extends BasicTextWidget {
public PlainTextWidget(Identifier id) {
super(id, List.of(
new TextFieldWidgetSettingOption("text", Text.translatable("widgets.widgets.plaintext.text"), Text.translatable("widgets.widgets.plaintext.initial"), Text.translatable("widgets.widgets.plaintext.placeholder"), true, 200)
new TextFieldWidgetSettingOption("text", Component.translatable("widgets.widgets.plaintext.text"), Component.translatable("widgets.widgets.plaintext.initial"), Component.translatable("widgets.widgets.plaintext.placeholder"), true, 200)
));
}
@@ -18,13 +17,13 @@ public class PlainTextWidget extends BasicTextWidget {
public void tickWidget() {}
@Override
public Text getName() {
return Text.translatable("widgets.widgets.plaintext");
public Component getName() {
return Component.translatable("widgets.widgets.plaintext");
}
@Override
public Text getDescription() {
return Text.translatable("widgets.widgets.plaintext.description");
public Component getDescription() {
return Component.translatable("widgets.widgets.plaintext.description");
}
@Override
@@ -2,13 +2,12 @@ package de.shiewk.widgets.widgets;
import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.widgets.settings.EnumWidgetSetting;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import java.util.List;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import static net.minecraft.text.Text.literal;
import static net.minecraft.text.Text.translatable;
import static net.minecraft.network.chat.Component.literal;
import static net.minecraft.network.chat.Component.translatable;
public class PlayTimeWidget extends BasicTextWidget {
@@ -61,12 +60,12 @@ public class PlayTimeWidget extends BasicTextWidget {
}
@Override
public Text getName() {
public Component getName() {
return translatable("widgets.widgets.playtime");
}
@Override
public Text getDescription() {
public Component getDescription() {
return translatable("widgets.widgets.playtime.description");
}
@@ -3,15 +3,14 @@ package de.shiewk.widgets.widgets;
import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.utils.WidgetUtils;
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientPacketListener;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import static net.minecraft.text.Text.literal;
import static net.minecraft.text.Text.translatable;
import static net.minecraft.network.chat.Component.literal;
import static net.minecraft.network.chat.Component.translatable;
public class PlayerCountWidget extends BasicTextWidget{
public PlayerCountWidget(Identifier id) {
@@ -28,18 +27,18 @@ public class PlayerCountWidget extends BasicTextWidget{
public void tickWidget() {
shouldRender = !(hideInSingleplayer && WidgetUtils.isInSingleplayer());
if (!shouldRender) return;
final ClientPlayNetworkHandler networkHandler = MinecraftClient.getInstance().getNetworkHandler();
String online = networkHandler == null ? "?" : String.valueOf(networkHandler.getListedPlayerListEntries().size());
final ClientPacketListener networkHandler = Minecraft.getInstance().getConnection();
String online = networkHandler == null ? "?" : String.valueOf(networkHandler.getListedOnlinePlayers().size());
formatAndSetRenderText(showLabel ? literal(translatable("widgets.widgets.playerCount.online", online).getString()) : literal(online));
}
@Override
public Text getName() {
public Component getName() {
return translatable("widgets.widgets.playerCount");
}
@Override
public Text getDescription() {
public Component getDescription() {
return translatable("widgets.widgets.playerCount.description");
}
@@ -4,14 +4,14 @@ import de.shiewk.widgets.ModWidget;
import de.shiewk.widgets.widgets.settings.WidgetSettingOption;
import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.widgets.settings.IntSliderWidgetSetting;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import org.joml.Matrix3x2fStack;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
public abstract class ResizableWidget extends ModWidget {
@@ -21,25 +21,25 @@ public abstract class ResizableWidget extends ModWidget {
private static List<WidgetSettingOption<?>> addScaleSetting(List<WidgetSettingOption<?>> target) {
ArrayList<WidgetSettingOption<?>> settings = new ArrayList<>(target);
settings.add(new IntSliderWidgetSetting("size", Text.translatable("widgets.widgets.common.sizePercent"), 25, 100, 400));
settings.add(new IntSliderWidgetSetting("size", Component.translatable("widgets.widgets.common.sizePercent"), 25, 100, 400));
return settings;
}
protected float size = 1f;
@Override
public final void render(DrawContext context, long measuringTimeNano, TextRenderer textRenderer, int posX, int posY) {
public final void render(GuiGraphicsExtractor context, long measuringTimeNano, Font textRenderer, int posX, int posY) {
if (size != 1f){
Matrix3x2fStack matrices = context.getMatrices();
Matrix3x2fStack matrices = context.pose();
matrices.pushMatrix();
matrices.translate(-(size-1) * posX, -(size-1) * posY, matrices);
matrices.scale(size, size, matrices);
}
this.renderScaled(context, measuringTimeNano, textRenderer, posX, posY);
if (size != 1f) context.getMatrices().popMatrix();
if (size != 1f) context.pose().popMatrix();
}
public abstract void renderScaled(DrawContext context, long measuringTimeNano, TextRenderer textRenderer, int posX, int posY);
public abstract void renderScaled(GuiGraphicsExtractor context, long measuringTimeNano, Font textRenderer, int posX, int posY);
@Override
public void onSettingsChanged(WidgetSettings settings) {
@@ -3,14 +3,13 @@ package de.shiewk.widgets.widgets;
import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.utils.WidgetUtils;
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ServerInfo;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import static net.minecraft.text.Text.translatable;
import static net.minecraft.network.chat.Component.translatable;
public class ServerIPWidget extends BasicTextWidget {
public ServerIPWidget(Identifier id) {
@@ -31,16 +30,16 @@ public class ServerIPWidget extends BasicTextWidget {
public void tickWidget() {
shouldRender = !(this.hideInSingleplayer && WidgetUtils.isInSingleplayer());
if (!shouldRender) return;
final ServerInfo serverEntry = MinecraftClient.getInstance().getCurrentServerEntry();
final ServerData serverEntry = Minecraft.getInstance().getCurrentServer();
if (serverEntry != null){
formatAndSetRenderText(serverEntry.address);
formatAndSetRenderText(serverEntry.ip);
} else {
formatAndSetRenderText(translatable("menu.singleplayer"));
}
t++;
if (dynamicWidth && t >= 20){
t = 0;
this.width = MinecraftClient.getInstance().textRenderer.getWidth(this.renderText) + 20;
this.width = Minecraft.getInstance().font.width(this.renderText) + 20;
}
}
@@ -50,12 +49,12 @@ public class ServerIPWidget extends BasicTextWidget {
}
@Override
public Text getName() {
public Component getName() {
return translatable("widgets.widgets.serverIP");
}
@Override
public Text getDescription() {
public Component getDescription() {
return translatable("widgets.widgets.serverIP.description");
}
@@ -5,13 +5,12 @@ import de.shiewk.widgets.utils.WidgetUtils;
import de.shiewk.widgets.widgets.settings.EnumWidgetSetting;
import de.shiewk.widgets.widgets.settings.IntSliderWidgetSetting;
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.Vec3d;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.world.phys.Vec3;
import static de.shiewk.widgets.utils.WidgetUtils.reduceDigits;
@@ -33,16 +32,16 @@ public class SpeedWidget extends BasicTextWidget {
super(id, List.of(
new EnumWidgetSetting<>(
"unit",
Text.translatable("widgets.widgets.speed.unit"),
Component.translatable("widgets.widgets.speed.unit"),
Unit.class,
Unit.METERS_PER_SECOND,
unit -> Text.of(unit.displayName)
unit -> Component.nullToEmpty(unit.displayName)
),
new ToggleWidgetSetting("with_x", Text.translatable("widgets.widgets.speed.withX"), true),
new ToggleWidgetSetting("with_y", Text.translatable("widgets.widgets.speed.withY"), false),
new ToggleWidgetSetting("with_z", Text.translatable("widgets.widgets.speed.withZ"), true),
new IntSliderWidgetSetting("digits", Text.translatable("widgets.widgets.speed.digits"), 0, 1, 3),
new IntSliderWidgetSetting("window_size", Text.translatable("widgets.widgets.speed.windowSize"), 3, 10, 60)
new ToggleWidgetSetting("with_x", Component.translatable("widgets.widgets.speed.withX"), true),
new ToggleWidgetSetting("with_y", Component.translatable("widgets.widgets.speed.withY"), false),
new ToggleWidgetSetting("with_z", Component.translatable("widgets.widgets.speed.withZ"), true),
new IntSliderWidgetSetting("digits", Component.translatable("widgets.widgets.speed.digits"), 0, 1, 3),
new IntSliderWidgetSetting("window_size", Component.translatable("widgets.widgets.speed.windowSize"), 3, 10, 60)
));
}
@@ -54,19 +53,19 @@ public class SpeedWidget extends BasicTextWidget {
private double[] averagingWindow = new double[10];
private int windowPointer = 0;
private Vec3d lastPos = new Vec3d(0, 0, 0);
private Vec3 lastPos = new Vec3(0, 0, 0);
@Override
public void tickWidget() {
ClientPlayerEntity player = MinecraftClient.getInstance().player;
LocalPlayer player = Minecraft.getInstance().player;
if (player != null) {
Vec3d lastPos = this.lastPos;
Vec3d newPos = this.lastPos = player.getEntityPos();
Vec3d velocity = lastPos.subtract(newPos);
Vec3 lastPos = this.lastPos;
Vec3 newPos = this.lastPos = player.position();
Vec3 velocity = lastPos.subtract(newPos);
double rt = 0;
if (withXVelocity) rt += velocity.getX() * velocity.getX();
if (withYVelocity) rt += velocity.getY() * velocity.getY();
if (withZVelocity) rt += velocity.getZ() * velocity.getZ();
if (withXVelocity) rt += velocity.x() * velocity.x();
if (withYVelocity) rt += velocity.y() * velocity.y();
if (withZVelocity) rt += velocity.z() * velocity.z();
averagingWindow[windowPointer++] = switch (unit){
case METERS_PER_SECOND, BLOCKS_PER_SECOND -> Math.sqrt(rt) * WidgetUtils.getClientTickRate();
case CENTIMETERS_PER_TICK -> Math.sqrt(rt) * 100;
@@ -86,13 +85,13 @@ public class SpeedWidget extends BasicTextWidget {
}
@Override
public Text getName() {
return Text.translatable("widgets.widgets.speed");
public Component getName() {
return Component.translatable("widgets.widgets.speed");
}
@Override
public Text getDescription() {
return Text.translatable("widgets.widgets.speed.description");
public Component getDescription() {
return Component.translatable("widgets.widgets.speed.description");
}
@Override
@@ -5,15 +5,14 @@ import de.shiewk.widgets.WidgetsMod;
import de.shiewk.widgets.color.GradientOptions;
import de.shiewk.widgets.widgets.settings.IntSliderWidgetSetting;
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
import net.minecraft.client.MinecraftClient;
import net.minecraft.server.ServerTickManager;
import net.minecraft.server.integrated.IntegratedServer;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.client.server.IntegratedServer;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.server.ServerTickRateManager;
import static net.minecraft.text.Text.translatable;
import static net.minecraft.network.chat.Component.translatable;
public class TPSWidget extends BasicTextWidget {
private TPSWidget(Identifier id) {
@@ -25,7 +24,7 @@ public class TPSWidget extends BasicTextWidget {
getSettings().optionById("textcolor").setShowCondition(() -> !this.dynamicColor);
}
public static final TPSWidget INSTANCE = new TPSWidget(Identifier.of(WidgetsMod.MOD_ID, "tps"));
public static final TPSWidget INSTANCE = new TPSWidget(Identifier.fromNamespaceAndPath(WidgetsMod.MOD_ID, "tps"));
private static long[] lastUpdates = new long[5];
private static int updatePointer = 0;
@@ -40,13 +39,13 @@ public class TPSWidget extends BasicTextWidget {
}
public static void worldTimeUpdated(long nanoTime) {
MinecraftClient client = MinecraftClient.getInstance();
if (client.isInSingleplayer()){
IntegratedServer server = client.getServer();
Minecraft client = Minecraft.getInstance();
if (client.isLocalServer()){
IntegratedServer server = client.getSingleplayerServer();
if (server != null) {
ServerTickManager tickManager = server.getTickManager();
float tps = 1000f / server.getAverageTickTime();
float targetTickRate = tickManager.getTickRate();
ServerTickRateManager tickManager = server.tickRateManager();
float tps = 1000f / server.getCurrentSmoothedTickTime();
float targetTickRate = tickManager.tickrate();
if (tickManager.isSprinting()){
INSTANCE.updateTPS(tps, targetTickRate, true);
} else {
@@ -70,8 +69,8 @@ public class TPSWidget extends BasicTextWidget {
float ticksPerSecond = 1000f / mspt;
boolean loadingFinished = updatesSinceWorldChange > lastUpdates.length;
if (client.world != null) {
INSTANCE.updateTPS(ticksPerSecond, client.world.getTickManager().getTickRate(), loadingFinished);
if (client.level != null) {
INSTANCE.updateTPS(ticksPerSecond, client.level.tickRateManager().tickrate(), loadingFinished);
} else {
INSTANCE.updateTPS(ticksPerSecond, 20, loadingFinished);
}
@@ -111,12 +110,12 @@ public class TPSWidget extends BasicTextWidget {
}
@Override
public Text getName() {
public Component getName() {
return translatable("widgets.widgets.tps");
}
@Override
public Text getDescription() {
public Component getDescription() {
return translatable("widgets.widgets.tps.description");
}
@@ -3,14 +3,14 @@ package de.shiewk.widgets.widgets;
import de.shiewk.widgets.WidgetSettings;
import de.shiewk.widgets.widgets.settings.EnumWidgetSetting;
import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting;
import net.minecraft.client.MinecraftClient;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.world.World;
import net.minecraft.client.Minecraft;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.world.level.Level;
import java.util.List;
import static net.minecraft.text.Text.*;
import static net.minecraft.network.chat.Component.*;
public class WorldTimeWidget extends BasicTextWidget {
@@ -30,11 +30,11 @@ public class WorldTimeWidget extends BasicTextWidget {
protected boolean showDay;
protected ClockWidget.TimeOption timeFormat;
public Text getDayLabel(long day) {
public Component getDayLabel(long day) {
return translatable("widgets.widgets.worldtime.day", day);
}
public Text getTimeLabel(long hour, long minute) {
public Component getTimeLabel(long hour, long minute) {
return switch (timeFormat) {
case NO_TIME -> empty();
case HOUR_24 -> literal(hour + ":" + (minute < 10 ? "0" + minute : minute));
@@ -48,11 +48,11 @@ public class WorldTimeWidget extends BasicTextWidget {
@Override
public void tickWidget() {
final World world = MinecraftClient.getInstance().world;
final Level world = Minecraft.getInstance().level;
if (world == null) {
formatAndSetRenderText("?");
} else {
long time = world.getTimeOfDay() + 6000;
long time = world.getGameTime() + 6000;
long day = time / 24000;
long hour = time / 1000 % 24;
long minute = (long) ((time % 1000) / 16.6666);
@@ -76,12 +76,12 @@ public class WorldTimeWidget extends BasicTextWidget {
}
@Override
public Text getName() {
public Component getName() {
return translatable("widgets.widgets.worldtime");
}
@Override
public Text getDescription() {
public Component getDescription() {
return translatable("widgets.widgets.worldtime.description");
}
@@ -2,14 +2,15 @@ package de.shiewk.widgets.widgets.settings;
import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import com.mojang.blaze3d.platform.cursor.CursorTypes;
import de.shiewk.widgets.utils.WidgetUtils;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.cursor.StandardCursors;
import net.minecraft.sound.SoundEvents;
import net.minecraft.text.Text;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.input.MouseButtonEvent;
import net.minecraft.network.chat.Component;
import net.minecraft.sounds.SoundEvents;
import org.jspecify.annotations.NonNull;
import java.awt.*;
import java.util.function.Function;
@@ -18,12 +19,12 @@ public class EnumWidgetSetting<T extends Enum<T>> extends WidgetSettingOption<T>
private final Class<T> enumClass;
private T value;
private final Function<T, Text> enumNameGetter;
private final Function<T, Component> enumNameGetter;
private int height = 0;
private boolean mouseClick = false;
private boolean changed = false;
public EnumWidgetSetting(String id, Text name, Class<T> enumClass, T defaultValue, Function<T, Text> enumNameGetter) {
public EnumWidgetSetting(String id, Component name, Class<T> enumClass, T defaultValue, Function<T, Component> enumNameGetter) {
super(id, name);
this.enumClass = enumClass;
this.value = defaultValue;
@@ -58,28 +59,28 @@ public class EnumWidgetSetting<T extends Enum<T>> extends WidgetSettingOption<T>
COLOR_TEXT = new Color(255, 255, 255, 255).getRGB();
@Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
public void extractRenderState(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY, float delta) {
final Font textRenderer = Minecraft.getInstance().font;
int y = 0;
int nx = 5;
final int bx = getX() + getWidth();
for (T constant : enumClass.getEnumConstants()) {
final Text name = enumNameGetter.apply(constant);
final int textRendererWidth = textRenderer.getWidth(name);
final Component name = enumNameGetter.apply(constant);
final int textRendererWidth = textRenderer.width(name);
if (nx != 5 && nx + textRendererWidth + 20 > this.getWidth()){
y += 24;
nx = 5;
}
final boolean hover = mouseX <= bx - nx && mouseX >= bx - nx - 10 - textRendererWidth && mouseY <= y + 19 + getY() && mouseY >= y + getY();
context.fill(bx - 10 - textRendererWidth - nx, y + getY(), bx - nx, y + 19 + getY(), constant == value ? COLOR_SELECTED : hover ? COLOR_UNSELECTED_HOVER : COLOR_UNSELECTED);
context.drawText(textRenderer, name, bx - nx - 5 - textRendererWidth, y + 5 + getY(), COLOR_TEXT, true);
context.text(textRenderer, name, bx - nx - 5 - textRendererWidth, y + 5 + getY(), COLOR_TEXT, true);
if (hover && mouseClick){
this.value = constant;
this.changed = true;
WidgetUtils.playSound(SoundEvents.BLOCK_COPPER_BULB_TURN_ON);
WidgetUtils.playSound(SoundEvents.COPPER_BULB_TURN_ON);
}
if (hover){
context.setCursor(StandardCursors.POINTING_HAND);
context.requestCursor(CursorTypes.POINTING_HAND);
}
nx += textRendererWidth + 20;
}
@@ -89,13 +90,13 @@ public class EnumWidgetSetting<T extends Enum<T>> extends WidgetSettingOption<T>
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(MouseButtonEvent click, boolean doubled) {
mouseClick = true;
return false;
}
@Override
public boolean mouseReleased(Click click) {
public boolean mouseReleased(MouseButtonEvent click) {
mouseClick = false;
boolean changed = this.changed;
this.changed = false;
@@ -1,26 +1,27 @@
package de.shiewk.widgets.widgets.settings;
import com.google.gson.JsonElement;
import com.mojang.blaze3d.platform.cursor.CursorTypes;
import de.shiewk.widgets.client.screen.WidgetSettingsScreen;
import de.shiewk.widgets.client.screen.gradienteditor.GradientEditorScreen;
import de.shiewk.widgets.color.GradientMode;
import de.shiewk.widgets.color.GradientOptions;
import de.shiewk.widgets.utils.WidgetUtils;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.cursor.StandardCursors;
import net.minecraft.sound.SoundEvents;
import net.minecraft.text.Text;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.input.MouseButtonEvent;
import net.minecraft.network.chat.Component;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.util.Util;
import org.jspecify.annotations.NonNull;
import static de.shiewk.widgets.client.WidgetManager.gson;
import static de.shiewk.widgets.utils.WidgetUtils.colorARGBToHexRGBA;
public class GradientWidgetSetting extends WidgetSettingOption<GradientOptions> {
public GradientWidgetSetting(String id, Text name, GradientMode defaultMode, int defaultGradientSize, int defaultGradientSpeed, int defaultColor) {
public GradientWidgetSetting(String id, Component name, GradientMode defaultMode, int defaultGradientSize, int defaultGradientSpeed, int defaultColor) {
super(id, name);
this.value = new GradientOptions(
defaultMode,
@@ -30,7 +31,7 @@ public class GradientWidgetSetting extends WidgetSettingOption<GradientOptions>
);
}
public GradientWidgetSetting(String id, Text name, int defaultColor) {
public GradientWidgetSetting(String id, Component name, int defaultColor) {
this(id, name, GradientMode.SWEEP, 40, 10, defaultColor);
}
@@ -61,9 +62,9 @@ public class GradientWidgetSetting extends WidgetSettingOption<GradientOptions>
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, float deltaTicks) {
final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
final long n = Util.getMeasuringTimeNano();
public void extractRenderState(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY, float deltaTicks) {
final Font textRenderer = Minecraft.getInstance().font;
final long n = Util.getNanos();
GradientOptions gradient = this.getValue();
gradient.fillHorizontal(
context,
@@ -81,15 +82,15 @@ public class GradientWidgetSetting extends WidgetSettingOption<GradientOptions>
displayText = "#" + colorARGBToHexRGBA(colors[0]);
} else {
outlineColor = 0xff_ff_ff_ff;
displayText = Text.translatable("widgets.ui.widgetSettings.colors", colors.length).getString();
displayText = Component.translatable("widgets.ui.widgetSettings.colors", colors.length).getString();
}
context.drawHorizontalLine(getX(), getX()+getWidth(), getY(), outlineColor);
context.drawHorizontalLine(getX(), getX()+getWidth(), getY()+getHeight(), outlineColor);
context.drawVerticalLine(getX(), getY(), getY() + getHeight(), outlineColor);
context.drawVerticalLine(getX() + getWidth(), getY(), getY() + getHeight(), outlineColor);
context.horizontalLine(getX(), getX()+getWidth(), getY(), outlineColor);
context.horizontalLine(getX(), getX()+getWidth(), getY()+getHeight(), outlineColor);
context.verticalLine(getX(), getY(), getY() + getHeight(), outlineColor);
context.verticalLine(getX() + getWidth(), getY(), getY() + getHeight(), outlineColor);
int width = textRenderer.getWidth(displayText);
context.drawText(
int width = textRenderer.width(displayText);
context.text(
textRenderer,
displayText,
getX() + (getWidth() / 2 - (width / 2)),
@@ -99,7 +100,7 @@ public class GradientWidgetSetting extends WidgetSettingOption<GradientOptions>
);
if (this.isHovered(mouseX, mouseY)){
context.setCursor(StandardCursors.POINTING_HAND);
context.requestCursor(CursorTypes.POINTING_HAND);
}
}
@@ -114,11 +115,11 @@ public class GradientWidgetSetting extends WidgetSettingOption<GradientOptions>
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
MinecraftClient client = MinecraftClient.getInstance();
if (client.currentScreen instanceof WidgetSettingsScreen screen) {
WidgetUtils.playSound(SoundEvents.BLOCK_COPPER_BULB_TURN_ON);
client.setScreen(new GradientEditorScreen(client.currentScreen, screen.getWidget(), this, screen.getOnChange()));
public boolean mouseClicked(MouseButtonEvent click, boolean doubled) {
Minecraft client = Minecraft.getInstance();
if (client.screen instanceof WidgetSettingsScreen screen) {
WidgetUtils.playSound(SoundEvents.COPPER_BULB_TURN_ON);
client.setScreen(new GradientEditorScreen(client.screen, screen.getWidget(), this, screen.getOnChange()));
}
return true;
}
@@ -2,14 +2,14 @@ package de.shiewk.widgets.widgets.settings;
import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.cursor.StandardCursors;
import net.minecraft.client.input.KeyInput;
import net.minecraft.text.Text;
import net.minecraft.util.math.MathHelper;
import com.mojang.blaze3d.platform.cursor.CursorTypes;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.input.KeyEvent;
import net.minecraft.client.input.MouseButtonEvent;
import net.minecraft.network.chat.Component;
import net.minecraft.util.Mth;
import org.jetbrains.annotations.NotNull;
public class IntSliderWidgetSetting extends WidgetSettingOption<Integer> {
@@ -20,7 +20,7 @@ public class IntSliderWidgetSetting extends WidgetSettingOption<Integer> {
private boolean changed = false;
private boolean clicked = false;
public IntSliderWidgetSetting(String id, Text name, int minValue, int defaultValue, int maxValue) {
public IntSliderWidgetSetting(String id, Component name, int minValue, int defaultValue, int maxValue) {
super(id, name);
this.value = defaultValue;
this.minValue = minValue;
@@ -28,7 +28,7 @@ public class IntSliderWidgetSetting extends WidgetSettingOption<Integer> {
}
@Override
public boolean keyPressed(KeyInput input) {
public boolean keyPressed(KeyEvent input) {
if (maxValue > value && input.isRight()) {
value++;
return true;
@@ -52,28 +52,28 @@ public class IntSliderWidgetSetting extends WidgetSettingOption<Integer> {
}
private int valueToXPos(int value){
return MathHelper.lerp((float) (value - minValue) / (maxValue - minValue), getX() + 5, getX() + 155);
return Mth.lerpInt((float) (value - minValue) / (maxValue - minValue), getX() + 5, getX() + 155);
}
private int xPosToValue(int xpos){
return MathHelper.lerp((xpos - getX() - 5) / 150f, minValue, maxValue);
return Mth.lerpInt((xpos - getX() - 5) / 150f, minValue, maxValue);
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
public void extractRenderState(GuiGraphicsExtractor context, int mouseX, int mouseY, float delta) {
int xp = valueToXPos(getValue());
context.drawHorizontalLine(getX() + 5, getX() + 155, getY() + 6, 0xffffffff);
context.drawVerticalLine(getX() + 4, getY() + 3, getY() + 10, 0xffffffff);
context.drawVerticalLine(getX() + 155, getY() + 3, getY() + 10, 0xffffffff);
context.horizontalLine(getX() + 5, getX() + 155, getY() + 6, 0xffffffff);
context.verticalLine(getX() + 4, getY() + 3, getY() + 10, 0xffffffff);
context.verticalLine(getX() + 155, getY() + 3, getY() + 10, 0xffffffff);
context.fill(xp-2, getY() + 3, xp+2, getY() + 10, 0xffffffff);
final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
context.drawText(textRenderer, String.valueOf(getValue()), getX() + 160, getY() + 3, 0xffffffff, true);
final Font textRenderer = Minecraft.getInstance().font;
context.text(textRenderer, String.valueOf(getValue()), getX() + 160, getY() + 3, 0xffffffff, true);
if (clicked){
this.changed = true;
this.value = MathHelper.clamp(xPosToValue(mouseX), minValue, maxValue);
this.value = Mth.clamp(xPosToValue(mouseX), minValue, maxValue);
}
if (isHovering(mouseX, mouseY)){
context.setCursor(StandardCursors.RESIZE_EW);
context.requestCursor(CursorTypes.RESIZE_EW);
}
}
@@ -85,13 +85,13 @@ public class IntSliderWidgetSetting extends WidgetSettingOption<Integer> {
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(MouseButtonEvent click, boolean doubled) {
this.clicked = true;
return super.mouseClicked(click, doubled);
}
@Override
public boolean mouseReleased(Click click) {
public boolean mouseReleased(MouseButtonEvent click) {
this.clicked = false;
boolean t = this.changed;
this.changed = false;
@@ -1,349 +0,0 @@
package de.shiewk.widgets.widgets.settings;
import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import de.shiewk.widgets.client.screen.WidgetVisibilityToggle;
import de.shiewk.widgets.utils.WidgetUtils;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.cursor.StandardCursors;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.client.input.KeyInput;
import net.minecraft.sound.SoundEvents;
import net.minecraft.text.Text;
import net.minecraft.util.math.MathHelper;
import org.jetbrains.annotations.NotNull;
import java.awt.*;
/**
* @deprecated Use {@link GradientWidgetSetting}
*/
@Deprecated(forRemoval = true, since = "2.3.0")
public class RGBAColorWidgetSetting extends WidgetSettingOption<Integer> {
public RGBAColorWidgetSetting(String id, Text name, int defaultR, int defaultG, int defaultB, int defaultAlpha) {
super(id, name);
this.r = defaultR;
this.g = defaultG;
this.b = defaultB;
this.a = defaultAlpha;
}
private int r;
private int g;
private int b;
private int a;
@Override
public JsonElement saveState() {
return new JsonPrimitive(getColor());
}
public int getColor(){
return a << 24 | r << 16 | g << 8 | b;
}
@Override
public @NotNull Integer getValue(){
return getColor();
}
@Override
public void loadState(JsonElement state) {
if (state.isJsonPrimitive() && state.getAsJsonPrimitive().isNumber()){
final Color color = new Color(state.getAsJsonPrimitive().getAsInt(), true);
this.r = color.getRed();
this.g = color.getGreen();
this.b = color.getBlue();
this.a = color.getAlpha();
}
}
@Override
public int getWidth() {
return 72;
}
@Override
public int getHeight() {
return 24;
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
context.fill(
getX(),
getY(),
getX() + getWidth(),
getY() + getHeight(),
getColor()
);
context.drawHorizontalLine(getX(), getX()+getWidth(), getY(), getColor() | 0xff_00_00_00);
context.drawHorizontalLine(getX(), getX()+getWidth(), getY()+getHeight(), getColor() | 0xff_00_00_00);
context.drawVerticalLine(getX(), getY(), getY() + getHeight(), getColor() | 0xff_00_00_00);
context.drawVerticalLine(getX() + getWidth(), getY(), getY() + getHeight(), getColor() | 0xff_00_00_00);
String colorText = "#" + toHexString();
int width = textRenderer.getWidth(colorText);
context.drawText(
textRenderer,
colorText,
getX() + (getWidth() / 2 - (width / 2)),
getY() + (getHeight() / 2 - 4),
0xff_ff_ff_ff,
true
);
if (this.isHovered(mouseX, mouseY)){
context.setCursor(StandardCursors.POINTING_HAND);
}
}
private String toHexSingle(int comp){
String s = Integer.toHexString(comp);
return "0".repeat(2 - s.length()) + s;
}
public String toHexString() {
return toHexSingle(r) + toHexSingle(g) + toHexSingle(b) + toHexSingle(a);
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
MinecraftClient client = MinecraftClient.getInstance();
WidgetUtils.playSound(SoundEvents.BLOCK_COPPER_BULB_TURN_ON);
client.setScreen(
new ChangeScreen(client.currentScreen, (int) client.mouse.getScaledX(client.getWindow()), (int) client.mouse.getScaledY(client.getWindow()))
);
return true;
}
public class ChangeScreen extends Screen implements WidgetVisibilityToggle {
private final Screen parent;
private int x;
private int y;
protected ChangeScreen(Screen parent, int x, int y) {
super(Text.empty());
this.parent = parent;
this.x = x;
this.y = y;
}
private static final int PADDING = 16;
private static final int BAR_WIDTH = 18;
private static final int BAR_HEIGHT = 127 + 20;
private static final int RECT_WIDTH = 5 * PADDING + 4 * BAR_WIDTH;
private static final int RECT_HEIGHT = 2 * PADDING + BAR_HEIGHT;
@Override
protected void init() {
super.init();
if (y + RECT_HEIGHT > height){
y = height - RECT_HEIGHT;
}
if (x + RECT_WIDTH > width){
x = width - RECT_WIDTH;
}
// Color components
// Red color
addDrawableChild(new ColorBar(
x + PADDING,
y + PADDING,
BAR_WIDTH,
BAR_HEIGHT,
0
));
// Green color
addDrawableChild(new ColorBar(
x + 2* PADDING + BAR_WIDTH,
y + PADDING,
BAR_WIDTH,
BAR_HEIGHT,
1
));
// Blue color
addDrawableChild(new ColorBar(
x + 3* PADDING + 2* BAR_WIDTH,
y + PADDING,
BAR_WIDTH,
BAR_HEIGHT,
2
));
// Alpha
addDrawableChild(new ColorBar(
x + 4* PADDING + 3* BAR_WIDTH,
y + PADDING,
BAR_WIDTH,
BAR_HEIGHT,
3
));
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, float deltaTicks) {
parent.render(context, 0, 0, deltaTicks);
context.fill(x, y, x+ RECT_WIDTH, y+ RECT_HEIGHT,0xc0_00_00_00);
context.drawStrokedRectangle(x, y, RECT_WIDTH, RECT_HEIGHT, 0x67_ff_ff_ff);
super.render(context, mouseX, mouseY, deltaTicks);
}
@Override
public void close() {
client.setScreen(parent);
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
if (click.x() < x || click.y() < y || click.x() > x + RECT_WIDTH || click.y() > y + RECT_HEIGHT){
close();
WidgetUtils.playSound(SoundEvents.BLOCK_COPPER_BULB_TURN_OFF);
return false;
}
return super.mouseClicked(click, doubled);
}
@Override
public boolean shouldRenderWidgets() {
return false;
}
public class ColorBar extends ClickableWidget {
private final int component;
public ColorBar(int x, int y, int width, int height, int component) {
super(x, y, width, height, Text.empty());
this.component = component;
}
@Override
public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) {
if (isHovered()){
setValue((int) (getValue() + verticalAmount * 2));
return true;
}
return false;
}
public int getValue(){
return switch (component){
case 0 -> RGBAColorWidgetSetting.this.r; // Red
case 1 -> RGBAColorWidgetSetting.this.g; // Green
case 2 -> RGBAColorWidgetSetting.this.b; // Blue
case 3 -> RGBAColorWidgetSetting.this.a; // Alpha
default -> throw new IllegalStateException("Component out of range: " + component);
};
}
public void setValue(int val){
val = MathHelper.clamp(val, 0, 255);
switch (component){
case 0 -> RGBAColorWidgetSetting.this.r = val; // Red
case 1 -> RGBAColorWidgetSetting.this.g = val; // Green
case 2 -> RGBAColorWidgetSetting.this.b = val; // Blue
case 3 -> RGBAColorWidgetSetting.this.a = val; // Alpha
default -> throw new IllegalStateException("Component out of range: " + component);
}
}
@Override
protected void renderWidget(DrawContext context, int mouseX, int mouseY, float deltaTicks) {
context.fillGradient(
getX() + 2,
getY() + 10,
getX() + getWidth() - 2,
getY() + getHeight() - 10,
topColor(),
bottomColor()
);
context.drawHorizontalLine(
getX(),
getX() + getWidth() - 1,
getY() + 10 + (255 - getValue()) / 2,
0xffffffff
);
{
String text = ""+getValue();
int textWidth = textRenderer.getWidth(text);
context.drawText(textRenderer, text, getX() + (getWidth() / 2 - textWidth / 2), getY() - 2, 0xffffffff, true);
}
{
String text = componentLabel();
int textWidth = textRenderer.getWidth(text);
context.drawText(textRenderer, text, getX() + (getWidth() / 2 - textWidth / 2), getY() + 142, 0xffffffff, true);
}
if (isHovered()){
context.setCursor(StandardCursors.RESIZE_NS);
}
}
private String componentLabel() {
return switch (component){
case 0 -> "R"; // Red
case 1 -> "G"; // Green
case 2 -> "B"; // Blue
case 3 -> "A"; // Alpha
default -> throw new IllegalStateException("Component out of range: " + component);
};
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
return this.mouseDragged(click, 0, 0);
}
@Override
public boolean mouseDragged(Click click, double offsetX, double offsetY) {
if (isHovered()){
double pos = click.y() - this.getY() - 10;
int val = (int) (255 - pos * 2);
setValue(val);
return true;
}
return false;
}
private int componentMask(){
return switch (component){
case 0 -> 0x00_ff_00_00; // Red
case 1 -> 0x00_00_ff_00; // Green
case 2 -> 0x00_00_00_ff; // Blue
case 3 -> 0xff_00_00_00; // Alpha
default -> throw new IllegalStateException("Component out of range: " + component);
};
}
@Override
public boolean keyPressed(KeyInput input) {
if (input.isUp()) {
setValue(getValue() + 1);
return true;
} else if (input.isDown()) {
setValue(getValue() - 1);
return true;
} else {
return super.keyPressed(input);
}
}
private int bottomColor() {
return RGBAColorWidgetSetting.this.getColor() & ~componentMask();
}
private int topColor() {
return RGBAColorWidgetSetting.this.getColor() | componentMask();
}
@Override
protected void appendClickableNarrations(NarrationMessageBuilder builder) {}
}
}
}
@@ -3,20 +3,21 @@ package de.shiewk.widgets.widgets.settings;
import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import de.shiewk.widgets.WidgetsMod;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.client.input.CharInput;
import net.minecraft.client.input.KeyInput;
import net.minecraft.text.Text;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.input.CharacterEvent;
import net.minecraft.client.input.KeyEvent;
import net.minecraft.client.input.MouseButtonEvent;
import net.minecraft.network.chat.Component;
import org.jspecify.annotations.NonNull;
public class TextFieldWidgetSettingOption extends WidgetSettingOption<String> {
private TextField textField = null;
private final Text initialValue;
private final Text placeholder;
private final Component initialValue;
private final Component placeholder;
private final boolean trim;
private final int maxLength;
private String value = "";
@@ -25,11 +26,11 @@ public class TextFieldWidgetSettingOption extends WidgetSettingOption<String> {
this.value = value;
}
public class TextField extends TextFieldWidget {
public class TextField extends EditBox {
public TextField(TextRenderer textRenderer, int width, int height, Text text) {
public TextField(Font textRenderer, int width, int height, Component text) {
super(textRenderer, width, height, text);
this.setChangedListener(value -> TextFieldWidgetSettingOption.this.setValue(TextFieldWidgetSettingOption.this.trim ? value.trim() : value));
this.setResponder(value -> TextFieldWidgetSettingOption.this.setValue(TextFieldWidgetSettingOption.this.trim ? value.trim() : value));
}
@Override
@@ -38,7 +39,7 @@ public class TextFieldWidgetSettingOption extends WidgetSettingOption<String> {
}
}
public TextFieldWidgetSettingOption(String id, Text name, Text initialValue, Text placeholder, boolean trim, int maxLength) {
public TextFieldWidgetSettingOption(String id, Component name, Component initialValue, Component placeholder, boolean trim, int maxLength) {
super(id, name);
this.initialValue = initialValue;
this.placeholder = placeholder;
@@ -48,10 +49,10 @@ public class TextFieldWidgetSettingOption extends WidgetSettingOption<String> {
private void initializeTextField() {
if (textField != null) return;
textField = new TextField(MinecraftClient.getInstance().textRenderer, this.getWidth(), this.getHeight(), Text.empty());
textField.setPlaceholder(placeholder);
textField = new TextField(Minecraft.getInstance().font, this.getWidth(), this.getHeight(), Component.empty());
textField.setHint(placeholder);
textField.setMaxLength(maxLength);
textField.setText(value.isEmpty() ? initialValue.getString() : value);
textField.setValue(value.isEmpty() ? initialValue.getString() : value);
}
@Override
@@ -67,7 +68,7 @@ public class TextFieldWidgetSettingOption extends WidgetSettingOption<String> {
@Override
public void loadState(JsonElement state) {
if (state.isJsonPrimitive() && state.getAsJsonPrimitive().isString()){
if (textField != null) textField.setText(state.getAsString());
if (textField != null) textField.setValue(state.getAsString());
this.value = state.getAsString();
} else {
WidgetsMod.LOGGER.warn("Failed to load text field widget setting option for state {}", state);
@@ -89,33 +90,33 @@ public class TextFieldWidgetSettingOption extends WidgetSettingOption<String> {
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
public void extractRenderState(@NonNull GuiGraphicsExtractor context, int mouseX, int mouseY, float delta) {
initializeTextField();
textField.render(context, mouseX, mouseY, delta);
textField.extractRenderState(context, mouseX, mouseY, delta);
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(MouseButtonEvent click, boolean doubled) {
return isFocused() && textField.mouseClicked(click, doubled);
}
@Override
public boolean mouseReleased(Click click) {
public boolean mouseReleased(MouseButtonEvent click) {
return isFocused() && textField.mouseReleased(click);
}
@Override
public boolean charTyped(CharInput input) {
public boolean charTyped(CharacterEvent input) {
return isFocused() && textField.charTyped(input);
}
@Override
public boolean keyPressed(KeyInput input) {
public boolean keyPressed(KeyEvent input) {
return isFocused() && textField.keyPressed(input);
}
@Override
public boolean keyReleased(KeyInput input) {
public boolean keyReleased(KeyEvent input) {
return isFocused() && textField.keyReleased(input);
}
@@ -2,14 +2,14 @@ package de.shiewk.widgets.widgets.settings;
import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import com.mojang.blaze3d.platform.cursor.CursorTypes;
import de.shiewk.widgets.utils.WidgetUtils;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.cursor.StandardCursors;
import net.minecraft.sound.SoundEvents;
import net.minecraft.text.Text;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.client.input.MouseButtonEvent;
import net.minecraft.network.chat.Component;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.util.Mth;
import net.minecraft.util.Util;
import net.minecraft.util.math.MathHelper;
import org.jetbrains.annotations.NotNull;
import java.awt.*;
@@ -19,7 +19,7 @@ public class ToggleWidgetSetting extends WidgetSettingOption<Boolean> {
private boolean value;
private long toggleTime = 0;
public ToggleWidgetSetting(String id, Text name, boolean defaultValue) {
public ToggleWidgetSetting(String id, Component name, boolean defaultValue) {
super(id, name);
this.value = defaultValue;
}
@@ -47,11 +47,11 @@ public class ToggleWidgetSetting extends WidgetSettingOption<Boolean> {
COLOR_DISABLED_THUMB = new Color(255, 200, 200, 255).getRGB();
@Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
public void extractRenderState(GuiGraphicsExtractor context, int mouseX, int mouseY, float delta) {
int col = value ? COLOR_ENABLED : COLOR_DISABLED;
int thumb = value ? COLOR_ENABLED_THUMB : COLOR_DISABLED_THUMB;
int thumbLoc = (Util.getMeasuringTimeNano() - toggleTime) < 300000000f ?
(int) (getX() + MathHelper.lerp(WidgetUtils.computeEasing((Util.getMeasuringTimeNano() - toggleTime) / 300000000f),
int thumbLoc = (Util.getNanos() - toggleTime) < 300000000f ?
(int) (getX() + Mth.lerp(WidgetUtils.computeEasing((Util.getNanos() - toggleTime) / 300000000f),
value ? 2 : getWidth() - 4 - 12,
value ? getWidth() - 4 - 12 : 4))
: value ? getX() + getWidth() - 4 - 12 : getX() + 4;
@@ -59,20 +59,20 @@ public class ToggleWidgetSetting extends WidgetSettingOption<Boolean> {
context.fill(thumbLoc, getY() + 4, thumbLoc + 12, getY() + getHeight() - 4, thumb);
if (this.isHovered(mouseX, mouseY)){
context.setCursor(StandardCursors.POINTING_HAND);
context.requestCursor(CursorTypes.POINTING_HAND);
}
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(MouseButtonEvent click, boolean doubled) {
toggle();
return true;
}
public void toggle(){
this.value = !value;
WidgetUtils.playSound(value ? SoundEvents.BLOCK_COPPER_BULB_TURN_ON : SoundEvents.BLOCK_COPPER_BULB_TURN_OFF);
this.toggleTime = Util.getMeasuringTimeNano();
WidgetUtils.playSound(value ? SoundEvents.COPPER_BULB_TURN_ON : SoundEvents.COPPER_BULB_TURN_OFF);
this.toggleTime = Util.getNanos();
}
@Override
@@ -2,28 +2,28 @@ package de.shiewk.widgets.widgets.settings;
import com.google.gson.JsonElement;
import de.shiewk.widgets.utils.WidgetUtils;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.Drawable;
import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.client.gui.widget.Widget;
import net.minecraft.client.input.CharInput;
import net.minecraft.client.input.KeyInput;
import net.minecraft.text.Text;
import java.util.function.BooleanSupplier;
import java.util.function.Consumer;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.Renderable;
import net.minecraft.client.gui.layouts.LayoutElement;
import net.minecraft.client.input.CharacterEvent;
import net.minecraft.client.input.KeyEvent;
import net.minecraft.client.input.MouseButtonEvent;
import net.minecraft.network.chat.Component;
import org.jspecify.annotations.NonNull;
public abstract class WidgetSettingOption<T> implements Drawable, Widget {
public abstract class WidgetSettingOption<T> implements Renderable, LayoutElement {
private final String id;
private final Text name;
private final Component name;
private int x = 0;
private int y = 0;
private int maxRenderWidth = 200; // this will always be changed before rendering
private boolean focused = false;
private BooleanSupplier shouldShow = WidgetUtils.TRUE_SUPPLIER;
protected WidgetSettingOption(String id, Text name) {
protected WidgetSettingOption(String id, Component name) {
this.id = id;
this.name = name;
}
@@ -40,7 +40,7 @@ public abstract class WidgetSettingOption<T> implements Drawable, Widget {
return id;
}
public final Text getName() {
public final Component getName() {
return name;
}
@@ -48,23 +48,23 @@ public abstract class WidgetSettingOption<T> implements Drawable, Widget {
public abstract void loadState(JsonElement state);
public abstract T getValue();
public boolean mouseClicked(Click click, boolean doubled) {
public boolean mouseClicked(MouseButtonEvent click, boolean doubled) {
return false;
}
public boolean mouseReleased(Click click){
public boolean mouseReleased(MouseButtonEvent click){
return false;
}
public boolean charTyped(CharInput input) {
public boolean charTyped(CharacterEvent input) {
return false;
}
public boolean keyPressed(KeyInput input) {
public boolean keyPressed(KeyEvent input) {
return false;
}
public boolean keyReleased(KeyInput input) {
public boolean keyReleased(KeyEvent input) {
return false;
}
@@ -94,7 +94,7 @@ public abstract class WidgetSettingOption<T> implements Drawable, Widget {
}
@Override
public final void forEachChild(Consumer<ClickableWidget> consumer) {
public final void visitWidgets(@NonNull Consumer<AbstractWidget> consumer) {
throw new UnsupportedOperationException();
}
+2 -2
View File
@@ -11,7 +11,7 @@
},
"license": "LGPL-3.0-only",
"icon": "assets/widgets/icon.png",
"accessWidener": "widgets.accesswidener",
"accessWidener": "widgets.classtweaker",
"environment": "client",
"entrypoints": {
"client": [
@@ -29,7 +29,7 @@
],
"depends": {
"fabricloader": ">=${loader_version}",
"fabric": "*",
"fabric-api": "*",
"minecraft": "~${minecraft_version}"
}
}
-4
View File
@@ -1,4 +0,0 @@
accessWidener v2 named
accessible field net/minecraft/client/network/ClientPlayNetworkHandler pingMeasurer Lnet/minecraft/client/network/PingMeasurer;
accessible field net/minecraft/client/network/PingMeasurer log Lnet/minecraft/util/profiler/MultiValueDebugSampleLogImpl;
+4
View File
@@ -0,0 +1,4 @@
classTweaker v1 official
accessible field net/minecraft/client/multiplayer/ClientPacketListener pingDebugMonitor Lnet/minecraft/client/multiplayer/PingDebugMonitor;
accessible field net/minecraft/client/multiplayer/PingDebugMonitor delayTimer Lnet/minecraft/util/debugchart/LocalSampleLogger;