diff --git a/src/main/java/org/saturnclient/saturnclient/SaturnClient.java b/src/main/java/org/saturnclient/saturnclient/SaturnClient.java index 8012dea..6029235 100644 --- a/src/main/java/org/saturnclient/saturnclient/SaturnClient.java +++ b/src/main/java/org/saturnclient/saturnclient/SaturnClient.java @@ -6,6 +6,7 @@ import net.minecraft.util.math.ColorHelper; import org.saturnclient.saturnclient.cloaks.Cloaks; import org.saturnclient.saturnclient.event.KeyInputHandler; +import org.saturnclient.saturnmods.ModManager; import org.saturnclient.saturnclient.auth.SaturnSocket; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,11 +19,13 @@ public class SaturnClient implements ModInitializer { public static final String MOD_ID = "saturnclient"; public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); public static int COLOR = ColorHelper.getArgb(255, 251, 60, 79); + public static int WHITE = ColorHelper.getArgb(255, 255, 255, 255); public static TextRenderer textRenderer = null; @Override public void onInitialize() { LOGGER.info("Initializing " + MOD_ID); + ModManager.init(); KeyInputHandler.register(); if (SaturnSocket.authenticate()) { diff --git a/src/main/java/org/saturnclient/saturnclient/menus/HudEditor.java b/src/main/java/org/saturnclient/saturnclient/menus/HudEditor.java new file mode 100644 index 0000000..9d24d77 --- /dev/null +++ b/src/main/java/org/saturnclient/saturnclient/menus/HudEditor.java @@ -0,0 +1,87 @@ +package org.saturnclient.saturnclient.menus; + +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Text; + +import org.saturnclient.saturnmods.HudMod; +import org.saturnclient.saturnmods.ModDimensions; +import org.saturnclient.saturnmods.ModManager; +import org.saturnclient.saturnmods.SaturnMod; + +import java.util.ArrayList; +import java.util.List; + +public class HudEditor extends Screen { + private List hudMods = new ArrayList<>(); + private HudMod draggingMod = null; + private int offsetX, offsetY; + + public HudEditor() { + super(Text.literal("HUD Editor")); + for (SaturnMod m : ModManager.MODS) { + if (m.isEnabled() && m instanceof HudMod) { + HudMod mod = (HudMod) m; + hudMods.add(mod); + } + } + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0) { + for (int m = hudMods.size() - 1; m >= 0; m--) { + HudMod mod = hudMods.get(m); + ModDimensions dim = mod.getDimensions(); + if (isInside(mouseX, mouseY, dim)) { + draggingMod = mod; + offsetX = (int) (mouseX - dim.x); + offsetY = (int) (mouseY - dim.y); + return true; + } + } + } + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (button == 0) { + draggingMod = null; + } + return super.mouseReleased(mouseX, mouseY, button); + } + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { + if (draggingMod != null) { + ModDimensions dim = draggingMod.getDimensions(); + dim.x = (int) mouseX - offsetX; + dim.y = (int) mouseY - offsetY; + } + return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); + } + + @Override + public void render(DrawContext context, int mouseX, int mouseY, float delta) { + for (HudMod mod : hudMods) { + ModDimensions dim = mod.getDimensions(); + MatrixStack matrices = context.getMatrices(); + matrices.push(); + + matrices.translate(dim.x, dim.y, 0); + + matrices.scale(dim.scale, dim.scale, 1.0f); + + mod.renderDummy(context); + + matrices.pop(); + } + } + + private boolean isInside(double mouseX, double mouseY, ModDimensions dim) { + return mouseX >= dim.x && mouseX <= dim.x + (dim.width * dim.scale) && mouseY >= dim.y + && mouseY <= dim.y + (dim.height * dim.scale); + } +} diff --git a/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java b/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java index 4c9608d..72a60a7 100644 --- a/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java +++ b/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java @@ -34,7 +34,7 @@ public class MainMenu extends SaturnUi { draw( new SaturnImageButton(Textures.EMOTE, 14, 14, () -> { - client.setScreen(new SettingsMenu()); + client.setScreen(new HudEditor()); }) .setX((width - buttonWidth - (buttonHeight * 2) - 6) / 2) .setY((height - buttonHeight) / 2) diff --git a/src/main/java/org/saturnclient/saturnclient/menus/SettingsMenu.java b/src/main/java/org/saturnclient/saturnclient/menus/SettingsMenu.java index 4b4264e..c8917aa 100644 --- a/src/main/java/org/saturnclient/saturnclient/menus/SettingsMenu.java +++ b/src/main/java/org/saturnclient/saturnclient/menus/SettingsMenu.java @@ -1,16 +1,15 @@ package org.saturnclient.saturnclient.menus; -import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnmods.ModManager; import org.saturnclient.saturnmods.SaturnMod; import org.saturnclient.ui.SaturnUi; import org.saturnclient.ui.Textures; import org.saturnclient.ui.animations.FadeIn; import org.saturnclient.ui.animations.Slide; +import org.saturnclient.ui.components.SaturnModComp; import org.saturnclient.ui.widgets.SaturnClickableImage; import org.saturnclient.ui.widgets.SaturnScroll; import org.saturnclient.ui.widgets.SaturnSprite; -import org.saturnclient.ui.widgets.SaturnText; import net.minecraft.text.Text; public class SettingsMenu extends SaturnUi { @@ -81,18 +80,12 @@ public class SettingsMenu extends SaturnUi { SaturnScroll modsScroll = new SaturnScroll(); for (SaturnMod mod : ModManager.MODS) { - modsScroll.draw(new SaturnClickableImage(Textures.MOD, (m) -> { - - }) - .setSelected(mod.isEnabled()) + modsScroll.draw(new SaturnModComp(mod) .setX(modX) .setY(modY) .setWidth(86) .setHeight(20)); - modsScroll.draw(new SaturnText(mod.getName()).setX(modX + 27) - .setY(modY + (21 - SaturnClient.textRenderer.fontHeight) / 2)); - col++; if (col < 3) { diff --git a/src/main/java/org/saturnclient/saturnmods/HudMod.java b/src/main/java/org/saturnclient/saturnmods/HudMod.java new file mode 100644 index 0000000..ff84d88 --- /dev/null +++ b/src/main/java/org/saturnclient/saturnmods/HudMod.java @@ -0,0 +1,13 @@ +package org.saturnclient.saturnmods; + +import net.minecraft.client.gui.DrawContext; + +public interface HudMod { + public void setDimensions(ModDimensions dimensions); + + public ModDimensions getDimensions(); + + public void renderDummy(DrawContext context); + + public void render(DrawContext context); +} diff --git a/src/main/java/org/saturnclient/saturnmods/ModDimensions.java b/src/main/java/org/saturnclient/saturnmods/ModDimensions.java new file mode 100644 index 0000000..7f1cd21 --- /dev/null +++ b/src/main/java/org/saturnclient/saturnmods/ModDimensions.java @@ -0,0 +1,24 @@ +package org.saturnclient.saturnmods; + +public class ModDimensions { + public int x = 0; + public int y = 0; + public float scale = 1.0f; + + public int width = 0; + public int height = 0; + + public ModDimensions() { + } + + public ModDimensions(int x, int y) { + this.x = x; + this.y = y; + } + + public ModDimensions(int x, int y, float scale) { + this.x = x; + this.y = y; + this.scale = scale; + } +} diff --git a/src/main/java/org/saturnclient/saturnmods/ModManager.java b/src/main/java/org/saturnclient/saturnmods/ModManager.java index 66a483b..31c58c0 100644 --- a/src/main/java/org/saturnclient/saturnmods/ModManager.java +++ b/src/main/java/org/saturnclient/saturnmods/ModManager.java @@ -1,9 +1,43 @@ package org.saturnclient.saturnmods; +import org.saturnclient.saturnclient.SaturnClient; +import org.saturnclient.saturnmods.mods.ArmorDisplay; import org.saturnclient.saturnmods.mods.Coordinates; +import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.util.math.MatrixStack; public class ModManager { public static SaturnMod[] MODS = { - new Coordinates() + new Coordinates(), + new ArmorDisplay() }; + + public static void init() { + HudRenderCallback.EVENT.register((context, tickDelta) -> { + TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; + + if (textRenderer != null) { + SaturnClient.textRenderer = textRenderer; + + for (SaturnMod m : MODS) { + if (m instanceof HudMod && m.isEnabled()) { + ModDimensions dim = ((HudMod) m).getDimensions(); + + MatrixStack matrices = context.getMatrices(); + matrices.push(); + + matrices.translate(dim.x, dim.y, 0); + + matrices.scale(dim.scale, dim.scale, 1.0f); + + ((HudMod) m).render(context); + + matrices.pop(); + } + } + } + }); + } } diff --git a/src/main/java/org/saturnclient/saturnmods/SaturnMod.java b/src/main/java/org/saturnclient/saturnmods/SaturnMod.java index 9890430..a321638 100644 --- a/src/main/java/org/saturnclient/saturnmods/SaturnMod.java +++ b/src/main/java/org/saturnclient/saturnmods/SaturnMod.java @@ -1,11 +1,9 @@ package org.saturnclient.saturnmods; public interface SaturnMod { - public static boolean enabled = false; + public boolean isEnabled(); - default public boolean isEnabled() { - return enabled; - } + public void setEnabled(boolean e); public String getName(); } diff --git a/src/main/java/org/saturnclient/saturnmods/mods/ArmorDisplay.java b/src/main/java/org/saturnclient/saturnmods/mods/ArmorDisplay.java new file mode 100644 index 0000000..9b6e85c --- /dev/null +++ b/src/main/java/org/saturnclient/saturnmods/mods/ArmorDisplay.java @@ -0,0 +1,93 @@ +package org.saturnclient.saturnmods.mods; + +import org.saturnclient.saturnclient.SaturnClient; +import org.saturnclient.saturnmods.HudMod; +import org.saturnclient.saturnmods.ModDimensions; +import org.saturnclient.saturnmods.SaturnMod; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; + +public class ArmorDisplay implements SaturnMod, HudMod { + private static ModDimensions dimensions = new ModDimensions(120, 40); + public static boolean enabled = false; + + private boolean renderItem(DrawContext context, ItemStack item, int y) { + if (item.isEmpty()) { + return false; + } + + context.drawItem(item, 0, y); + + context.drawText(SaturnClient.textRenderer, "" + (item.getMaxDamage() - item.getDamage()), + 16, y + 4, SaturnClient.WHITE, false); + + return true; + } + + @Override + public void render(DrawContext context) { + PlayerEntity player = MinecraftClient.getInstance().player; + ItemStack[] items = { + player.getEquippedStack(EquipmentSlot.FEET), + player.getEquippedStack(EquipmentSlot.LEGS), + player.getEquippedStack(EquipmentSlot.CHEST), + player.getEquippedStack(EquipmentSlot.HEAD), + player.getEquippedStack(EquipmentSlot.MAINHAND), + }; + + int y = 75; + + for (ItemStack item : items) { + if (renderItem(context, item, y)) { + y -= 15; + } + } + } + + @Override + public void renderDummy(DrawContext context) { + ItemStack[] items = { + new ItemStack(Items.DIAMOND_BOOTS), + new ItemStack(Items.DIAMOND_LEGGINGS), + new ItemStack(Items.DIAMOND_CHESTPLATE), + new ItemStack(Items.DIAMOND_HELMET), + new ItemStack(Items.DIAMOND_SWORD), + }; + + int y = 75; + + for (ItemStack item : items) { + if (renderItem(context, item, y)) { + y -= 15; + } + } + + dimensions.width = 28; + dimensions.height = 100; + } + + public String getName() { + return "Armor display"; + } + + public void setDimensions(ModDimensions d) { + dimensions = d; + } + + public ModDimensions getDimensions() { + return dimensions; + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean e) { + enabled = e; + } +} diff --git a/src/main/java/org/saturnclient/saturnmods/mods/Coordinates.java b/src/main/java/org/saturnclient/saturnmods/mods/Coordinates.java index d588ab7..2f62821 100644 --- a/src/main/java/org/saturnclient/saturnmods/mods/Coordinates.java +++ b/src/main/java/org/saturnclient/saturnmods/mods/Coordinates.java @@ -1,9 +1,60 @@ package org.saturnclient.saturnmods.mods; +import org.saturnclient.saturnclient.SaturnClient; +import org.saturnclient.saturnmods.HudMod; +import org.saturnclient.saturnmods.ModDimensions; import org.saturnclient.saturnmods.SaturnMod; -public class Coordinates implements SaturnMod { +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.entity.player.PlayerEntity; + +public class Coordinates implements SaturnMod, HudMod { + private static ModDimensions dimensions = new ModDimensions(); + public static boolean enabled = false; + + public Coordinates() { + } + + public void renderDummy(DrawContext context) { + int playerX = 124; + int playerY = 69; + int playerZ = 83; + + context.drawText(SaturnClient.textRenderer, playerX + " " + playerY + " " + playerZ, + 0, 0, SaturnClient.WHITE, false); + + dimensions.width = SaturnClient.textRenderer.getWidth(playerX + " " + playerY + " " + playerZ); + dimensions.height = SaturnClient.textRenderer.fontHeight; + } + + public void render(DrawContext context) { + PlayerEntity player = MinecraftClient.getInstance().player; + int playerX = (int) player.getX(); + int playerY = (int) player.getY(); + int playerZ = (int) player.getZ(); + + context.drawText(SaturnClient.textRenderer, playerX + " " + playerY + " " + playerZ, + 0, 0, SaturnClient.WHITE, false); + } + public String getName() { return "Coords"; } + + public void setDimensions(ModDimensions d) { + dimensions = d; + } + + public ModDimensions getDimensions() { + return dimensions; + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean e) { + enabled = e; + } } diff --git a/src/main/java/org/saturnclient/ui/components/SaturnModComp.java b/src/main/java/org/saturnclient/ui/components/SaturnModComp.java new file mode 100644 index 0000000..8882530 --- /dev/null +++ b/src/main/java/org/saturnclient/ui/components/SaturnModComp.java @@ -0,0 +1,35 @@ +package org.saturnclient.ui.components; + +import org.saturnclient.saturnclient.SaturnClient; +import org.saturnclient.saturnmods.SaturnMod; +import org.saturnclient.ui.SaturnWidget; +import org.saturnclient.ui.Textures; + +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.util.math.ColorHelper; + +public class SaturnModComp extends SaturnWidget { + SaturnMod mod; + + public SaturnModComp(SaturnMod mod) { + this.mod = mod; + } + + @Override + public void render(DrawContext context, boolean hovering, int mouseX, int mouseY) { + int color = mod.isEnabled() || hovering ? SaturnClient.COLOR : ColorHelper.getWhite(alpha); + + context.drawText(SaturnClient.textRenderer, mod.getName(), x + 27, + y + (21 - SaturnClient.textRenderer.fontHeight) / 2, + color, false); + + context.drawTexture(RenderLayer::getGuiTextured, Textures.MOD, x, y, 0, 0, 86, 20, width, + height, color); + } + + @Override + public void click(int mouseX, int mouseY) { + mod.setEnabled(!mod.isEnabled()); + } +} diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnText.java b/src/main/java/org/saturnclient/ui/widgets/SaturnText.java index 0ea18cd..93f4f26 100644 --- a/src/main/java/org/saturnclient/ui/widgets/SaturnText.java +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnText.java @@ -5,11 +5,9 @@ import org.saturnclient.ui.SaturnUi; import org.saturnclient.ui.SaturnWidget; import net.minecraft.client.gui.DrawContext; import net.minecraft.util.math.ColorHelper; -import net.minecraft.util.math.MathHelper; public class SaturnText extends SaturnWidget { private String text; - private int color = ColorHelper.getWhite(1.0f); public SaturnText(String text) { this.text = text; @@ -19,13 +17,12 @@ public class SaturnText extends SaturnWidget { public SaturnText(String text, int color) { this(text); - this.color = color; } @Override public void render(DrawContext context, boolean hovering, int mouseX, int mouseY) { context.drawText(SaturnClient.textRenderer, SaturnUi.text(text), x, y, - color | MathHelper.ceil(this.alpha * 255.0F) << 24, false); + ColorHelper.getWhite(alpha), false); } }