├── readme-assets ├── ingame.png ├── title.png ├── clickgui.png ├── title-old.png ├── ingame-old.png └── clickgui-old.png ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── src └── main │ ├── resources │ ├── assets │ │ └── moonlight │ │ │ ├── icon.png │ │ │ └── textures │ │ │ └── gui │ │ │ └── sprites │ │ │ ├── hud.png │ │ │ ├── chat.png │ │ │ ├── combat.png │ │ │ ├── player.png │ │ │ ├── render.png │ │ │ ├── updown.png │ │ │ ├── world.png │ │ │ ├── movement.png │ │ │ ├── settings.png │ │ │ ├── chat_light.png │ │ │ ├── hud_light.png │ │ │ ├── world_light.png │ │ │ ├── combat_light.png │ │ │ ├── player_light.png │ │ │ ├── render_light.png │ │ │ ├── updown_light.png │ │ │ ├── movement_light.png │ │ │ └── settings_light.png │ ├── moonlight.accesswidener │ ├── moonlight.mixins.json │ └── fabric.mod.json │ └── java │ └── me │ └── kawaiizenbo │ └── moonlight │ ├── util │ ├── ISimpleOption.java │ ├── ChatUtils.java │ ├── Timer.java │ ├── DrawUtils.java │ ├── ReflectionUtils.java │ ├── MathUtils.java │ ├── ColorUtils.java │ └── KeycodeUtils.java │ ├── module │ ├── modules │ │ ├── AntiPowderSnow.java │ │ ├── ModulesList.java │ │ ├── NoFall.java │ │ ├── Fly.java │ │ ├── AutoWalk.java │ │ ├── HUDEnabler.java │ │ ├── Fullbright.java │ │ ├── Rotation.java │ │ ├── AutoJump.java │ │ ├── ChatSpammer.java │ │ ├── Step.java │ │ ├── Speed.java │ │ ├── AutoTotem.java │ │ ├── TestModule.java │ │ └── Reach.java │ ├── Category.java │ ├── settings │ │ ├── Setting.java │ │ ├── BooleanSetting.java │ │ ├── IndexSetting.java │ │ ├── KeycodeSetting.java │ │ ├── DoubleSetting.java │ │ └── StringSetting.java │ ├── ModuleManager.java │ └── Module.java │ ├── mixin │ ├── MinecraftClientMixin.java │ ├── PowderSnowBlockMixin.java │ ├── SimpleOptionMixin.java │ ├── KeyboardMixin.java │ ├── ClientConnectionMixin.java │ ├── InGameHudMixin.java │ ├── TitleScreenMixin.java │ ├── ClientPlayerEntityMixin.java │ └── ChatInputSuggestorMixin.java │ ├── command │ ├── commands │ │ ├── Reset.java │ │ ├── Help.java │ │ ├── Toggle.java │ │ ├── VClip.java │ │ ├── DeathPos.java │ │ └── Teleport.java │ ├── Command.java │ └── CommandManager.java │ ├── theme │ ├── ThemeColor.java │ └── Theme.java │ ├── ui │ ├── hud │ │ ├── HUDRenderer.java │ │ ├── modules │ │ │ ├── ClientTag.java │ │ │ ├── FPS.java │ │ │ ├── ArmorDisplay.java │ │ │ ├── Ping.java │ │ │ ├── TestModuleHUD.java │ │ │ ├── TotemCounter.java │ │ │ ├── Coordinates.java │ │ │ └── MovementSpeed.java │ │ ├── HUDModuleManager.java │ │ ├── editor │ │ │ ├── HUDEditorScreen.java │ │ │ ├── HUDModuleButton.java │ │ │ ├── HUDModuleList.java │ │ │ └── HUDModuleSettingsScreen.java │ │ └── HUDModule.java │ ├── SetScreenButton.java │ ├── ModulesListOverlay.java │ ├── clickgui │ │ ├── ModuleButton.java │ │ ├── ClickGUIScreen.java │ │ ├── CategoryPane.java │ │ └── SettingsScreen.java │ └── LegacyHUD.java │ ├── Config.java │ └── Moonlight.java ├── settings.gradle ├── .gitignore ├── gradle.properties ├── .github └── workflows │ └── build.yml ├── README.md ├── LICENSE ├── gradlew.bat └── gradlew /readme-assets/ingame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/readme-assets/ingame.png -------------------------------------------------------------------------------- /readme-assets/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/readme-assets/title.png -------------------------------------------------------------------------------- /readme-assets/clickgui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/readme-assets/clickgui.png -------------------------------------------------------------------------------- /readme-assets/title-old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/readme-assets/title-old.png -------------------------------------------------------------------------------- /readme-assets/ingame-old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/readme-assets/ingame-old.png -------------------------------------------------------------------------------- /readme-assets/clickgui-old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/readme-assets/clickgui-old.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/icon.png -------------------------------------------------------------------------------- /src/main/resources/moonlight.accesswidener: -------------------------------------------------------------------------------- 1 | accessWidener v1 named 2 | accessible method net/minecraft/client/gui/DrawContext fillGradient (IIIIIII)V 3 | -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/textures/gui/sprites/hud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/textures/gui/sprites/hud.png -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/textures/gui/sprites/chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/textures/gui/sprites/chat.png -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/textures/gui/sprites/combat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/textures/gui/sprites/combat.png -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/textures/gui/sprites/player.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/textures/gui/sprites/player.png -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/textures/gui/sprites/render.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/textures/gui/sprites/render.png -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/textures/gui/sprites/updown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/textures/gui/sprites/updown.png -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/textures/gui/sprites/world.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/textures/gui/sprites/world.png -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/textures/gui/sprites/movement.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/textures/gui/sprites/movement.png -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/textures/gui/sprites/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/textures/gui/sprites/settings.png -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/util/ISimpleOption.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.util; 2 | 3 | public interface ISimpleOption 4 | { 5 | public void setValueUnrestricted(T value); 6 | } 7 | -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/textures/gui/sprites/chat_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/textures/gui/sprites/chat_light.png -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/textures/gui/sprites/hud_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/textures/gui/sprites/hud_light.png -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/textures/gui/sprites/world_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/textures/gui/sprites/world_light.png -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/textures/gui/sprites/combat_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/textures/gui/sprites/combat_light.png -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/textures/gui/sprites/player_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/textures/gui/sprites/player_light.png -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/textures/gui/sprites/render_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/textures/gui/sprites/render_light.png -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/textures/gui/sprites/updown_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/textures/gui/sprites/updown_light.png -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/textures/gui/sprites/movement_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/textures/gui/sprites/movement_light.png -------------------------------------------------------------------------------- /src/main/resources/assets/moonlight/textures/gui/sprites/settings_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kawaiizenbo/MoonlightMeadows/HEAD/src/main/resources/assets/moonlight/textures/gui/sprites/settings_light.png -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | maven { 4 | name = 'Fabric' 5 | url = 'https://maven.fabricmc.net/' 6 | } 7 | mavenCentral() 8 | gradlePluginPortal() 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # gradle 2 | 3 | .gradle/ 4 | build/ 5 | out/ 6 | classes/ 7 | 8 | # eclipse 9 | 10 | *.launch 11 | 12 | # idea 13 | 14 | .idea/ 15 | *.iml 16 | *.ipr 17 | *.iws 18 | 19 | # vscode 20 | 21 | .settings/ 22 | .vscode/ 23 | bin/ 24 | .classpath 25 | .project 26 | 27 | # macos 28 | 29 | *.DS_Store 30 | 31 | # fabric 32 | 33 | run/ 34 | 35 | # java 36 | 37 | hs_err_*.log 38 | replay_*.log 39 | *.hprof 40 | *.jfr 41 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/modules/AntiPowderSnow.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.modules; 2 | 3 | import me.kawaiizenbo.moonlight.module.Category; 4 | import me.kawaiizenbo.moonlight.module.Module; 5 | 6 | public class AntiPowderSnow extends Module 7 | { 8 | public AntiPowderSnow() 9 | { 10 | super("Anti Powder Snow", "Allows the player to walk on powder snow.", Category.PLAYER); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Done to increase the memory available to gradle. 2 | org.gradle.jvmargs=-Xmx1G 3 | org.gradle.parallel=true 4 | 5 | # Fabric Properties 6 | # check these on https://fabricmc.net/develop 7 | minecraft_version=1.21.4 8 | yarn_mappings=1.21.4+build.8 9 | loader_version=0.16.10 10 | 11 | # Mod Properties 12 | mod_version = 0.4.0 13 | maven_group = me.kawaiizenbo 14 | archives_base_name = moonlight 15 | 16 | # Dependencies 17 | fabric_version=0.115.0+1.21.4 18 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/util/ChatUtils.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.util; 2 | 3 | import net.minecraft.client.MinecraftClient; 4 | import net.minecraft.text.Text; 5 | 6 | public class ChatUtils 7 | { 8 | private static MinecraftClient mc = MinecraftClient.getInstance(); 9 | 10 | public static void sendMsg(String message) 11 | { 12 | if (mc.world == null) return; 13 | mc.inGameHud.getChatHud().addMessage(Text.literal(message)); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/modules/ModulesList.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.modules; 2 | 3 | import me.kawaiizenbo.moonlight.module.Category; 4 | import me.kawaiizenbo.moonlight.module.Module; 5 | 6 | public class ModulesList extends Module 7 | { 8 | public ModulesList() 9 | { 10 | super("ModulesList", "Shows enabled modules on side of screen", Category.RENDER); 11 | this.enabled = true; 12 | this.showInModulesList.value = false; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/Category.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module; 2 | 3 | public enum Category 4 | { 5 | COMBAT("Combat", 0xFFFF5555), 6 | MOVEMENT("Movement", 0xFFFF55FF), 7 | RENDER("Render", 0xFF5555FF), 8 | WORLD("World", 0xFF55FF55), 9 | PLAYER("Player", 0xFF00AAAA), 10 | CHAT("Chat", 0xFFFFAA00), 11 | SPECIAL("Special", 0xFFFFFFFF); 12 | 13 | public String name; 14 | public int color; 15 | 16 | Category(String name, int color) 17 | { 18 | this.name = name; 19 | this.color = color; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/resources/moonlight.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "minVersion": "0.8", 4 | "package": "me.kawaiizenbo.moonlight.mixin", 5 | "compatibilityLevel": "JAVA_17", 6 | "mixins": [ 7 | ], 8 | "client": [ 9 | "TitleScreenMixin", 10 | "InGameHudMixin", 11 | "ChatInputSuggestorMixin", 12 | "ClientConnectionMixin", 13 | "KeyboardMixin", 14 | "SimpleOptionMixin", 15 | "MinecraftClientMixin", 16 | "ClientPlayerEntityMixin", 17 | "PowderSnowBlockMixin" 18 | ], 19 | "injectors": { 20 | "defaultRequire": 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/modules/NoFall.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.modules; 2 | 3 | import me.kawaiizenbo.moonlight.module.Category; 4 | import me.kawaiizenbo.moonlight.module.Module; 5 | import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; 6 | 7 | public class NoFall extends Module 8 | { 9 | public NoFall() 10 | { 11 | super("NoFall", "Prevents you from taking fall damage.", Category.PLAYER); 12 | } 13 | 14 | @Override 15 | public void tick() 16 | { 17 | if(mc.player.fallDistance >= 2.5) mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.OnGroundOnly(true, false)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/mixin/MinecraftClientMixin.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.Inject; 5 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 6 | import org.spongepowered.asm.mixin.injection.At; 7 | 8 | import me.kawaiizenbo.moonlight.Moonlight; 9 | import net.minecraft.client.MinecraftClient; 10 | 11 | @Mixin(MinecraftClient.class) 12 | public class MinecraftClientMixin 13 | { 14 | @Inject(at = @At("TAIL"), method = "scheduleStop") 15 | public void onShutdown(CallbackInfo ci) { 16 | Moonlight.INSTANCE.saveConfig(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/modules/Fly.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.modules; 2 | 3 | import me.kawaiizenbo.moonlight.module.Category; 4 | import me.kawaiizenbo.moonlight.module.Module; 5 | 6 | public class Fly extends Module 7 | { 8 | 9 | public Fly() 10 | { 11 | super("Fly", "Allows you to fly in survival mode.", Category.MOVEMENT); 12 | } 13 | 14 | @Override 15 | public void tick() 16 | { 17 | mc.player.getAbilities().flying = true; 18 | } 19 | 20 | @Override 21 | public void onDisable() 22 | { 23 | super.onDisable(); 24 | mc.player.getAbilities().flying = false; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/modules/AutoWalk.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.modules; 2 | 3 | import me.kawaiizenbo.moonlight.module.Category; 4 | import me.kawaiizenbo.moonlight.module.Module; 5 | 6 | public class AutoWalk extends Module 7 | { 8 | 9 | public AutoWalk() 10 | { 11 | super("Auto Walk", "Automatically moves forward.", Category.MOVEMENT); 12 | } 13 | 14 | @Override 15 | public void tick() 16 | { 17 | mc.options.forwardKey.setPressed(true); 18 | } 19 | 20 | @Override 21 | public void onDisable() 22 | { 23 | super.onDisable(); 24 | mc.options.forwardKey.setPressed(false); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/util/Timer.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.util; 2 | 3 | public class Timer 4 | { 5 | public long lastMS = System.currentTimeMillis(); 6 | 7 | public void reset() 8 | { 9 | lastMS = System.currentTimeMillis(); 10 | } 11 | 12 | public boolean hasTimeElapsed(long time, boolean reset) 13 | { 14 | if (lastMS > System.currentTimeMillis()) 15 | { 16 | lastMS = System.currentTimeMillis(); 17 | } 18 | 19 | if (System.currentTimeMillis()-lastMS > time) 20 | { 21 | if (reset) reset(); 22 | 23 | return true; 24 | } 25 | 26 | else 27 | { 28 | return false; 29 | } 30 | 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/modules/HUDEnabler.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.modules; 2 | 3 | import me.kawaiizenbo.moonlight.module.Category; 4 | import me.kawaiizenbo.moonlight.module.Module; 5 | import me.kawaiizenbo.moonlight.module.settings.IndexSetting; 6 | 7 | public class HUDEnabler extends Module 8 | { 9 | public IndexSetting mode = new IndexSetting("Mode", 0, "Modular", "Legacy"); 10 | 11 | public HUDEnabler() 12 | { 13 | super("HUD", "The Moonlight HUD.", Category.RENDER); 14 | this.enabled = true; 15 | this.showInModulesList.value = false; 16 | this.showEditButton = true; 17 | settings.add(mode); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/command/commands/Reset.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.command.commands; 2 | 3 | import com.mojang.brigadier.builder.LiteralArgumentBuilder; 4 | 5 | import me.kawaiizenbo.moonlight.Moonlight; 6 | import me.kawaiizenbo.moonlight.command.Command; 7 | import net.minecraft.command.CommandSource; 8 | 9 | public class Reset extends Command 10 | { 11 | public Reset() 12 | { 13 | super("reset", "Resets all config options."); 14 | } 15 | 16 | @Override 17 | public void build(LiteralArgumentBuilder builder) 18 | { 19 | builder.executes(context -> 20 | { 21 | Moonlight.CONFIG.loadDefaultConfig(); 22 | return SINGLE_SUCCESS; 23 | }); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/theme/ThemeColor.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.theme; 2 | 3 | public class ThemeColor 4 | { 5 | public int r, g, b; 6 | 7 | public ThemeColor(int r, int g, int b) 8 | { 9 | this.r = r; 10 | this.g = g; 11 | this.b = b; 12 | } 13 | 14 | public ThemeColor(int RGBcolor) 15 | { 16 | this.r = (RGBcolor&0x00FF0000)>>16; 17 | this.g = (RGBcolor&0x0000FF00)>>8; 18 | this.b = (RGBcolor&0x000000FF)>>0; 19 | } 20 | 21 | public int getRGB() 22 | { 23 | return ((255&0x0ff)<<24)|((r&0x0ff)<<16)|((g&0x0ff)<<8)|(b&0x0ff); 24 | } 25 | 26 | public void setRGB(int RGBcolor) 27 | { 28 | this.r = RGBcolor&0x00FF0000; 29 | this.g = RGBcolor&0x0000FF00; 30 | this.b = RGBcolor&0x000000FF; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/util/DrawUtils.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.util; 2 | 3 | import me.kawaiizenbo.moonlight.Moonlight; 4 | import me.kawaiizenbo.moonlight.theme.ThemeColor; 5 | import net.minecraft.util.Identifier; 6 | 7 | public class DrawUtils 8 | { 9 | public static Identifier getThemedGUIIcon(String textureName, ThemeColor invert) 10 | { 11 | boolean mode = ((invert.r + invert.g + invert.b) / 3) > 77; 12 | String addition = mode ? "_light" : ""; 13 | return Identifier.of("moonlight", textureName+addition); 14 | } 15 | 16 | public static Identifier getThemedGUIIcon(String textureName) 17 | { 18 | String addition = Moonlight.THEME.useDarkIcons ? "_light" : ""; 19 | return Identifier.of("moonlight", textureName+addition); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/hud/HUDRenderer.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.hud; 2 | 3 | import net.minecraft.client.MinecraftClient; 4 | import net.minecraft.client.gui.DrawContext; 5 | 6 | public class HUDRenderer 7 | { 8 | public static HUDRenderer INSTANCE = new HUDRenderer(); 9 | private MinecraftClient mc = MinecraftClient.getInstance(); 10 | 11 | public void render(DrawContext drawContext) 12 | { 13 | // do not draw if F3 enabled 14 | if (mc.getDebugHud().shouldShowDebugHud()) return; 15 | 16 | for (HUDModule h : HUDModuleManager.INSTANCE.getEnabledModules()) 17 | { 18 | // mouse coords are not needed when not in edit mode 19 | h.render(drawContext, 0, 0, mc.textRenderer, false, true); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/modules/Fullbright.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.modules; 2 | 3 | import me.kawaiizenbo.moonlight.module.Category; 4 | import me.kawaiizenbo.moonlight.module.Module; 5 | import me.kawaiizenbo.moonlight.util.ISimpleOption; 6 | 7 | public class Fullbright extends Module 8 | { 9 | public Fullbright() 10 | { 11 | super("Fullbright", "Allows you to see in the dark.", Category.RENDER); 12 | } 13 | 14 | @SuppressWarnings("unchecked") 15 | @Override 16 | public void onEnable() 17 | { 18 | super.onEnable(); 19 | ((ISimpleOption)(Object)mc.options.getGamma()).setValueUnrestricted(100.0); 20 | } 21 | 22 | @Override 23 | public void onDisable() 24 | { 25 | super.onDisable(); 26 | mc.options.getGamma().setValue(1.0); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/modules/Rotation.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.modules; 2 | 3 | import me.kawaiizenbo.moonlight.module.Category; 4 | import me.kawaiizenbo.moonlight.module.Module; 5 | import me.kawaiizenbo.moonlight.module.settings.DoubleSetting; 6 | 7 | public class Rotation extends Module 8 | { 9 | DoubleSetting pitch = new DoubleSetting("Pitch", 0, 0, 360, 0); 10 | DoubleSetting yaw = new DoubleSetting("Yaw", 0, 0, 360, 0); 11 | 12 | public Rotation() 13 | { 14 | super("Rotation", "Locks camera to specified pitch and yaw.", Category.PLAYER); 15 | settings.add(pitch); 16 | settings.add(yaw); 17 | } 18 | 19 | @Override 20 | public void tick() 21 | { 22 | mc.player.setPitch((float)pitch.value); 23 | mc.player.setYaw((float)yaw.value); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/mixin/PowderSnowBlockMixin.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 7 | 8 | import me.kawaiizenbo.moonlight.module.ModuleManager; 9 | import net.minecraft.block.PowderSnowBlock; 10 | import net.minecraft.entity.Entity; 11 | 12 | @Mixin(PowderSnowBlock.class) 13 | public class PowderSnowBlockMixin 14 | { 15 | 16 | @Inject(at = @At("HEAD"), method = "canWalkOnPowderSnow", cancellable = true) 17 | private static void canWalkOnPowderSnow(Entity entity, CallbackInfoReturnable cir) 18 | { 19 | if (ModuleManager.INSTANCE.getModuleByName("Anti Powder Snow").enabled) cir.setReturnValue(true); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/hud/modules/ClientTag.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.hud.modules; 2 | 3 | import me.kawaiizenbo.moonlight.Moonlight; 4 | import me.kawaiizenbo.moonlight.ui.hud.HUDModule; 5 | import net.minecraft.client.font.TextRenderer; 6 | import net.minecraft.client.gui.DrawContext; 7 | 8 | public class ClientTag extends HUDModule 9 | { 10 | public ClientTag(int x, int y) 11 | { 12 | super("Client Tag", x, y); 13 | this.width = 128; 14 | this.height = 8; 15 | this.enabled = true; 16 | } 17 | 18 | @Override 19 | public void render(DrawContext drawContext, int mouseX, int mouseY, TextRenderer textRenderer, boolean editMode, boolean enabled) 20 | { 21 | super.render(drawContext, mouseX, mouseY, textRenderer, editMode, enabled); 22 | drawContext.drawTextWithShadow(mc.textRenderer, Moonlight.clientTag + " " + Moonlight.versionTag, x, y, 16777215); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/resources/fabric.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 1, 3 | "id": "moonlight", 4 | "version": "v0.4.0", 5 | "name": "Moonlight Meadows", 6 | "description": "Utility mod with a focus on stability.", 7 | "authors": [ 8 | "KawaiiZenbo", 9 | "madeline1805", 10 | "BadGamesInc (re-used Hypnotic Code)" 11 | ], 12 | "contact": { 13 | "homepage": "https://kawaiizenbo.me/", 14 | "sources": "https://github.com/kawaiizenbo/MoonlightMeadows" 15 | }, 16 | 17 | "license": "MIT", 18 | "icon": "assets/moonlight/icon.png", 19 | 20 | "environment": "*", 21 | "entrypoints": { 22 | "main": [ 23 | "me.kawaiizenbo.moonlight.Moonlight" 24 | ] 25 | }, 26 | "accessWidener" : "moonlight.accesswidener", 27 | "mixins": [ 28 | "moonlight.mixins.json" 29 | ], 30 | 31 | "depends": { 32 | "fabricloader": ">=0.16.9", 33 | "fabric-api": "*", 34 | "minecraft": "~1.21.3", 35 | "java": ">=21" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/modules/AutoJump.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.modules; 2 | 3 | import me.kawaiizenbo.moonlight.module.Category; 4 | import me.kawaiizenbo.moonlight.module.Module; 5 | import me.kawaiizenbo.moonlight.module.settings.DoubleSetting; 6 | import me.kawaiizenbo.moonlight.util.Timer; 7 | 8 | public class AutoJump extends Module 9 | { 10 | public DoubleSetting delay = new DoubleSetting("Delay (Seconds)", 1, 0.1, 10, 1); 11 | private Timer timer = new Timer(); 12 | 13 | public AutoJump() 14 | { 15 | super("Auto Jump", "Automatically jumps on a timer.", Category.MOVEMENT); 16 | settings.add(delay); 17 | } 18 | 19 | @Override 20 | public void tick() 21 | { 22 | if (timer.hasTimeElapsed((long)delay.value * 1000, true) && mc.player.isOnGround() && mc.player.hasVehicle() == false) 23 | { 24 | mc.player.jump(); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/hud/modules/FPS.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.hud.modules; 2 | 3 | import me.kawaiizenbo.moonlight.Moonlight; 4 | import me.kawaiizenbo.moonlight.ui.hud.HUDModule; 5 | import me.kawaiizenbo.moonlight.util.ColorUtils; 6 | import net.minecraft.client.font.TextRenderer; 7 | import net.minecraft.client.gui.DrawContext; 8 | 9 | public class FPS extends HUDModule 10 | { 11 | public FPS(int x, int y) 12 | { 13 | super("FPS", x, y); 14 | this.width = 48; 15 | this.height = 8; 16 | this.enabled = true; 17 | } 18 | 19 | @Override 20 | public void render(DrawContext drawContext, int mouseX, int mouseY, TextRenderer textRenderer, boolean editMode, boolean enabled) 21 | { 22 | super.render(drawContext, mouseX, mouseY, textRenderer, editMode, enabled); 23 | drawContext.drawTextWithShadow(mc.textRenderer, "FPS: " + ColorUtils.gray + mc.fpsDebugString.split(" ")[0], x, y, Moonlight.THEME.hudAccent.getRGB()); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | on: [pull_request, push] 3 | 4 | jobs: 5 | build: 6 | strategy: 7 | matrix: 8 | java: [ 9 | 21, # java version used since 1.20.5 10 | ] 11 | # only linux 12 | os: [ubuntu-latest] 13 | runs-on: ${{ matrix.os }} 14 | steps: 15 | - name: checkout repository 16 | uses: actions/checkout@v3 17 | - name: validate gradle wrapper 18 | uses: gradle/wrapper-validation-action@v1 19 | - name: setup jdk ${{ matrix.java }} 20 | uses: actions/setup-java@v3 21 | with: 22 | java-version: ${{ matrix.java }} 23 | distribution: 'microsoft' 24 | - name: make gradle wrapper executable 25 | run: chmod +x ./gradlew 26 | - name: build 27 | run: ./gradlew build 28 | - name: capture build artifacts 29 | uses: actions/upload-artifact@v3 30 | with: 31 | name: Artifacts 32 | path: build/libs/ 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Moonlight Meadows Utility Mod for Modern versions of Minecraft 2 | ## This repo has moved, please see https://git.kawaiizenbo.me/kawaiizenbo/MoonlightMeadows 3 | 4 | Requires Fabric, Fabric API, and Minecraft 1.21 5 | 6 | Default ClickGUI Key is Right Alt. 7 | 8 | Grab the latest release build [here](https://github.com/kawaiizenbo/MoonlightMeadows/releases) 9 | Grab the latest nightly build [here](https://nightly.link/kawaiizenbo/MoonlightMeadows/workflows/build/main/Artifacts.zip) 10 | 11 | ## Screenshots 12 | ![Title Screen](./readme-assets/title.png) 13 | *Title Screen* 14 | 15 | ![In-Game HUD](./readme-assets/ingame.png) 16 | *In-Game HUD* 17 | 18 | ![ClickGUI](./readme-assets/clickgui.png) 19 | *ClickGUI* 20 | 21 | 22 | ## Disclaimer 23 | Please use this mod at your own risk, we are not responsible for any serious injury or death caused by this mod. 24 | Do not use while operating heavy machinery. 25 | This project is not affiliated with Mojang or Microsoft. 26 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/util/ReflectionUtils.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.util; 2 | 3 | import java.lang.reflect.Method; 4 | 5 | public class ReflectionUtils 6 | { 7 | public static Method tryGetMethod(String methodName, Class class1) 8 | { 9 | // safety be damned this is my own code i get to control when it crashes 10 | try 11 | { 12 | return class1.getDeclaredMethod(methodName, new Class[1]); 13 | } 14 | catch (Exception e) 15 | { 16 | e.printStackTrace(); 17 | return (Method)null; 18 | } 19 | } 20 | 21 | public static void tryCallMethod(Method method, Object... parameters) 22 | { 23 | // hope that shits static 24 | try 25 | { 26 | method.invoke(null, parameters); 27 | } 28 | catch (Exception e) 29 | { 30 | // go fuck yourself 31 | e.printStackTrace(); 32 | } 33 | 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/hud/modules/ArmorDisplay.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.hud.modules; 2 | 3 | import me.kawaiizenbo.moonlight.ui.hud.HUDModule; 4 | import net.minecraft.client.font.TextRenderer; 5 | import net.minecraft.client.gui.DrawContext; 6 | import net.minecraft.item.ItemStack; 7 | 8 | public class ArmorDisplay extends HUDModule 9 | { 10 | 11 | public ArmorDisplay(int x, int y) 12 | { 13 | super("Armor Display", x, y); 14 | this.width = 16; 15 | this.height = 64; 16 | } 17 | 18 | @Override 19 | public void render(DrawContext drawContext, int mouseX, int mouseY, TextRenderer textRenderer, boolean editMode, boolean enabled) 20 | { 21 | super.render(drawContext, mouseX, mouseY, textRenderer, editMode, enabled); 22 | int yOffset = 0; 23 | for (int i = 39; i >= 36; i--) 24 | { 25 | ItemStack piece = mc.player.getInventory().getStack(i); 26 | drawContext.drawItem(piece, x, y+yOffset); 27 | drawContext.drawStackOverlay(textRenderer, piece, x, y+yOffset); 28 | yOffset += 16; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/mixin/SimpleOptionMixin.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.mixin; 2 | 3 | import java.util.Objects; 4 | import java.util.function.Consumer; 5 | 6 | import org.spongepowered.asm.mixin.Final; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.Shadow; 9 | 10 | import me.kawaiizenbo.moonlight.util.ISimpleOption; 11 | import net.minecraft.client.MinecraftClient; 12 | import net.minecraft.client.option.SimpleOption; 13 | 14 | @Mixin(SimpleOption.class) 15 | public class SimpleOptionMixin implements ISimpleOption 16 | { 17 | @Shadow T value; 18 | @Shadow @Final private Consumer changeCallback; 19 | 20 | @Override 21 | public void setValueUnrestricted(T object) 22 | { 23 | if (!MinecraftClient.getInstance().isRunning()) 24 | { 25 | this.value = object; 26 | return; 27 | } 28 | if (!Objects.equals(this.value, object)) 29 | { 30 | this.value = object; 31 | this.changeCallback.accept(this.value); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/hud/modules/Ping.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.hud.modules; 2 | 3 | import me.kawaiizenbo.moonlight.Moonlight; 4 | import me.kawaiizenbo.moonlight.ui.hud.HUDModule; 5 | import me.kawaiizenbo.moonlight.util.ColorUtils; 6 | import net.minecraft.client.font.TextRenderer; 7 | import net.minecraft.client.gui.DrawContext; 8 | 9 | public class Ping extends HUDModule 10 | { 11 | public Ping(int x, int y) 12 | { 13 | super("Ping", x, y); 14 | this.width = 48; 15 | this.height = 8; 16 | this.enabled = true; 17 | } 18 | 19 | @Override 20 | public void render(DrawContext drawContext, int mouseX, int mouseY, TextRenderer textRenderer, boolean editMode, boolean enabled) 21 | { 22 | super.render(drawContext, mouseX, mouseY, textRenderer, editMode, enabled); 23 | drawContext.drawTextWithShadow(mc.textRenderer, "Ping: " + ColorUtils.gray + (mc.getNetworkHandler().getPlayerListEntry(mc.player.getUuid()) == null ? 0 : mc.getNetworkHandler().getPlayerListEntry(mc.player.getUuid()).getLatency()), x, y, Moonlight.THEME.hudAccent.getRGB()); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/util/MathUtils.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.util; 2 | 3 | import java.math.BigDecimal; 4 | import java.math.RoundingMode; 5 | 6 | import net.minecraft.util.math.MathHelper; 7 | import net.minecraft.util.math.Vec3d; 8 | 9 | public class MathUtils 10 | { 11 | public static double round(double value, int places) 12 | { 13 | if (places < 0) throw new IllegalArgumentException(); 14 | 15 | BigDecimal bd = new BigDecimal(Double.toString(value)); 16 | bd = bd.setScale(places, RoundingMode.HALF_UP); 17 | return bd.doubleValue(); 18 | } 19 | 20 | public static int d2iSafe(Object value) 21 | { 22 | int out = 0; 23 | try 24 | { 25 | out = (int)Math.floor((double)value); 26 | } catch (Exception e) 27 | { 28 | out = (int)value; 29 | } 30 | return out; 31 | } 32 | 33 | public static double length2D(Vec3d vec3d) 34 | { 35 | return MathHelper.sqrt((float)(vec3d.x * vec3d.x + vec3d.z * vec3d.z)); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/settings/Setting.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.settings; 2 | 3 | import me.kawaiizenbo.moonlight.Moonlight; 4 | import net.minecraft.client.font.TextRenderer; 5 | import net.minecraft.client.gui.DrawContext; 6 | 7 | public class Setting 8 | { 9 | public String name; 10 | 11 | int x = 0, y = 0; 12 | public void render(DrawContext drawContext, int x, int y, int mouseX, int mouseY, TextRenderer textRenderer) 13 | { 14 | this.x = x; 15 | this.y = y; 16 | drawContext.fill(x, y, x+192, y+24, hovered(mouseX, mouseY) ? Moonlight.THEME.hover.getRGB(): Moonlight.THEME.background.getRGB()); 17 | 18 | } 19 | 20 | public void mouseClicked(double mouseX, double mouseY, int button) { } 21 | 22 | public void mouseReleased(double mouseX, double mouseY, int button) { } 23 | 24 | public void keyPressed(int keyCode, int scanCode, int modifiers) { } 25 | 26 | protected boolean hovered(int mouseX, int mouseY) 27 | { 28 | return mouseX >= x && mouseX <= x + 192 && mouseY >= y && mouseY <= y + 24; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/modules/ChatSpammer.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.modules; 2 | 3 | import me.kawaiizenbo.moonlight.module.Category; 4 | import me.kawaiizenbo.moonlight.module.Module; 5 | import me.kawaiizenbo.moonlight.module.settings.DoubleSetting; 6 | import me.kawaiizenbo.moonlight.module.settings.StringSetting; 7 | import me.kawaiizenbo.moonlight.util.Timer; 8 | 9 | public class ChatSpammer extends Module 10 | { 11 | public StringSetting message = new StringSetting("Message", "E4PE4J"); 12 | public DoubleSetting delay = new DoubleSetting("Delay (Seconds)", 1, 0.1, 10, 1); 13 | private Timer timer = new Timer(); 14 | 15 | public ChatSpammer() 16 | { 17 | super("Chat Spammer", "Spams a selected message in chat.", Category.CHAT); 18 | settings.add(message); 19 | settings.add(delay); 20 | } 21 | 22 | @Override 23 | public void tick() 24 | { 25 | if (timer.hasTimeElapsed((long)delay.value * 1000, true)) 26 | { 27 | mc.player.networkHandler.sendChatMessage(message.value); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/command/commands/Help.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.command.commands; 2 | 3 | import com.mojang.brigadier.builder.LiteralArgumentBuilder; 4 | 5 | import me.kawaiizenbo.moonlight.command.Command; 6 | import me.kawaiizenbo.moonlight.command.CommandManager; 7 | import me.kawaiizenbo.moonlight.util.ChatUtils; 8 | import me.kawaiizenbo.moonlight.util.ColorUtils; 9 | import net.minecraft.command.CommandSource; 10 | 11 | public class Help extends Command 12 | { 13 | public Help() 14 | { 15 | super("help", "Gives you a list of all of the commands"); 16 | } 17 | 18 | @Override 19 | public void build(LiteralArgumentBuilder builder) 20 | { 21 | builder.executes(context -> 22 | { 23 | for (Command cmd : CommandManager.get().getAll()) 24 | { 25 | ChatUtils.sendMsg(ColorUtils.aqua + "Command: " + ColorUtils.gray + cmd.getName()); 26 | ChatUtils.sendMsg(ColorUtils.gray + cmd.getDescription()); 27 | ChatUtils.sendMsg(ColorUtils.gray + ""); 28 | } 29 | return SINGLE_SUCCESS; 30 | }); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 KawaiiZenbo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/hud/modules/TestModuleHUD.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.hud.modules; 2 | 3 | import me.kawaiizenbo.moonlight.module.settings.DoubleSetting; 4 | import me.kawaiizenbo.moonlight.module.settings.StringSetting; 5 | import me.kawaiizenbo.moonlight.ui.hud.HUDModule; 6 | import net.minecraft.client.font.TextRenderer; 7 | import net.minecraft.client.gui.DrawContext; 8 | 9 | public class TestModuleHUD extends HUDModule 10 | { 11 | public StringSetting text = new StringSetting("Text", "hii :3"); 12 | public DoubleSetting number = new DoubleSetting("test", 1, 0, 10, 0); 13 | 14 | public TestModuleHUD(int x, int y) 15 | { 16 | super("Test HUD Module", x, y); 17 | this.width = 96; 18 | this.height = 8; 19 | settings.add(text); 20 | settings.add(number); 21 | } 22 | 23 | @Override 24 | public void render(DrawContext drawContext, int mouseX, int mouseY, TextRenderer textRenderer, boolean editMode, boolean enabled) 25 | { 26 | super.render(drawContext, mouseX, mouseY, textRenderer, editMode, enabled); 27 | drawContext.drawText(textRenderer, text.value, x, y, 0xFFFFFF, false); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/hud/modules/TotemCounter.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.hud.modules; 2 | 3 | import me.kawaiizenbo.moonlight.ui.hud.HUDModule; 4 | import net.minecraft.client.font.TextRenderer; 5 | import net.minecraft.client.gui.DrawContext; 6 | import net.minecraft.item.ItemStack; 7 | import net.minecraft.item.Items; 8 | 9 | public class TotemCounter extends HUDModule 10 | { 11 | 12 | public TotemCounter(int x, int y) 13 | { 14 | super("Totem Counter", x, y); 15 | this.width = 24; 16 | this.height = 16; 17 | } 18 | 19 | @Override 20 | public void render(DrawContext drawContext, int mouseX, int mouseY, TextRenderer textRenderer, boolean editMode, boolean enabled) 21 | { 22 | super.render(drawContext, mouseX, mouseY, textRenderer, editMode, enabled); 23 | int count = 0; 24 | for (int i = 0; i < 36; i++) 25 | { 26 | ItemStack stack = mc.player.getInventory().getStack(i); 27 | if (stack.getItem() == Items.TOTEM_OF_UNDYING) count += stack.getCount(); 28 | } 29 | drawContext.drawItem(Items.TOTEM_OF_UNDYING.getDefaultStack(), x, y); 30 | drawContext.drawTextWithShadow(textRenderer, count+"", x+16, y+8, 16777215); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/command/commands/Toggle.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.command.commands; 2 | 3 | import com.mojang.brigadier.arguments.StringArgumentType; 4 | import com.mojang.brigadier.builder.LiteralArgumentBuilder; 5 | 6 | import me.kawaiizenbo.moonlight.command.Command; 7 | import me.kawaiizenbo.moonlight.module.ModuleManager; 8 | import me.kawaiizenbo.moonlight.module.Module; 9 | import net.minecraft.client.MinecraftClient; 10 | import net.minecraft.command.CommandSource; 11 | 12 | public class Toggle extends Command 13 | { 14 | 15 | public Toggle() 16 | { 17 | super("toggle", "Toggle a module on or off."); 18 | } 19 | 20 | @Override 21 | public void build(LiteralArgumentBuilder builder) 22 | { 23 | builder.then(argument("module", StringArgumentType.string()) 24 | .executes(context -> 25 | { 26 | String m = context.getArgument("module", String.class); 27 | Module module = ModuleManager.INSTANCE.getModuleByName(m); 28 | MinecraftClient.getInstance().send(() -> module.toggle()); 29 | 30 | return SINGLE_SUCCESS; 31 | })); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/modules/Step.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.modules; 2 | 3 | import me.kawaiizenbo.moonlight.module.Category; 4 | import me.kawaiizenbo.moonlight.module.Module; 5 | import me.kawaiizenbo.moonlight.module.settings.DoubleSetting; 6 | import net.minecraft.entity.attribute.EntityAttributes; 7 | 8 | public class Step extends Module 9 | { 10 | DoubleSetting stepHeight = new DoubleSetting("Height", 1, 1, 10, 0); 11 | double old = 0.6; 12 | 13 | public Step() 14 | { 15 | super("Step", "Allows you to step up full blocks.", Category.MOVEMENT); 16 | settings.add(stepHeight); 17 | } 18 | 19 | @Override 20 | public void onEnable() 21 | { 22 | super.onEnable(); 23 | old = mc.player.getAttributeInstance(EntityAttributes.STEP_HEIGHT).getBaseValue(); 24 | } 25 | 26 | @Override 27 | public void tick() 28 | { 29 | mc.player.getAttributeInstance(EntityAttributes.STEP_HEIGHT).setBaseValue(stepHeight.value); 30 | } 31 | 32 | @Override 33 | public void onDisable() 34 | { 35 | super.onDisable(); 36 | mc.player.getAttributeInstance(EntityAttributes.STEP_HEIGHT).setBaseValue(old); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/modules/Speed.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.modules; 2 | 3 | import me.kawaiizenbo.moonlight.module.Category; 4 | import me.kawaiizenbo.moonlight.module.Module; 5 | import me.kawaiizenbo.moonlight.module.settings.DoubleSetting; 6 | import net.minecraft.entity.attribute.EntityAttributes; 7 | 8 | public class Speed extends Module 9 | { 10 | double old = 0.1; 11 | 12 | DoubleSetting speed = new DoubleSetting("Speed", 1.4, 0.1, 10, 1); 13 | public Speed() 14 | { 15 | super("Speed", "Allows you to move faster.", Category.MOVEMENT); 16 | settings.add(speed); 17 | } 18 | 19 | @Override 20 | public void onEnable() 21 | { 22 | super.onEnable(); 23 | old = mc.player.getAttributeInstance(EntityAttributes.MOVEMENT_SPEED).getBaseValue(); 24 | } 25 | 26 | @Override 27 | public void tick() 28 | { 29 | mc.player.getAttributeInstance(EntityAttributes.MOVEMENT_SPEED).setBaseValue(speed.value/10d); 30 | } 31 | 32 | @Override 33 | public void onDisable() 34 | { 35 | super.onDisable(); 36 | mc.player.getAttributeInstance(EntityAttributes.MOVEMENT_SPEED).setBaseValue(old); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/hud/modules/Coordinates.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.hud.modules; 2 | 3 | import me.kawaiizenbo.moonlight.Moonlight; 4 | import me.kawaiizenbo.moonlight.ui.hud.HUDModule; 5 | import me.kawaiizenbo.moonlight.util.ColorUtils; 6 | import net.minecraft.client.font.TextRenderer; 7 | import net.minecraft.client.gui.DrawContext; 8 | 9 | public class Coordinates extends HUDModule 10 | { 11 | public Coordinates(int x, int y) 12 | { 13 | super("Coordinates", x, y); 14 | this.width = 128; 15 | this.height = 8; 16 | this.enabled = true; 17 | } 18 | 19 | @Override 20 | public void render(DrawContext drawContext, int mouseX, int mouseY, TextRenderer textRenderer, boolean editMode, boolean enabled) 21 | { 22 | super.render(drawContext, mouseX, mouseY, textRenderer, editMode, enabled); 23 | drawContext.drawTextWithShadow(mc.textRenderer, 24 | "X: " + ColorUtils.gray + String.format("%.1f", mc.player.getX()) + ColorUtils.reset + 25 | " Y: " + ColorUtils.gray + String.format("%.1f", mc.player.getY()) + ColorUtils.reset + 26 | " Z: " + ColorUtils.gray + String.format("%.1f", mc.player.getZ()), x, y, Moonlight.THEME.hudAccent.getRGB() 27 | ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/hud/modules/MovementSpeed.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.hud.modules; 2 | 3 | import me.kawaiizenbo.moonlight.Moonlight; 4 | import me.kawaiizenbo.moonlight.ui.hud.HUDModule; 5 | import me.kawaiizenbo.moonlight.util.ColorUtils; 6 | import me.kawaiizenbo.moonlight.util.MathUtils; 7 | import net.minecraft.client.font.TextRenderer; 8 | import net.minecraft.client.gui.DrawContext; 9 | import net.minecraft.util.math.Vec3d; 10 | 11 | public class MovementSpeed extends HUDModule 12 | { 13 | public MovementSpeed(int x, int y) 14 | { 15 | super("Movement Speed", x, y); 16 | this.width = 72; 17 | this.height = 8; 18 | this.enabled = true; 19 | } 20 | 21 | @Override 22 | public void render(DrawContext drawContext, int mouseX, int mouseY, TextRenderer textRenderer, boolean editMode, boolean enabled) 23 | { 24 | super.render(drawContext, mouseX, mouseY, textRenderer, editMode, enabled); 25 | drawContext.drawTextWithShadow(mc.textRenderer, "Meters/s: " + ColorUtils.gray + MathUtils.round(moveSpeed(), 2), x, y, Moonlight.THEME.hudAccent.getRGB()); 26 | } 27 | 28 | private double moveSpeed() 29 | { 30 | Vec3d move = new Vec3d(mc.player.getX() - mc.player.prevX, 0, mc.player.getZ() - mc.player.prevZ).multiply(20); 31 | return Math.abs(MathUtils.length2D(move)) ; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/command/commands/VClip.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.command.commands; 2 | 3 | import com.mojang.brigadier.arguments.DoubleArgumentType; 4 | import com.mojang.brigadier.builder.LiteralArgumentBuilder; 5 | 6 | import me.kawaiizenbo.moonlight.command.Command; 7 | import net.minecraft.client.network.ClientPlayerEntity; 8 | import net.minecraft.command.CommandSource; 9 | import net.minecraft.entity.Entity; 10 | 11 | public class VClip extends Command 12 | { 13 | 14 | public VClip() 15 | { 16 | super("vclip", "Teleports you vertically."); 17 | } 18 | 19 | @Override 20 | public void build(LiteralArgumentBuilder builder) 21 | { 22 | builder.then(argument("blocks", DoubleArgumentType.doubleArg()).executes(context -> 23 | { 24 | ClientPlayerEntity player = mc.player; 25 | assert player != null; 26 | 27 | double blocks = context.getArgument("blocks", Double.class); 28 | if (player.hasVehicle()) 29 | { 30 | Entity vehicle = player.getVehicle(); 31 | vehicle.setPosition(vehicle.getX(), vehicle.getY() + blocks, vehicle.getZ()); 32 | } 33 | player.setPosition(player.getX(), player.getY() + blocks, player.getZ()); 34 | 35 | return SINGLE_SUCCESS; 36 | })); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/modules/AutoTotem.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.modules; 2 | 3 | import me.kawaiizenbo.moonlight.module.Category; 4 | import me.kawaiizenbo.moonlight.module.Module; 5 | import me.kawaiizenbo.moonlight.module.settings.BooleanSetting; 6 | import net.minecraft.item.Items; 7 | import net.minecraft.screen.slot.SlotActionType; 8 | 9 | public class AutoTotem extends Module 10 | { 11 | public BooleanSetting overrideItems = new BooleanSetting("Override other items", false); 12 | 13 | public AutoTotem() 14 | { 15 | super("Auto Totem", "Automatically puts totems in offhand.", Category.COMBAT); 16 | settings.add(overrideItems); 17 | } 18 | 19 | @Override 20 | public void tick() 21 | { 22 | if (mc.player.getInventory().offHand.get(0).getItem() != Items.TOTEM_OF_UNDYING) 23 | { 24 | if((!mc.player.getInventory().offHand.isEmpty()) && !overrideItems.value) return; 25 | for (int i = 0; i <= 35; i++) 26 | { 27 | if (mc.player.getInventory().getStack(i).getItem() == Items.TOTEM_OF_UNDYING) 28 | { 29 | mc.interactionManager.clickSlot(0, i, 8, SlotActionType.SWAP, mc.player); 30 | mc.interactionManager.clickSlot(0, 45, 8, SlotActionType.SWAP, mc.player); 31 | mc.interactionManager.clickSlot(0, i, 8, SlotActionType.SWAP, mc.player); 32 | } 33 | } 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/settings/BooleanSetting.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.settings; 2 | 3 | import me.kawaiizenbo.moonlight.Moonlight; 4 | import net.minecraft.client.font.TextRenderer; 5 | import net.minecraft.client.gui.DrawContext; 6 | import net.minecraft.text.Text; 7 | 8 | public class BooleanSetting extends Setting 9 | { 10 | public boolean value; 11 | 12 | public BooleanSetting(String name, boolean value) 13 | { 14 | this.name = name; 15 | this.value = value; 16 | } 17 | 18 | @Override 19 | public void render(DrawContext drawContext, int x, int y, int mouseX, int mouseY, TextRenderer textRenderer) 20 | { 21 | super.render(drawContext, x, y, mouseX, mouseY, textRenderer); 22 | drawContext.drawText(textRenderer, Text.literal(name), x+2, y+8, Moonlight.THEME.text.getRGB(), false); 23 | drawContext.fill(x+180, y+7, x+190, y+17, Moonlight.THEME.border.getRGB()); 24 | drawContext.fill(x+181, y+8, x+189, y+16, Moonlight.THEME.background.getRGB()); 25 | drawContext.fill(x+182, y+9, x+188, y+15, value ? Moonlight.THEME.accent.getRGB() : Moonlight.THEME.background.getRGB()); 26 | } 27 | 28 | @Override 29 | public void mouseClicked(double mouseX, double mouseY, int button) 30 | { 31 | if (hovered((int)mouseX, (int)mouseY) && button == 0) 32 | { 33 | this.value = !value; 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/hud/HUDModuleManager.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.hud; 2 | 3 | import java.util.ArrayList; 4 | 5 | import me.kawaiizenbo.moonlight.ui.hud.modules.*; 6 | 7 | public class HUDModuleManager 8 | { 9 | public static HUDModuleManager INSTANCE = new HUDModuleManager(); 10 | public ArrayList modules = new ArrayList<>(); 11 | 12 | public HUDModuleManager() 13 | { 14 | registerModules( 15 | new ClientTag(2, 2), 16 | new FPS(2, 12), 17 | new Ping(2, 22), 18 | new MovementSpeed(2, 32), 19 | new Coordinates(2, 42), 20 | new ArmorDisplay(2, 52), 21 | new TotemCounter(20, 52) 22 | //new TestModuleHUD(20, 50) 23 | ); 24 | } 25 | 26 | private void registerModules(HUDModule... modules) 27 | { 28 | for (HUDModule module : modules) { 29 | this.modules.add(module); 30 | } 31 | } 32 | 33 | public HUDModule getModuleByName(String moduleName) 34 | { 35 | for(HUDModule module : modules) 36 | { 37 | if ((module.name.trim().equalsIgnoreCase(moduleName))) 38 | { 39 | return module; 40 | } 41 | } 42 | return null; 43 | } 44 | 45 | public ArrayList getEnabledModules() 46 | { 47 | ArrayList enabledModules = new ArrayList<>(); 48 | for (HUDModule module : modules) 49 | { 50 | if (!module.enabled) 51 | continue; 52 | enabledModules.add(module); 53 | } 54 | return enabledModules; 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/mixin/KeyboardMixin.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.mixin; 2 | 3 | import org.lwjgl.glfw.GLFW; 4 | import org.spongepowered.asm.mixin.Final; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.Shadow; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 10 | 11 | import me.kawaiizenbo.moonlight.module.Module; 12 | import me.kawaiizenbo.moonlight.module.ModuleManager; 13 | import me.kawaiizenbo.moonlight.ui.clickgui.ClickGUIScreen; 14 | import net.minecraft.client.Keyboard; 15 | import net.minecraft.client.MinecraftClient; 16 | 17 | @Mixin(Keyboard.class) 18 | public abstract class KeyboardMixin 19 | { 20 | @Shadow @Final private MinecraftClient client; 21 | 22 | @Inject(method = "onKey", at = @At("HEAD"), cancellable = true) 23 | public void onKey(long window, int key, int scancode, int action, int modifiers, CallbackInfo info) 24 | { 25 | if (key == GLFW.GLFW_KEY_RIGHT_ALT) MinecraftClient.getInstance().setScreen(ClickGUIScreen.INSTANCE); 26 | for (Module m : ModuleManager.INSTANCE.modules) 27 | { 28 | if (key == m.keybind.value && action == GLFW.GLFW_PRESS && MinecraftClient.getInstance().currentScreen == null) 29 | { 30 | m.toggle(); 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/util/ColorUtils.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.util; 2 | 3 | public class ColorUtils 4 | { 5 | public static String colorChar = "\247"; 6 | 7 | public static String black = "\2470"; 8 | public static String darkBlue = "\2471"; 9 | public static String darkGreen = "\2472"; 10 | public static String darkAqua = "\2473"; 11 | public static String darkRed = "\2474"; 12 | public static String darkMagenta = "\2475"; 13 | public static String gold = "\2476"; 14 | public static String gray = "\2477"; 15 | public static String darkGray = "\2478"; 16 | public static String blue = "\2479"; 17 | public static String green = "\247a"; 18 | public static String aqua = "\247b"; 19 | public static String red = "\247c"; 20 | public static String magenta = "\247d"; 21 | public static String yellow = "\247e"; 22 | public static String white = "\247f"; 23 | 24 | public static String underline = "\247n"; 25 | public static String bold = "\247l"; 26 | public static String italic = "\247o"; 27 | public static String strikethrough = "\247m"; 28 | public static String obfuscated = "\247k"; 29 | public static String reset = "\247r"; 30 | 31 | public static int rgbaToInt(int r, int g, int b, int a) 32 | { 33 | return ((a&0x0ff)<<24)|((r&0x0ff)<<16)|((g&0x0ff)<<8)|(b&0x0ff); 34 | } 35 | 36 | public static int rgbToInt(int r, int g, int b) 37 | { 38 | return ((r&0x0ff)<<16)|((g&0x0ff)<<8)|(b&0x0ff); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/mixin/ClientConnectionMixin.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | 8 | import com.mojang.brigadier.exceptions.CommandSyntaxException; 9 | 10 | import me.kawaiizenbo.moonlight.command.CommandManager; 11 | import me.kawaiizenbo.moonlight.util.ChatUtils; 12 | import net.minecraft.network.ClientConnection; 13 | import net.minecraft.network.packet.Packet; 14 | import net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket; 15 | 16 | @Mixin(ClientConnection.class) 17 | public class ClientConnectionMixin 18 | { 19 | @Inject(method = "send(Lnet/minecraft/network/packet/Packet;)V", at = @At("HEAD"), cancellable = true) 20 | public void send(Packet packet, CallbackInfo ci) 21 | { 22 | if(packet instanceof ChatMessageC2SPacket && ((ChatMessageC2SPacket) packet).chatMessage().startsWith(CommandManager.get().getPrefix())) 23 | { 24 | try 25 | { 26 | CommandManager.get().dispatch(((ChatMessageC2SPacket) packet).chatMessage().substring(CommandManager.get().getPrefix().length())); 27 | } 28 | catch (CommandSyntaxException e) 29 | { 30 | e.printStackTrace(); 31 | ChatUtils.sendMsg(e.getMessage()); 32 | } 33 | ci.cancel(); 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/SetScreenButton.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui; 2 | 3 | import me.kawaiizenbo.moonlight.Moonlight; 4 | import net.minecraft.client.MinecraftClient; 5 | import net.minecraft.client.font.TextRenderer; 6 | import net.minecraft.client.gui.DrawContext; 7 | import net.minecraft.client.gui.screen.Screen; 8 | import net.minecraft.text.Text; 9 | 10 | public class SetScreenButton 11 | { 12 | String text; 13 | Screen screen; 14 | int x, y, width; 15 | 16 | public SetScreenButton(String text, int x, int y, Screen screen) 17 | { 18 | this.text = text; 19 | this.x = x; 20 | this.y = y; 21 | this.screen = screen; 22 | } 23 | 24 | public void render(DrawContext drawContext, TextRenderer textRenderer, int mouseX, int mouseY, int x, int y) 25 | { 26 | this.x = x; 27 | this.y = y; 28 | width = textRenderer.getWidth(text); 29 | drawContext.fill(x-1, y-1, x + width + 1, y + 10, hovered(mouseX, mouseY) ? 0x22222222 : 0); 30 | drawContext.drawText(textRenderer, Text.literal(text), x, y, Moonlight.THEME.headerText.getRGB(), false); 31 | } 32 | 33 | public boolean hovered(int mouseX, int mouseY) 34 | { 35 | return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + 10; 36 | } 37 | 38 | public void mouseClicked(int mouseX, int mouseY) 39 | { 40 | if (hovered(mouseX, mouseY)) 41 | { 42 | MinecraftClient.getInstance().setScreen(screen); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/mixin/InGameHudMixin.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | 8 | import me.kawaiizenbo.moonlight.module.ModuleManager; 9 | import me.kawaiizenbo.moonlight.module.modules.HUDEnabler; 10 | import me.kawaiizenbo.moonlight.ui.LegacyHUD; 11 | import me.kawaiizenbo.moonlight.ui.ModulesListOverlay; 12 | import me.kawaiizenbo.moonlight.ui.hud.HUDRenderer; 13 | import net.minecraft.client.gui.DrawContext; 14 | import net.minecraft.client.gui.hud.InGameHud; 15 | import net.minecraft.client.render.RenderTickCounter; 16 | 17 | @Mixin(InGameHud.class) 18 | public class InGameHudMixin { 19 | 20 | @Inject(at = @At("TAIL"), method = "render") 21 | public void onRender (DrawContext drawContext, RenderTickCounter tickCounter, CallbackInfo info) 22 | { 23 | HUDEnabler hudModule = (HUDEnabler)ModuleManager.INSTANCE.getModuleByName("HUD"); 24 | if (hudModule.enabled) 25 | { 26 | if (hudModule.mode.index == 1) LegacyHUD.INSTANCE.render(drawContext, drawContext.getScaledWindowWidth(), drawContext.getScaledWindowHeight()); 27 | else HUDRenderer.INSTANCE.render(drawContext); 28 | } 29 | if (ModuleManager.INSTANCE.getModuleByName("ModulesList").enabled) ModulesListOverlay.INSTANCE.render(drawContext, drawContext.getScaledWindowWidth(), drawContext.getScaledWindowHeight()); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/command/commands/DeathPos.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.command.commands; 2 | 3 | import com.mojang.brigadier.builder.LiteralArgumentBuilder; 4 | 5 | import me.kawaiizenbo.moonlight.command.Command; 6 | import me.kawaiizenbo.moonlight.util.ChatUtils; 7 | import me.kawaiizenbo.moonlight.util.ColorUtils; 8 | import net.minecraft.command.CommandSource; 9 | import net.minecraft.util.math.GlobalPos; 10 | 11 | public class DeathPos extends Command 12 | { 13 | public DeathPos() 14 | { 15 | super("deathpos", "Shows your last death position."); 16 | } 17 | 18 | @Override 19 | public void build(LiteralArgumentBuilder builder) 20 | { 21 | builder.executes(context -> 22 | { 23 | GlobalPos pos = null; 24 | try 25 | { 26 | pos = mc.player.getLastDeathPos().get(); 27 | if (pos == null) throw new Exception(); 28 | } 29 | catch (Exception e) 30 | { 31 | ChatUtils.sendMsg(ColorUtils.reset + "You have not died in this world."); 32 | return SINGLE_SUCCESS; 33 | } 34 | 35 | ChatUtils.sendMsg(ColorUtils.reset + "You last died at: " + 36 | ColorUtils.aqua + " X: " + ColorUtils.gray + pos.pos().getX() + 37 | ColorUtils.aqua + " Y: " + ColorUtils.gray + pos.pos().getY() + 38 | ColorUtils.aqua + " Z: " + ColorUtils.gray + pos.pos().getZ() 39 | ); 40 | return SINGLE_SUCCESS; 41 | }); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/modules/TestModule.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.modules; 2 | 3 | import me.kawaiizenbo.moonlight.module.Category; 4 | import me.kawaiizenbo.moonlight.module.Module; 5 | import me.kawaiizenbo.moonlight.module.settings.BooleanSetting; 6 | import me.kawaiizenbo.moonlight.module.settings.DoubleSetting; 7 | import me.kawaiizenbo.moonlight.module.settings.StringSetting; 8 | import net.minecraft.entity.MovementType; 9 | import net.minecraft.util.math.Vec3d; 10 | 11 | public class TestModule extends Module 12 | { 13 | public BooleanSetting bs = new BooleanSetting("BooleanSetting", false); 14 | public DoubleSetting ds = new DoubleSetting("DoubleSetting", 1, 0, 10, 10); 15 | public StringSetting ss = new StringSetting("StringSetting", "string"); 16 | 17 | public TestModule() 18 | { 19 | super("Test Module", "Used for testing module features.", Category.WORLD); 20 | addSettings(bs, ds, ss); 21 | } 22 | 23 | @Override 24 | public void onEnable() 25 | { 26 | super.onEnable(); 27 | System.out.println("Test Module Enabled"); 28 | } 29 | 30 | @Override 31 | public void onDisable() 32 | { 33 | super.onDisable(); 34 | System.out.println("Test Module Disabled"); 35 | } 36 | 37 | @Override 38 | public void onMotion(MovementType type, Vec3d movement) 39 | { 40 | System.out.println("Test Module motion"); 41 | } 42 | 43 | @Override 44 | public void tick() 45 | { 46 | System.out.println("Test Module Tick"); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/command/commands/Teleport.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.command.commands; 2 | 3 | import com.mojang.brigadier.arguments.DoubleArgumentType; 4 | import com.mojang.brigadier.builder.LiteralArgumentBuilder; 5 | 6 | import me.kawaiizenbo.moonlight.command.Command; 7 | import net.minecraft.client.network.ClientPlayerEntity; 8 | import net.minecraft.command.CommandSource; 9 | import net.minecraft.entity.Entity; 10 | 11 | public class Teleport extends Command 12 | { 13 | 14 | public Teleport() 15 | { 16 | super("teleport", "Teleports you to specified coordinates."); 17 | } 18 | 19 | @Override 20 | public void build(LiteralArgumentBuilder builder) 21 | { 22 | builder 23 | .then(argument("x", DoubleArgumentType.doubleArg()) 24 | .then(argument("y", DoubleArgumentType.doubleArg()) 25 | .then(argument("z", DoubleArgumentType.doubleArg()) 26 | .executes(context -> 27 | { 28 | ClientPlayerEntity player = mc.player; 29 | assert player != null; 30 | 31 | double x = context.getArgument("x", Double.class); 32 | double y = context.getArgument("y", Double.class); 33 | double z = context.getArgument("z", Double.class); 34 | 35 | if (player.hasVehicle()) 36 | { 37 | Entity vehicle = player.getVehicle(); 38 | vehicle.setPosition(x, y, z); 39 | } 40 | player.setPosition(x, y, z); 41 | 42 | return SINGLE_SUCCESS; 43 | })))); 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/ModulesListOverlay.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui; 2 | 3 | import java.util.ArrayList; 4 | 5 | import me.kawaiizenbo.moonlight.module.ModuleManager; 6 | import me.kawaiizenbo.moonlight.module.Module; 7 | import net.minecraft.client.MinecraftClient; 8 | 9 | import net.minecraft.client.gui.DrawContext; 10 | 11 | public class ModulesListOverlay 12 | { 13 | // this will be replaced with a new hud version at some point 14 | 15 | public static ModulesListOverlay INSTANCE = new ModulesListOverlay(); 16 | private MinecraftClient mc = MinecraftClient.getInstance(); 17 | private ArrayList enabledModules = ModuleManager.INSTANCE.getEnabledModules(); 18 | 19 | public void render(DrawContext drawContext, int scaledWidth, int scaledHeight) 20 | { 21 | // do not draw if F3 enabled 22 | if (mc.getDebugHud().shouldShowDebugHud()) return; 23 | 24 | int yOffset = 0; 25 | for (Module m : enabledModules) 26 | { 27 | if (!m.showInModulesList.value) continue; 28 | int nameWidth = mc.textRenderer.getWidth(m.name); 29 | drawContext.fill(scaledWidth - nameWidth - 8, yOffset, scaledWidth, yOffset+12, 0x77222222); 30 | drawContext.fill(scaledWidth - 2, yOffset, scaledWidth, yOffset+12, 0xFF55FFFF); 31 | drawContext.drawText(mc.textRenderer, m.name, scaledWidth - nameWidth - 4, yOffset + 2, 0xFFFFFFFF, false); 32 | yOffset += 12; 33 | } 34 | } 35 | 36 | public void update() 37 | { 38 | enabledModules = ModuleManager.INSTANCE.getEnabledModules(); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/mixin/TitleScreenMixin.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.mixin; 2 | 3 | import me.kawaiizenbo.moonlight.Moonlight; 4 | 5 | import org.spongepowered.asm.mixin.Final; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.Shadow; 8 | import org.spongepowered.asm.mixin.injection.At; 9 | import org.spongepowered.asm.mixin.injection.Inject; 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 11 | 12 | import net.minecraft.client.gui.DrawContext; 13 | import net.minecraft.client.gui.screen.Screen; 14 | import net.minecraft.client.gui.screen.TitleScreen; 15 | import net.minecraft.util.Util; 16 | import net.minecraft.util.math.MathHelper; 17 | 18 | @Mixin(TitleScreen.class) 19 | public abstract class TitleScreenMixin extends Screen 20 | { 21 | @Shadow 22 | @Final 23 | private boolean doBackgroundFade; 24 | 25 | @Shadow 26 | @Final 27 | private long backgroundFadeStart; 28 | 29 | public TitleScreenMixin() 30 | { 31 | super(null); 32 | } 33 | 34 | @Inject(at = @At("TAIL"), method = "render") 35 | private void clientTag(DrawContext drawContext, int mouseX, int mouseY, float delta, CallbackInfo info) 36 | { 37 | float f = this.doBackgroundFade ? (Util.getMeasuringTimeMs() - this.backgroundFadeStart) / 1000.0F : 1.0F; 38 | float g = this.doBackgroundFade ? MathHelper.clamp(f - 1.0F, 0.0F, 1.0F) : 1.0F; 39 | int l = MathHelper.ceil(g * 255.0F) << 24; 40 | 41 | drawContext.drawTextWithShadow(this.textRenderer, Moonlight.clientTag + " " + Moonlight.versionTag, 2, 2, 16777215 | l); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/mixin/ClientPlayerEntityMixin.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | 8 | import me.kawaiizenbo.moonlight.module.ModuleManager; 9 | import me.kawaiizenbo.moonlight.module.Module; 10 | import net.minecraft.client.MinecraftClient; 11 | import net.minecraft.client.network.ClientPlayerEntity; 12 | import net.minecraft.entity.MovementType; 13 | import net.minecraft.util.math.Vec3d; 14 | 15 | @Mixin(ClientPlayerEntity.class) 16 | public class ClientPlayerEntityMixin 17 | { 18 | @Inject(method = "move", at = @At(value = "TAIL"), cancellable = true) 19 | public void onMove(MovementType type, Vec3d movement, CallbackInfo ci) 20 | { 21 | for (Module m : ModuleManager.INSTANCE.getEnabledModules()) 22 | { 23 | m.onMotion(type, movement); 24 | } 25 | } 26 | 27 | @SuppressWarnings("resource") 28 | @Inject(method = "tick", at = @At(value = "HEAD"), cancellable = true) 29 | public void onTick(CallbackInfo ci) 30 | { 31 | for (Module m : ModuleManager.INSTANCE.getEnabledModules()) 32 | { 33 | if (MinecraftClient.getInstance().player != null) m.tick(); 34 | } 35 | } 36 | 37 | @Inject(method = "init", at = @At(value = "TAIL"), cancellable = true) 38 | public void onInit(CallbackInfo ci) 39 | { 40 | for (Module m : ModuleManager.INSTANCE.getEnabledModules()) 41 | { 42 | m.onEnable(); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/clickgui/ModuleButton.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.clickgui; 2 | 3 | import me.kawaiizenbo.moonlight.Moonlight; 4 | import me.kawaiizenbo.moonlight.module.Module; 5 | import net.minecraft.client.MinecraftClient; 6 | import net.minecraft.client.font.TextRenderer; 7 | import net.minecraft.client.gui.DrawContext; 8 | 9 | public class ModuleButton 10 | { 11 | public Module module; 12 | public int x, y, width, height = 0; 13 | 14 | public ModuleButton(Module module) 15 | { 16 | this.module = module; 17 | this.width = 92; 18 | this.height = 12; 19 | } 20 | 21 | public void render(DrawContext drawContext, int mouseX, int mouseY, int x, int y, TextRenderer textRenderer) 22 | { 23 | this.x = x; 24 | this.y = y; 25 | drawContext.fill(x, y, x + width, y + height, hovered(mouseX, mouseY) ? Moonlight.THEME.hover.getRGB() : Moonlight.THEME.background.getRGB()); 26 | drawContext.drawText(textRenderer, module.name, x+2, y+2, module.enabled ? Moonlight.THEME.accent.getRGB() : Moonlight.THEME.text.getRGB(), false); 27 | } 28 | 29 | public boolean hovered(int mouseX, int mouseY) 30 | { 31 | return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height; 32 | } 33 | 34 | public boolean mouseClicked(int mouseX, int mouseY, int button) 35 | { 36 | if (hovered(mouseX, mouseY)) 37 | { 38 | if (button == 0) 39 | { 40 | module.toggle(); 41 | } 42 | else if (button == 1) 43 | { 44 | MinecraftClient.getInstance().setScreen(new SettingsScreen(module)); 45 | } 46 | return true; 47 | } 48 | return false; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/modules/Reach.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.modules; 2 | 3 | import me.kawaiizenbo.moonlight.module.Category; 4 | import me.kawaiizenbo.moonlight.module.Module; 5 | import me.kawaiizenbo.moonlight.module.settings.DoubleSetting; 6 | import net.minecraft.entity.attribute.EntityAttributes; 7 | 8 | public class Reach extends Module 9 | { 10 | DoubleSetting blockRange = new DoubleSetting("Block Range", 4.5, 1, 10, 1); 11 | DoubleSetting entityRange = new DoubleSetting("Entity Range", 3.0, 1, 10, 1); 12 | double oldBe = 4.5; 13 | double oldEe = 3.0; 14 | 15 | public Reach() 16 | { 17 | super("Reach", "Extends player interaction distance.", Category.MOVEMENT); 18 | settings.add(blockRange); 19 | settings.add(entityRange); 20 | } 21 | 22 | @Override 23 | public void onEnable() 24 | { 25 | super.onEnable(); 26 | oldBe = mc.player.getAttributeInstance(EntityAttributes.BLOCK_INTERACTION_RANGE).getBaseValue(); 27 | oldEe = mc.player.getAttributeInstance(EntityAttributes.ENTITY_INTERACTION_RANGE).getBaseValue(); 28 | } 29 | 30 | @Override 31 | public void tick() 32 | { 33 | mc.player.getAttributeInstance(EntityAttributes.BLOCK_INTERACTION_RANGE).setBaseValue(blockRange.value); 34 | mc.player.getAttributeInstance(EntityAttributes.ENTITY_INTERACTION_RANGE).setBaseValue(entityRange.value); 35 | } 36 | 37 | @Override 38 | public void onDisable() 39 | { 40 | super.onDisable(); 41 | mc.player.getAttributeInstance(EntityAttributes.BLOCK_INTERACTION_RANGE).setBaseValue(oldBe); 42 | mc.player.getAttributeInstance(EntityAttributes.ENTITY_INTERACTION_RANGE).setBaseValue(oldEe); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/settings/IndexSetting.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.settings; 2 | 3 | import me.kawaiizenbo.moonlight.Moonlight; 4 | import me.kawaiizenbo.moonlight.util.DrawUtils; 5 | import net.minecraft.client.font.TextRenderer; 6 | import net.minecraft.client.gui.DrawContext; 7 | import net.minecraft.client.render.RenderLayer; 8 | import net.minecraft.text.Text; 9 | 10 | public class IndexSetting extends Setting 11 | { 12 | public int index; 13 | public String[] elements; 14 | 15 | public IndexSetting(String name, int index, String... elements) 16 | { 17 | this.name = name; 18 | this.index = index; 19 | this.elements = elements; 20 | } 21 | 22 | @Override 23 | public void render(DrawContext drawContext, int x, int y, int mouseX, int mouseY, TextRenderer textRenderer) 24 | { 25 | super.render(drawContext, x, y, mouseX, mouseY, textRenderer); 26 | drawContext.drawText(textRenderer, Text.literal(name), x+2, y+8, Moonlight.THEME.text.getRGB(), false); 27 | drawContext.fill(x+96, y+5, x+190, y+19, Moonlight.THEME.border.getRGB()); 28 | drawContext.fill(x+97, y+6, x+189, y+18, hovered(mouseX, mouseY) ? Moonlight.THEME.hover.getRGB() : Moonlight.THEME.background.getRGB()); 29 | drawContext.drawText(textRenderer, elements[index], x+98, y+8, Moonlight.THEME.text.getRGB(), false); 30 | drawContext.drawGuiTexture(RenderLayer::getGuiTextured, DrawUtils.getThemedGUIIcon("updown", Moonlight.THEME.background), x+177, y+6, 12, 12); 31 | } 32 | 33 | @Override 34 | public void mouseClicked(double mouseX, double mouseY, int button) 35 | { 36 | if (hovered((int)mouseX, (int)mouseY) && button == 0) 37 | { 38 | if (index >= elements.length-1) index = 0; 39 | else index++; 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/ModuleManager.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module; 2 | 3 | import java.util.ArrayList; 4 | 5 | import me.kawaiizenbo.moonlight.module.modules.*; 6 | 7 | public class ModuleManager 8 | { 9 | public static ModuleManager INSTANCE = new ModuleManager(); 10 | public ArrayList modules = new ArrayList<>(); 11 | 12 | public ModuleManager() 13 | { 14 | registerModules( 15 | new Fly(), 16 | new NoFall(), 17 | new HUDEnabler(), 18 | new Step(), 19 | new Fullbright(), 20 | new Speed(), 21 | new ModulesList(), 22 | new ChatSpammer(), 23 | new Rotation(), 24 | new AutoJump(), 25 | new Reach(), 26 | new AntiPowderSnow(), 27 | new AutoTotem(), 28 | new AutoWalk() 29 | /*new Timer()*/ 30 | ); 31 | } 32 | 33 | private void registerModules(Module... modules) 34 | { 35 | for (Module module : modules) { 36 | this.modules.add(module); 37 | } 38 | } 39 | 40 | public Module getModuleByName(String moduleName) 41 | { 42 | for(Module module : modules) 43 | { 44 | if ((module.name.trim().equalsIgnoreCase(moduleName))) 45 | { 46 | return module; 47 | } 48 | } 49 | return null; 50 | } 51 | 52 | public ArrayList getModulesByCategory(Category category) 53 | { 54 | ArrayList returnedModules = new ArrayList<>(); 55 | for(Module module : modules) 56 | { 57 | if (module.category == category) 58 | { 59 | returnedModules.add(module); 60 | } 61 | } 62 | return returnedModules; 63 | } 64 | 65 | public ArrayList getEnabledModules() 66 | { 67 | ArrayList enabledModules = new ArrayList<>(); 68 | for (Module module : modules) 69 | { 70 | if (!module.enabled) 71 | continue; 72 | enabledModules.add(module); 73 | } 74 | return enabledModules; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/hud/editor/HUDEditorScreen.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.hud.editor; 2 | 3 | import me.kawaiizenbo.moonlight.ui.hud.HUDModule; 4 | import me.kawaiizenbo.moonlight.ui.hud.HUDModuleManager; 5 | import net.minecraft.client.gui.DrawContext; 6 | import net.minecraft.client.gui.screen.Screen; 7 | import net.minecraft.text.Text; 8 | 9 | public class HUDEditorScreen extends Screen 10 | { 11 | public static HUDEditorScreen INSTANCE = new HUDEditorScreen(); 12 | HUDModuleList moduleList; 13 | 14 | public HUDEditorScreen() 15 | { 16 | super(Text.literal("HUD Editor")); 17 | moduleList = new HUDModuleList(256, 2, false); 18 | } 19 | 20 | @Override 21 | public void render(DrawContext drawContext, int mouseX, int mouseY, float delta) 22 | { 23 | this.renderBackground(drawContext, mouseX, mouseY, delta); 24 | for (HUDModule h : HUDModuleManager.INSTANCE.modules) 25 | { 26 | h.render(drawContext, mouseX, mouseY, textRenderer, true, h.enabled); 27 | } 28 | moduleList.render(drawContext, mouseX, mouseY, delta, textRenderer); 29 | } 30 | 31 | @Override 32 | public boolean mouseClicked(double mouseX, double mouseY, int button) 33 | { 34 | for (HUDModule h : HUDModuleManager.INSTANCE.modules) 35 | { 36 | h.mouseClicked((int)mouseX, (int)mouseY, button); 37 | } 38 | moduleList.mouseClicked((int)mouseX, (int)mouseY, button); 39 | return super.mouseClicked(mouseX, mouseY, button); 40 | } 41 | 42 | @Override 43 | public boolean mouseReleased(double mouseX, double mouseY, int button) 44 | { 45 | for (HUDModule h : HUDModuleManager.INSTANCE.modules) 46 | { 47 | h.mouseReleased((int)mouseX, (int)mouseY, button); 48 | } 49 | moduleList.mouseReleased((int)mouseX, (int)mouseY, button); 50 | return super.mouseReleased(mouseX, mouseY, button); 51 | } 52 | 53 | @Override 54 | public boolean shouldPause() 55 | { 56 | return false; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/hud/editor/HUDModuleButton.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.hud.editor; 2 | 3 | import me.kawaiizenbo.moonlight.Moonlight; 4 | import me.kawaiizenbo.moonlight.ui.hud.HUDModule; 5 | import net.minecraft.client.MinecraftClient; 6 | import net.minecraft.client.font.TextRenderer; 7 | import net.minecraft.client.gui.DrawContext; 8 | import net.minecraft.client.render.RenderLayer; 9 | import net.minecraft.util.Identifier; 10 | 11 | public class HUDModuleButton 12 | { 13 | public HUDModule module; 14 | public int x, y, width, height = 0; 15 | 16 | public HUDModuleButton(HUDModule module) 17 | { 18 | this.module = module; 19 | this.width = 124; 20 | this.height = 12; 21 | } 22 | 23 | public void render(DrawContext drawContext, int mouseX, int mouseY, int x, int y, TextRenderer textRenderer) 24 | { 25 | this.x = x; 26 | this.y = y; 27 | drawContext.fill(x, y, x + width, y + height, hovered(mouseX, mouseY) ? Moonlight.THEME.hover.getRGB() : Moonlight.THEME.background.getRGB()); 28 | drawContext.drawText(textRenderer, module.name, x+2, y+2, module.enabled ? Moonlight.THEME.accent.getRGB() : Moonlight.THEME.text.getRGB(), false); 29 | if (!module.settings.isEmpty()) drawContext.drawGuiTexture(RenderLayer::getGuiTextured, Identifier.of("moonlight", "settings"), x+width-12, y, 12, 12); 30 | } 31 | 32 | public boolean hovered(int mouseX, int mouseY) 33 | { 34 | return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height; 35 | } 36 | 37 | public boolean mouseClicked(int mouseX, int mouseY, int button) 38 | { 39 | if (hovered(mouseX, mouseY)) 40 | { 41 | if (button == 0) 42 | { 43 | module.toggle(); 44 | } 45 | else if (button == 1) 46 | { 47 | if (!module.settings.isEmpty()) MinecraftClient.getInstance().setScreen(new HUDModuleSettingsScreen(module)); 48 | } 49 | return true; 50 | } 51 | return false; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/hud/HUDModule.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.hud; 2 | 3 | import java.util.ArrayList; 4 | 5 | import me.kawaiizenbo.moonlight.Moonlight; 6 | import me.kawaiizenbo.moonlight.module.settings.Setting; 7 | import net.minecraft.client.MinecraftClient; 8 | import net.minecraft.client.font.TextRenderer; 9 | import net.minecraft.client.gui.DrawContext; 10 | 11 | public abstract class HUDModule 12 | { 13 | public int x, y, height, width; 14 | public String name; 15 | int startX, startY; 16 | boolean dragging = false; 17 | public boolean enabled = false; 18 | public ArrayList settings; 19 | 20 | protected static MinecraftClient mc = MinecraftClient.getInstance(); 21 | 22 | public HUDModule(String name, int x, int y) 23 | { 24 | this.name = name; 25 | this.x = x; 26 | this.y = y; 27 | settings = new ArrayList<>(); 28 | } 29 | 30 | public void render(DrawContext drawContext, int mouseX, int mouseY, TextRenderer textRenderer, boolean editMode, boolean enabled) 31 | { 32 | if (editMode) 33 | { 34 | if (dragging) 35 | { 36 | x = mouseX - startX; 37 | y = mouseY - startY; 38 | } 39 | drawContext.fill(x-1, y-1, x+width+1, y+height+1, enabled ? Moonlight.THEME.accent.getRGB() : 0xFF555555); 40 | drawContext.fill(x, y, x+width, y+height, 0xFF222222); 41 | } 42 | } 43 | 44 | public boolean hovered(int mouseX, int mouseY) 45 | { 46 | return mouseX >= x && mouseX <= x+width && mouseY >= y && mouseY <= y+height; 47 | } 48 | 49 | public void mouseClicked(int mouseX, int mouseY, int button) 50 | { 51 | if (hovered(mouseX, mouseY) && button == 0) 52 | { 53 | startX = (int)mouseX-x; 54 | startY = (int)mouseY-y; 55 | dragging = true; 56 | } 57 | } 58 | 59 | public void mouseReleased(int mouseX, int mouseY, int button) 60 | { 61 | dragging = false; 62 | } 63 | 64 | public void toggle() 65 | { 66 | enabled = !enabled; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/theme/Theme.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.theme; 2 | 3 | public class Theme 4 | { 5 | public static final Theme LIGHT = new Theme( 6 | "Light", 7 | new ThemeColor(0x222222), 8 | new ThemeColor(0xFFFFFF), 9 | new ThemeColor(0xFFFFFF), 10 | new ThemeColor(0xDDDDDD), 11 | new ThemeColor(0x00AAAA), 12 | new ThemeColor(0x55FFFF), 13 | new ThemeColor(0x222222), 14 | false, 15 | false 16 | ); 17 | public static final Theme HIGHCONTRAST = new Theme( 18 | "High Contrast", 19 | new ThemeColor(0x000000), 20 | new ThemeColor(0xFFFFFF), 21 | new ThemeColor(0xFFFFFF), 22 | new ThemeColor(0x777777), 23 | new ThemeColor(0x00AAAA), 24 | new ThemeColor(0xFFFFFF), 25 | new ThemeColor(0x000000), 26 | false, 27 | true 28 | ); 29 | public static final Theme DARK = new Theme( 30 | "Dark", 31 | new ThemeColor(0xFFFFFF), 32 | new ThemeColor(0xFFFFFF), 33 | new ThemeColor(0x222222), 34 | new ThemeColor(0x333333), 35 | new ThemeColor(0x55FFFF), 36 | new ThemeColor(0x55FFFF), 37 | new ThemeColor(0xFFFFFF), 38 | false, 39 | false 40 | ); 41 | public static final Theme[] THEME_LIST = 42 | { 43 | LIGHT, HIGHCONTRAST, DARK 44 | }; 45 | 46 | public String name; 47 | public ThemeColor text; 48 | public ThemeColor headerText; 49 | public ThemeColor background; 50 | public ThemeColor hover; 51 | public ThemeColor accent; 52 | public ThemeColor hudAccent; 53 | public ThemeColor border; 54 | public boolean useDarkIcons; 55 | public boolean themedWindowBorders; 56 | 57 | public Theme( 58 | String name, 59 | ThemeColor text, 60 | ThemeColor headerText, 61 | ThemeColor background, 62 | ThemeColor hover, 63 | ThemeColor accent, 64 | ThemeColor hudAccent, 65 | ThemeColor border, 66 | boolean useDarkIcons, 67 | boolean themedWindowBorders 68 | ) 69 | { 70 | this.name = name; 71 | this.text = text; 72 | this.headerText = headerText; 73 | this.background = background; 74 | this.hover = hover; 75 | this.accent = accent; 76 | this.hudAccent = hudAccent; 77 | this.border = border; 78 | this.useDarkIcons = useDarkIcons; 79 | this.themedWindowBorders = themedWindowBorders; 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/Module.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module; 2 | 3 | import java.util.ArrayList; 4 | 5 | import me.kawaiizenbo.moonlight.module.settings.BooleanSetting; 6 | import me.kawaiizenbo.moonlight.module.settings.KeycodeSetting; 7 | import me.kawaiizenbo.moonlight.module.settings.Setting; 8 | import me.kawaiizenbo.moonlight.ui.ModulesListOverlay; 9 | import net.minecraft.client.MinecraftClient; 10 | import net.minecraft.entity.MovementType; 11 | import net.minecraft.util.math.Vec3d; 12 | 13 | public abstract class Module 14 | { 15 | protected static MinecraftClient mc = MinecraftClient.getInstance(); 16 | public String name; 17 | public String description; 18 | public Category category; 19 | public boolean enabled; 20 | public ArrayList settings; 21 | public boolean showEditButton; 22 | 23 | public BooleanSetting showInModulesList = new BooleanSetting("Show in Modules List", true); 24 | public KeycodeSetting keybind = new KeycodeSetting("Keybind", 0); 25 | 26 | public Module(String name, String description, Category category) 27 | { 28 | this.name = name; 29 | this.description = description; 30 | this.category = category; 31 | settings = new ArrayList<>(); 32 | settings.add(showInModulesList); 33 | settings.add(keybind); 34 | } 35 | 36 | public void onEnable() { ModulesListOverlay.INSTANCE.update(); } 37 | public void onDisable() { ModulesListOverlay.INSTANCE.update(); } 38 | public void onMotion(MovementType type, Vec3d movement) {} 39 | public void tick() {} 40 | 41 | public void toggle() 42 | { 43 | enabled = !enabled; 44 | if(enabled) { 45 | onEnable(); 46 | } else { 47 | onDisable(); 48 | } 49 | } 50 | 51 | public Setting getSettingByName(String settingName) 52 | { 53 | for(Setting setting : settings) 54 | { 55 | if ((setting.name.trim().equalsIgnoreCase(settingName))) 56 | { 57 | return setting; 58 | } 59 | } 60 | return null; 61 | } 62 | 63 | protected void addSettings(Setting... settings) 64 | { 65 | for(Setting setting : settings) 66 | { 67 | this.settings.add(setting); 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/LegacyHUD.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui; 2 | 3 | import me.kawaiizenbo.moonlight.Moonlight; 4 | import me.kawaiizenbo.moonlight.util.ColorUtils; 5 | import me.kawaiizenbo.moonlight.util.MathUtils; 6 | 7 | import net.minecraft.client.MinecraftClient; 8 | import net.minecraft.client.gui.DrawContext; 9 | import net.minecraft.util.math.Vec3d; 10 | 11 | public class LegacyHUD 12 | { 13 | // This is deprecated and will be removed in a later version 14 | public static LegacyHUD INSTANCE = new LegacyHUD(); 15 | private MinecraftClient mc = MinecraftClient.getInstance(); 16 | 17 | public void render(DrawContext drawContext, int scaledWidth, int scaledHeight) 18 | { 19 | // do not draw if F3 enabled 20 | if (mc.getDebugHud().shouldShowDebugHud()) return; 21 | 22 | // draw stats 23 | drawContext.drawTextWithShadow(mc.textRenderer, "FPS: " + ColorUtils.gray + mc.fpsDebugString.split(" ")[0], 2, 2, 0xFF55FFFF); 24 | drawContext.drawTextWithShadow(mc.textRenderer, "Ping: " + ColorUtils.gray + (mc.getNetworkHandler().getPlayerListEntry(mc.player.getUuid()) == null ? 0 : mc.getNetworkHandler().getPlayerListEntry(mc.player.getUuid()).getLatency()), 2, 12, 0xFF55FFFF); 25 | drawContext.drawTextWithShadow(mc.textRenderer, "Meters/s: " + ColorUtils.gray + MathUtils.round(moveSpeed(), 2), 2, scaledHeight - 20, 0xFF55FFFF); 26 | 27 | // draw coordinates 28 | drawContext.drawTextWithShadow(mc.textRenderer, 29 | "X: " + ColorUtils.gray + String.format("%.1f", mc.player.getX()) + ColorUtils.reset + 30 | " Y: " + ColorUtils.gray + String.format("%.1f", mc.player.getY()) + ColorUtils.reset + 31 | " Z: " + ColorUtils.gray + String.format("%.1f", mc.player.getZ()), 2, scaledHeight - 10, 0xFF55FFFF 32 | ); 33 | 34 | // draw client tag 35 | drawContext.drawTextWithShadow(mc.textRenderer, Moonlight.clientTag + " " + Moonlight.versionTag, 36 | scaledWidth - mc.textRenderer.getWidth(Moonlight.clientTag + " " + Moonlight.versionTag) - 2, scaledHeight - 10, 16777215); 37 | } 38 | 39 | private double moveSpeed() 40 | { 41 | Vec3d move = new Vec3d(mc.player.getX() - mc.player.prevX, 0, mc.player.getZ() - mc.player.prevZ).multiply(20); 42 | 43 | return Math.abs(MathUtils.length2D(move)) ; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/settings/KeycodeSetting.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.settings; 2 | 3 | import org.lwjgl.glfw.GLFW; 4 | 5 | import me.kawaiizenbo.moonlight.Moonlight; 6 | import me.kawaiizenbo.moonlight.util.KeycodeUtils; 7 | import net.minecraft.client.font.TextRenderer; 8 | import net.minecraft.client.gui.DrawContext; 9 | import net.minecraft.text.Text; 10 | 11 | public class KeycodeSetting extends Setting 12 | { 13 | public int value; 14 | private boolean isWaiting = false; 15 | 16 | public KeycodeSetting(String name, int value) 17 | { 18 | this.name = name; 19 | this.value = value; 20 | } 21 | 22 | @Override 23 | public void mouseClicked(double mouseX, double mouseY, int button) 24 | { 25 | if (isWaiting) 26 | { 27 | isWaiting = false; 28 | return; 29 | } 30 | if (hovered((int)mouseX, (int)mouseY) && button == 0) 31 | { 32 | isWaiting = true; 33 | } 34 | } 35 | 36 | @Override 37 | public void render(DrawContext drawContext, int x, int y, int mouseX, int mouseY, TextRenderer textRenderer) 38 | { 39 | super.render(drawContext, x, y, mouseX, mouseY, textRenderer); 40 | drawContext.drawText(textRenderer, Text.literal(name), x+2, y+8, Moonlight.THEME.text.getRGB(), false); 41 | if (isWaiting) 42 | { 43 | String waiting = "Press any key."; 44 | int twwidth = textRenderer.getWidth(waiting); 45 | drawContext.drawText(textRenderer, waiting, x+190-twwidth, y+8, Moonlight.THEME.text.getRGB(), false); 46 | } 47 | else 48 | { 49 | String key = KeycodeUtils.keyTable[value]; 50 | if (value == GLFW.GLFW_KEY_UNKNOWN) key = ""; 51 | int twidth = textRenderer.getWidth(key); 52 | drawContext.drawText(textRenderer, key, x+190-twidth, y+8, Moonlight.THEME.text.getRGB(), false); 53 | } 54 | } 55 | 56 | @Override 57 | public void keyPressed(int keyCode, int scanCode, int modifiers) 58 | { 59 | if (isWaiting) 60 | { 61 | if (keyCode == 256) 62 | { 63 | // escape was pressed, exit safely 64 | isWaiting = false; 65 | return; 66 | } 67 | value = keyCode; 68 | isWaiting = false; 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/settings/DoubleSetting.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.settings; 2 | 3 | import me.kawaiizenbo.moonlight.Moonlight; 4 | import me.kawaiizenbo.moonlight.util.MathUtils; 5 | import net.minecraft.client.font.TextRenderer; 6 | import net.minecraft.client.gui.DrawContext; 7 | import net.minecraft.text.Text; 8 | 9 | public class DoubleSetting extends Setting 10 | { 11 | public double value; 12 | private double min, max; 13 | private int roundingPlace; 14 | 15 | boolean sliding = false; 16 | 17 | public DoubleSetting(String name, double value, double min, double max, int roundingPlace) 18 | { 19 | this.name = name; 20 | this.value = value; 21 | this.min = min; 22 | this.max = max; 23 | this.roundingPlace = roundingPlace; 24 | } 25 | 26 | @Override 27 | public void render(DrawContext drawContext, int x, int y, int mouseX, int mouseY, TextRenderer textRenderer) 28 | { 29 | super.render(drawContext, x, y, mouseX, mouseY, textRenderer); 30 | drawContext.drawText(textRenderer, Text.literal(name), x+2, y+4, Moonlight.THEME.text.getRGB(), false); 31 | double diff = Math.min(100, Math.max(0, (mouseX - x)/1.9)); 32 | 33 | if (sliding) 34 | { 35 | if (diff == 0) 36 | { 37 | value = min; 38 | } 39 | else 40 | { 41 | double newValue = MathUtils.round(((diff / 100) * (max - min) + min), roundingPlace); 42 | value = newValue; 43 | } 44 | } 45 | 46 | String valueString = ""+MathUtils.round(value, roundingPlace); 47 | drawContext.drawText(textRenderer, Text.literal(valueString), (x+190)-textRenderer.getWidth(valueString), y+4, Moonlight.THEME.text.getRGB(), false); 48 | drawContext.fill(x+2, y+16, x+190, y+18, 0xFF777777); 49 | int scaledValue = (int)((value/max)*190); 50 | drawContext.fill(x+2, y+16, (x+2)+scaledValue, y+18, Moonlight.THEME.accent.getRGB()); 51 | drawContext.fill(x+2+(scaledValue-1), y+14, x+2+(scaledValue+1), y+20, Moonlight.THEME.border.getRGB()); 52 | } 53 | 54 | @Override 55 | public void mouseClicked(double mouseX, double mouseY, int button) 56 | { 57 | if (hovered((int)mouseX, (int)mouseY) && button == 0) 58 | { 59 | this.sliding = true; 60 | } 61 | } 62 | 63 | @Override 64 | public void mouseReleased(double mouseX, double mouseY, int button) 65 | { 66 | sliding = false; 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/module/settings/StringSetting.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.module.settings; 2 | 3 | import me.kawaiizenbo.moonlight.Moonlight; 4 | import me.kawaiizenbo.moonlight.util.KeycodeUtils; 5 | import net.minecraft.client.font.TextRenderer; 6 | import net.minecraft.client.gui.DrawContext; 7 | import net.minecraft.text.Text; 8 | 9 | public class StringSetting extends Setting 10 | { 11 | public String value; 12 | private boolean focused = false; 13 | 14 | public StringSetting(String name, String value) 15 | { 16 | this.name = name; 17 | this.value = value; 18 | } 19 | 20 | @Override 21 | public void render(DrawContext drawContext, int x, int y, int mouseX, int mouseY, TextRenderer textRenderer) 22 | { 23 | super.render(drawContext, x, y, mouseX, mouseY, textRenderer); 24 | drawContext.drawText(textRenderer, Text.literal(name), x+2, y+8, Moonlight.THEME.text.getRGB(), false); 25 | int twidth = textRenderer.getWidth(value); 26 | drawContext.fill(x+96, y+5, x+190, y+19, Moonlight.THEME.border.getRGB()); 27 | drawContext.fill(x+97, y+6, x+189, y+18, Moonlight.THEME.background.getRGB()); 28 | int cursorPos = x+98+twidth; 29 | if (focused) drawContext.fill(cursorPos, y+7, cursorPos+1, y+17, Moonlight.THEME.accent.getRGB()); 30 | drawContext.drawText(textRenderer, value, x+98, y+8, Moonlight.THEME.text.getRGB(), false); 31 | } 32 | 33 | @Override 34 | public void mouseClicked(double mouseX, double mouseY, int button) 35 | { 36 | if (focused) 37 | { 38 | focused = false; 39 | return; 40 | } 41 | if (hovered((int)mouseX, (int)mouseY) && button == 0) 42 | { 43 | focused = true; 44 | } 45 | } 46 | 47 | @Override 48 | public void keyPressed(int keyCode, int scanCode, int modifiers) 49 | { 50 | if (focused) 51 | { 52 | if (keyCode == 256 || keyCode == 257) 53 | { 54 | // escape or enter was pressed, exit safely 55 | focused = false; 56 | return; 57 | } 58 | if (keyCode == 259) 59 | { 60 | // backspace, remove a character 61 | if (value.length() > 0) value = value.substring(0, value.length() - 1); 62 | return; 63 | } 64 | if (keyCode > 96) return; // not a typing key 65 | String append = KeycodeUtils.keyTable[keyCode]; 66 | if (modifiers == 1) append = KeycodeUtils.shiftedKeyTable[keyCode]; 67 | if (append == "Unknown") return; 68 | if (append == "Space") append = " "; 69 | value += append; 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/command/Command.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.command; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | import java.util.Collections; 6 | import java.util.List; 7 | import java.util.stream.Collectors; 8 | 9 | import org.apache.commons.lang3.StringUtils; 10 | 11 | import com.mojang.brigadier.CommandDispatcher; 12 | import com.mojang.brigadier.arguments.ArgumentType; 13 | import com.mojang.brigadier.builder.LiteralArgumentBuilder; 14 | import com.mojang.brigadier.builder.RequiredArgumentBuilder; 15 | 16 | import net.minecraft.client.MinecraftClient; 17 | import net.minecraft.command.CommandSource; 18 | 19 | public abstract class Command 20 | { 21 | protected static MinecraftClient mc; 22 | 23 | private final String name; 24 | private final String description; 25 | private final List aliases = new ArrayList<>(); 26 | public int SINGLE_SUCCESS = com.mojang.brigadier.Command.SINGLE_SUCCESS; 27 | 28 | public Command(String name, String description, String... aliases) { 29 | this.name = name; 30 | this.description = description; 31 | Collections.addAll(this.aliases, aliases); 32 | mc = MinecraftClient.getInstance(); 33 | } 34 | 35 | // Helper methods to painlessly infer the CommandSource generic type argument 36 | protected static RequiredArgumentBuilder argument(final String name, final ArgumentType type) { 37 | return RequiredArgumentBuilder.argument(name, type); 38 | } 39 | 40 | protected static LiteralArgumentBuilder literal(final String name) { 41 | return LiteralArgumentBuilder.literal(name); 42 | } 43 | 44 | public final void registerTo(CommandDispatcher dispatcher) { 45 | register(dispatcher, name); 46 | for (String alias : aliases) register(dispatcher, alias); 47 | } 48 | 49 | public void register(CommandDispatcher dispatcher, String name) { 50 | LiteralArgumentBuilder builder = LiteralArgumentBuilder.literal(name); 51 | build(builder); 52 | dispatcher.register(builder); 53 | } 54 | 55 | public abstract void build(LiteralArgumentBuilder builder); 56 | 57 | public String getName() { 58 | return name; 59 | } 60 | 61 | public String getDescription() { 62 | return description; 63 | } 64 | 65 | public List getAliases() { 66 | return aliases; 67 | } 68 | 69 | public String toString() { 70 | return CommandManager.get().getPrefix() + name; 71 | } 72 | 73 | public String toString(String... args) { 74 | StringBuilder base = new StringBuilder(toString()); 75 | for (String arg : args) 76 | base.append(' ').append(arg); 77 | 78 | return base.toString(); 79 | } 80 | 81 | public static String nameToTitle(String name) { 82 | return Arrays.stream(name.split("-")).map(StringUtils::capitalize).collect(Collectors.joining(" ")); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/command/CommandManager.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.command; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Comparator; 5 | import java.util.HashMap; 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | import com.mojang.brigadier.CommandDispatcher; 10 | import com.mojang.brigadier.ParseResults; 11 | import com.mojang.brigadier.exceptions.CommandSyntaxException; 12 | 13 | import net.minecraft.client.MinecraftClient; 14 | import net.minecraft.client.network.ClientCommandSource; 15 | import net.minecraft.command.CommandSource; 16 | 17 | import me.kawaiizenbo.moonlight.command.commands.*; 18 | 19 | public class CommandManager 20 | { 21 | private static MinecraftClient mc = MinecraftClient.getInstance(); 22 | private final CommandDispatcher DISPATCHER = new CommandDispatcher<>(); 23 | private final CommandSource COMMAND_SOURCE = new ChatCommandSource(mc); 24 | private final List commands = new ArrayList<>(); 25 | private final Map, Command> commandInstances = new HashMap<>(); 26 | 27 | private CommandManager() { 28 | add(new VClip()); 29 | add(new Help()); 30 | add(new Toggle()); 31 | add(new Teleport()); 32 | add(new Reset()); 33 | add(new DeathPos()); 34 | commands.sort(Comparator.comparing(Command::getName)); 35 | } 36 | 37 | public static CommandManager get() { 38 | return new CommandManager(); 39 | } 40 | 41 | public void dispatch(String message) throws CommandSyntaxException { 42 | dispatch(message, new ChatCommandSource(mc)); 43 | } 44 | 45 | public void dispatch(String message, CommandSource source) throws CommandSyntaxException { 46 | ParseResults results = DISPATCHER.parse(message, source); 47 | DISPATCHER.execute(results); 48 | } 49 | 50 | public CommandDispatcher getDispatcher() { 51 | return DISPATCHER; 52 | } 53 | 54 | public CommandSource getCommandSource() { 55 | return COMMAND_SOURCE; 56 | } 57 | 58 | private final static class ChatCommandSource extends ClientCommandSource { 59 | public ChatCommandSource(MinecraftClient client) { 60 | super(null, client); 61 | } 62 | } 63 | 64 | public void add(Command command) { 65 | commands.removeIf(command1 -> command1.getName().equals(command.getName())); 66 | commandInstances.values().removeIf(command1 -> command1.getName().equals(command.getName())); 67 | 68 | command.registerTo(DISPATCHER); 69 | commands.add(command); 70 | commandInstances.put(command.getClass(), command); 71 | } 72 | 73 | public int getCount() { 74 | return commands.size(); 75 | } 76 | 77 | public List getAll() { 78 | return commands; 79 | } 80 | 81 | @SuppressWarnings("unchecked") 82 | public T get(Class klass) { 83 | return (T) commandInstances.get(klass); 84 | } 85 | 86 | public String getPrefix() { 87 | return "."; 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/clickgui/ClickGUIScreen.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.clickgui; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Map; 5 | 6 | import me.kawaiizenbo.moonlight.Moonlight; 7 | import me.kawaiizenbo.moonlight.module.Category; 8 | import me.kawaiizenbo.moonlight.theme.Theme; 9 | import me.kawaiizenbo.moonlight.util.MathUtils; 10 | import net.minecraft.client.gui.DrawContext; 11 | import net.minecraft.client.gui.screen.Screen; 12 | import net.minecraft.text.Text; 13 | 14 | public class ClickGUIScreen extends Screen 15 | { 16 | public static ClickGUIScreen INSTANCE = new ClickGUIScreen(); 17 | public ArrayList categoryPanes; 18 | 19 | @SuppressWarnings("unchecked") 20 | public ClickGUIScreen() 21 | { 22 | super(Text.literal("ClickGUI")); 23 | categoryPanes = new ArrayList(); 24 | Map panePos = ((Map)Moonlight.CONFIG.config.get("panes")); 25 | for (Category category : Category.values()) 26 | { 27 | if(category.name == "Special") continue; 28 | int xOffset = MathUtils.d2iSafe(((Map)panePos.get(category.name)).get("x")); 29 | int yOffset = MathUtils.d2iSafe(((Map)panePos.get(category.name)).get("y")); 30 | boolean collapsed = (boolean)((Map)panePos.get(category.name)).get("collapsed"); 31 | categoryPanes.add(new CategoryPane(category, xOffset, yOffset, collapsed)); 32 | } 33 | } 34 | 35 | @Override 36 | public void render(DrawContext drawContext, int mouseX, int mouseY, float delta) 37 | { 38 | this.renderBackground(drawContext, mouseX, mouseY, delta); 39 | drawContext.fill(width-80, height-16, width, height, Moonlight.THEME.border.getRGB()); 40 | drawContext.fill(width-78, height-14, width-2, height-2, (mouseX > width-80 && mouseY > height-16) ? Moonlight.THEME.hover.getRGB() : Moonlight.THEME.background.getRGB()); 41 | drawContext.drawText(textRenderer, "Change Theme", width-75, height-12, Moonlight.THEME.text.getRGB(), false); 42 | for (CategoryPane category : categoryPanes) 43 | { 44 | category.render(drawContext, mouseX, mouseY, delta, textRenderer); 45 | } 46 | } 47 | 48 | @Override 49 | public boolean mouseClicked(double mouseX, double mouseY, int button) 50 | { 51 | for (CategoryPane category : categoryPanes) 52 | { 53 | category.mouseClicked((int) mouseX, (int) mouseY, button); 54 | } 55 | if (mouseX > width-80 && mouseY > height-16) 56 | { 57 | if (Moonlight.THEME_IDX >= Theme.THEME_LIST.length-1) Moonlight.THEME_IDX = 0; 58 | else Moonlight.THEME_IDX++; 59 | Moonlight.THEME = Theme.THEME_LIST[Moonlight.THEME_IDX]; 60 | } 61 | return super.mouseClicked(mouseX, mouseY, button); 62 | } 63 | 64 | @Override 65 | public boolean mouseReleased(double mouseX, double mouseY, int button) 66 | { 67 | for (CategoryPane category : categoryPanes) 68 | { 69 | category.mouseReleased((int) mouseX, (int) mouseY, button); 70 | } 71 | return super.mouseReleased(mouseX, mouseY, button); 72 | } 73 | 74 | @Override 75 | public boolean shouldPause() 76 | { 77 | return false; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/mixin/ChatInputSuggestorMixin.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.mixin; 2 | 3 | import java.util.concurrent.CompletableFuture; 4 | 5 | import org.spongepowered.asm.mixin.Final; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.Shadow; 8 | import org.spongepowered.asm.mixin.injection.At; 9 | import org.spongepowered.asm.mixin.injection.Inject; 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 11 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 12 | 13 | import com.mojang.brigadier.CommandDispatcher; 14 | import com.mojang.brigadier.ParseResults; 15 | import com.mojang.brigadier.StringReader; 16 | import com.mojang.brigadier.suggestion.Suggestions; 17 | 18 | import me.kawaiizenbo.moonlight.command.CommandManager; 19 | import net.minecraft.client.MinecraftClient; 20 | import net.minecraft.client.gui.screen.ChatInputSuggestor; 21 | import net.minecraft.client.gui.screen.ChatInputSuggestor.SuggestionWindow; 22 | import net.minecraft.client.gui.widget.TextFieldWidget; 23 | import net.minecraft.command.CommandSource; 24 | 25 | @Mixin(ChatInputSuggestor.class) 26 | public abstract class ChatInputSuggestorMixin 27 | { 28 | 29 | @Shadow private ParseResults parse; 30 | 31 | @Shadow @Final private TextFieldWidget textField; 32 | 33 | @Shadow @Final private MinecraftClient client; 34 | 35 | @Shadow private boolean completingSuggestions; 36 | 37 | @Shadow private CompletableFuture pendingSuggestions; 38 | 39 | @Shadow private SuggestionWindow window; 40 | 41 | @Shadow abstract void showCommandSuggestions(); 42 | 43 | @Inject(method = "refresh", 44 | at = @At(value = "INVOKE", target = "Lcom/mojang/brigadier/StringReader;canRead()Z", remap = false), 45 | cancellable = true, 46 | locals = LocalCapture.CAPTURE_FAILHARD) 47 | public void onRefresh(CallbackInfo ci, String string, StringReader reader) { 48 | String prefix = CommandManager.get().getPrefix(); 49 | int length = prefix.length(); 50 | if (reader.canRead(length) && reader.getString().startsWith(prefix, reader.getCursor())) { 51 | reader.setCursor(reader.getCursor() + length); 52 | assert this.client.player != null; 53 | CommandDispatcher commandDispatcher = CommandManager.get().getDispatcher(); 54 | if (this.parse == null) { 55 | this.parse = commandDispatcher.parse(reader, CommandManager.get().getCommandSource()); 56 | } 57 | 58 | int cursor = textField.getCursor(); 59 | if (cursor >= 1 && (this.window == null || !this.completingSuggestions)) { 60 | this.pendingSuggestions = commandDispatcher.getCompletionSuggestions(this.parse, cursor); 61 | this.pendingSuggestions.thenRun(() -> { 62 | if (this.pendingSuggestions.isDone()) { 63 | showCommandSuggestions(); 64 | } 65 | }); 66 | } 67 | ci.cancel(); 68 | } 69 | } 70 | 71 | } 72 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%"=="" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%"=="" set DIRNAME=. 29 | @rem This is normally unused 30 | set APP_BASE_NAME=%~n0 31 | set APP_HOME=%DIRNAME% 32 | 33 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 34 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 35 | 36 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 37 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 38 | 39 | @rem Find java.exe 40 | if defined JAVA_HOME goto findJavaFromJavaHome 41 | 42 | set JAVA_EXE=java.exe 43 | %JAVA_EXE% -version >NUL 2>&1 44 | if %ERRORLEVEL% equ 0 goto execute 45 | 46 | echo. 47 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 48 | echo. 49 | echo Please set the JAVA_HOME variable in your environment to match the 50 | echo location of your Java installation. 51 | 52 | goto fail 53 | 54 | :findJavaFromJavaHome 55 | set JAVA_HOME=%JAVA_HOME:"=% 56 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 57 | 58 | if exist "%JAVA_EXE%" goto execute 59 | 60 | echo. 61 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 62 | echo. 63 | echo Please set the JAVA_HOME variable in your environment to match the 64 | echo location of your Java installation. 65 | 66 | goto fail 67 | 68 | :execute 69 | @rem Setup the command line 70 | 71 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 72 | 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if %ERRORLEVEL% equ 0 goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | set EXIT_CODE=%ERRORLEVEL% 85 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 86 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 87 | exit /b %EXIT_CODE% 88 | 89 | :mainEnd 90 | if "%OS%"=="Windows_NT" endlocal 91 | 92 | :omega 93 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/hud/editor/HUDModuleList.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.hud.editor; 2 | 3 | import java.util.ArrayList; 4 | 5 | import me.kawaiizenbo.moonlight.Moonlight; 6 | import me.kawaiizenbo.moonlight.ui.hud.HUDModule; 7 | import me.kawaiizenbo.moonlight.ui.hud.HUDModuleManager; 8 | import me.kawaiizenbo.moonlight.util.DrawUtils; 9 | import net.minecraft.client.font.TextRenderer; 10 | import net.minecraft.client.gui.DrawContext; 11 | import net.minecraft.client.render.RenderLayer; 12 | import net.minecraft.util.Identifier; 13 | 14 | public class HUDModuleList 15 | { 16 | public int x, y, height, width = 128; 17 | int startX, startY; 18 | boolean dragging = false; 19 | public boolean collapsed = false; 20 | ArrayList buttons; 21 | 22 | public HUDModuleList(int initialX, int initialY, boolean collapsed) 23 | { 24 | this.x = initialX; 25 | this.y = initialY; 26 | this.collapsed = collapsed; 27 | buttons = new ArrayList(); 28 | for (HUDModule m : HUDModuleManager.INSTANCE.modules) 29 | { 30 | buttons.add(new HUDModuleButton(m)); 31 | } 32 | if (buttons.size() == 0) collapsed = true; 33 | height = (buttons.size()*12) + 18; 34 | } 35 | 36 | public void render(DrawContext drawContext, int mouseX, int mouseY, float delta, TextRenderer textRenderer) 37 | { 38 | if (dragging) 39 | { 40 | x = mouseX - startX; 41 | y = mouseY - startY; 42 | } 43 | drawContext.fill(x, y, x+width, collapsed ? y+16 : y+height, Moonlight.THEME.themedWindowBorders ? Moonlight.THEME.border.getRGB() : Moonlight.THEME.accent.getRGB()); 44 | //drawContext.fill(x+2, y+2, x+(width-2), y+14, hovered(mouseX, mouseY) ? Moonlight.THEME.hover.getRGB() : Moonlight.THEME.background.getRGB()); 45 | drawContext.drawGuiTexture(RenderLayer::getGuiTextured, DrawUtils.getThemedGUIIcon("hud"), x+2, y+2, 12, 12); 46 | drawContext.drawText(textRenderer, "HUD Modules", x+16, y+4, Moonlight.THEME.headerText.getRGB(), false); 47 | if (!collapsed) 48 | { 49 | int buttonYOffset = y+16; 50 | for (HUDModuleButton m : buttons) 51 | { 52 | m.render(drawContext, mouseX, mouseY, x+2, buttonYOffset, textRenderer); 53 | buttonYOffset += 12; 54 | } 55 | } 56 | } 57 | 58 | public boolean hovered(int mouseX, int mouseY) 59 | { 60 | return mouseX >= x+2 && mouseX <= x+(width-2) && mouseY >= y+2 && mouseY <= y+14; 61 | } 62 | 63 | public void mouseClicked(int mouseX, int mouseY, int button) 64 | { 65 | for (HUDModuleButton moduleButton : buttons) 66 | { 67 | if (moduleButton.mouseClicked(mouseX, mouseY, button)) return; 68 | } 69 | if (hovered(mouseX, mouseY) && button == 1) collapsed = !collapsed; 70 | else if (hovered(mouseX, mouseY) && button == 0) 71 | { 72 | startX = (int)mouseX-x; 73 | startY = (int)mouseY-y; 74 | dragging = true; 75 | } 76 | } 77 | 78 | public void mouseReleased(int mouseX, int mouseY, int button) 79 | { 80 | dragging = false; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/clickgui/CategoryPane.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.clickgui; 2 | 3 | import java.util.ArrayList; 4 | 5 | import me.kawaiizenbo.moonlight.Moonlight; 6 | import me.kawaiizenbo.moonlight.module.Category; 7 | import me.kawaiizenbo.moonlight.module.ModuleManager; 8 | import me.kawaiizenbo.moonlight.util.DrawUtils; 9 | import me.kawaiizenbo.moonlight.module.Module; 10 | import net.minecraft.client.font.TextRenderer; 11 | import net.minecraft.client.gui.DrawContext; 12 | import net.minecraft.client.render.RenderLayer; 13 | import net.minecraft.util.Identifier; 14 | 15 | public class CategoryPane 16 | { 17 | public Category category; 18 | public int x, y, height, width = 96; 19 | int startX, startY; 20 | boolean dragging = false; 21 | public boolean collapsed = false; 22 | ArrayList moduleButtons; 23 | Identifier icon; 24 | 25 | public CategoryPane(Category category, int initialX, int initialY, boolean collapsed) 26 | { 27 | this.category = category; 28 | this.x = initialX; 29 | this.y = initialY; 30 | this.collapsed = collapsed; 31 | moduleButtons = new ArrayList(); 32 | icon = DrawUtils.getThemedGUIIcon(category.name.toLowerCase()); 33 | for (Module m : ModuleManager.INSTANCE.getModulesByCategory(category)) 34 | { 35 | moduleButtons.add(new ModuleButton(m)); 36 | } 37 | if (moduleButtons.size() == 0) collapsed = true; 38 | height = (moduleButtons.size()*12) + 18; 39 | } 40 | 41 | public void render(DrawContext drawContext, int mouseX, int mouseY, float delta, TextRenderer textRenderer) 42 | { 43 | if (dragging) 44 | { 45 | x = mouseX - startX; 46 | y = mouseY - startY; 47 | } 48 | drawContext.fill(x, y, x+width, collapsed ? y+16 : y+height, Moonlight.THEME.themedWindowBorders ? Moonlight.THEME.border.getRGB() : category.color); 49 | //drawContext.fill(x+2, y+2, x+(width-2), y+14, hovered(mouseX, mouseY) ? Moonlight.THEME.hover.getRGB() : Moonlight.THEME.background.getRGB()); 50 | drawContext.drawGuiTexture(RenderLayer::getGuiTextured, icon, x+2, y+2, 12, 12); 51 | drawContext.drawText(textRenderer, category.name, x+16, y+4, Moonlight.THEME.headerText.getRGB(), false); 52 | if (!collapsed) 53 | { 54 | int buttonYOffset = y+16; 55 | for (ModuleButton m : moduleButtons) 56 | { 57 | m.render(drawContext, mouseX, mouseY, x+2, buttonYOffset, textRenderer); 58 | buttonYOffset += 12; 59 | } 60 | } 61 | } 62 | 63 | public boolean hovered(int mouseX, int mouseY) 64 | { 65 | return mouseX >= x+2 && mouseX <= x+(width-2) && mouseY >= y+2 && mouseY <= y+14; 66 | } 67 | 68 | public void mouseClicked(int mouseX, int mouseY, int button) 69 | { 70 | for (ModuleButton moduleButton : moduleButtons) 71 | { 72 | if (moduleButton.mouseClicked(mouseX, mouseY, button)) return; 73 | } 74 | if (hovered(mouseX, mouseY) && button == 1) collapsed = !collapsed; 75 | else if (hovered(mouseX, mouseY) && button == 0) 76 | { 77 | startX = (int)mouseX-x; 78 | startY = (int)mouseY-y; 79 | dragging = true; 80 | } 81 | } 82 | 83 | public void mouseReleased(int mouseX, int mouseY, int button) 84 | { 85 | dragging = false; 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/hud/editor/HUDModuleSettingsScreen.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.hud.editor; 2 | 3 | import me.kawaiizenbo.moonlight.Moonlight; 4 | import me.kawaiizenbo.moonlight.module.settings.Setting; 5 | import me.kawaiizenbo.moonlight.ui.SetScreenButton; 6 | import me.kawaiizenbo.moonlight.ui.hud.HUDModule; 7 | import me.kawaiizenbo.moonlight.util.ColorUtils; 8 | import net.minecraft.client.gui.DrawContext; 9 | import net.minecraft.client.gui.screen.Screen; 10 | import net.minecraft.text.Text; 11 | 12 | public class HUDModuleSettingsScreen extends Screen 13 | { 14 | // adapted for hud modules 15 | private HUDModule module; 16 | private SetScreenButton backButton; 17 | 18 | boolean dragging = false; 19 | int startX, startY, x = (HUDEditorScreen.INSTANCE.width/2)-112, y = (HUDEditorScreen.INSTANCE.height/2)-96, windowWidth = 224, windowHeight = 192; 20 | 21 | public HUDModuleSettingsScreen(HUDModule module) 22 | { 23 | super(Text.literal("Settings")); 24 | backButton = new SetScreenButton(ColorUtils.underline + "< Back", x+4, y+4, HUDEditorScreen.INSTANCE); 25 | this.module = module; 26 | } 27 | 28 | @Override 29 | public void render(DrawContext drawContext, int mouseX, int mouseY, float delta) 30 | { 31 | this.renderBackground(drawContext, mouseX, mouseY, delta); 32 | 33 | // move window if dragging 34 | if (dragging) 35 | { 36 | x = mouseX - startX; 37 | y = mouseY - startY; 38 | } 39 | drawContext.fill(x, y, x+windowWidth, y+windowHeight, Moonlight.THEME.themedWindowBorders ? Moonlight.THEME.border.getRGB() : Moonlight.THEME.accent.getRGB()); 40 | drawContext.fill(x+2, y+2, x+windowWidth-2, y+windowHeight-2, Moonlight.THEME.background.getRGB()); 41 | drawContext.fill(x, y, x+windowWidth, y+16, Moonlight.THEME.themedWindowBorders ? Moonlight.THEME.border.getRGB() : Moonlight.THEME.accent.getRGB()); 42 | //drawContext.fill(x+2, y+2, x+(windowWidth-2), y+14, Moonlight.THEME.background.getRGB()); 43 | drawContext.drawText(textRenderer, module.name, x+((windowWidth/2)-(textRenderer.getWidth(module.name)/2)), y+4, Moonlight.THEME.headerText.getRGB(), false); 44 | backButton.render(drawContext, textRenderer, mouseX, mouseY, x+4, y+4); 45 | int yOffset = y+24; 46 | for (Setting setting : module.settings) 47 | { 48 | setting.render(drawContext, x+16, yOffset, mouseX, mouseY, textRenderer); 49 | yOffset += 25; 50 | } 51 | } 52 | 53 | public boolean barHovered(int mouseX, int mouseY) 54 | { 55 | return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + 16; 56 | } 57 | 58 | @Override 59 | public boolean shouldPause() 60 | { 61 | return false; 62 | } 63 | 64 | @Override 65 | public boolean mouseClicked(double mouseX, double mouseY, int button) 66 | { 67 | if (barHovered((int)mouseX, (int)mouseY)) 68 | { 69 | startX = (int)mouseX-x; 70 | startY = (int)mouseY-y; 71 | dragging = true; 72 | } 73 | backButton.mouseClicked((int)mouseX, (int)mouseY); 74 | for (Setting setting : module.settings) 75 | { 76 | setting.mouseClicked(mouseX, mouseY, button); 77 | } 78 | return super.mouseClicked(mouseX, mouseY, button); 79 | } 80 | 81 | @Override 82 | public boolean mouseReleased(double mouseX, double mouseY, int button) 83 | { 84 | dragging = false; 85 | for (Setting setting : module.settings) 86 | { 87 | setting.mouseReleased(mouseX, mouseY, button); 88 | } 89 | return super.mouseReleased(mouseX, mouseY, button); 90 | } 91 | 92 | @Override 93 | public boolean keyPressed(int keyCode, int scanCode, int modifiers) 94 | { 95 | for (Setting setting : module.settings) 96 | { 97 | setting.keyPressed(keyCode, scanCode, modifiers); 98 | } 99 | return super.keyPressed(keyCode, scanCode, modifiers); 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/ui/clickgui/SettingsScreen.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.ui.clickgui; 2 | 3 | import me.kawaiizenbo.moonlight.Moonlight; 4 | import me.kawaiizenbo.moonlight.module.Module; 5 | import me.kawaiizenbo.moonlight.module.settings.Setting; 6 | import me.kawaiizenbo.moonlight.ui.SetScreenButton; 7 | import me.kawaiizenbo.moonlight.ui.hud.editor.HUDEditorScreen; 8 | import me.kawaiizenbo.moonlight.util.ColorUtils; 9 | import net.minecraft.client.gui.DrawContext; 10 | import net.minecraft.client.gui.screen.Screen; 11 | import net.minecraft.text.Text; 12 | 13 | public class SettingsScreen extends Screen 14 | { 15 | private Module module; 16 | private SetScreenButton backButton; 17 | private SetScreenButton editButton; 18 | 19 | boolean dragging = false; 20 | int startX, startY, x = (ClickGUIScreen.INSTANCE.width/2)-112, y = (ClickGUIScreen.INSTANCE.height/2)-96, windowWidth = 224, windowHeight = 192; 21 | 22 | public SettingsScreen(Module module) 23 | { 24 | super(Text.literal("Settings")); 25 | backButton = new SetScreenButton(ColorUtils.underline + "< Back", x+4, y+4, ClickGUIScreen.INSTANCE); 26 | editButton = new SetScreenButton(ColorUtils.underline + "Edit", x+windowWidth-22, y+4, HUDEditorScreen.INSTANCE); 27 | this.module = module; 28 | } 29 | 30 | @Override 31 | public void render(DrawContext drawContext, int mouseX, int mouseY, float delta) 32 | { 33 | this.renderBackground(drawContext, mouseX, mouseY, delta); 34 | 35 | // move window if dragging 36 | if (dragging) 37 | { 38 | x = mouseX - startX; 39 | y = mouseY - startY; 40 | } 41 | drawContext.fill(x, y, x+windowWidth, y+windowHeight, Moonlight.THEME.themedWindowBorders ? Moonlight.THEME.border.getRGB() : module.category.color); 42 | drawContext.fill(x+2, y+2, x+windowWidth-2, y+windowHeight-2, Moonlight.THEME.background.getRGB()); 43 | drawContext.fill(x, y, x+windowWidth, y+16, Moonlight.THEME.themedWindowBorders ? Moonlight.THEME.border.getRGB() : module.category.color); 44 | //drawContext.fill(x+2, y+2, x+(windowWidth-2), y+14, Moonlight.THEME.background.getRGB()); 45 | drawContext.drawText(textRenderer, module.name, x+((windowWidth/2)-(textRenderer.getWidth(module.name)/2)), y+4, Moonlight.THEME.headerText.getRGB(), false); 46 | drawContext.drawText(textRenderer, module.description, x+8, y+24, Moonlight.THEME.text.getRGB(), false); 47 | backButton.render(drawContext, textRenderer, mouseX, mouseY, x+4, y+4); 48 | if (module.showEditButton) editButton.render(drawContext, textRenderer, mouseX, mouseY, x+windowWidth-22, y+4); 49 | int yOffset = y+40; 50 | for (Setting setting : module.settings) 51 | { 52 | setting.render(drawContext, x+16, yOffset, mouseX, mouseY, textRenderer); 53 | yOffset += 25; 54 | } 55 | } 56 | 57 | public boolean barHovered(int mouseX, int mouseY) 58 | { 59 | return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + 16; 60 | } 61 | 62 | @Override 63 | public boolean shouldPause() 64 | { 65 | return false; 66 | } 67 | 68 | @Override 69 | public boolean mouseClicked(double mouseX, double mouseY, int button) 70 | { 71 | if (barHovered((int)mouseX, (int)mouseY)) 72 | { 73 | startX = (int)mouseX-x; 74 | startY = (int)mouseY-y; 75 | dragging = true; 76 | } 77 | backButton.mouseClicked((int)mouseX, (int)mouseY); 78 | editButton.mouseClicked((int)mouseX, (int)mouseY); 79 | for (Setting setting : module.settings) 80 | { 81 | setting.mouseClicked(mouseX, mouseY, button); 82 | } 83 | return super.mouseClicked(mouseX, mouseY, button); 84 | } 85 | 86 | @Override 87 | public boolean mouseReleased(double mouseX, double mouseY, int button) 88 | { 89 | dragging = false; 90 | for (Setting setting : module.settings) 91 | { 92 | setting.mouseReleased(mouseX, mouseY, button); 93 | } 94 | return super.mouseReleased(mouseX, mouseY, button); 95 | } 96 | 97 | @Override 98 | public boolean keyPressed(int keyCode, int scanCode, int modifiers) 99 | { 100 | for (Setting setting : module.settings) 101 | { 102 | setting.keyPressed(keyCode, scanCode, modifiers); 103 | } 104 | return super.keyPressed(keyCode, scanCode, modifiers); 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/Config.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight; 2 | 3 | import java.io.File; 4 | import java.io.FileWriter; 5 | import java.io.IOException; 6 | import java.nio.file.Files; 7 | import java.util.HashMap; 8 | import java.util.Map; 9 | 10 | import com.google.gson.Gson; 11 | 12 | import me.kawaiizenbo.moonlight.module.Category; 13 | import me.kawaiizenbo.moonlight.module.ModuleManager; 14 | import me.kawaiizenbo.moonlight.module.Module; 15 | import me.kawaiizenbo.moonlight.module.settings.BooleanSetting; 16 | import me.kawaiizenbo.moonlight.module.settings.DoubleSetting; 17 | import me.kawaiizenbo.moonlight.module.settings.IndexSetting; 18 | import me.kawaiizenbo.moonlight.module.settings.KeycodeSetting; 19 | import me.kawaiizenbo.moonlight.module.settings.Setting; 20 | import me.kawaiizenbo.moonlight.module.settings.StringSetting; 21 | import me.kawaiizenbo.moonlight.ui.clickgui.ClickGUIScreen; 22 | import me.kawaiizenbo.moonlight.ui.hud.HUDModule; 23 | import me.kawaiizenbo.moonlight.ui.hud.HUDModuleManager; 24 | import net.minecraft.client.MinecraftClient; 25 | 26 | public class Config 27 | { 28 | MinecraftClient mc = MinecraftClient.getInstance(); 29 | public File configDir = new File(mc.runDirectory.getPath() + "/moonlight"); 30 | public File configFile = new File(configDir, "config.json"); 31 | public Map config = new HashMap<>(); 32 | protected static Gson gson = new Gson(); 33 | 34 | public Config() 35 | { 36 | configDir.mkdirs(); 37 | } 38 | 39 | public boolean doesConfigExist() 40 | { 41 | return !Files.exists(configFile.toPath()); 42 | } 43 | 44 | public void loadDefaultConfig() 45 | { 46 | ModuleManager.INSTANCE = new ModuleManager(); 47 | config.put("theme", 2); 48 | Map mi = new HashMap<>(); 49 | for (Module m : ModuleManager.INSTANCE.modules) 50 | { 51 | Map mo = new HashMap<>(); 52 | mo.put("enabled", m.enabled); 53 | Map ms = new HashMap<>(); 54 | for (Setting s : m.settings) 55 | { 56 | if (s instanceof BooleanSetting) 57 | { 58 | ms.put(s.name, ((BooleanSetting)s).value); 59 | } 60 | else if (s instanceof DoubleSetting) 61 | { 62 | ms.put(s.name, ((DoubleSetting)s).value); 63 | } 64 | else if (s instanceof StringSetting) 65 | { 66 | ms.put(s.name, ((StringSetting)s).value); 67 | } 68 | else if (s instanceof KeycodeSetting) 69 | { 70 | ms.put(s.name, ((KeycodeSetting)s).value); 71 | } 72 | else if (s instanceof IndexSetting) 73 | { 74 | ms.put(s.name, ((IndexSetting)s).index); 75 | } 76 | } 77 | mo.put("settings", ms); 78 | mi.put(m.name, mo); 79 | } 80 | config.put("modules", mi); 81 | 82 | HUDModuleManager.INSTANCE = new HUDModuleManager(); 83 | Map hi = new HashMap<>(); 84 | for (HUDModule h : HUDModuleManager.INSTANCE.modules) 85 | { 86 | Map ho = new HashMap<>(); 87 | ho.put("enabled", h.enabled); 88 | Map hs = new HashMap<>(); 89 | for (Setting s : h.settings) 90 | { 91 | if (s instanceof BooleanSetting) 92 | { 93 | hs.put(s.name, ((BooleanSetting)s).value); 94 | } 95 | else if (s instanceof DoubleSetting) 96 | { 97 | hs.put(s.name, ((DoubleSetting)s).value); 98 | } 99 | else if (s instanceof StringSetting) 100 | { 101 | hs.put(s.name, ((StringSetting)s).value); 102 | } 103 | else if (s instanceof KeycodeSetting) 104 | { 105 | hs.put(s.name, ((KeycodeSetting)s).value); 106 | } 107 | else if (s instanceof IndexSetting) 108 | { 109 | hs.put(s.name, ((IndexSetting)s).index); 110 | } 111 | } 112 | ho.put("settings", hs); 113 | ho.put("x", h.x); 114 | ho.put("y", h.y); 115 | hi.put(h.name, ho); 116 | } 117 | config.put("hud", hi); 118 | int xOffset = 4; 119 | int yOffset = 4; 120 | Map pi = new HashMap<>(); 121 | for (Category category : Category.values()) 122 | { 123 | Map po = new HashMap<>(); 124 | if (xOffset > 400) 125 | { 126 | xOffset = 4; 127 | yOffset = 128; 128 | } 129 | po.put("x", xOffset); 130 | po.put("y", yOffset); 131 | po.put("collapsed", false); 132 | pi.put(category.name, po); 133 | xOffset += 100; 134 | } 135 | config.put("panes", pi); 136 | ClickGUIScreen.INSTANCE = new ClickGUIScreen(); 137 | } 138 | 139 | @SuppressWarnings("unchecked") 140 | public void load() throws IOException 141 | { 142 | try 143 | { 144 | String configText = new String(Files.readAllBytes(configFile.toPath())); 145 | config = (Map)gson.fromJson(configText, Map.class); 146 | } 147 | catch (Exception e) 148 | { 149 | throw new IOException("Failed to load config file."); 150 | } 151 | } 152 | 153 | public void save() 154 | { 155 | try 156 | { 157 | if (!doesConfigExist()) configFile.createNewFile(); 158 | } 159 | catch(Exception e) 160 | { 161 | e.printStackTrace(); 162 | } 163 | try 164 | { 165 | String configText = gson.toJson(config); 166 | FileWriter writer = new FileWriter(configFile); 167 | writer.write(configText); 168 | writer.close(); 169 | } 170 | catch (Exception e) 171 | { 172 | e.printStackTrace(); 173 | } 174 | } 175 | } 176 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/Moonlight.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight; 2 | 3 | import net.fabricmc.api.ModInitializer; 4 | 5 | import org.slf4j.Logger; 6 | 7 | import java.util.HashMap; 8 | import java.util.Map; 9 | import org.slf4j.LoggerFactory; 10 | 11 | import me.kawaiizenbo.moonlight.module.ModuleManager; 12 | import me.kawaiizenbo.moonlight.module.Module; 13 | import me.kawaiizenbo.moonlight.module.settings.BooleanSetting; 14 | import me.kawaiizenbo.moonlight.module.settings.DoubleSetting; 15 | import me.kawaiizenbo.moonlight.module.settings.IndexSetting; 16 | import me.kawaiizenbo.moonlight.module.settings.KeycodeSetting; 17 | import me.kawaiizenbo.moonlight.module.settings.Setting; 18 | import me.kawaiizenbo.moonlight.module.settings.StringSetting; 19 | import me.kawaiizenbo.moonlight.theme.Theme; 20 | import me.kawaiizenbo.moonlight.ui.clickgui.CategoryPane; 21 | import me.kawaiizenbo.moonlight.ui.clickgui.ClickGUIScreen; 22 | import me.kawaiizenbo.moonlight.ui.hud.HUDModule; 23 | import me.kawaiizenbo.moonlight.ui.hud.HUDModuleManager; 24 | import me.kawaiizenbo.moonlight.util.ColorUtils; 25 | 26 | public class Moonlight implements ModInitializer 27 | { 28 | public static final Moonlight INSTANCE = new Moonlight(); 29 | public static final Logger LOGGER = LoggerFactory.getLogger("Moonlight"); 30 | public static final String clientTag = ColorUtils.aqua + "Moonlight Meadows"; 31 | public static final String versionTag = ColorUtils.magenta + "v0.4.0"; 32 | public static Theme THEME = Theme.DARK; 33 | public static int THEME_IDX = 2; 34 | public static Config CONFIG = new Config(); 35 | 36 | @Override 37 | public void onInitialize() 38 | { 39 | LOGGER.info("Moonlight loading..."); 40 | loadConfig(); 41 | } 42 | 43 | @SuppressWarnings("unchecked") 44 | public void loadConfig() 45 | { 46 | try 47 | { 48 | LOGGER.info("Loading config..."); 49 | CONFIG.load(); 50 | THEME_IDX = ((Double)CONFIG.config.get("theme")).intValue(); 51 | THEME = Theme.THEME_LIST[THEME_IDX]; 52 | for (Module m : ModuleManager.INSTANCE.modules) 53 | { 54 | m.enabled = (boolean)((Map)((Map)CONFIG.config.get("modules")).get(m.name)).get("enabled"); 55 | for (Setting s : m.settings) 56 | { 57 | if (s instanceof BooleanSetting) 58 | { 59 | ((BooleanSetting)s).value = (boolean)((Map)((Map)((Map)CONFIG.config.get("modules")).get(m.name)).get("settings")).get(s.name); 60 | } 61 | else if (s instanceof DoubleSetting) 62 | { 63 | ((DoubleSetting)s).value = (Double)((Map)((Map)((Map)CONFIG.config.get("modules")).get(m.name)).get("settings")).get(s.name); 64 | } 65 | else if (s instanceof StringSetting) 66 | { 67 | ((StringSetting)s).value = (String)((Map)((Map)((Map)CONFIG.config.get("modules")).get(m.name)).get("settings")).get(s.name); 68 | } 69 | else if (s instanceof KeycodeSetting) 70 | { 71 | ((KeycodeSetting)s).value = ((Double)((Map)((Map)((Map)CONFIG.config.get("modules")).get(m.name)).get("settings")).get(s.name)).intValue(); 72 | } 73 | else if (s instanceof IndexSetting) 74 | { 75 | ((IndexSetting)s).index = ((Double)((Map)((Map)((Map)CONFIG.config.get("modules")).get(m.name)).get("settings")).get(s.name)).intValue(); 76 | } 77 | } 78 | } 79 | for (HUDModule m : HUDModuleManager.INSTANCE.modules) 80 | { 81 | m.enabled = (boolean)((Map)((Map)CONFIG.config.get("hud")).get(m.name)).get("enabled"); 82 | m.x = ((Double)((Map)((Map)CONFIG.config.get("hud")).get(m.name)).get("x")).intValue(); 83 | m.y = ((Double)((Map)((Map)CONFIG.config.get("hud")).get(m.name)).get("y")).intValue(); 84 | for (Setting s : m.settings) 85 | { 86 | if (s instanceof BooleanSetting) 87 | { 88 | ((BooleanSetting)s).value = (boolean)((Map)((Map)((Map)CONFIG.config.get("hud")).get(m.name)).get("settings")).get(s.name); 89 | } 90 | else if (s instanceof DoubleSetting) 91 | { 92 | ((DoubleSetting)s).value = (Double)((Map)((Map)((Map)CONFIG.config.get("hud")).get(m.name)).get("settings")).get(s.name); 93 | } 94 | else if (s instanceof StringSetting) 95 | { 96 | ((StringSetting)s).value = (String)((Map)((Map)((Map)CONFIG.config.get("hud")).get(m.name)).get("settings")).get(s.name); 97 | } 98 | else if (s instanceof KeycodeSetting) 99 | { 100 | ((KeycodeSetting)s).value = ((Double)((Map)((Map)((Map)CONFIG.config.get("hud")).get(m.name)).get("settings")).get(s.name)).intValue(); 101 | } 102 | else if (s instanceof IndexSetting) 103 | { 104 | ((IndexSetting)s).index = ((Double)((Map)((Map)((Map)CONFIG.config.get("hud")).get(m.name)).get("settings")).get(s.name)).intValue(); 105 | } 106 | } 107 | } 108 | } 109 | catch(Exception e) 110 | { 111 | LOGGER.warn("Config Error: " + e.getMessage()); 112 | LOGGER.info("Loading default config..."); 113 | CONFIG.loadDefaultConfig(); 114 | CONFIG.save(); 115 | } 116 | } 117 | 118 | public void saveConfig() 119 | { 120 | LOGGER.info("Saving config..."); 121 | CONFIG.config.put("theme", THEME_IDX); 122 | Map mi = new HashMap<>(); 123 | for (Module m : ModuleManager.INSTANCE.modules) 124 | { 125 | Map mo = new HashMap<>(); 126 | mo.put("enabled", m.enabled); 127 | Map ms = new HashMap<>(); 128 | for (Setting s : m.settings) 129 | { 130 | if (s instanceof BooleanSetting) 131 | { 132 | ms.put(s.name, ((BooleanSetting)s).value); 133 | } 134 | else if (s instanceof DoubleSetting) 135 | { 136 | ms.put(s.name, ((DoubleSetting)s).value); 137 | } 138 | else if (s instanceof StringSetting) 139 | { 140 | ms.put(s.name, ((StringSetting)s).value); 141 | } 142 | else if (s instanceof KeycodeSetting) 143 | { 144 | ms.put(s.name, ((KeycodeSetting)s).value); 145 | } 146 | else if (s instanceof IndexSetting) 147 | { 148 | ms.put(s.name, ((IndexSetting)s).index); 149 | } 150 | } 151 | mo.put("settings", ms); 152 | mi.put(m.name, mo); 153 | } 154 | CONFIG.config.put("modules", mi); 155 | 156 | Map hi = new HashMap<>(); 157 | for (HUDModule h : HUDModuleManager.INSTANCE.modules) 158 | { 159 | Map ho = new HashMap<>(); 160 | ho.put("enabled", h.enabled); 161 | Map hs = new HashMap<>(); 162 | for (Setting s : h.settings) 163 | { 164 | if (s instanceof BooleanSetting) 165 | { 166 | hs.put(s.name, ((BooleanSetting)s).value); 167 | } 168 | else if (s instanceof DoubleSetting) 169 | { 170 | hs.put(s.name, ((DoubleSetting)s).value); 171 | } 172 | else if (s instanceof StringSetting) 173 | { 174 | hs.put(s.name, ((StringSetting)s).value); 175 | } 176 | else if (s instanceof KeycodeSetting) 177 | { 178 | hs.put(s.name, ((KeycodeSetting)s).value); 179 | } 180 | else if (s instanceof IndexSetting) 181 | { 182 | hs.put(s.name, ((IndexSetting)s).index); 183 | } 184 | } 185 | ho.put("settings", hs); 186 | ho.put("x", h.x); 187 | ho.put("y", h.y); 188 | hi.put(h.name, ho); 189 | } 190 | CONFIG.config.put("hud", hi); 191 | 192 | Map pi = new HashMap<>(); 193 | for (CategoryPane c : ClickGUIScreen.INSTANCE.categoryPanes) 194 | { 195 | Map po = new HashMap<>(); 196 | po.put("x", c.x); 197 | po.put("y", c.y); 198 | po.put("collapsed", c.collapsed); 199 | pi.put(c.category.name, po); 200 | } 201 | CONFIG.config.put("panes", pi); 202 | CONFIG.save(); 203 | } 204 | } 205 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 4 | # Copyright © 2015-2021 the original authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | # 21 | # Gradle start up script for POSIX generated by Gradle. 22 | # 23 | # Important for running: 24 | # 25 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is 26 | # noncompliant, but you have some other compliant shell such as ksh or 27 | # bash, then to run this script, type that shell name before the whole 28 | # command line, like: 29 | # 30 | # ksh Gradle 31 | # 32 | # Busybox and similar reduced shells will NOT work, because this script 33 | # requires all of these POSIX shell features: 34 | # * functions; 35 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», 36 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»; 37 | # * compound commands having a testable exit status, especially «case»; 38 | # * various built-in commands including «command», «set», and «ulimit». 39 | # 40 | # Important for patching: 41 | # 42 | # (2) This script targets any POSIX shell, so it avoids extensions provided 43 | # by Bash, Ksh, etc; in particular arrays are avoided. 44 | # 45 | # The "traditional" practice of packing multiple parameters into a 46 | # space-separated string is a well documented source of bugs and security 47 | # problems, so this is (mostly) avoided, by progressively accumulating 48 | # options in "$@", and eventually passing that to Java. 49 | # 50 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, 51 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; 52 | # see the in-line comments for details. 53 | # 54 | # There are tweaks for specific operating systems such as AIX, CygWin, 55 | # Darwin, MinGW, and NonStop. 56 | # 57 | # (3) This script is generated from the Groovy template 58 | # https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt 59 | # within the Gradle project. 60 | # 61 | # You can find Gradle at https://github.com/gradle/gradle/. 62 | # 63 | ############################################################################## 64 | 65 | # Attempt to set APP_HOME 66 | 67 | # Resolve links: $0 may be a link 68 | app_path=$0 69 | 70 | # Need this for daisy-chained symlinks. 71 | while 72 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path 73 | [ -h "$app_path" ] 74 | do 75 | ls=$( ls -ld "$app_path" ) 76 | link=${ls#*' -> '} 77 | case $link in #( 78 | /*) app_path=$link ;; #( 79 | *) app_path=$APP_HOME$link ;; 80 | esac 81 | done 82 | 83 | # This is normally unused 84 | # shellcheck disable=SC2034 85 | APP_BASE_NAME=${0##*/} 86 | # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) 87 | APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit 88 | 89 | # Use the maximum available, or set MAX_FD != -1 to use that value. 90 | MAX_FD=maximum 91 | 92 | warn () { 93 | echo "$*" 94 | } >&2 95 | 96 | die () { 97 | echo 98 | echo "$*" 99 | echo 100 | exit 1 101 | } >&2 102 | 103 | # OS specific support (must be 'true' or 'false'). 104 | cygwin=false 105 | msys=false 106 | darwin=false 107 | nonstop=false 108 | case "$( uname )" in #( 109 | CYGWIN* ) cygwin=true ;; #( 110 | Darwin* ) darwin=true ;; #( 111 | MSYS* | MINGW* ) msys=true ;; #( 112 | NONSTOP* ) nonstop=true ;; 113 | esac 114 | 115 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 116 | 117 | 118 | # Determine the Java command to use to start the JVM. 119 | if [ -n "$JAVA_HOME" ] ; then 120 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 121 | # IBM's JDK on AIX uses strange locations for the executables 122 | JAVACMD=$JAVA_HOME/jre/sh/java 123 | else 124 | JAVACMD=$JAVA_HOME/bin/java 125 | fi 126 | if [ ! -x "$JAVACMD" ] ; then 127 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 128 | 129 | Please set the JAVA_HOME variable in your environment to match the 130 | location of your Java installation." 131 | fi 132 | else 133 | JAVACMD=java 134 | if ! command -v java >/dev/null 2>&1 135 | then 136 | die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 137 | 138 | Please set the JAVA_HOME variable in your environment to match the 139 | location of your Java installation." 140 | fi 141 | fi 142 | 143 | # Increase the maximum file descriptors if we can. 144 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then 145 | case $MAX_FD in #( 146 | max*) 147 | # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. 148 | # shellcheck disable=SC2039,SC3045 149 | MAX_FD=$( ulimit -H -n ) || 150 | warn "Could not query maximum file descriptor limit" 151 | esac 152 | case $MAX_FD in #( 153 | '' | soft) :;; #( 154 | *) 155 | # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. 156 | # shellcheck disable=SC2039,SC3045 157 | ulimit -n "$MAX_FD" || 158 | warn "Could not set maximum file descriptor limit to $MAX_FD" 159 | esac 160 | fi 161 | 162 | # Collect all arguments for the java command, stacking in reverse order: 163 | # * args from the command line 164 | # * the main class name 165 | # * -classpath 166 | # * -D...appname settings 167 | # * --module-path (only if needed) 168 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. 169 | 170 | # For Cygwin or MSYS, switch paths to Windows format before running java 171 | if "$cygwin" || "$msys" ; then 172 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) 173 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) 174 | 175 | JAVACMD=$( cygpath --unix "$JAVACMD" ) 176 | 177 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 178 | for arg do 179 | if 180 | case $arg in #( 181 | -*) false ;; # don't mess with options #( 182 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath 183 | [ -e "$t" ] ;; #( 184 | *) false ;; 185 | esac 186 | then 187 | arg=$( cygpath --path --ignore --mixed "$arg" ) 188 | fi 189 | # Roll the args list around exactly as many times as the number of 190 | # args, so each arg winds up back in the position where it started, but 191 | # possibly modified. 192 | # 193 | # NB: a `for` loop captures its iteration list before it begins, so 194 | # changing the positional parameters here affects neither the number of 195 | # iterations, nor the values presented in `arg`. 196 | shift # remove old arg 197 | set -- "$@" "$arg" # push replacement arg 198 | done 199 | fi 200 | 201 | 202 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 203 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 204 | 205 | # Collect all arguments for the java command: 206 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, 207 | # and any embedded shellness will be escaped. 208 | # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be 209 | # treated as '${Hostname}' itself on the command line. 210 | 211 | set -- \ 212 | "-Dorg.gradle.appname=$APP_BASE_NAME" \ 213 | -classpath "$CLASSPATH" \ 214 | org.gradle.wrapper.GradleWrapperMain \ 215 | "$@" 216 | 217 | # Stop when "xargs" is not available. 218 | if ! command -v xargs >/dev/null 2>&1 219 | then 220 | die "xargs is not available" 221 | fi 222 | 223 | # Use "xargs" to parse quoted args. 224 | # 225 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed. 226 | # 227 | # In Bash we could simply go: 228 | # 229 | # readarray ARGS < <( xargs -n1 <<<"$var" ) && 230 | # set -- "${ARGS[@]}" "$@" 231 | # 232 | # but POSIX shell has neither arrays nor command substitution, so instead we 233 | # post-process each arg (as a line of input to sed) to backslash-escape any 234 | # character that might be a shell metacharacter, then use eval to reverse 235 | # that process (while maintaining the separation between arguments), and wrap 236 | # the whole thing up as a single "set" statement. 237 | # 238 | # This will of course break if any of these variables contains a newline or 239 | # an unmatched quote. 240 | # 241 | 242 | eval "set -- $( 243 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | 244 | xargs -n1 | 245 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | 246 | tr '\n' ' ' 247 | )" '"$@"' 248 | 249 | exec "$JAVACMD" "$@" 250 | -------------------------------------------------------------------------------- /src/main/java/me/kawaiizenbo/moonlight/util/KeycodeUtils.java: -------------------------------------------------------------------------------- 1 | package me.kawaiizenbo.moonlight.util; 2 | 3 | public class KeycodeUtils 4 | { 5 | public static String[] keyTable = { 6 | "", 7 | "Unknown", 8 | "Unknown", 9 | "Unknown", 10 | "Unknown", 11 | "Unknown", 12 | "Unknown", 13 | "Unknown", 14 | "Unknown", 15 | "Unknown", 16 | "Unknown", 17 | "Unknown", 18 | "Unknown", 19 | "Unknown", 20 | "Unknown", 21 | "Unknown", 22 | "Unknown", 23 | "Unknown", 24 | "Unknown", 25 | "Unknown", 26 | "Unknown", 27 | "Unknown", 28 | "Unknown", 29 | "Unknown", 30 | "Unknown", 31 | "Unknown", 32 | "Unknown", 33 | "Unknown", 34 | "Unknown", 35 | "Unknown", 36 | "Unknown", 37 | "Unknown", 38 | "Space", 39 | "Unknown", 40 | "Unknown", 41 | "Unknown", 42 | "Unknown", 43 | "Unknown", 44 | "Unknown", 45 | "'", 46 | "Unknown", 47 | "Unknown", 48 | "Unknown", 49 | "Unknown", 50 | ",", 51 | "-", 52 | ".", 53 | "/", 54 | "0", 55 | "1", 56 | "2", 57 | "3", 58 | "4", 59 | "5", 60 | "6", 61 | "7", 62 | "8", 63 | "9", 64 | "Unknown", 65 | ";", 66 | "Unknown", 67 | "=", 68 | "Unknown", 69 | "Unknown", 70 | "Unknown", 71 | "a", 72 | "b", 73 | "c", 74 | "d", 75 | "e", 76 | "f", 77 | "g", 78 | "h", 79 | "i", 80 | "j", 81 | "k", 82 | "l", 83 | "m", 84 | "n", 85 | "o", 86 | "p", 87 | "q", 88 | "r", 89 | "s", 90 | "t", 91 | "u", 92 | "v", 93 | "w", 94 | "x", 95 | "y", 96 | "z", 97 | "[", 98 | "\\", 99 | "]", 100 | "Unknown", 101 | "Unknown", 102 | "`", 103 | "Unknown", 104 | "Unknown", 105 | "Unknown", 106 | "Unknown", 107 | "Unknown", 108 | "Unknown", 109 | "Unknown", 110 | "Unknown", 111 | "Unknown", 112 | "Unknown", 113 | "Unknown", 114 | "Unknown", 115 | "Unknown", 116 | "Unknown", 117 | "Unknown", 118 | "Unknown", 119 | "Unknown", 120 | "Unknown", 121 | "Unknown", 122 | "Unknown", 123 | "Unknown", 124 | "Unknown", 125 | "Unknown", 126 | "Unknown", 127 | "Unknown", 128 | "Unknown", 129 | "Unknown", 130 | "Unknown", 131 | "Unknown", 132 | "Unknown", 133 | "Unknown", 134 | "Unknown", 135 | "Unknown", 136 | "Unknown", 137 | "Unknown", 138 | "Unknown", 139 | "Unknown", 140 | "Unknown", 141 | "Unknown", 142 | "Unknown", 143 | "Unknown", 144 | "Unknown", 145 | "Unknown", 146 | "Unknown", 147 | "Unknown", 148 | "Unknown", 149 | "Unknown", 150 | "Unknown", 151 | "Unknown", 152 | "Unknown", 153 | "Unknown", 154 | "Unknown", 155 | "Unknown", 156 | "Unknown", 157 | "Unknown", 158 | "Unknown", 159 | "Unknown", 160 | "Unknown", 161 | "Unknown", 162 | "Unknown", 163 | "Unknown", 164 | "Unknown", 165 | "Unknown", 166 | "Unknown", 167 | "World 1", 168 | "World 2", 169 | "Unknown", 170 | "Unknown", 171 | "Unknown", 172 | "Unknown", 173 | "Unknown", 174 | "Unknown", 175 | "Unknown", 176 | "Unknown", 177 | "Unknown", 178 | "Unknown", 179 | "Unknown", 180 | "Unknown", 181 | "Unknown", 182 | "Unknown", 183 | "Unknown", 184 | "Unknown", 185 | "Unknown", 186 | "Unknown", 187 | "Unknown", 188 | "Unknown", 189 | "Unknown", 190 | "Unknown", 191 | "Unknown", 192 | "Unknown", 193 | "Unknown", 194 | "Unknown", 195 | "Unknown", 196 | "Unknown", 197 | "Unknown", 198 | "Unknown", 199 | "Unknown", 200 | "Unknown", 201 | "Unknown", 202 | "Unknown", 203 | "Unknown", 204 | "Unknown", 205 | "Unknown", 206 | "Unknown", 207 | "Unknown", 208 | "Unknown", 209 | "Unknown", 210 | "Unknown", 211 | "Unknown", 212 | "Unknown", 213 | "Unknown", 214 | "Unknown", 215 | "Unknown", 216 | "Unknown", 217 | "Unknown", 218 | "Unknown", 219 | "Unknown", 220 | "Unknown", 221 | "Unknown", 222 | "Unknown", 223 | "Unknown", 224 | "Unknown", 225 | "Unknown", 226 | "Unknown", 227 | "Unknown", 228 | "Unknown", 229 | "Unknown", 230 | "Unknown", 231 | "Unknown", 232 | "Unknown", 233 | "Unknown", 234 | "Unknown", 235 | "Unknown", 236 | "Unknown", 237 | "Unknown", 238 | "Unknown", 239 | "Unknown", 240 | "Unknown", 241 | "Unknown", 242 | "Unknown", 243 | "Unknown", 244 | "Unknown", 245 | "Unknown", 246 | "Unknown", 247 | "Unknown", 248 | "Unknown", 249 | "Unknown", 250 | "Unknown", 251 | "Unknown", 252 | "Unknown", 253 | "Unknown", 254 | "Unknown", 255 | "Unknown", 256 | "Unknown", 257 | "Unknown", 258 | "Unknown", 259 | "Unknown", 260 | "Unknown", 261 | "Unknown", 262 | "Escape", 263 | "Enter", 264 | "Tab", 265 | "Backspace", 266 | "Insert", 267 | "Delete", 268 | "Right", 269 | "Left", 270 | "Down", 271 | "Up", 272 | "Page Up", 273 | "Page Down", 274 | "Home", 275 | "End", 276 | "Unknown", 277 | "Unknown", 278 | "Unknown", 279 | "Unknown", 280 | "Unknown", 281 | "Unknown", 282 | "Unknown", 283 | "Unknown", 284 | "Unknown", 285 | "Unknown", 286 | "Caps Lock", 287 | "Scroll Lock", 288 | "Num Lock", 289 | "Print Screen", 290 | "Pause", 291 | "Unknown", 292 | "Unknown", 293 | "Unknown", 294 | "Unknown", 295 | "Unknown", 296 | "F1", 297 | "F2", 298 | "F3", 299 | "F4", 300 | "F5", 301 | "F6", 302 | "F7", 303 | "F8", 304 | "F9", 305 | "F10", 306 | "F11", 307 | "F12", 308 | "F13", 309 | "F14", 310 | "F15", 311 | "F16", 312 | "F17", 313 | "F18", 314 | "F19", 315 | "F20", 316 | "F21", 317 | "F22", 318 | "F23", 319 | "F24", 320 | "F25", 321 | "Unknown", 322 | "Unknown", 323 | "Unknown", 324 | "Unknown", 325 | "Unknown", 326 | "Num 0", 327 | "Num 1", 328 | "Num 2", 329 | "Num 3", 330 | "Num 4", 331 | "Num 5", 332 | "Num 6", 333 | "Num 7", 334 | "Num 8", 335 | "Num 9", 336 | "Num .", 337 | "Num /", 338 | "Num *", 339 | "Num -", 340 | "Num +", 341 | "Num Enter", 342 | "Num =", 343 | "Unknown", 344 | "Unknown", 345 | "Unknown", 346 | "Left Shift", 347 | "Left Control", 348 | "Left Alt", 349 | "Left Command", 350 | "Right Shift", 351 | "Right Control", 352 | "Right Alt", 353 | "Right Command", 354 | "Menu", 355 | "Last", 356 | }; 357 | 358 | public static String[] shiftedKeyTable = { 359 | "", 360 | "Unknown", 361 | "Unknown", 362 | "Unknown", 363 | "Unknown", 364 | "Unknown", 365 | "Unknown", 366 | "Unknown", 367 | "Unknown", 368 | "Unknown", 369 | "Unknown", 370 | "Unknown", 371 | "Unknown", 372 | "Unknown", 373 | "Unknown", 374 | "Unknown", 375 | "Unknown", 376 | "Unknown", 377 | "Unknown", 378 | "Unknown", 379 | "Unknown", 380 | "Unknown", 381 | "Unknown", 382 | "Unknown", 383 | "Unknown", 384 | "Unknown", 385 | "Unknown", 386 | "Unknown", 387 | "Unknown", 388 | "Unknown", 389 | "Unknown", 390 | "Unknown", 391 | "Space", 392 | "Unknown", 393 | "Unknown", 394 | "Unknown", 395 | "Unknown", 396 | "Unknown", 397 | "Unknown", 398 | "\"", 399 | "Unknown", 400 | "Unknown", 401 | "Unknown", 402 | "Unknown", 403 | "<", 404 | "_", 405 | ">", 406 | "?", 407 | ")", 408 | "!", 409 | "@", 410 | "#", 411 | "$", 412 | "%", 413 | "^", 414 | "&", 415 | "*", 416 | "(", 417 | "Unknown", 418 | ":", 419 | "Unknown", 420 | "+", 421 | "Unknown", 422 | "Unknown", 423 | "Unknown", 424 | "A", 425 | "B", 426 | "C", 427 | "D", 428 | "E", 429 | "F", 430 | "G", 431 | "H", 432 | "I", 433 | "J", 434 | "K", 435 | "L", 436 | "M", 437 | "N", 438 | "O", 439 | "P", 440 | "Q", 441 | "R", 442 | "S", 443 | "T", 444 | "U", 445 | "V", 446 | "W", 447 | "X", 448 | "Y", 449 | "Z", 450 | "{", 451 | "|", 452 | "}", 453 | "Unknown", 454 | "Unknown", 455 | "~", 456 | "Unknown", 457 | "Unknown", 458 | "Unknown", 459 | "Unknown", 460 | "Unknown", 461 | "Unknown", 462 | "Unknown", 463 | "Unknown", 464 | "Unknown", 465 | "Unknown", 466 | "Unknown", 467 | "Unknown", 468 | "Unknown", 469 | "Unknown", 470 | "Unknown", 471 | "Unknown", 472 | "Unknown", 473 | "Unknown", 474 | "Unknown", 475 | "Unknown", 476 | "Unknown", 477 | "Unknown", 478 | "Unknown", 479 | "Unknown", 480 | "Unknown", 481 | "Unknown", 482 | "Unknown", 483 | "Unknown", 484 | "Unknown", 485 | "Unknown", 486 | "Unknown", 487 | "Unknown", 488 | "Unknown", 489 | "Unknown", 490 | "Unknown", 491 | "Unknown", 492 | "Unknown", 493 | "Unknown", 494 | "Unknown", 495 | "Unknown", 496 | "Unknown", 497 | "Unknown", 498 | "Unknown", 499 | "Unknown", 500 | "Unknown", 501 | "Unknown", 502 | "Unknown", 503 | "Unknown", 504 | "Unknown", 505 | "Unknown", 506 | "Unknown", 507 | "Unknown", 508 | "Unknown", 509 | "Unknown", 510 | "Unknown", 511 | "Unknown", 512 | "Unknown", 513 | "Unknown", 514 | "Unknown", 515 | "Unknown", 516 | "Unknown", 517 | "Unknown", 518 | "Unknown", 519 | "Unknown", 520 | "World 1", 521 | "World 2", 522 | "Unknown", 523 | "Unknown", 524 | "Unknown", 525 | "Unknown", 526 | "Unknown", 527 | "Unknown", 528 | "Unknown", 529 | "Unknown", 530 | "Unknown", 531 | "Unknown", 532 | "Unknown", 533 | "Unknown", 534 | "Unknown", 535 | "Unknown", 536 | "Unknown", 537 | "Unknown", 538 | "Unknown", 539 | "Unknown", 540 | "Unknown", 541 | "Unknown", 542 | "Unknown", 543 | "Unknown", 544 | "Unknown", 545 | "Unknown", 546 | "Unknown", 547 | "Unknown", 548 | "Unknown", 549 | "Unknown", 550 | "Unknown", 551 | "Unknown", 552 | "Unknown", 553 | "Unknown", 554 | "Unknown", 555 | "Unknown", 556 | "Unknown", 557 | "Unknown", 558 | "Unknown", 559 | "Unknown", 560 | "Unknown", 561 | "Unknown", 562 | "Unknown", 563 | "Unknown", 564 | "Unknown", 565 | "Unknown", 566 | "Unknown", 567 | "Unknown", 568 | "Unknown", 569 | "Unknown", 570 | "Unknown", 571 | "Unknown", 572 | "Unknown", 573 | "Unknown", 574 | "Unknown", 575 | "Unknown", 576 | "Unknown", 577 | "Unknown", 578 | "Unknown", 579 | "Unknown", 580 | "Unknown", 581 | "Unknown", 582 | "Unknown", 583 | "Unknown", 584 | "Unknown", 585 | "Unknown", 586 | "Unknown", 587 | "Unknown", 588 | "Unknown", 589 | "Unknown", 590 | "Unknown", 591 | "Unknown", 592 | "Unknown", 593 | "Unknown", 594 | "Unknown", 595 | "Unknown", 596 | "Unknown", 597 | "Unknown", 598 | "Unknown", 599 | "Unknown", 600 | "Unknown", 601 | "Unknown", 602 | "Unknown", 603 | "Unknown", 604 | "Unknown", 605 | "Unknown", 606 | "Unknown", 607 | "Unknown", 608 | "Unknown", 609 | "Unknown", 610 | "Unknown", 611 | "Unknown", 612 | "Unknown", 613 | "Unknown", 614 | "Unknown", 615 | "Escape", 616 | "Enter", 617 | "Tab", 618 | "Backspace", 619 | "Insert", 620 | "Delete", 621 | "Right", 622 | "Left", 623 | "Down", 624 | "Up", 625 | "Page Up", 626 | "Page Down", 627 | "Home", 628 | "End", 629 | "Unknown", 630 | "Unknown", 631 | "Unknown", 632 | "Unknown", 633 | "Unknown", 634 | "Unknown", 635 | "Unknown", 636 | "Unknown", 637 | "Unknown", 638 | "Unknown", 639 | "Caps Lock", 640 | "Scroll Lock", 641 | "Num Lock", 642 | "Print Screen", 643 | "Pause", 644 | "Unknown", 645 | "Unknown", 646 | "Unknown", 647 | "Unknown", 648 | "Unknown", 649 | "F1", 650 | "F2", 651 | "F3", 652 | "F4", 653 | "F5", 654 | "F6", 655 | "F7", 656 | "F8", 657 | "F9", 658 | "F10", 659 | "F11", 660 | "F12", 661 | "F13", 662 | "F14", 663 | "F15", 664 | "F16", 665 | "F17", 666 | "F18", 667 | "F19", 668 | "F20", 669 | "F21", 670 | "F22", 671 | "F23", 672 | "F24", 673 | "F25", 674 | "Unknown", 675 | "Unknown", 676 | "Unknown", 677 | "Unknown", 678 | "Unknown", 679 | "Num 0", 680 | "Num 1", 681 | "Num 2", 682 | "Num 3", 683 | "Num 4", 684 | "Num 5", 685 | "Num 6", 686 | "Num 7", 687 | "Num 8", 688 | "Num 9", 689 | "Num .", 690 | "Num /", 691 | "Num *", 692 | "Num -", 693 | "Num +", 694 | "Num Enter", 695 | "Num =", 696 | "Unknown", 697 | "Unknown", 698 | "Unknown", 699 | "Left Shift", 700 | "Left Control", 701 | "Left Alt", 702 | "Left Command", 703 | "Right Shift", 704 | "Right Control", 705 | "Right Alt", 706 | "Right Command", 707 | "Menu", 708 | "Last", 709 | }; 710 | } 711 | --------------------------------------------------------------------------------