add config system and window dragging

This commit is contained in:
kawaiizenbo 2023-06-29 18:30:32 -07:00
parent 6e584de0e6
commit a18cb2a137
22 changed files with 354 additions and 104 deletions

View file

@ -1,7 +1,7 @@
# Moonlight Meadows Utility Mod for Minecraft 1.20 # Moonlight Meadows Utility Mod for Minecraft 1.20.1
Please use this mod at your own risk Please use this mod at your own risk
Requires Fabric API and Minecraft 1.20 Requires Fabric API and Minecraft 1.20.1
Default ClickGUI Key is Right Alt Default ClickGUI Key is Right Alt

View file

@ -0,0 +1,107 @@
package me.kawaiizenbo.moonlight;
import java.io.File;
import java.io.FileWriter;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;
import com.google.gson.Gson;
import me.kawaiizenbo.moonlight.module.Category;
import me.kawaiizenbo.moonlight.module.ModuleManager;
import me.kawaiizenbo.moonlight.module.Module_;
import me.kawaiizenbo.moonlight.module.settings.Setting;
import me.kawaiizenbo.moonlight.ui.clickgui.ClickGUIScreen;
import net.minecraft.client.MinecraftClient;
public class Config
{
MinecraftClient mc = MinecraftClient.getInstance();
public File configDir = new File(mc.runDirectory.getPath() + "/moonlight");
public File configFile = new File(configDir, "config.json");
public Map<String, Object> config = new HashMap<>();
protected static Gson gson = new Gson();
public Config()
{
configDir.mkdirs();
}
public boolean doesConfigExist()
{
return !Files.exists(configFile.toPath());
}
public void loadDefaultConfig()
{
ModuleManager.INSTANCE = new ModuleManager();
Map<String, Object> mi = new HashMap<>();
for (Module_ m : ModuleManager.INSTANCE.modules)
{
Map<String, Object> mo = new HashMap<>();
mo.put("enabled", m.enabled);
for (Setting s : m.settings)
{
mo.put(s.name, s.value);
}
mi.put(m.name, mo);
}
config.put("modules", mi);
int xOffset = 4;
int yOffset = 4;
Map<String, Object> pi = new HashMap<>();
for (Category category : Category.values())
{
Map<String, Object> po = new HashMap<>();
if (xOffset > 400)
{
xOffset = 4;
yOffset = 128;
}
po.put("x", xOffset);
po.put("y", yOffset);
po.put("collapsed", false);
pi.put(category.name, po);
xOffset += 100;
}
config.put("panes", pi);
ClickGUIScreen.INSTANCE = new ClickGUIScreen();
}
public void load()
{
try
{
String configText = new String(Files.readAllBytes(configFile.toPath()));
config = (Map<String, Object>)gson.fromJson(configText, Map.class);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void save()
{
try
{
if (!doesConfigExist()) configFile.createNewFile();
}
catch(Exception e)
{
e.printStackTrace();
}
try
{
String configText = gson.toJson(config);
FileWriter writer = new FileWriter(configFile);
writer.write(configText);
writer.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

View file

@ -3,8 +3,16 @@ package me.kawaiizenbo.moonlight;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
import org.slf4j.Logger; import org.slf4j.Logger;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import me.kawaiizenbo.moonlight.module.ModuleManager;
import me.kawaiizenbo.moonlight.module.Module_;
import me.kawaiizenbo.moonlight.module.settings.Setting;
import me.kawaiizenbo.moonlight.ui.clickgui.CategoryPane;
import me.kawaiizenbo.moonlight.ui.clickgui.ClickGUIScreen;
import me.kawaiizenbo.moonlight.util.ColorUtils; import me.kawaiizenbo.moonlight.util.ColorUtils;
public class Moonlight implements ModInitializer public class Moonlight implements ModInitializer
@ -13,6 +21,7 @@ public class Moonlight implements ModInitializer
public static final Logger LOGGER = LoggerFactory.getLogger("Moonlight"); public static final Logger LOGGER = LoggerFactory.getLogger("Moonlight");
public static final String clientTag = ColorUtils.aqua + "Moonlight Meadows"; public static final String clientTag = ColorUtils.aqua + "Moonlight Meadows";
public static final String versionTag = ColorUtils.magenta + "v0.dev"; public static final String versionTag = ColorUtils.magenta + "v0.dev";
public static Config CONFIG = new Config();
public static int uiColorA = 0xFF55FFFF; public static int uiColorA = 0xFF55FFFF;
public static int uiColor = 0x55FFFF; public static int uiColor = 0x55FFFF;
@ -20,5 +29,53 @@ public class Moonlight implements ModInitializer
public void onInitialize() public void onInitialize()
{ {
LOGGER.info("Moonlight loading..."); LOGGER.info("Moonlight loading...");
loadConfig();
}
public void loadConfig()
{
LOGGER.info("Loading config...");
if (CONFIG.doesConfigExist())
{
CONFIG.loadDefaultConfig();
CONFIG.save();
}
CONFIG.load();
for (Module_ m : ModuleManager.INSTANCE.modules)
{
m.enabled = (boolean)((Map<String, Object>)((Map<String, Object>)CONFIG.config.get("modules")).get(m.name)).get("enabled");
for (Setting s : m.settings)
{
s.value = ((Map<String, Object>)((Map<String, Object>)CONFIG.config.get("modules")).get(m.name)).get(s.name);
}
}
}
public void saveConfig()
{
LOGGER.info("Saving config...");
Map<String, Object> mi = new HashMap<>();
for (Module_ m : ModuleManager.INSTANCE.modules)
{
Map<String, Object> mo = new HashMap<>();
mo.put("enabled", m.enabled);
for (Setting s : m.settings)
{
mo.put(s.name, s.value);
}
mi.put(m.name, mo);
}
CONFIG.config.put("modules", mi);
Map<String, Object> pi = new HashMap<>();
for (CategoryPane c : ClickGUIScreen.INSTANCE.categoryPanes)
{
Map<String, Object> po = new HashMap<>();
po.put("x", c.x);
po.put("y", c.y);
po.put("collapsed", c.collapsed);
pi.put(c.category.name, po);
}
CONFIG.config.put("panes", pi);
CONFIG.save();
} }
} }

View file

@ -0,0 +1,25 @@
package me.kawaiizenbo.moonlight.command.commands;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import me.kawaiizenbo.moonlight.Moonlight;
import me.kawaiizenbo.moonlight.command.Command;
import net.minecraft.command.CommandSource;
public class Reset extends Command
{
public Reset()
{
super("reset", "Resets all config options.");
}
@Override
public void build(LiteralArgumentBuilder<CommandSource> builder)
{
builder.executes(context ->
{
Moonlight.CONFIG.loadDefaultConfig();
return SINGLE_SUCCESS;
});
}
}

View file

@ -7,6 +7,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import me.kawaiizenbo.moonlight.module.ModuleManager; import me.kawaiizenbo.moonlight.module.ModuleManager;
import me.kawaiizenbo.moonlight.module.Module_; import me.kawaiizenbo.moonlight.module.Module_;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.entity.MovementType; import net.minecraft.entity.MovementType;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
@ -14,12 +15,30 @@ import net.minecraft.util.math.Vec3d;
@Mixin(ClientPlayerEntity.class) @Mixin(ClientPlayerEntity.class)
public class ClientPlayerEntityMixin public class ClientPlayerEntityMixin
{ {
@Inject(method = "move", at = @At(value = "HEAD"), cancellable = true) @Inject(method = "move", at = @At(value = "TAIL"), cancellable = true)
public void onMotion(MovementType type, Vec3d movement, CallbackInfo ci) public void onMove(MovementType type, Vec3d movement, CallbackInfo ci)
{ {
for (Module_ m : ModuleManager.INSTANCE.getEnabledModules()) for (Module_ m : ModuleManager.INSTANCE.getEnabledModules())
{ {
m.onMotion(type, movement); m.onMotion(type, movement);
} }
} }
@Inject(method = "tick", at = @At(value = "HEAD"), cancellable = true)
public void onTick(CallbackInfo ci)
{
for (Module_ m : ModuleManager.INSTANCE.getEnabledModules())
{
if (MinecraftClient.getInstance().player != null) m.tick();
}
}
@Inject(method = "init", at = @At(value = "TAIL"), cancellable = true)
public void onInit(CallbackInfo ci)
{
for (Module_ m : ModuleManager.INSTANCE.getEnabledModules())
{
m.onEnable();
}
}
} }

View file

@ -1,25 +0,0 @@
package me.kawaiizenbo.moonlight.mixin;
import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.LivingEntity;
import me.kawaiizenbo.moonlight.module.Module_;
import me.kawaiizenbo.moonlight.module.ModuleManager;
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(LivingEntity.class)
public class LivingEntityMixin
{
@Inject(at = @At("HEAD"), method = "tick()V")
private void init(CallbackInfo info)
{
for (Module_ mod : ModuleManager.INSTANCE.getEnabledModules())
{
if (MinecraftClient.getInstance().player != null) mod.tick();
}
}
}

View file

@ -0,0 +1,18 @@
package me.kawaiizenbo.moonlight.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.At;
import me.kawaiizenbo.moonlight.Moonlight;
import net.minecraft.client.MinecraftClient;
@Mixin(MinecraftClient.class)
public class MinecraftClientMixin
{
@Inject(at = @At("TAIL"), method = "scheduleStop")
public void onShutdown(CallbackInfo ci) {
Moonlight.INSTANCE.saveConfig();
}
}

View file

@ -6,8 +6,8 @@ public enum Category
MOVEMENT("Movement", 0xFFFF55FF), MOVEMENT("Movement", 0xFFFF55FF),
RENDER("Render", 0xFF5555FF), RENDER("Render", 0xFF5555FF),
WORLD("World", 0xFF55FF55), WORLD("World", 0xFF55FF55),
PLAYER("Player", 0xFFFFFFFF), PLAYER("Player", 0xFF00AAAA),
CHAT("Chat", 0xFFFFFF55); CHAT("Chat", 0xFFFFAA00);
public String name; public String name;
public int color; public int color;

View file

@ -17,7 +17,6 @@ public abstract class Module_
public Category category; public Category category;
public boolean enabled; public boolean enabled;
public ArrayList<Setting> settings; public ArrayList<Setting> settings;
public int keyBind;
public BooleanSetting showInModulesList = new BooleanSetting("Show in Modules List", true); public BooleanSetting showInModulesList = new BooleanSetting("Show in Modules List", true);

View file

@ -1,5 +1,6 @@
package me.kawaiizenbo.moonlight.module.settings; package me.kawaiizenbo.moonlight.module.settings;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.DrawContext;
import net.minecraft.text.Text; import net.minecraft.text.Text;
@ -14,9 +15,9 @@ public class BooleanSetting extends Setting
} }
@Override @Override
public void render(DrawContext drawContext, int x, int y, int mouseX, int mouseY) public void render(DrawContext drawContext, int x, int y, int mouseX, int mouseY, TextRenderer textRenderer)
{ {
super.render(drawContext, x, y, mouseX, mouseY); super.render(drawContext, x, y, mouseX, mouseY, textRenderer);
drawContext.drawTextWithShadow(textRenderer, Text.literal(name), x+2, y+8, 0xFFFFFF); drawContext.drawTextWithShadow(textRenderer, Text.literal(name), x+2, y+8, 0xFFFFFF);
drawContext.fill(x+175, y+7, x+185, y+17, 0xFFFFFFFF); drawContext.fill(x+175, y+7, x+185, y+17, 0xFFFFFFFF);
drawContext.fill(x+176, y+8, x+184, y+16, 0xFF222222); drawContext.fill(x+176, y+8, x+184, y+16, 0xFF222222);

View file

@ -1,6 +1,7 @@
package me.kawaiizenbo.moonlight.module.settings; package me.kawaiizenbo.moonlight.module.settings;
import me.kawaiizenbo.moonlight.util.ColorUtils; import me.kawaiizenbo.moonlight.util.ColorUtils;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.DrawContext;
import net.minecraft.text.Text; import net.minecraft.text.Text;
@ -23,9 +24,9 @@ public class ColorSetting extends Setting
} }
@Override @Override
public void render(DrawContext drawContext, int x, int y, int mouseX, int mouseY) public void render(DrawContext drawContext, int x, int y, int mouseX, int mouseY, TextRenderer textRenderer)
{ {
super.render(drawContext, x, y, mouseX, mouseY); super.render(drawContext, x, y, mouseX, mouseY, textRenderer);
drawContext.drawTextWithShadow(textRenderer, Text.literal(name), x+2, y+2, 0xFFFFFF); drawContext.drawTextWithShadow(textRenderer, Text.literal(name), x+2, y+2, 0xFFFFFF);
int redDisplayStartColor = ColorUtils.rgbaToInt(0, g, b, 255); int redDisplayStartColor = ColorUtils.rgbaToInt(0, g, b, 255);
int redDisplayEndColor = ColorUtils.rgbaToInt(255, g, b, 255); int redDisplayEndColor = ColorUtils.rgbaToInt(255, g, b, 255);

View file

@ -1,6 +1,7 @@
package me.kawaiizenbo.moonlight.module.settings; package me.kawaiizenbo.moonlight.module.settings;
import me.kawaiizenbo.moonlight.util.MathUtils; import me.kawaiizenbo.moonlight.util.MathUtils;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.DrawContext;
import net.minecraft.text.Text; import net.minecraft.text.Text;
@ -22,9 +23,9 @@ public class DoubleSetting extends Setting
} }
@Override @Override
public void render(DrawContext drawContext, int x, int y, int mouseX, int mouseY) public void render(DrawContext drawContext, int x, int y, int mouseX, int mouseY, TextRenderer textRenderer)
{ {
super.render(drawContext, x, y, mouseX, mouseY); super.render(drawContext, x, y, mouseX, mouseY, textRenderer);
drawContext.drawTextWithShadow(textRenderer, Text.literal(name), x+2, y+2, 0xFFFFFF); drawContext.drawTextWithShadow(textRenderer, Text.literal(name), x+2, y+2, 0xFFFFFF);
double diff = Math.min(100, Math.max(0, (mouseX - x)/1.9)); double diff = Math.min(100, Math.max(0, (mouseX - x)/1.9));

View file

@ -1,20 +1,16 @@
package me.kawaiizenbo.moonlight.module.settings; package me.kawaiizenbo.moonlight.module.settings;
import java.lang.reflect.Method;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer; import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.DrawContext;
public class Setting public class Setting
{ {
public String name; public String name;
public Method onValueChanged;
protected TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
public int height = 24; public int height = 24;
public Object value;
int x = 0, y = 0; int x = 0, y = 0;
public void render(DrawContext drawContext, int x, int y, int mouseX, int mouseY) public void render(DrawContext drawContext, int x, int y, int mouseX, int mouseY, TextRenderer textRenderer)
{ {
this.x = x; this.x = x;
this.y = y; this.y = y;

View file

@ -7,7 +7,6 @@ import me.kawaiizenbo.moonlight.util.ColorUtils;
import me.kawaiizenbo.moonlight.util.MathUtils; import me.kawaiizenbo.moonlight.util.MathUtils;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.DrawContext;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
@ -15,7 +14,6 @@ public class HUDOverlay
{ {
public static HUDOverlay INSTANCE = new HUDOverlay(); public static HUDOverlay INSTANCE = new HUDOverlay();
private MinecraftClient mc = MinecraftClient.getInstance(); private MinecraftClient mc = MinecraftClient.getInstance();
TextRenderer textRenderer = mc.textRenderer;
public boolean showClientTag = ((HUDModule)ModuleManager.INSTANCE.getModuleByName("HUD")).clientTag.value; public boolean showClientTag = ((HUDModule)ModuleManager.INSTANCE.getModuleByName("HUD")).clientTag.value;
public int hudColor = ColorUtils.rgbaToInt( public int hudColor = ColorUtils.rgbaToInt(
(int)((HUDModule)ModuleManager.INSTANCE.getModuleByName("HUD")).r.value, (int)((HUDModule)ModuleManager.INSTANCE.getModuleByName("HUD")).r.value,
@ -29,12 +27,12 @@ public class HUDOverlay
if (mc.options.debugEnabled) return; if (mc.options.debugEnabled) return;
// draw stats // draw stats
drawContext.drawTextWithShadow(textRenderer, "FPS: " + ColorUtils.gray + mc.fpsDebugString.split(" ")[0], 2, 2, Moonlight.uiColorA); drawContext.drawTextWithShadow(mc.textRenderer, "FPS: " + ColorUtils.gray + mc.fpsDebugString.split(" ")[0], 2, 2, Moonlight.uiColorA);
drawContext.drawTextWithShadow(textRenderer, "Ping: " + ColorUtils.gray + (mc.getNetworkHandler().getPlayerListEntry(mc.player.getUuid()) == null ? 0 : mc.getNetworkHandler().getPlayerListEntry(mc.player.getUuid()).getLatency()), 2, 12, Moonlight.uiColorA); drawContext.drawTextWithShadow(mc.textRenderer, "Ping: " + ColorUtils.gray + (mc.getNetworkHandler().getPlayerListEntry(mc.player.getUuid()) == null ? 0 : mc.getNetworkHandler().getPlayerListEntry(mc.player.getUuid()).getLatency()), 2, 12, Moonlight.uiColorA);
drawContext.drawTextWithShadow(textRenderer, "Meters/s: " + ColorUtils.gray + MathUtils.round(moveSpeed(), 2), 2, scaledHeight - 20, Moonlight.uiColorA); drawContext.drawTextWithShadow(mc.textRenderer, "Meters/s: " + ColorUtils.gray + MathUtils.round(moveSpeed(), 2), 2, scaledHeight - 20, Moonlight.uiColorA);
// draw coordinates // draw coordinates
drawContext.drawTextWithShadow(textRenderer, drawContext.drawTextWithShadow(mc.textRenderer,
"X: " + ColorUtils.gray + MathUtils.round(mc.player.getX(), 1) + ColorUtils.reset + "X: " + ColorUtils.gray + MathUtils.round(mc.player.getX(), 1) + ColorUtils.reset +
" Y: " + ColorUtils.gray + MathUtils.round(mc.player.getY(), 1) + ColorUtils.reset + " Y: " + ColorUtils.gray + MathUtils.round(mc.player.getY(), 1) + ColorUtils.reset +
" Z: " + ColorUtils.gray + MathUtils.round(mc.player.getZ(), 1), 2, scaledHeight - 10, Moonlight.uiColorA " Z: " + ColorUtils.gray + MathUtils.round(mc.player.getZ(), 1), 2, scaledHeight - 10, Moonlight.uiColorA
@ -43,8 +41,8 @@ public class HUDOverlay
// draw client tag (if enabled) // draw client tag (if enabled)
if (showClientTag) if (showClientTag)
{ {
drawContext.drawTextWithShadow(textRenderer, Moonlight.clientTag + " " + Moonlight.versionTag, drawContext.drawTextWithShadow(mc.textRenderer, Moonlight.clientTag + " " + Moonlight.versionTag,
scaledWidth - textRenderer.getWidth(Moonlight.clientTag + " " + Moonlight.versionTag) - 2, scaledHeight - 10, 16777215); scaledWidth - mc.textRenderer.getWidth(Moonlight.clientTag + " " + Moonlight.versionTag) - 2, scaledHeight - 10, 16777215);
} }
} }

View file

@ -1,21 +1,18 @@
package me.kawaiizenbo.moonlight.ui; package me.kawaiizenbo.moonlight.ui;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator;
import me.kawaiizenbo.moonlight.Moonlight; import me.kawaiizenbo.moonlight.Moonlight;
import me.kawaiizenbo.moonlight.module.ModuleManager; import me.kawaiizenbo.moonlight.module.ModuleManager;
import me.kawaiizenbo.moonlight.module.Module_; import me.kawaiizenbo.moonlight.module.Module_;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.DrawContext;
public class ModulesListOverlay public class ModulesListOverlay
{ {
public static ModulesListOverlay INSTANCE = new ModulesListOverlay(); public static ModulesListOverlay INSTANCE = new ModulesListOverlay();
private MinecraftClient mc = MinecraftClient.getInstance(); private MinecraftClient mc = MinecraftClient.getInstance();
TextRenderer textRenderer = mc.textRenderer;
private ArrayList<Module_> enabledModules = ModuleManager.INSTANCE.getEnabledModules(); private ArrayList<Module_> enabledModules = ModuleManager.INSTANCE.getEnabledModules();
public void render(DrawContext drawContext, int scaledWidth, int scaledHeight) public void render(DrawContext drawContext, int scaledWidth, int scaledHeight)
@ -27,10 +24,10 @@ public class ModulesListOverlay
for (Module_ m : enabledModules) for (Module_ m : enabledModules)
{ {
if (!m.showInModulesList.value) continue; if (!m.showInModulesList.value) continue;
int nameWidth = textRenderer.getWidth(m.name); int nameWidth = mc.textRenderer.getWidth(m.name);
drawContext.fill(scaledWidth - nameWidth - 8, yOffset, scaledWidth, yOffset+12, 0x55222222); drawContext.fill(scaledWidth - nameWidth - 8, yOffset, scaledWidth, yOffset+12, 0x55222222);
drawContext.fill(scaledWidth - 2, yOffset, scaledWidth, yOffset+12, Moonlight.uiColorA); drawContext.fill(scaledWidth - 2, yOffset, scaledWidth, yOffset+12, Moonlight.uiColorA);
drawContext.drawText(textRenderer, m.name, scaledWidth - nameWidth - 4, yOffset + 2, 0xFFFFFFFF, false); drawContext.drawText(mc.textRenderer, m.name, scaledWidth - nameWidth - 4, yOffset + 2, 0xFFFFFFFF, false);
yOffset += 12; yOffset += 12;
} }
} }

View file

@ -22,7 +22,7 @@ public class TextButton
public void render(DrawContext drawContext, TextRenderer textRenderer, int mouseX, int mouseY) public void render(DrawContext drawContext, TextRenderer textRenderer, int mouseX, int mouseY)
{ {
width = textRenderer.getWidth(text); width = textRenderer.getWidth(text);
drawContext.fill(x-1, y-1, x + width + 1, y + 10, hovered(mouseX, mouseY) ? 0xFF444444 : 0xFF222222); drawContext.fill(x-1, y-1, x + width + 1, y + 10, hovered(mouseX, mouseY) ? 0x55FFFFFF : 0);
drawContext.drawText(textRenderer, Text.literal(text), x, y, color, true); drawContext.drawText(textRenderer, Text.literal(text), x, y, color, true);
} }

View file

@ -5,56 +5,57 @@ import java.util.ArrayList;
import me.kawaiizenbo.moonlight.module.Category; import me.kawaiizenbo.moonlight.module.Category;
import me.kawaiizenbo.moonlight.module.ModuleManager; import me.kawaiizenbo.moonlight.module.ModuleManager;
import me.kawaiizenbo.moonlight.module.Module_; import me.kawaiizenbo.moonlight.module.Module_;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer; import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.DrawContext;
public class CategoryPane public class CategoryPane
{ {
private MinecraftClient mc = MinecraftClient.getInstance();
private TextRenderer textRenderer = mc.textRenderer;
public Category category; public Category category;
public int x; public int x, y, height, width = 96;
public int y; int startX, startY;
private int height; boolean dragging = false;
private int width = 96; public boolean collapsed = false;
private boolean collapsed = false; ArrayList<ModuleButton> moduleButtons;
private ArrayList<ModuleButton> moduleButtons;
public CategoryPane(Category category, int initialX, int initialY) public CategoryPane(Category category, int initialX, int initialY, boolean collapsed)
{ {
this.category = category; this.category = category;
this.x = initialX; this.x = initialX;
this.y = initialY; this.y = initialY;
int buttonYOffset = y+16; this.collapsed = collapsed;
moduleButtons = new ArrayList<ModuleButton>(); moduleButtons = new ArrayList<ModuleButton>();
for (Module_ m : ModuleManager.INSTANCE.getModulesByCategory(category)) for (Module_ m : ModuleManager.INSTANCE.getModulesByCategory(category))
{ {
moduleButtons.add(new ModuleButton(m, x+2, buttonYOffset)); moduleButtons.add(new ModuleButton(m));
buttonYOffset += 12;
} }
if (moduleButtons.size() == 0) collapsed = true; if (moduleButtons.size() == 0) collapsed = true;
height = (moduleButtons.size()*12) + 18; height = (moduleButtons.size()*12) + 18;
} }
public void render(DrawContext drawContext, int mouseX, int mouseY, float delta) public void render(DrawContext drawContext, int mouseX, int mouseY, float delta, TextRenderer textRenderer)
{ {
if (dragging)
{
x = mouseX - startX;
y = mouseY - startY;
}
drawContext.fill(x, y, x+width, collapsed ? y+16 : y+height, category.color); drawContext.fill(x, y, x+width, collapsed ? y+16 : y+height, category.color);
drawContext.fill(x+2, y+2, x+(width-2), y+14, hovered(mouseX, mouseY) ? 0xFF333333 : 0xFF222222); drawContext.fill(x+2, y+2, x+(width-2), y+14, hovered(mouseX, mouseY) ? 0xFF333333 : 0xFF222222);
drawContext.drawText(textRenderer, category.name, x+4, y+4, 0xFFFFFFFF, false); drawContext.drawText(textRenderer, category.name, x+4, y+4, 0xFFFFFFFF, false);
if (!collapsed) if (!collapsed)
{ {
int buttonYOffset = y+16;
for (ModuleButton m : moduleButtons) for (ModuleButton m : moduleButtons)
{ {
m.render(drawContext, mouseX, mouseY); m.render(drawContext, mouseX, mouseY, x+2, buttonYOffset, textRenderer);
buttonYOffset += 12;
} }
} }
} }
public boolean hovered(int mouseX, int mouseY) public boolean hovered(int mouseX, int mouseY)
{ {
return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height; return mouseX >= x+2 && mouseX <= x+(width-2) && mouseY >= y+2 && mouseY <= y+14;
} }
public void mouseClicked(int mouseX, int mouseY, int button) public void mouseClicked(int mouseX, int mouseY, int button)
@ -63,6 +64,17 @@ public class CategoryPane
{ {
if (moduleButton.mouseClicked(mouseX, mouseY, button)) return; if (moduleButton.mouseClicked(mouseX, mouseY, button)) return;
} }
if (hovered(mouseX, mouseY)) collapsed = !collapsed; if (hovered(mouseX, mouseY) && button == 1) collapsed = !collapsed;
else if (hovered(mouseX, mouseY) && button == 0)
{
startX = (int)mouseX-x;
startY = (int)mouseY-y;
dragging = true;
}
}
public void mouseReleased(int mouseX, int mouseY, int button)
{
dragging = false;
} }
} }

View file

@ -1,8 +1,11 @@
package me.kawaiizenbo.moonlight.ui.clickgui; package me.kawaiizenbo.moonlight.ui.clickgui;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Map;
import me.kawaiizenbo.moonlight.Moonlight;
import me.kawaiizenbo.moonlight.module.Category; import me.kawaiizenbo.moonlight.module.Category;
import me.kawaiizenbo.moonlight.util.MathUtils;
import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.text.Text; import net.minecraft.text.Text;
@ -10,23 +13,19 @@ import net.minecraft.text.Text;
public class ClickGUIScreen extends Screen public class ClickGUIScreen extends Screen
{ {
public static ClickGUIScreen INSTANCE = new ClickGUIScreen(); public static ClickGUIScreen INSTANCE = new ClickGUIScreen();
public static ArrayList<CategoryPane> categoryPanes; public ArrayList<CategoryPane> categoryPanes;
public ClickGUIScreen() public ClickGUIScreen()
{ {
super(Text.literal("ClickGUI")); super(Text.literal("ClickGUI"));
int xOffset = 4;
int yOffset = 4;
categoryPanes = new ArrayList<CategoryPane>(); categoryPanes = new ArrayList<CategoryPane>();
Map<String, Object> panePos = ((Map<String, Object>)Moonlight.INSTANCE.CONFIG.config.get("panes"));
for (Category category : Category.values()) for (Category category : Category.values())
{ {
if (xOffset > 400) int xOffset = MathUtils.d2iSafe(((Map<String, Object>)panePos.get(category.name)).get("x"));
{ int yOffset = MathUtils.d2iSafe(((Map<String, Object>)panePos.get(category.name)).get("y"));
xOffset = 4; boolean collapsed = (boolean)((Map<String, Object>)panePos.get(category.name)).get("collapsed");
yOffset = 128; categoryPanes.add(new CategoryPane(category, xOffset, yOffset, collapsed));
}
categoryPanes.add(new CategoryPane(category, xOffset, yOffset));
xOffset += 100;
} }
} }
@ -36,7 +35,7 @@ public class ClickGUIScreen extends Screen
this.renderBackground(drawContext); this.renderBackground(drawContext);
for (CategoryPane category : categoryPanes) for (CategoryPane category : categoryPanes)
{ {
category.render(drawContext, mouseX, mouseY, delta); category.render(drawContext, mouseX, mouseY, delta, textRenderer);
} }
} }
@ -50,6 +49,16 @@ public class ClickGUIScreen extends Screen
return super.mouseClicked(mouseX, mouseY, button); return super.mouseClicked(mouseX, mouseY, button);
} }
@Override
public boolean mouseReleased(double mouseX, double mouseY, int button)
{
for (CategoryPane category : categoryPanes)
{
category.mouseReleased((int) mouseX, (int) mouseY, button);
}
return super.mouseReleased(mouseX, mouseY, button);
}
@Override @Override
public boolean shouldPause() public boolean shouldPause()
{ {

View file

@ -10,20 +10,18 @@ public class ModuleButton
{ {
public Module_ module; public Module_ module;
public int x, y, width, height = 0; public int x, y, width, height = 0;
private MinecraftClient mc = MinecraftClient.getInstance();
private TextRenderer textRenderer = mc.textRenderer;
public ModuleButton(Module_ module, int initialX, int initialY) public ModuleButton(Module_ module)
{ {
this.module = module; this.module = module;
this.x = initialX;
this.y = initialY;
this.width = 92; this.width = 92;
this.height = 12; this.height = 12;
} }
public void render(DrawContext drawContext, int mouseX, int mouseY) public void render(DrawContext drawContext, int mouseX, int mouseY, int x, int y, TextRenderer textRenderer)
{ {
this.x = x;
this.y = y;
drawContext.fill(x, y, x + width, y + height, hovered(mouseX, mouseY) ? 0xFF333333 : 0xFF222222); drawContext.fill(x, y, x + width, y + height, hovered(mouseX, mouseY) ? 0xFF333333 : 0xFF222222);
drawContext.drawText(textRenderer, module.name, x+2, y+2, module.enabled ? Moonlight.uiColor : 0xFFFFFF, false); drawContext.drawText(textRenderer, module.name, x+2, y+2, module.enabled ? Moonlight.uiColor : 0xFFFFFF, false);
} }

View file

@ -13,7 +13,10 @@ public class SettingsScreen extends Screen
private Module_ module; private Module_ module;
private TextButton backButton; private TextButton backButton;
protected SettingsScreen(Module_ module) boolean dragging = false;
int startX, startY, x = 4, y = 4, windowWidth = 224, windowHeight = 192;
public SettingsScreen(Module_ module)
{ {
super(Text.literal("Settings")); super(Text.literal("Settings"));
this.module = module; this.module = module;
@ -23,19 +26,33 @@ public class SettingsScreen extends Screen
public void render(DrawContext drawContext, int mouseX, int mouseY, float delta) public void render(DrawContext drawContext, int mouseX, int mouseY, float delta)
{ {
this.renderBackground(drawContext); this.renderBackground(drawContext);
drawContext.fill((width/2)-112, (height/2)-96, (width/2)+112, (height/2)+96, 0xFF222222);
drawContext.drawCenteredTextWithShadow(textRenderer, module.name, width/2, (height/2)-88, 0xFFFFFF); // move window if dragging
drawContext.drawTextWithShadow(textRenderer, Text.literal(module.description), (width/2)-104, (height/2)-72, 0xFFFFFF); if (dragging)
backButton = new TextButton(ColorUtils.underline + "< Back", (width/2)-104, (height/2)-88, 0xFFFFFF); {
x = mouseX - startX;
y = mouseY - startY;
}
drawContext.fill(x, y, x+windowWidth, y+windowHeight, 0xFF222222);
drawContext.fill(x, y, x+windowWidth, y+16, module.category.color);
drawContext.fill(x+2, y+2, x+(windowWidth-2), y+14, 0xFF222222);
drawContext.drawCenteredTextWithShadow(textRenderer, "Module Settings: "+module.name, x+(windowWidth/2), y+4, 0xFFFFFF);
drawContext.drawText(textRenderer, module.description, x+8, y+24, 0xFFFFFF, true);
backButton = new TextButton(ColorUtils.underline + "< Back", x+4, y+4, 0xFFFFFF);
backButton.render(drawContext, textRenderer, mouseX, mouseY); backButton.render(drawContext, textRenderer, mouseX, mouseY);
int yOffset = (height/2)-56; int yOffset = y+40;
for (Setting setting : module.settings) for (Setting setting : module.settings)
{ {
setting.render(drawContext, (width/2)-96, yOffset, mouseX, mouseY); setting.render(drawContext, x+16, yOffset, mouseX, mouseY, textRenderer);
yOffset += setting.height + 1; yOffset += setting.height + 1;
} }
} }
public boolean barHovered(int mouseX, int mouseY)
{
return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + 16;
}
@Override @Override
public boolean shouldPause() public boolean shouldPause()
{ {
@ -45,6 +62,12 @@ public class SettingsScreen extends Screen
@Override @Override
public boolean mouseClicked(double mouseX, double mouseY, int button) public boolean mouseClicked(double mouseX, double mouseY, int button)
{ {
if (barHovered((int)mouseX, (int)mouseY))
{
startX = (int)mouseX-x;
startY = (int)mouseY-y;
dragging = true;
}
backButton.mouseClicked((int)mouseX, (int)mouseY); backButton.mouseClicked((int)mouseX, (int)mouseY);
for (Setting setting : module.settings) for (Setting setting : module.settings)
{ {
@ -56,6 +79,7 @@ public class SettingsScreen extends Screen
@Override @Override
public boolean mouseReleased(double mouseX, double mouseY, int button) public boolean mouseReleased(double mouseX, double mouseY, int button)
{ {
dragging = false;
for (Setting setting : module.settings) for (Setting setting : module.settings)
{ {
setting.mouseReleased(mouseX, mouseY, button); setting.mouseReleased(mouseX, mouseY, button);

View file

@ -17,6 +17,19 @@ public class MathUtils
return bd.doubleValue(); return bd.doubleValue();
} }
public static int d2iSafe(Object value)
{
int out = 0;
try
{
out = (int)Math.floor((double)value);
} catch (Exception e)
{
out = (int)value;
}
return out;
}
public static double length2D(Vec3d vec3d) public static double length2D(Vec3d vec3d)
{ {
return MathHelper.sqrt((float)(vec3d.x * vec3d.x + vec3d.z * vec3d.z)); return MathHelper.sqrt((float)(vec3d.x * vec3d.x + vec3d.z * vec3d.z));

View file

@ -11,9 +11,9 @@
"InGameHudMixin", "InGameHudMixin",
"ChatInputSuggestorMixin", "ChatInputSuggestorMixin",
"ClientConnectionMixin", "ClientConnectionMixin",
"LivingEntityMixin",
"KeyboardMixin", "KeyboardMixin",
"SimpleOptionMixin" "SimpleOptionMixin",
"MinecraftClientMixin"
], ],
"injectors": { "injectors": {
"defaultRequire": 1 "defaultRequire": 1