diff --git a/gradle.properties b/gradle.properties index 378e7cc..7f78867 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ loader_version=0.18.2 loom_version=1.14-SNAPSHOT # Mod Properties -mod_version=9.1.2 +mod_version=9.2.0 maven_group=hudder archives_base_name=hudder diff --git a/src/main/java/dev/ngspace/ngsmcconfig/gui/AbstractNGSMCConfigScreen.java b/src/main/java/dev/ngspace/ngsmcconfig/gui/AbstractNGSMCConfigScreen.java index 3ae908b..e56d290 100644 --- a/src/main/java/dev/ngspace/ngsmcconfig/gui/AbstractNGSMCConfigScreen.java +++ b/src/main/java/dev/ngspace/ngsmcconfig/gui/AbstractNGSMCConfigScreen.java @@ -58,7 +58,8 @@ protected void init() { saveButton.active = error==null; addRenderableWidget(saveButton); - globalResetButton = Button.builder(Component.translatable("ngsmcconfig.globalreset"), b->reset()) + globalResetButton = Button.builder(Component.translatable("ngsmcconfig.globalreset").withColor(0xdb3b3b), + b->reset()) .bounds(width-40, 0, 40, 20) .build(); @@ -79,7 +80,7 @@ protected void init() { } addRenderableWidget(globalResetButton); - errorWidget = new StringWidget(error!=null?error.plainCopy().withColor(0xFF0000):Component.literal(""), font); + errorWidget = new StringWidget(stylizeErrorComponment(error), font); errorWidget.setPosition(65, 0); errorWidget.setSize(300, 20); // errorWidget.alignLeft(); @@ -94,7 +95,7 @@ protected void init() { addRenderableWidget(container); } } - + protected void save() { for (var category : categories) { for (var option : category.options()) { @@ -151,15 +152,14 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTi Component error = getError(); saveButton.active = error==null; - errorWidget.setMessage(error!=null?error:Component.literal("")); + errorWidget.setMessage(stylizeErrorComponment(error)); if (container!=null) container.render(graphics, mouseX, mouseY, partialTick); super.render(graphics, mouseX, mouseY, partialTick); } -// @Override -// public boolean handleComponentClicked(@Nullable Style style) { -// if (style == null) return false; -// return super.handleComponentClicked(style); -// } + + private Component stylizeErrorComponment(Component error) { + return error!=null?error.plainCopy().withColor(0xFF0000):Component.literal(""); + } } diff --git a/src/main/java/dev/ngspace/ngsmcconfig/gui/dropdown/DropdownElement.java b/src/main/java/dev/ngspace/ngsmcconfig/gui/dropdown/DropdownElement.java index 727e2c1..3b685fa 100644 --- a/src/main/java/dev/ngspace/ngsmcconfig/gui/dropdown/DropdownElement.java +++ b/src/main/java/dev/ngspace/ngsmcconfig/gui/dropdown/DropdownElement.java @@ -25,7 +25,7 @@ protected void renderWidget(GuiGraphics guiGraphics, int i, int j, float f) { } @Override - protected void updateWidgetNarration(NarrationElementOutput narrationElementOutput) {} + protected void updateWidgetNarration(NarrationElementOutput narrationElementOutput) { /* */ } @Override public boolean mouseClicked(MouseButtonEvent mouseButtonEvent, boolean bl) { diff --git a/src/main/java/io/github/ngspace/hudder/Hudder.java b/src/main/java/io/github/ngspace/hudder/Hudder.java index 075749b..e261630 100644 --- a/src/main/java/io/github/ngspace/hudder/Hudder.java +++ b/src/main/java/io/github/ngspace/hudder/Hudder.java @@ -21,6 +21,7 @@ import io.github.ngspace.hudder.data_management.EffectData; import io.github.ngspace.hudder.data_management.ResourcePackVariables; import io.github.ngspace.hudder.data_management.api.DataVariableRegistry; +import io.github.ngspace.hudder.data_management.builtin.HudderBuiltInVariables; import io.github.ngspace.hudder.main.HudCompilationManager; import io.github.ngspace.hudder.main.HudderRenderer; import io.github.ngspace.hudder.main.HudderTickEvent; @@ -137,6 +138,7 @@ public class Hudder implements ClientModInitializer { "selectedresourcepacks_unfiltered"); DataVariableRegistry.registerVariable(new EffectData(), "active_effects"); Advanced.registerKeyVariables(); + HudderBuiltInVariables.registerVariables(); HudCompilationManager compman = new HudCompilationManager(); ClientTickEvents.END_CLIENT_TICK.register(compman); @@ -147,6 +149,9 @@ public class Hudder implements ClientModInitializer { ClientLifecycleEvents.CLIENT_STARTED.register(c->{ try { HudFileUtils.reloadResources(); + if (config.globalVariables.size()>0) + showWarningToast(Component.literal("Hudder is deprecating global variables!"), + Component.literal("Please stop using them or shit will break.")); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/io/github/ngspace/hudder/api/functionsandconsumers/HudderBuiltInFunctions.java b/src/main/java/io/github/ngspace/hudder/api/functionsandconsumers/HudderBuiltInFunctions.java index 9f3c503..babb116 100644 --- a/src/main/java/io/github/ngspace/hudder/api/functionsandconsumers/HudderBuiltInFunctions.java +++ b/src/main/java/io/github/ngspace/hudder/api/functionsandconsumers/HudderBuiltInFunctions.java @@ -8,10 +8,8 @@ import io.github.ngspace.hudder.compilers.utils.HudInformation; import io.github.ngspace.hudder.compilers.utils.functionandconsumerapi.FunctionAndConsumerAPI; import io.github.ngspace.hudder.compilers.utils.functionandconsumerapi.FunctionAndConsumerAPI.TranslatedItemStack; -import io.github.ngspace.hudder.data_management.BooleanData; -import io.github.ngspace.hudder.data_management.NumberData; import io.github.ngspace.hudder.data_management.ObjectDataAPI; -import io.github.ngspace.hudder.data_management.StringData; +import io.github.ngspace.hudder.data_management.api.DataVariableRegistry; import io.github.ngspace.hudder.main.HudCompilationManager; import io.github.ngspace.hudder.utils.HudFileUtils; import net.minecraft.client.Minecraft; @@ -25,14 +23,14 @@ public static void registerFunction(FunctionAndConsumerAPI binder) { //Getters binder.registerFunction((m,c,s)->c.getVariable(s[0].asString()), "get", "getVal", "getVariable"); - binder.registerFunction((m,c,s)->NumberData.getNumber (s[0].asString()), "getNumber" ); - binder.registerFunction((m,c,s)->StringData.getString (s[0].asString()), "getString" ); - binder.registerFunction((m,c,s)->ObjectDataAPI.getObject(s[0].asString()), "getObject" ); - binder.registerFunction((m,c,s)->BooleanData.getBoolean (s[0].asString()), "getBoolean"); + binder.registerFunction((m,c,s)->DataVariableRegistry.getNumber (s[0].asString()), "getNumber" ); + binder.registerFunction((m,c,s)->DataVariableRegistry.getString (s[0].asString()), "getString" ); + binder.registerFunction((m,c,s)->ObjectDataAPI.getObject (s[0].asString()), "getObject" ); + binder.registerFunction((m,c,s)->DataVariableRegistry.getBoolean (s[0].asString()), "getBoolean"); binder.registerFunction((m,c,s)->new TranslatedItemStack(mc.player.getInventory().getItem(s[0].asInt())), "getItem"); -// binder.bindFunction((m,c,s)->c.getConfig().savedVariables.get(s[0].asString()),"readVal"); + binder.registerFunction((m,c,s)->c.getConfig().savedVariables.get(s[0].asString()),"readVal"); //Compile diff --git a/src/main/java/io/github/ngspace/hudder/api/functionsandconsumers/HudderBuiltInMethods.java b/src/main/java/io/github/ngspace/hudder/api/functionsandconsumers/HudderBuiltInMethods.java index ab880f0..e1541e9 100644 --- a/src/main/java/io/github/ngspace/hudder/api/functionsandconsumers/HudderBuiltInMethods.java +++ b/src/main/java/io/github/ngspace/hudder/api/functionsandconsumers/HudderBuiltInMethods.java @@ -1,5 +1,7 @@ package io.github.ngspace.hudder.api.functionsandconsumers; +import java.io.IOException; + import io.github.ngspace.hudder.Hudder; import io.github.ngspace.hudder.compilers.utils.functionandconsumerapi.FunctionAndConsumerAPI; import io.github.ngspace.hudder.uielements.BuiltInTextureElement; @@ -73,7 +75,14 @@ public static void registerMethods(FunctionAndConsumerAPI api) { //Variables api.registerConsumer((e,a,s)->a.put(s[0].asString(), s[1]), "set", "setVal", "setVariable"); -// binder.bindConsumer((e,a,l,ch,s)->a.getConfig().savedVariables.put(s[0].asString(),s[1]),"saveVal"); + api.registerConsumer((e,a,s)->{ + try { + a.getConfig().putSavedVariable(s[0].asString(),s[1].get()); + } catch (IOException ex) { + ex.printStackTrace(); + throw new IllegalArgumentException(ex); + } + },"saveVal"); //Items diff --git a/src/main/java/io/github/ngspace/hudder/compilers/abstractions/AScriptingLanguageCompiler.java b/src/main/java/io/github/ngspace/hudder/compilers/abstractions/AScriptingLanguageCompiler.java index 6309b20..b92d413 100644 --- a/src/main/java/io/github/ngspace/hudder/compilers/abstractions/AScriptingLanguageCompiler.java +++ b/src/main/java/io/github/ngspace/hudder/compilers/abstractions/AScriptingLanguageCompiler.java @@ -10,10 +10,8 @@ import io.github.ngspace.hudder.compilers.utils.HudInformation; import io.github.ngspace.hudder.compilers.utils.IScriptingLanguageEngine; import io.github.ngspace.hudder.compilers.utils.functionandconsumerapi.ArrayElementManager; -import io.github.ngspace.hudder.data_management.BooleanData; -import io.github.ngspace.hudder.data_management.NumberData; import io.github.ngspace.hudder.data_management.ObjectDataAPI; -import io.github.ngspace.hudder.data_management.StringData; +import io.github.ngspace.hudder.data_management.api.DataVariableRegistry; import io.github.ngspace.hudder.main.HudCompilationManager; import io.github.ngspace.hudder.main.config.HudderConfig; import io.github.ngspace.hudder.uielements.AUIElement; @@ -91,10 +89,8 @@ protected AScriptingLanguageCompiler() { @SuppressWarnings("removal") @Override public Object getVariable(String key) throws CompileException { - Object obj = NumberData.getNumber(key); + Object obj = DataVariableRegistry.getAny(key); if ( obj!=null) return obj; - if ((obj=StringData.getString (key))!=null) return obj; - if ((obj=BooleanData.getBoolean(key))!=null) return obj; if ((obj=ObjectDataAPI.getObject(key))!=null) return obj; if ((obj=get(key))!=null) return obj; if ((obj=Hudder.config.globalVariables.get(key))!=null) return obj; diff --git a/src/main/java/io/github/ngspace/hudder/compilers/abstractions/AV2Compiler.java b/src/main/java/io/github/ngspace/hudder/compilers/abstractions/AV2Compiler.java index ba76558..d7cf126 100644 --- a/src/main/java/io/github/ngspace/hudder/compilers/abstractions/AV2Compiler.java +++ b/src/main/java/io/github/ngspace/hudder/compilers/abstractions/AV2Compiler.java @@ -129,7 +129,7 @@ public void defineFunctionOrMethod(String commands, String[] args, String name, try { state.combineWithResult(runtime.execute().toResult(), false); } catch (CompileException e) { - throw new CompileException("Method "+type+" threw an error: \n"+e.getFailureMessage(),line,charpos); + throw new CompileException("Method "+type+" threw an error: \n"+e.getFailureMessage(),charpos); } }); } else {//Is function diff --git a/src/main/java/io/github/ngspace/hudder/compilers/abstractions/AVarTextCompiler.java b/src/main/java/io/github/ngspace/hudder/compilers/abstractions/AVarTextCompiler.java index 40d78d1..53d17e2 100644 --- a/src/main/java/io/github/ngspace/hudder/compilers/abstractions/AVarTextCompiler.java +++ b/src/main/java/io/github/ngspace/hudder/compilers/abstractions/AVarTextCompiler.java @@ -2,10 +2,7 @@ import io.github.ngspace.hudder.Hudder; import io.github.ngspace.hudder.compilers.utils.CompileException; -import io.github.ngspace.hudder.data_management.BooleanData; -import io.github.ngspace.hudder.data_management.NumberData; import io.github.ngspace.hudder.data_management.ObjectDataAPI; -import io.github.ngspace.hudder.data_management.StringData; import io.github.ngspace.hudder.data_management.api.DataVariableRegistry; public abstract class AVarTextCompiler extends ATextCompiler { @@ -33,11 +30,8 @@ public boolean isSystemVariable(String key) { */ @SuppressWarnings("removal") public Object getSystemVariable(String key) { - Object obj = NumberData.getNumber(key); + Object obj = DataVariableRegistry.getAny(key); if (obj!=null) return obj; - if ((obj=BooleanData.getBoolean(key))!=null) return obj; - if ((obj=StringData.getString(key))!=null) return obj; - if ((obj=DataVariableRegistry.getObject(key))!=null) return obj; if ((obj=ObjectDataAPI.getObject(key))!=null) return obj; return Hudder.config.globalVariables.get(key); } diff --git a/src/main/java/io/github/ngspace/hudder/compilers/utils/CompileException.java b/src/main/java/io/github/ngspace/hudder/compilers/utils/CompileException.java index 47b271c..a6c24e0 100644 --- a/src/main/java/io/github/ngspace/hudder/compilers/utils/CompileException.java +++ b/src/main/java/io/github/ngspace/hudder/compilers/utils/CompileException.java @@ -1,11 +1,14 @@ package io.github.ngspace.hudder.compilers.utils; +import io.github.ngspace.hudder.compilers.abstractions.ATextCompiler.CharPosition; + public class CompileException extends Exception { public final int line; public final int col; public CompileException(String string) {this(string,-1,0);} public CompileException(String string, int line, int col) {super(string);this.line = line;this.col = col;} + public CompileException(String string, CharPosition pos) {this(string, pos.line, pos.charpos);} public CompileException(String string, int line, int col, Throwable e) { super(string,e); this.line = line; diff --git a/src/main/java/io/github/ngspace/hudder/compilers/utils/functionandconsumerapi/FunctionAndConsumerAPI.java b/src/main/java/io/github/ngspace/hudder/compilers/utils/functionandconsumerapi/FunctionAndConsumerAPI.java index 8dde5c8..33634a3 100644 --- a/src/main/java/io/github/ngspace/hudder/compilers/utils/functionandconsumerapi/FunctionAndConsumerAPI.java +++ b/src/main/java/io/github/ngspace/hudder/compilers/utils/functionandconsumerapi/FunctionAndConsumerAPI.java @@ -102,6 +102,7 @@ public static class TranslatedItemStack implements ValueGetter { public int durability; public int maxdurability; private DataComponentMap components; + private ItemStack item; public TranslatedItemStack(ItemStack stack) { name = stack.getDisplayName().getString(); count = stack.getCount(); @@ -109,13 +110,14 @@ public TranslatedItemStack(ItemStack stack) { durability = stack.getMaxDamage()-stack.getDamageValue(); maxdurability = stack.getMaxDamage(); components = stack.getComponents(); + item = stack; } @Override public String toString() { return "{name:\"" + name + "\", count:" + count + ", maxcount: " + maxcount + ", durability: " + durability + ", maxdurability: " + maxdurability + "}"; } @Override public Object get(String component) { - return ComponentsData.getObject(component, components); + return ComponentsData.getObject(component, components, item); } } } diff --git a/src/main/java/io/github/ngspace/hudder/data_management/BooleanData.java b/src/main/java/io/github/ngspace/hudder/data_management/BooleanData.java index 0940ae9..ad88772 100644 --- a/src/main/java/io/github/ngspace/hudder/data_management/BooleanData.java +++ b/src/main/java/io/github/ngspace/hudder/data_management/BooleanData.java @@ -1,119 +1,14 @@ package io.github.ngspace.hudder.data_management; -import io.github.ngspace.hudder.Hudder; import io.github.ngspace.hudder.data_management.api.DataVariableRegistry; -import io.github.ngspace.hudder.main.config.HudderConfig; -import net.minecraft.client.Camera; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.ChatScreen; -import net.minecraft.client.gui.screens.dialog.DialogScreen; -import net.minecraft.client.gui.screens.inventory.ContainerScreen; -import net.minecraft.client.gui.screens.inventory.CraftingScreen; -import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; -import net.minecraft.client.gui.screens.inventory.InventoryScreen; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.animal.equine.AbstractChestedHorse; -import net.minecraft.world.entity.animal.equine.AbstractHorse; -import net.minecraft.world.level.GameType; -import net.minecraft.world.level.levelgen.WorldgenRandom; +/** + * @deprecated use DataVariableRegistry. + */ +@Deprecated(since = "9.2.0", forRemoval = true) public class BooleanData {private BooleanData(){} + @Deprecated public static Boolean getBoolean(String key) { - Minecraft ins = Minecraft.getInstance(); - HudderConfig config = Hudder.config; - LocalPlayer p = ins.player; - Camera c = ins.gameRenderer.getMainCamera(); - return switch (key) { - - - - /* Generic */ - case "isslime", "is_slime": { - try { - yield WorldgenRandom.seedSlimeChunk(p.getBlockX() >> 4, p.getBlockZ() >> 4, ins.getSingleplayerServer() - .getLevel(ins.level.dimension()).getSeed(), 987234911L).nextInt(10) == 0; - } catch (Exception e) {/* For some reason adding a yield false; here causes runtime errors...*/} - yield false; - } - case "hudhidden": yield ins.options.hideGui; - case "showdebug": yield ins.getDebugOverlay().showDebugScreen(); - case "f3enabled": yield ins.debugEntries.isOverlayVisible(); - case "camera_detached": yield c.entity() != p; - - - - /* GUI */ - case "isguiopen": yield ins.screen!=null; - case "ischestopen": yield ins.screen instanceof ContainerScreen; - case "iscraftingtableopen": yield ins.screen instanceof CraftingScreen; - case "ischatopen": yield ins.screen instanceof ChatScreen; - case "isdialogopen": yield ins.screen instanceof DialogScreen; - case "isinventoryopen": yield ins.screen instanceof InventoryScreen - || ins.screen instanceof CreativeModeInventoryScreen; - - - - /* Player gamemode */ - case "issurvival","is_survival": yield ins.gameMode.getPlayerMode()==GameType.SURVIVAL; - case "iscreative","is_creative": yield ins.gameMode.getPlayerMode()==GameType.CREATIVE; - case "isadventure","is_adventure": yield ins.gameMode.getPlayerMode()==GameType.ADVENTURE; - case "isspectator","is_spectator": yield ins.gameMode.getPlayerMode()==GameType.SPECTATOR; - - - - /* Player movement */ - case "isflying": yield p.getAbilities().flying; - case "isgliding": yield p.isFallFlying(); - case "isclimbing": yield p.onClimbable(); - case "iscrawling": yield p.isVisuallyCrawling(); - case "isswimming": yield p.isSwimming(); - case "issneaking": yield p.isShiftKeyDown(); - case "issprinting": yield p.isSprinting(); - - - - /* Player information */ - case "isalive": yield p.isAlive(); - case "isblocking": yield p.isBlocking(); - case "isfreezing": yield p.isFreezing(); - case "isglowing": yield p.isCurrentlyGlowing(); - case "isfireimmune": yield p.fireImmune(); - case "isonfire": yield p.isOnFire(); - case "isonground": yield p.onGround(); - case "isinvisible": yield p.isInvisible(); - case "isdrowning": yield p.isInWater(); - case "iscontrollingmount": yield p.getControlledVehicle() != null; - case "isonmount": yield p.getVehicle()!=null; - - - - /* Mount information */ - case "mount_is_saddled": yield p.getVehicle() instanceof Mob mob && mob.isSaddled(); - case "mount_has_armor": yield p.getVehicle() instanceof Mob mob && mob.isWearingBodyArmor(); - case "mount_is_tamed": yield p.getVehicle() instanceof AbstractHorse horse && horse.isTamed(); - case "mount_has_chest": yield p.getVehicle() instanceof AbstractChestedHorse horse && horse.hasChest(); - - - - /* Mouse */ - case "mouse_left": yield ins.mouseHandler.isLeftPressed(); - case "mouse_middle": yield ins.mouseHandler.isMiddlePressed(); - case "mouse_right": yield ins.mouseHandler.isRightPressed(); - - - - /* Hudder */ - case "enabled": yield true; //Duh - case "shadow": yield config.shadow; - case "showinf3": yield config.showInF3; - case "javascriptenabled": yield true; // For compatibility - case "unsafeoperations": yield config.unsafeoperations; - case "globalvariablesenabled": yield config.globalVariablesEnabled; - case "background": yield config.background; - case "removegui": yield config.removegui; - case "limitrate": yield config.limitrate; - default: yield DataVariableRegistry.getBoolean(key); - }; + return DataVariableRegistry.getBoolean(key); } } \ No newline at end of file diff --git a/src/main/java/io/github/ngspace/hudder/data_management/ComponentsData.java b/src/main/java/io/github/ngspace/hudder/data_management/ComponentsData.java index 87e124f..00e16d5 100644 --- a/src/main/java/io/github/ngspace/hudder/data_management/ComponentsData.java +++ b/src/main/java/io/github/ngspace/hudder/data_management/ComponentsData.java @@ -2,7 +2,9 @@ import java.util.HashMap; +import io.github.ngspace.hudder.mixin.ItemCooldownsAccessor; import io.github.ngspace.hudder.utils.ValueGetter; +import net.minecraft.client.Minecraft; import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponentMap; import net.minecraft.core.component.DataComponents; @@ -10,6 +12,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.resources.Identifier; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.ItemEnchantments; @@ -18,41 +21,57 @@ public class ComponentsData extends HashMap { private static final long serialVersionUID = 229002063971831208L; - public static Object getObject(String key, DataComponentMap comp) { - + public static Object getObject(String key, DataComponentMap data, ItemStack item) { + var player = Minecraft.getInstance().player; return switch (key.toLowerCase()) { /* Text Objects */ case "custom_name", "item_name": { - Component t = (Component) comp.get(BuiltInRegistries.DATA_COMPONENT_TYPE.getValue(Identifier.withDefaultNamespace(key))); + Component t = (Component) data.get(BuiltInRegistries.DATA_COMPONENT_TYPE.getValue(Identifier.withDefaultNamespace(key))); yield t!=null ? t.getString() : null; } /* Primitives */ case "repair_cost", "damage", "max_damage", "max_stack_size", "enchantment_glint_override": - yield comp.get(BuiltInRegistries.DATA_COMPONENT_TYPE.getValue(Identifier.withDefaultNamespace(key))); - -// case "mining_speed": yield comp.get(DataComponentTypes.TOOL).defaultMiningSpeed(); + yield data.get(BuiltInRegistries.DATA_COMPONENT_TYPE.getValue(Identifier.withDefaultNamespace(key))); + + case "max_cooldown": { + var component = data.get(DataComponents.USE_COOLDOWN); + yield component == null ? 0 : component.seconds() * 20; + } + case "cooldown": { + var group = player.getCooldowns().getCooldownGroup(item); + var acc = ((ItemCooldownsAccessor)player.getCooldowns()); + var cooldown = acc.getCooldowns().get(group); + if (cooldown==null) + yield 0; + var totaltime = (cooldown.endTime()-acc.getTickCount()) - (cooldown.startTime()-acc.getTickCount()); + yield totaltime - (acc.getTickCount()-cooldown.startTime()); + } - case "trim": yield comp.get(DataComponents.TRIM) !=null ? new Object() { - String material = comp.get(DataComponents.TRIM).material().value().assets().base().suffix(); - String pattern = comp.get(DataComponents.TRIM).pattern().value().assetId().toString(); - } : null; + case "trim": + yield data.get(DataComponents.TRIM) ==null ? null : new Object() { + String material = data.get(DataComponents.TRIM).material().value().assets().base().suffix(); + String pattern = data.get(DataComponents.TRIM).pattern().value().assetId().toString(); + }; - case "enchantable": yield comp.get(DataComponents.ENCHANTABLE) !=null ? - comp.get(DataComponents.ENCHANTABLE).value() : null; - case "lore": yield comp.get(DataComponents.LORE) !=null ? - comp.get(DataComponents.LORE).styledLines() : null; - case "rarity": yield comp.get(DataComponents.RARITY) !=null ? - comp.get(DataComponents.RARITY).toString() : null; + case "enchantable": + var enchantable = data.get(DataComponents.ENCHANTABLE); + yield enchantable !=null ? enchantable.value() : null; + case "lore": + var lore = data.get(DataComponents.LORE); + yield lore !=null ? lore.styledLines() : null; + case "rarity": + var rarity = data.get(DataComponents.RARITY); + yield rarity !=null ? rarity.toString() : null; - case "unbreakable": yield comp.get(DataComponents.UNBREAKABLE); + case "unbreakable": yield data.get(DataComponents.UNBREAKABLE); - case "custom_data": yield String.valueOf(comp.get(DataComponents.CUSTOM_DATA)); + case "custom_data": yield String.valueOf(data.get(DataComponents.CUSTOM_DATA)); case "enchantments": { - var d = comp.get(DataComponents.ENCHANTMENTS); + var d = data.get(DataComponents.ENCHANTMENTS); if (d==null) yield null; yield new EnchantmentInfo(d); } diff --git a/src/main/java/io/github/ngspace/hudder/data_management/NumberData.java b/src/main/java/io/github/ngspace/hudder/data_management/NumberData.java index 644031b..b8fc79f 100644 --- a/src/main/java/io/github/ngspace/hudder/data_management/NumberData.java +++ b/src/main/java/io/github/ngspace/hudder/data_management/NumberData.java @@ -1,267 +1,14 @@ package io.github.ngspace.hudder.data_management; -import java.util.Calendar; -import java.util.Queue; - -import io.github.ngspace.hudder.Hudder; import io.github.ngspace.hudder.data_management.api.DataVariableRegistry; -import io.github.ngspace.hudder.main.config.HudderConfig; -import io.github.ngspace.hudder.mixin.LevelRendererAccess; -import io.github.ngspace.hudder.mixin.ParticleManagerAccessor; -import io.github.ngspace.hudder.v2runtime.V2Runtime; -import net.minecraft.client.Camera; -import net.minecraft.client.Minecraft; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.client.server.IntegratedServer; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.animal.equine.AbstractHorse; -import net.minecraft.world.level.LightLayer; +/** + * @deprecated use DataVariableRegistry. + */ +@Deprecated(since = "9.2.0", forRemoval = true) public class NumberData {private NumberData() {} - static final double MB = 1024d*1024d; - static final Runtime runtime = Runtime.getRuntime(); - + @Deprecated public static Object getNumber(String key) { - Minecraft ins = Minecraft.getInstance(); - LocalPlayer p = ins.player; - Camera c = ins.gameRenderer.getMainCamera(); - HudderConfig config = Hudder.config; - - return switch(key) { - - /* Performance */ - case "fps": yield (double) Advanced.fps; - case "avgfps","avg_fps": yield (double) Advanced.getAverageFPS(); - case "minfps","min_fps": yield (double) Advanced.getMinimumFPS(); - case "maxfps","max_fps": yield (double) Advanced.getMaximumFPS(); - case "ping": yield (double) ins.getConnection().getPlayerInfo(p.getUUID()).getLatency(); - case "tps": yield (double) getTPS(ins); - - case "gpu_d", "dgpu": yield Math.min(ins.getGpuUtilization(), 100.0); - case "gpu": yield Math.round(Math.min(ins.getGpuUtilization(), 100.0)); - case "cpu_d": yield Advanced.CPU.get()* 100d; - case "cpu": yield (double) (int) (Advanced.CPU.get()* 100d); - - case "delta": yield (double) Advanced.delta; - - - - /* Memory */ - case "totalmemory","maxmemory","totalram","maxram": yield runtime.maxMemory() / MB; - case "usedmemory","usedram": yield (runtime.totalMemory() - runtime.freeMemory()) / MB; - case "freememory","freeram": yield runtime.freeMemory() / MB; - case "usedmemory_percentage","usedram_percentage": - double usedmem = ((double)runtime.totalMemory() - (double)runtime.freeMemory()) / MB; - double totalmem = (runtime.maxMemory())/MB; - yield (double) ((int)(usedmem/totalmem*100)); - case "freememory_percentage","freeram_percentage": yield (double) runtime.freeMemory() / runtime.maxMemory(); - - - - /* Time */ - case "time": yield (double) System.currentTimeMillis(); - case "milliseconds": yield (double) Calendar.getInstance().get(Calendar.MILLISECOND); - case "seconds": yield (double) Calendar.getInstance().get(Calendar.SECOND); - case "minutes": yield (double) Calendar.getInstance().get(Calendar.MINUTE); - case "hour": yield (double) Calendar.getInstance().get(Calendar.HOUR_OF_DAY); - case "day": yield (double) Calendar.getInstance().get(Calendar.DAY_OF_MONTH); - case "month": yield (double) Calendar.getInstance().get(Calendar.MONTH); - case "year": yield (double) Calendar.getInstance().get(Calendar.YEAR); - - - - /* Food and health */ - case "saturation": yield (double) p.getFoodData().getSaturationLevel(); - case "hunger": yield (double) p.getFoodData().getFoodLevel(); - case "health", "hp": yield (double) p.getHealth(); - case "maxhealth", "maxhp": yield (double) p.getMaxHealth(); - case "absorption": yield (double) p.getAbsorptionAmount(); - case "maxabsorption": yield (double) p.getMaxAbsorption(); - - - - /* Mount information */ - case "mount_health", "mount_hp": yield (p.getVehicle() instanceof LivingEntity entity) ? (double) entity.getHealth() : V2Runtime.NULL; - case "mount_maxhealth", "mount_maxhp": yield (p.getVehicle() instanceof LivingEntity entity) ? (double) entity.getMaxHealth() : V2Runtime.NULL; - case "mount_speed": yield (p.getVehicle() instanceof LivingEntity entity) ? entity.getAttribute(Attributes.MOVEMENT_SPEED).getBaseValue() : V2Runtime.NULL; - case "mount_jump_strength": yield (p.getVehicle() instanceof LivingEntity entity) ? entity.getAttribute(Attributes.JUMP_STRENGTH).getBaseValue() : V2Runtime.NULL; - case "mount_jump_scale": yield (p.getVehicle() instanceof AbstractHorse) ? (double) p.getJumpRidingScale() : V2Runtime.NULL; - case "mount_armor": yield (p.getVehicle() instanceof AbstractHorse) ? (double) ((AbstractHorse) p.getVehicle()).getArmorValue() : V2Runtime.NULL; - case "mount_jump_cooldown": yield (p.getVehicle() instanceof AbstractHorse) ? (double) ((AbstractHorse) p.getVehicle()).getJumpCooldown() : V2Runtime.NULL; - - - - /* Other Player related information */ - case "selectedslot": yield (double) p.getInventory().getSelectedSlot(); - case "xplevel": yield (double) p.experienceLevel; - case "xp": yield (double) p.totalExperience; - case "armor": yield (double) p.getArmorValue(); - case "falldistance": yield p.fallDistance; - case "airbubbles": { - yield (double) getCurrentAirSupplyBubble(Math.clamp(p.getAirSupply(), 0, p.getMaxAirSupply()), p.getMaxAirSupply(), 0); - } - case "maxairbubbles": { - yield (double) getCurrentAirSupplyBubble(p.getMaxAirSupply(), p.getMaxAirSupply(), 0); - } - - case "playerspeed": { - var ent = p.getVehicle() == null ? p : p.getVehicle(); - if (ent==null) yield 0; - - double speed = (Math.sqrt(Math.pow(ent.getX() - ent.xOld, 2) + - Math.pow(ent.getY() - ent.yOld , 2) + Math.pow(ent.getZ() - ent.zOld , 2)) * 20); - yield speed; - } - case "horizontal_playerspeed": { - var ent = p.getVehicle() == null ? p : p.getVehicle(); - if (ent==null) yield 0; - - double speed = (Math.sqrt(Math.pow(ent.getX() - ent.xOld, 2) + Math.pow(ent.getZ() - ent.zOld , 2)) * 20); - yield speed; - } - case "cps": yield Advanced.getLeftCPS() + Advanced.getRightCPS(); - case "cps_left": yield Advanced.getLeftCPS(); - case "cps_right": yield Advanced.getRightCPS(); - - - - /* Player position */ - case "dxpos","dx": yield p.getX(); - case "dypos","dy": yield p.getY(); - case "dzpos","dz": yield p.getZ(); - case "xpos","x": yield (double) p.getBlockX(); - case "ypos","y": yield (double) p.getBlockY(); - case "zpos","z": yield (double) p.getBlockZ(); - - - - /* Camera position */ - case "cam_dxpos": yield c.position().x; - case "cam_dypos": yield c.position().y; - case "cam_dzpos": yield c.position().z; - case "cam_xpos": yield (double) c.blockPosition().getX(); - case "cam_ypos": yield (double) c.blockPosition().getY(); - case "cam_zpos": yield (double) c.blockPosition().getZ(); - - - - /* Chunk information */ - case "subchunkx": yield (double) (p.getBlockX() & 0xF); - case "subchunky": yield (double) (p.getBlockY() & 0xF); - case "subchunkz": yield (double) (p.getBlockZ() & 0xF); - case "chunkx": yield (double) p.chunkPosition().x; - case "chunkz": yield (double) p.chunkPosition().z; - - - - /* Camera chunk information */ - case "cam_subchunkx": yield (double) (c.blockPosition().getX() & 0xF); - case "cam_subchunky": yield (double) (c.blockPosition().getY() & 0xF); - case "cam_subchunkz": yield (double) (c.blockPosition().getZ() & 0xF); - case "cam_chunkx": yield (double) (c.blockPosition().getX() >> 4); - case "cam_chunkz": yield (double) (c.blockPosition().getZ() >> 4); - - - - /* Player roation */ - // Pitch - case "dpitch": yield (double) p.getXRot(); - case "pitch": yield (double) (int) p.getXRot(); - // Yaw - case "dyaw": { - float yaw = p.getYHeadRot(); - if (yaw<0) yield (double) (360d+(yaw % 360d)); - yield yaw % 360d; - } - case "yaw": { - int yaw = (int) p.getYHeadRot(); - if (yaw<0) yield (double) (360+(yaw % 360)); - yield yaw % 360d; - } - // F3 yaw - case "f3_dyaw": yield (double) Mth.wrapDegrees(p.getYHeadRot()); - case "f3_yaw": yield (double) (int) Mth.wrapDegrees(p.getYHeadRot()); - - - - /* Camera roation */ - // Pitch - case "cam_dpitch": yield (double) c.xRot(); - case "cam_pitch": yield (double) (int) c.xRot(); - // Yaw - case "cam_dyaw": { - float yaw = c.yRot(); - if (yaw<0) yield (double) (360d+(yaw % 360d)); - yield yaw % 360d; - } - case "cam_yaw": { - int yaw = (int) c.yRot(); - if (yaw<0) yield (double) (360+(yaw % 360)); - yield yaw % 360d; - } - // F3 yaw - case "cam_f3_dyaw": yield (double) Mth.wrapDegrees(c.yRot()); - case "cam_f3_yaw": yield (double) (int) Mth.wrapDegrees(c.yRot()); - - - - /* World Rendering */ - case "entites", "entities": yield ((LevelRendererAccess) ins.levelRenderer).getLevelRenderState() - .entityRenderStates.size(); - case "particles": yield (double) ((ParticleManagerAccessor)ins.particleEngine) - .getParticles().values().stream().mapToInt(Queue::size).sum(); - case "chunks": yield (double) ins.levelRenderer.countRenderedSections(); - - - - /* Light */ - /* At player */ - case "light": yield (double) ins.level.getMaxLocalRawBrightness(p.blockPosition()); - case "blocklight", "block_light": yield (double) ins.level.getBrightness(LightLayer.BLOCK,p.blockPosition()); - case "skylight", "sky_light": yield (double) ins.level.getBrightness(LightLayer.SKY,p.blockPosition()); - /* At camera */ - case "cam_light": yield (double) ins.level.getMaxLocalRawBrightness(c.blockPosition()); - case "cam_blocklight", "cam_block_light": yield (double) ins.level.getBrightness(LightLayer.BLOCK,c.blockPosition()); - case "cam_skylight", "cam_sky_light": yield (double) ins.level.getBrightness(LightLayer.SKY,c.blockPosition()); - - - - /* World */ - case "worldtime", "world_time": yield (double) ins.level.getDayTime(); - case "daytime", "day_time": yield ins.level.getDayTime()/24000d; - - - - /* GUI rendering */ - case "width": yield (double) ins.getWindow().getGuiScaledWidth(); - case "height": yield (double) ins.getWindow().getGuiScaledHeight(); - case "guiscale": yield (double) ins.getWindow().getGuiScale(); - - - /* Hudder */ - case "scale": yield (double) config.scale; - case "color": yield (double) config.color; - case "yoffset": yield (double) config.yoffset; - case "xoffset": yield (double) config.xoffset; - case "lineheight": yield (double) config.lineHeight; - case "methodbuffer": yield (double) config.methodBuffer; - case "backgroundcolor": yield (double) config.backgroundcolor; - - - - case "rebeccapurple": yield (double) 0xFF663399; - - default: yield DataVariableRegistry.getNumber(key); - }; - } - public static float getTPS(Minecraft client) { - IntegratedServer server = client.getSingleplayerServer(); - return server == null ? -1f : server.tickRateManager().tickrate(); - } - - public static int getCurrentAirSupplyBubble(int i, int j, int k) { - return Mth.ceil((float)((i + k) * 10) / (float)j); + return DataVariableRegistry.getNumber(key); } } diff --git a/src/main/java/io/github/ngspace/hudder/data_management/ObjectDataAPI.java b/src/main/java/io/github/ngspace/hudder/data_management/ObjectDataAPI.java index 663f961..3271f66 100644 --- a/src/main/java/io/github/ngspace/hudder/data_management/ObjectDataAPI.java +++ b/src/main/java/io/github/ngspace/hudder/data_management/ObjectDataAPI.java @@ -9,7 +9,9 @@ */ @Deprecated(since = "9.0.0", forRemoval = true) public class ObjectDataAPI {private ObjectDataAPI() {} + @Deprecated(since = "9.0.0", forRemoval = true) static List> getters = new ArrayList>(); + @Deprecated(since = "9.0.0", forRemoval = true) public static Object getObject(String key) { for (var getter : getters) { Object obj = getter.apply(key); @@ -23,5 +25,6 @@ public static Object getObject(String key) { */ @Deprecated(since = "9.0.0", forRemoval = true) public static void addObjectGetter(Function function) {getters.add(function);} + @Deprecated(since = "9.0.0", forRemoval = true) public static List> getObjectGetters() {return getters;} } diff --git a/src/main/java/io/github/ngspace/hudder/data_management/StringData.java b/src/main/java/io/github/ngspace/hudder/data_management/StringData.java index 4ffdc97..900733e 100644 --- a/src/main/java/io/github/ngspace/hudder/data_management/StringData.java +++ b/src/main/java/io/github/ngspace/hudder/data_management/StringData.java @@ -1,159 +1,14 @@ package io.github.ngspace.hudder.data_management; -import java.util.Calendar; -import java.util.Locale; - -import com.mojang.blaze3d.platform.GLX; - -import io.github.ngspace.hudder.Hudder; import io.github.ngspace.hudder.data_management.api.DataVariableRegistry; -import io.github.ngspace.hudder.v2runtime.V2Runtime; -import net.minecraft.SharedConstants; -import net.minecraft.client.Camera; -import net.minecraft.client.Minecraft; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.world.entity.animal.equine.AbstractHorse; -import net.minecraft.world.level.ClipContext; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.HitResult; -import net.minecraft.world.phys.Vec3; +/** + * @deprecated use DataVariableRegistry. + */ +@Deprecated(since = "9.2.0", forRemoval = true) public class StringData {private StringData() {} - @SuppressWarnings("deprecation") + @Deprecated public static Object getString(String key) { - Minecraft ins = Minecraft.getInstance(); - LocalPlayer p = ins.player; - Camera c = ins.gameRenderer.getMainCamera(); - return switch (key) { - - case "damagetype": yield p.getLastDamageSource() == null ? V2Runtime.NULL : p.getLastDamageSource().type().toString(); - - /* Computer info */ - case "cpu_info": yield GLX._getCpuInfo(); - case "operating_system": yield Advanced.OS; - case "month_name": yield Calendar.getInstance().getDisplayName(Calendar.MONTH,Calendar.LONG,Locale.getDefault()); - case "locale": yield Locale.getDefault().getDisplayName(); - case "language": yield Locale.getDefault().getLanguage(); - case "country": yield Locale.getDefault().getCountry(); - - - /* Game */ - case "version_type": yield ins.getVersionType(); - case "game_version": yield SharedConstants.getCurrentVersion().id(); - - - - /* Player */ - case "username": yield ins.player.getName().getString(); - case "uuid": yield ins.player.getStringUUID(); - - - - /* Inventory */ - case "helditem_name": yield ins.player.getInventory() - .getItem(ins.player.getInventory().getSelectedSlot()).getDisplayName().getString(); - - - - /* GUI */ - case "openguitype": yield Advanced.getScreenType(ins.screen); - case "openguititle": yield ins.screen == null ? V2Runtime.NULL : ins.screen.getTitle().getString(); - - - - /* Mount information */ - case "mount_type": yield p.getVehicle() == null ? V2Runtime.NULL : p.getVehicle().getType().builtInRegistryHolder().key().identifier().toString(); - case "mount_armor_type": yield (p.getVehicle() instanceof AbstractHorse horse) ? horse.getBodyArmorItem().getItem().toString() : V2Runtime.NULL; - case "mount_name": yield p.getVehicle() == null || p.getVehicle().getCustomName() == null ? V2Runtime.NULL : p.getVehicle().getCustomName().getString(); - - - - /* World */ - case "biome": - yield ins.level.getBiome(ins.player.blockPosition()).getRegisteredName(); - case "cam_biome": - yield ins.level.getBiome(c.blockPosition()).getRegisteredName(); - case "dimension": - yield ins.level.dimension().toString(); - case "world_name": - yield ins.getSingleplayerServer() == null ? V2Runtime.NULL : ins.getSingleplayerServer().getWorldData().getLevelName(); - - - - /* Server */ - case "server_name": - yield ins.getCurrentServer() == null ? V2Runtime.NULL : ins.getCurrentServer().name; - case "server_ip": - yield ins.getCurrentServer() == null ? V2Runtime.NULL : ins.getCurrentServer().ip; - case "server_motd": - yield ins.getCurrentServer() == null ? V2Runtime.NULL : ins.getCurrentServer().motd.getString(); - - - - /* Looking at */ - case "looking_at_pos": { - BlockHitResult hit = raycast(ins, p.getEyePosition(1.0f), p.getLookAngle(), 50, false); - yield (hit == null) ? V2Runtime.NULL : hit.getBlockPos().getX() + " " + hit.getBlockPos().getY() + " " + hit.getBlockPos().getZ(); - } - - case "cam_looking_at_pos": { - Vec3 camPos = c.position(); - Vec3 camLook = new Vec3(c.forwardVector().x(), c.forwardVector().y(), c.forwardVector().z()); - BlockHitResult hit = raycast(ins, camPos, camLook, 50, false); - yield (hit == null) ? V2Runtime.NULL : hit.getBlockPos().getX() + " " + hit.getBlockPos().getY() + " " + hit.getBlockPos().getZ(); - } - - case "block_in_front": { - BlockHitResult hit = raycast(ins, p.getEyePosition(1.0f), p.getLookAngle(), 50, false); - yield (hit == null) ? V2Runtime.NULL : BuiltInRegistries.BLOCK.getKey(ins.level.getBlockState(hit.getBlockPos()).getBlock()).toString(); - } - - case "cam_block_in_front": { - Vec3 camPos = c.position(); - Vec3 camLook = new Vec3(c.forwardVector().x(), c.forwardVector().y(), c.forwardVector().z()); - BlockHitResult hit = raycast(ins, camPos, camLook, 50, false); - yield (hit == null) ? V2Runtime.NULL : BuiltInRegistries.BLOCK.getKey(ins.level.getBlockState(hit.getBlockPos()).getBlock()).toString(); - } - - case "fluid_in_front": { - BlockHitResult hit = raycast(ins, p.getEyePosition(1.0f), p.getLookAngle(), 50, true); - yield (hit == null) ? V2Runtime.NULL : BuiltInRegistries.FLUID.getKey(ins.level.getFluidState(hit.getBlockPos()).getType()).toString(); - } - - case "cam_fluid_in_front": { - Vec3 camPos = c.position(); - Vec3 camLook = new Vec3(c.forwardVector().x(), c.forwardVector().y(), c.forwardVector().z()); - BlockHitResult hit = raycast(ins, camPos, camLook, 50, true); - yield (hit == null) ? V2Runtime.NULL : BuiltInRegistries.FLUID.getKey(ins.level.getFluidState(hit.getBlockPos()).getType()).toString(); - } - - case "entity_in_front": - yield (ins.crosshairPickEntity == null) ? V2Runtime.NULL : BuiltInRegistries.ENTITY_TYPE.getKey(ins.crosshairPickEntity.getType()).toString(); - - - - /* Hudder */ - case "compilertype": yield Hudder.config.getCompilerName(); - case "mainfile": yield Hudder.config.mainfile; - - case "unset": yield "unset"; - - default: yield DataVariableRegistry.getString(key); - }; - } - private static BlockHitResult raycast(Minecraft ins, Vec3 start, Vec3 direction, double reach, boolean fluid) { - ClipContext.Fluid fluidMode = fluid ? ClipContext.Fluid.ANY : ClipContext.Fluid.NONE; - Vec3 end = start.add(direction.scale(reach)); - - HitResult hit = ins.level.clip(new ClipContext( - start, - end, - ClipContext.Block.OUTLINE, - fluidMode, - ins.player - )); - - return (hit.getType() == HitResult.Type.BLOCK) ? (BlockHitResult) hit : null; + return DataVariableRegistry.getString(key); } } diff --git a/src/main/java/io/github/ngspace/hudder/data_management/api/DataVariableRegistry.java b/src/main/java/io/github/ngspace/hudder/data_management/api/DataVariableRegistry.java index b7123c0..5538e9d 100644 --- a/src/main/java/io/github/ngspace/hudder/data_management/api/DataVariableRegistry.java +++ b/src/main/java/io/github/ngspace/hudder/data_management/api/DataVariableRegistry.java @@ -3,8 +3,6 @@ import java.util.HashMap; import java.util.Map; -import io.github.ngspace.hudder.data_management.ObjectDataAPI; - /** * Hudder's class for management of system variables *

@@ -13,7 +11,6 @@ */ public class DataVariableRegistry { private DataVariableRegistry() {} - static {registerLegacyVariableSystem();} private static Map> BooleanVariables = new HashMap>(); private static Map> StringVariables = new HashMap>(); @@ -21,16 +18,6 @@ private DataVariableRegistry() {} private static Map> ObjectVariables = new HashMap>(); private static Map> AllVariables = new HashMap>(); - @SuppressWarnings("removal") - static void registerLegacyVariableSystem() { - ObjectDataAPI.addObjectGetter(key-> { - var variable = ObjectVariables.get(key); - if (variable!=null) - return variable.getValue(key); - return null; - }); - } - public static void registerVariable(DataVariable variable, String... names) { registerVariable(variable, VariableTypes.OBJECT, names); } diff --git a/src/main/java/io/github/ngspace/hudder/data_management/api/VariableTypes.java b/src/main/java/io/github/ngspace/hudder/data_management/api/VariableTypes.java index 9b7e9f5..001365f 100644 --- a/src/main/java/io/github/ngspace/hudder/data_management/api/VariableTypes.java +++ b/src/main/java/io/github/ngspace/hudder/data_management/api/VariableTypes.java @@ -4,12 +4,18 @@ public class VariableTypes { private VariableTypes() {} - public static final Type BOOLEAN = new Type(); - public static final Type STRING = new Type(); - public static final Type NUMBER = new Type(); - public static final Type OBJECT = new Type(); + public static final Type BOOLEAN = new Type(Boolean.class); + public static final Type STRING = new Type(String.class); + public static final Type NUMBER = new Type(Double.class); + public static final Type OBJECT = new Type(Object.class); public static class Type { - private Type() {} + private Class clazz; + private Type(Class clazz) { + this.clazz = clazz; + } + public Class getTypeClass() { + return clazz; + } } } diff --git a/src/main/java/io/github/ngspace/hudder/data_management/builtin/ClientData.java b/src/main/java/io/github/ngspace/hudder/data_management/builtin/ClientData.java new file mode 100644 index 0000000..9eabcac --- /dev/null +++ b/src/main/java/io/github/ngspace/hudder/data_management/builtin/ClientData.java @@ -0,0 +1,72 @@ +package io.github.ngspace.hudder.data_management.builtin; + +import static io.github.ngspace.hudder.data_management.api.VariableTypes.BOOLEAN; +import static io.github.ngspace.hudder.data_management.api.VariableTypes.NUMBER; +import static io.github.ngspace.hudder.data_management.api.VariableTypes.STRING; + +import io.github.ngspace.hudder.data_management.Advanced; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.ChatScreen; +import net.minecraft.client.gui.screens.dialog.DialogScreen; +import net.minecraft.client.gui.screens.inventory.ContainerScreen; +import net.minecraft.client.gui.screens.inventory.CraftingScreen; +import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; +import net.minecraft.client.gui.screens.inventory.InventoryScreen; + +public class ClientData extends HudderBuiltInVariables { + static Minecraft ins; + + public static void registerVariables() { + ins = Minecraft.getInstance(); + registerInputVariables(); + registerScreenVariables(); + registerScreenTypeVariables(); + } + + private static void registerInputVariables() { + // Mouse buttons + register(k -> ins.mouseHandler.isLeftPressed(), BOOLEAN, "mouse_left"); + register(k -> ins.mouseHandler.isMiddlePressed(), BOOLEAN, "mouse_middle"); + register(k -> ins.mouseHandler.isRightPressed(), BOOLEAN, "mouse_right"); + + // Clicks per second + register(k -> Advanced.getLeftCPS() + Advanced.getRightCPS(), NUMBER, "cps"); + register(k -> Advanced.getLeftCPS(), NUMBER, "cps_left"); + register(k -> Advanced.getRightCPS(), NUMBER, "cps_right"); + } + + private static void registerScreenVariables() { + // Window / GUI + register(k -> ins.getWindow().getGuiScaledWidth(), NUMBER, "width"); + register(k -> ins.getWindow().getGuiScaledHeight(), NUMBER, "height"); + register(k -> ins.getWindow().getGuiScale(), NUMBER, "guiscale"); + + // Open GUI + register(k -> Advanced.getScreenType(ins.screen), STRING, "openguitype"); + + register(k -> (ins.screen == null) + ? null + : ins.screen.getTitle().getString(), + STRING, "openguititle"); + + // HUD / debug + register(k -> ins.options.hideGui, BOOLEAN, "hudhidden"); + register(k -> ins.getDebugOverlay().showDebugScreen(), BOOLEAN, "showdebug"); + register(k -> ins.debugEntries.isOverlayVisible(), BOOLEAN, "f3enabled"); + + // Camera state + register(k -> ins.gameRenderer.getMainCamera().entity() != ins.player, + BOOLEAN, "camera_detached"); + } + + private static void registerScreenTypeVariables() { + register(k -> ins.screen != null, BOOLEAN, "isguiopen"); + register(k -> ins.screen instanceof ContainerScreen, BOOLEAN, "ischestopen"); + register(k -> ins.screen instanceof CraftingScreen, BOOLEAN, "iscraftingtableopen"); + register(k -> ins.screen instanceof ChatScreen, BOOLEAN, "ischatopen"); + register(k -> ins.screen instanceof DialogScreen, BOOLEAN, "isdialogopen"); + register(k -> ins.screen instanceof InventoryScreen + || ins.screen instanceof CreativeModeInventoryScreen, + BOOLEAN, "isinventoryopen"); + } +} diff --git a/src/main/java/io/github/ngspace/hudder/data_management/builtin/ComputerData.java b/src/main/java/io/github/ngspace/hudder/data_management/builtin/ComputerData.java new file mode 100644 index 0000000..80911e6 --- /dev/null +++ b/src/main/java/io/github/ngspace/hudder/data_management/builtin/ComputerData.java @@ -0,0 +1,89 @@ +package io.github.ngspace.hudder.data_management.builtin; + +import static io.github.ngspace.hudder.data_management.api.VariableTypes.*; + +import java.util.Calendar; +import java.util.Locale; + +import com.mojang.blaze3d.platform.GLX; + +import io.github.ngspace.hudder.data_management.Advanced; +import net.minecraft.client.Minecraft; +import net.minecraft.client.server.IntegratedServer; + +public class ComputerData extends HudderBuiltInVariables { + static Minecraft ins; + static final double MB = 1024d*1024d; + static final Runtime runtime = Runtime.getRuntime(); + + public static void registerVariables() { + ins = Minecraft.getInstance(); + registerPerformanceVariables(); + registerMemoryVariables(); + registerTimeVariables(); + registerStringComputerInfo(); + } + + public static void registerPerformanceVariables() { + register(k->Advanced.fps, NUMBER, "fps"); + register(k->Advanced.getAverageFPS(), NUMBER, "avgfps", "avg_fps"); + register(k->Advanced.getMinimumFPS(), NUMBER, "minfps", "min_fps"); + register(k->Advanced.getMaximumFPS(), NUMBER, "maxfps", "max_fps"); + + register(k->{ + var playerInfo = ins.player.connection.getPlayerInfo(ins.player.getUUID()); + return playerInfo==null?0:playerInfo.getLatency(); + }, NUMBER, "ping"); + + register(k->{ + IntegratedServer server = ins.getSingleplayerServer(); + return server == null ? -1f : server.tickRateManager().tickrate(); + }, NUMBER, "tps"); + + register(k->Math.min(ins.getGpuUtilization(), 100.0), NUMBER, "gpu_d", "dgpu"); + register(k->(int) (Math.min(ins.getGpuUtilization(), 100.0)), NUMBER, "gpu"); + register(k->Advanced.CPU.get()* 100d, NUMBER, "cpu_d", "dcpu"); + register(k->(int) (Advanced.CPU.get()* 100d), NUMBER, "cpu"); + + register(k->Advanced.delta, NUMBER, "delta"); + } + + public static void registerMemoryVariables() { + register(k->runtime.maxMemory() / MB, NUMBER, "totalmemory","maxmemory","totalram","maxram"); + register(k->(runtime.totalMemory() - runtime.freeMemory()) / MB, NUMBER, "usedmemory","usedram"); + register(k->runtime.freeMemory() / MB, NUMBER, "freememory","freeram"); + register(k->runtime.freeMemory() / runtime.maxMemory(), NUMBER, "freememory_percentage","freeram_percentage"); + register(k->{ + double usedmem = ((double)runtime.totalMemory() - (double)runtime.freeMemory()) / MB; + double totalmem = (runtime.maxMemory())/MB; + return (int)(usedmem/totalmem*100); + }, NUMBER, "usedmemory_percentage","usedram_percentage"); + } + + public static void registerTimeVariables() { + register(k->System.currentTimeMillis(), NUMBER, "time"); + register(k->Calendar.getInstance().get(Calendar.MILLISECOND), NUMBER, "milliseconds"); + register(k->Calendar.getInstance().get(Calendar.SECOND), NUMBER, "seconds"); + register(k->Calendar.getInstance().get(Calendar.MINUTE), NUMBER, "minutes"); + register(k->Calendar.getInstance().get(Calendar.HOUR_OF_DAY), NUMBER, "hour"); + register(k->Calendar.getInstance().get(Calendar.DAY_OF_MONTH), NUMBER, "day"); + register(k->Calendar.getInstance().get(Calendar.MONTH)+1, NUMBER, "month"); + register(k->Calendar.getInstance().get(Calendar.YEAR), NUMBER, "year"); + + register(k->Calendar.getInstance().getDisplayName(Calendar.MONTH,Calendar.LONG,Locale.getDefault()), STRING, "month_name"); + register(k->clockify(Calendar.getInstance().get(Calendar.HOUR_OF_DAY) % 12),STRING,"hour12"); + register(k->Calendar.getInstance().get(Calendar.HOUR_OF_DAY) / 12 == 1 ? "pm" : "am", STRING, "ampm"); + } + + public static void registerStringComputerInfo() { + register(k->GLX._getCpuInfo(), STRING, "cpu_info"); + register(k->Advanced.OS, STRING, "operating_system"); + register(k->Locale.getDefault().getDisplayName(), STRING, "locale"); + register(k->Locale.getDefault().getLanguage(), STRING, "language"); + register(k->Locale.getDefault().getCountry(), STRING, "country"); + } + + private static String clockify(int time) { + return String.valueOf(time < 10 ? "0" + time : time); + } +} diff --git a/src/main/java/io/github/ngspace/hudder/data_management/builtin/HudderBuiltInVariables.java b/src/main/java/io/github/ngspace/hudder/data_management/builtin/HudderBuiltInVariables.java new file mode 100644 index 0000000..526ad16 --- /dev/null +++ b/src/main/java/io/github/ngspace/hudder/data_management/builtin/HudderBuiltInVariables.java @@ -0,0 +1,66 @@ +package io.github.ngspace.hudder.data_management.builtin; + +import static io.github.ngspace.hudder.data_management.api.VariableTypes.BOOLEAN; +import static io.github.ngspace.hudder.data_management.api.VariableTypes.NUMBER; +import static io.github.ngspace.hudder.data_management.api.VariableTypes.STRING; + +import io.github.ngspace.hudder.Hudder; +import io.github.ngspace.hudder.data_management.api.DataVariable; +import io.github.ngspace.hudder.data_management.api.DataVariableRegistry; +import io.github.ngspace.hudder.data_management.api.VariableTypes; +import net.minecraft.SharedConstants; +import net.minecraft.client.Minecraft; + +public class HudderBuiltInVariables { + protected HudderBuiltInVariables() {} + + public static void registerVariables() { + ComputerData.registerVariables(); + PlayerData.registerVariables(); + ClientData.registerVariables(); + WorldData.registerVariables(); + registerHudderVariables(); + } + + public static void register(DataVariable variable, VariableTypes.Type type, String... names) { + DataVariableRegistry.registerVariable(variable, type, names); + } + + private static void registerHudderVariables() { + /* Hudder */ + + // Booleans + register(k -> true, BOOLEAN, "enabled"); // duh + register(k -> Hudder.config.shadow, BOOLEAN, "shadow"); + register(k -> Hudder.config.showInF3, BOOLEAN, "showinf3"); + register(k -> true, BOOLEAN, "javascriptenabled"); // compatibility + register(k -> Hudder.config.unsafeoperations, BOOLEAN, "unsafeoperations"); + register(k -> Hudder.config.globalVariablesEnabled, BOOLEAN, "globalvariablesenabled"); + register(k -> Hudder.config.background, BOOLEAN, "background"); + register(k -> Hudder.config.removegui, BOOLEAN, "removegui"); + register(k -> Hudder.config.limitrate, BOOLEAN, "limitrate"); + + // Strings + register(k -> Hudder.config.getCompilerName(), STRING, "compilertype"); + register(k -> Hudder.config.mainfile, STRING, "mainfile"); + register(k -> Hudder.HUDDER_VERSION, STRING, "hudder_version"); + + // Numbers + register(k -> Hudder.config.scale, NUMBER, "scale"); + register(k -> Hudder.config.color, NUMBER, "color"); + register(k -> Hudder.config.yoffset, NUMBER, "yoffset"); + register(k -> Hudder.config.xoffset, NUMBER, "xoffset"); + register(k -> Hudder.config.lineHeight, NUMBER, "lineheight"); + register(k -> Hudder.config.methodBuffer, NUMBER, "methodbuffer"); + register(k -> Hudder.config.backgroundcolor, NUMBER, "backgroundcolor"); + + /* Constants */ + register(k -> "unset", STRING, "unset"); + + register(k -> Minecraft.getInstance().getVersionType(), STRING, "version_type"); + register(k -> SharedConstants.getCurrentVersion().id(), STRING, "game_version"); + + register(k -> 0xFF663399, NUMBER, "rebeccapurple"); + + } +} diff --git a/src/main/java/io/github/ngspace/hudder/data_management/builtin/PlayerData.java b/src/main/java/io/github/ngspace/hudder/data_management/builtin/PlayerData.java new file mode 100644 index 0000000..e20371b --- /dev/null +++ b/src/main/java/io/github/ngspace/hudder/data_management/builtin/PlayerData.java @@ -0,0 +1,370 @@ +package io.github.ngspace.hudder.data_management.builtin; + +import static io.github.ngspace.hudder.data_management.api.VariableTypes.BOOLEAN; +import static io.github.ngspace.hudder.data_management.api.VariableTypes.NUMBER; +import static io.github.ngspace.hudder.data_management.api.VariableTypes.STRING; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.animal.equine.AbstractChestedHorse; +import net.minecraft.world.entity.animal.equine.AbstractHorse; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.GameType; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; + +public class PlayerData extends HudderBuiltInVariables { + static Minecraft ins; + + public static void registerVariables() { + ins = Minecraft.getInstance(); + registerPlayerStatusVariables(); + registerPlayerMovement(); + registerPlayerStateVariables(); + registerMountVariables(); + registerLookingAtVariables(); + registerPositionVariables(); + registerRotationVariables(); + registerOtherPlayerVariables(); + } + + private static void registerPlayerStatusVariables() { + // Food / hunger + register(k -> ins.player.getFoodData().getSaturationLevel(), NUMBER, "saturation"); + register(k -> ins.player.getFoodData().getFoodLevel(), NUMBER, "hunger"); + + // Health + register(k -> ins.player.getHealth(), NUMBER, "health", "hp"); + register(k -> ins.player.getMaxHealth(), NUMBER, "maxhealth", "maxhp"); + + // Absorption + register(k -> ins.player.getAbsorptionAmount(), NUMBER, "absorption"); + register(k -> ins.player.getMaxAbsorption(), NUMBER, "maxabsorption"); + + // XP + register(k -> ins.player.experienceLevel, NUMBER, "xplevel"); + register(k -> ins.player.totalExperience, NUMBER, "xp"); + + // Armor / movement + register(k -> ins.player.getArmorValue(), NUMBER, "armor"); + register(k -> ins.player.fallDistance, NUMBER, "falldistance"); + + // Air bubbles + register(k -> getCurrentAirSupplyBubble(Math.clamp(ins.player.getAirSupply(), 0, ins.player.getMaxAirSupply()),ins.player.getMaxAirSupply(),0), NUMBER, "airbubbles"); + + register(k -> getCurrentAirSupplyBubble(ins.player.getMaxAirSupply(),ins.player.getMaxAirSupply(),0), NUMBER, "maxairbubbles"); + } + + private static void registerPlayerMovement() { + // Movement / state flags + register(k -> ins.player.getAbilities().flying, BOOLEAN, "isflying"); + register(k -> ins.player.isFallFlying(), BOOLEAN, "isgliding"); + register(k -> ins.player.onClimbable(), BOOLEAN, "isclimbing"); + register(k -> ins.player.isVisuallyCrawling(), BOOLEAN, "iscrawling"); + register(k -> ins.player.isSwimming(), BOOLEAN, "isswimming"); + register(k -> ins.player.isShiftKeyDown(), BOOLEAN, "issneaking"); + register(k -> ins.player.isSprinting(), BOOLEAN, "issprinting"); + + // Speed + register(k -> { + var p = ins.player; + var ent = (p.getVehicle() == null) ? p : p.getVehicle(); + + return Math.sqrt( + Math.pow(ent.getX() - ent.xOld, 2) + + Math.pow(ent.getY() - ent.yOld, 2) + + Math.pow(ent.getZ() - ent.zOld, 2) + ) * 20; + }, NUMBER, "playerspeed"); + + register(k -> { + var p = ins.player; + var ent = (p.getVehicle() == null) ? p : p.getVehicle(); + + return Math.sqrt( + Math.pow(ent.getX() - ent.xOld, 2) + + Math.pow(ent.getZ() - ent.zOld, 2) + ) * 20; + }, NUMBER, "horizontal_playerspeed"); + } + + private static void registerPlayerStateVariables() { + // Player state flags + register(k -> ins.player.isAlive(), BOOLEAN, "isalive"); + register(k -> ins.player.isBlocking(), BOOLEAN, "isblocking"); + register(k -> ins.player.isFreezing(), BOOLEAN, "isfreezing"); + register(k -> ins.player.isCurrentlyGlowing(), BOOLEAN, "isglowing"); + register(k -> ins.player.fireImmune(), BOOLEAN, "isfireimmune"); + register(k -> ins.player.isOnFire(), BOOLEAN, "isonfire"); + register(k -> ins.player.onGround(), BOOLEAN, "isonground"); + register(k -> ins.player.isInvisible(), BOOLEAN, "isinvisible"); + register(k -> ins.player.isInWater(), BOOLEAN, "isdrowning"); + register(k -> ins.player.getControlledVehicle() != null, BOOLEAN, "iscontrollingmount"); + register(k -> ins.player.getVehicle() != null, BOOLEAN, "isonmount"); + + // Game mode flags (with aliases) + register(k -> ins.gameMode.getPlayerMode() == GameType.SURVIVAL, + BOOLEAN, "issurvival", "is_survival"); + + register(k -> ins.gameMode.getPlayerMode() == GameType.CREATIVE, + BOOLEAN, "iscreative", "is_creative"); + + register(k -> ins.gameMode.getPlayerMode() == GameType.ADVENTURE, + BOOLEAN, "isadventure", "is_adventure"); + + register(k -> ins.gameMode.getPlayerMode() == GameType.SPECTATOR, + BOOLEAN, "isspectator", "is_spectator"); + } + + @SuppressWarnings("deprecation") + private static void registerMountVariables() { + // --- Mount numeric stats (nullable) --- + + register(k -> (ins.player.getVehicle() instanceof LivingEntity entity) + ? entity.getHealth() + : null, + NUMBER, "mount_health", "mount_hp"); + + register(k -> (ins.player.getVehicle() instanceof LivingEntity entity) + ? entity.getMaxHealth() + : null, + NUMBER, "mount_maxhealth", "mount_maxhp"); + + register(k -> (ins.player.getVehicle() instanceof LivingEntity entity) + ? entity.getAttribute(Attributes.MOVEMENT_SPEED).getBaseValue() + : null, + NUMBER, "mount_speed"); + + register(k -> (ins.player.getVehicle() instanceof LivingEntity entity) + ? entity.getAttribute(Attributes.JUMP_STRENGTH).getBaseValue() + : null, + NUMBER, "mount_jump_strength"); + + register(k -> (ins.player.getVehicle() instanceof AbstractHorse) + ? ins.player.getJumpRidingScale() + : null, + NUMBER, "mount_jump_scale"); + + register(k -> (ins.player.getVehicle() instanceof AbstractHorse horse) + ? horse.getArmorValue() + : null, + NUMBER, "mount_armor"); + + register(k -> (ins.player.getVehicle() instanceof AbstractHorse horse) + ? horse.getJumpCooldown() + : null, + NUMBER, "mount_jump_cooldown"); + + + // --- Mount string info (nullable) --- + + register(k -> { + var v = ins.player.getVehicle(); + return (v == null) + ? null + : v.getType().builtInRegistryHolder().key().identifier().toString(); + }, STRING, "mount_type"); + + register(k -> (ins.player.getVehicle() instanceof AbstractHorse horse) + ? horse.getBodyArmorItem().getItem().toString() + : null, + STRING, "mount_armor_type"); + + register(k -> { + var v = ins.player.getVehicle(); + return (v == null || v.getCustomName() == null) + ? null + : v.getCustomName().getString(); + }, STRING, "mount_name"); + + + // --- Mount booleans --- + + register(k -> ins.player.getVehicle() instanceof Mob mob && mob.isSaddled(), + BOOLEAN, "mount_is_saddled"); + + register(k -> ins.player.getVehicle() instanceof Mob mob && mob.isWearingBodyArmor(), + BOOLEAN, "mount_has_armor"); + + register(k -> ins.player.getVehicle() instanceof AbstractHorse horse && horse.isTamed(), + BOOLEAN, "mount_is_tamed"); + + register(k -> ins.player.getVehicle() instanceof AbstractChestedHorse horse && horse.hasChest(), + BOOLEAN, "mount_has_chest"); + } + + private static void registerLookingAtVariables() { + /* Looking at */ + + register(k -> hitPos(raycastPlayer(false)), STRING, "looking_at_pos"); + register(k -> hitPos(raycastCamera(false)), STRING, "cam_looking_at_pos"); + + register(k -> { + var hit = raycastPlayer(false); + return hit == null ? null + : BuiltInRegistries.BLOCK.getKey( + ins.level.getBlockState(hit.getBlockPos()).getBlock() + ).toString(); + }, STRING, "block_in_front"); + + register(k -> { + var hit = raycastCamera(false); + return hit == null ? null + : BuiltInRegistries.BLOCK.getKey( + ins.level.getBlockState(hit.getBlockPos()).getBlock() + ).toString(); + }, STRING, "cam_block_in_front"); + + register(k -> { + var hit = raycastPlayer(true); + return hit == null ? null + : BuiltInRegistries.FLUID.getKey( + ins.level.getFluidState(hit.getBlockPos()).getType() + ).toString(); + }, STRING, "fluid_in_front"); + + register(k -> { + var hit = raycastCamera(true); + return hit == null ? null + : BuiltInRegistries.FLUID.getKey( + ins.level.getFluidState(hit.getBlockPos()).getType() + ).toString(); + }, STRING, "cam_fluid_in_front"); + + register(k -> ins.crosshairPickEntity == null + ? null + : BuiltInRegistries.ENTITY_TYPE + .getKey(ins.crosshairPickEntity.getType()) + .toString(), + STRING, "entity_in_front"); + } + + private static void registerPositionVariables() { + /* Player position */ + + register(k -> ins.player.getX(), NUMBER, "dxpos", "dx"); + register(k -> ins.player.getY(), NUMBER, "dypos", "dy"); + register(k -> ins.player.getZ(), NUMBER, "dzpos", "dz"); + + register(k -> ins.player.getBlockX(), NUMBER, "xpos", "x"); + register(k -> ins.player.getBlockY(), NUMBER, "ypos", "y"); + register(k -> ins.player.getBlockZ(), NUMBER, "zpos", "z"); + + + /* Camera position */ + + register(k -> ins.gameRenderer.getMainCamera().position().x, NUMBER, "cam_dxpos"); + register(k -> ins.gameRenderer.getMainCamera().position().y, NUMBER, "cam_dypos"); + register(k -> ins.gameRenderer.getMainCamera().position().z, NUMBER, "cam_dzpos"); + + register(k -> ins.gameRenderer.getMainCamera().blockPosition().getX(), NUMBER, "cam_xpos"); + register(k -> ins.gameRenderer.getMainCamera().blockPosition().getY(), NUMBER, "cam_ypos"); + register(k -> ins.gameRenderer.getMainCamera().blockPosition().getZ(), NUMBER, "cam_zpos"); + } + + private static void registerRotationVariables() { + /* Player rotation */ + + // Pitch + register(k -> ins.player.getXRot(), NUMBER, "dpitch"); + register(k -> (int) ins.player.getXRot(), NUMBER, "pitch"); + + // Yaw (0–360) + register(k -> { + float yaw = ins.player.getYHeadRot(); + return (yaw < 0) ? 360d + (yaw % 360d) : yaw % 360d; + }, NUMBER, "dyaw"); + + register(k -> { + int yaw = (int) ins.player.getYHeadRot(); + return (yaw < 0) ? 360 + (yaw % 360) : yaw % 360d; + }, NUMBER, "yaw"); + + // F3-style yaw + register(k -> Mth.wrapDegrees(ins.player.getYHeadRot()), NUMBER, "f3_dyaw"); + register(k -> (int) Mth.wrapDegrees(ins.player.getYHeadRot()), NUMBER, "f3_yaw"); + + + + /* Camera rotation */ + + // Pitch + register(k -> ins.gameRenderer.getMainCamera().xRot(), NUMBER, "cam_dpitch"); + register(k -> (int) ins.gameRenderer.getMainCamera().xRot(), NUMBER, "cam_pitch"); + + // Yaw (0–360) + register(k -> { + float yaw = ins.gameRenderer.getMainCamera().yRot(); + return (yaw < 0) ? 360d + (yaw % 360d) : yaw % 360d; + }, NUMBER, "cam_dyaw"); + + register(k -> { + int yaw = (int) ins.gameRenderer.getMainCamera().yRot(); + return (yaw < 0) ? 360 + (yaw % 360) : yaw % 360d; + }, NUMBER, "cam_yaw"); + + // F3-style yaw + register(k -> Mth.wrapDegrees(ins.gameRenderer.getMainCamera().yRot()), NUMBER, "cam_f3_dyaw"); + register(k -> (int) Mth.wrapDegrees(ins.gameRenderer.getMainCamera().yRot()), NUMBER, "cam_f3_yaw"); + } + + private static void registerOtherPlayerVariables() { + register(k -> ins.player.getName().getString(), STRING, "username"); + register(k -> ins.player.getStringUUID(), STRING, "uuid"); + + register(k -> { + var src = ins.player.getLastDamageSource(); + return (src == null) ? null : src.type().toString(); + }, STRING, "damagetype"); + + register(k -> ins.player.getInventory().getSelectedSlot(), NUMBER, "selectedslot"); + + register(k -> ins.player.getInventory() + .getItem(ins.player.getInventory().getSelectedSlot()) + .getDisplayName() + .getString(), + STRING, "helditem_name"); + } + + private static BlockHitResult raycast(Minecraft ins, Vec3 start, Vec3 direction, double reach, boolean fluid) { + ClipContext.Fluid fluidMode = fluid ? ClipContext.Fluid.ANY : ClipContext.Fluid.NONE; + Vec3 end = start.add(direction.scale(reach)); + + HitResult hit = ins.level.clip(new ClipContext( + start, + end, + ClipContext.Block.OUTLINE, + fluidMode, + ins.player + )); + + return (hit.getType() == HitResult.Type.BLOCK) ? (BlockHitResult) hit : null; + } + + private static BlockHitResult raycastPlayer(boolean fluids) { + var p = ins.player; + return raycast(ins, p.getEyePosition(1.0f), p.getLookAngle(), 50, fluids); + } + + private static BlockHitResult raycastCamera(boolean fluids) { + var cam = ins.gameRenderer.getMainCamera(); + Vec3 pos = cam.position(); + Vec3 look = new Vec3(cam.forwardVector().x(), cam.forwardVector().y(), cam.forwardVector().z()); + return raycast(ins, pos, look, 50, fluids); + } + + private static String hitPos(BlockHitResult hit) { + if (hit == null) return null; + var p = hit.getBlockPos(); + return p.getX() + " " + p.getY() + " " + p.getZ(); + } + + private static int getCurrentAirSupplyBubble(int i, int j, int k) { + return Mth.ceil((float)((i + k) * 10) / (float)j); + } +} diff --git a/src/main/java/io/github/ngspace/hudder/data_management/builtin/WorldData.java b/src/main/java/io/github/ngspace/hudder/data_management/builtin/WorldData.java new file mode 100644 index 0000000..692798b --- /dev/null +++ b/src/main/java/io/github/ngspace/hudder/data_management/builtin/WorldData.java @@ -0,0 +1,141 @@ +package io.github.ngspace.hudder.data_management.builtin; + +import static io.github.ngspace.hudder.data_management.api.VariableTypes.BOOLEAN; +import static io.github.ngspace.hudder.data_management.api.VariableTypes.NUMBER; +import static io.github.ngspace.hudder.data_management.api.VariableTypes.STRING; + +import java.util.Queue; + +import io.github.ngspace.hudder.mixin.LevelRendererAccess; +import io.github.ngspace.hudder.mixin.ParticleManagerAccessor; +import net.minecraft.client.Minecraft; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.levelgen.WorldgenRandom; + +public class WorldData extends HudderBuiltInVariables { + static Minecraft ins; + + public static void registerVariables() { + ins = Minecraft.getInstance(); + registerServerVariables(); + registerChunkVariables(); + registerRenderingVariables(); + registerOtherVariables(); + } + + private static void registerServerVariables() { + register(k -> { + var server = ins.getCurrentServer(); + return (server == null) ? null : server.name; + }, STRING, "server_name"); + + register(k -> { + var server = ins.getCurrentServer(); + return (server == null) ? null : server.ip; + }, STRING, "server_ip"); + + register(k -> { + var server = ins.getCurrentServer(); + return (server == null) ? null : server.motd.getString(); + }, STRING, "server_motd"); + } + + private static void registerChunkVariables() { + /* Player chunk information */ + + register(k -> ins.player.getBlockX() & 0xF, NUMBER, "subchunkx"); + register(k -> ins.player.getBlockY() & 0xF, NUMBER, "subchunky"); + register(k -> ins.player.getBlockZ() & 0xF, NUMBER, "subchunkz"); + + register(k -> ins.player.chunkPosition().x, NUMBER, "chunkx"); + register(k -> ins.player.chunkPosition().z, NUMBER, "chunkz"); + + /* Camera chunk information */ + + register(k -> ins.gameRenderer.getMainCamera().blockPosition().getX() & 0xF, NUMBER, "cam_subchunkx"); + register(k -> ins.gameRenderer.getMainCamera().blockPosition().getY() & 0xF, NUMBER, "cam_subchunky"); + register(k -> ins.gameRenderer.getMainCamera().blockPosition().getZ() & 0xF, NUMBER, "cam_subchunkz") + ; + register(k -> ins.gameRenderer.getMainCamera().blockPosition().getX() >> 4, NUMBER, "cam_chunkx"); + register(k -> ins.gameRenderer.getMainCamera().blockPosition().getZ() >> 4, NUMBER, "cam_chunkz"); + } + + private static void registerRenderingVariables() { + /* World Rendering */ + + register(k -> ((LevelRendererAccess) ins.levelRenderer) + .getLevelRenderState() + .entityRenderStates + .size(), + NUMBER, "entites", "entities"); + + register(k -> ((ParticleManagerAccessor) ins.particleEngine) + .getParticles() + .values() + .stream() + .mapToInt(Queue::size) + .sum(), + NUMBER, "particles"); + + register(k -> ins.levelRenderer.countRenderedSections(), NUMBER, "chunks"); + + + + /* Light */ + /* At player */ + register(k -> ins.level.getMaxLocalRawBrightness(ins.player.blockPosition()), NUMBER, "light"); + register(k -> ins.level.getBrightness(LightLayer.BLOCK, ins.player.blockPosition()), + NUMBER, "blocklight", "block_light"); + register(k -> ins.level.getBrightness(LightLayer.SKY, ins.player.blockPosition()), + NUMBER, "skylight", "sky_light"); + + /* At camera */ + register(k -> ins.level.getMaxLocalRawBrightness(ins.gameRenderer.getMainCamera().blockPosition()), + NUMBER, "cam_light"); + register(k -> ins.level.getBrightness(LightLayer.BLOCK, ins.gameRenderer.getMainCamera().blockPosition()), + NUMBER, "cam_blocklight", "cam_block_light"); + register(k -> ins.level.getBrightness(LightLayer.SKY, ins.gameRenderer.getMainCamera().blockPosition()), + NUMBER, "cam_skylight", "cam_sky_light"); + } + + private static void registerOtherVariables() { + // Biome / dimension + register(k -> ins.level.getBiome(ins.player.blockPosition()).getRegisteredName(), + STRING, "biome"); + + register(k -> ins.level.getBiome(ins.gameRenderer.getMainCamera().blockPosition()).getRegisteredName(), + STRING, "cam_biome"); + + register(k -> ins.level.dimension().toString(), + STRING, "dimension"); + + // World name (singleplayer only) + register(k -> { + var server = ins.getSingleplayerServer(); + return (server == null) ? null : server.getWorldData().getLevelName(); + }, STRING, "world_name"); + + // Time + register(k -> ins.level.getDayTime(), NUMBER, "worldtime", "world_time"); + register(k -> ins.level.getDayTime() / 24000d, NUMBER, "daytime", "day_time"); + + // Slime chunk (guards preserved) + register(k -> { + try { + var server = ins.getSingleplayerServer(); + if (server == null) return false; + + var seed = server.getLevel(ins.level.dimension()).getSeed(); + int cx = ins.player.getBlockX() >> 4; + int cz = ins.player.getBlockZ() >> 4; + + return WorldgenRandom + .seedSlimeChunk(cx, cz, seed, 987234911L) + .nextInt(10) == 0; + } catch (Exception e) { + // preserve old behavior + return false; + } + }, BOOLEAN, "isslime", "is_slime"); + } +} diff --git a/src/main/java/io/github/ngspace/hudder/main/config/HudderConfig.java b/src/main/java/io/github/ngspace/hudder/main/config/HudderConfig.java index fe69940..3a77e21 100644 --- a/src/main/java/io/github/ngspace/hudder/main/config/HudderConfig.java +++ b/src/main/java/io/github/ngspace/hudder/main/config/HudderConfig.java @@ -30,6 +30,7 @@ public class HudderConfig { /* EXPOSED :flushed: */ @Expose public Map globalVariables = new HashMap(); + @Expose public Map savedVariables = new HashMap(); @Expose public String mainfile = "tutorial";//Set "tutorial" as the default file selected @Expose public boolean enabled = true; @Expose public boolean shadow = true; @@ -285,4 +286,18 @@ public static boolean isAccessible(Class clazz) { public static boolean isPublic(Member member) { return member.accessFlags().contains(AccessFlag.PUBLIC)&&!member.accessFlags().contains(AccessFlag.PRIVATE); } + + + public void putSavedVariable(String key, Object value) throws IOException { + if (!(value instanceof Number + || value instanceof String + || value instanceof Boolean + || value instanceof Character + || unsafeoperations + || value==null)) + throw new IllegalArgumentException("Can only save variables of types: Number, String, Boolean or" + + " Character with unsafe operations disabled."); + savedVariables.put(key, value); + save(); + } } \ No newline at end of file diff --git a/src/main/java/io/github/ngspace/hudder/mixin/ItemCooldownsAccessor.java b/src/main/java/io/github/ngspace/hudder/mixin/ItemCooldownsAccessor.java new file mode 100644 index 0000000..b34e8e4 --- /dev/null +++ b/src/main/java/io/github/ngspace/hudder/mixin/ItemCooldownsAccessor.java @@ -0,0 +1,16 @@ +package io.github.ngspace.hudder.mixin; + +import java.util.Map; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.resources.Identifier; +import net.minecraft.world.item.ItemCooldowns; + +@Mixin(ItemCooldowns.class) +public interface ItemCooldownsAccessor { + @Accessor Map getCooldowns(); + @Accessor int getTickCount(); + +} diff --git a/src/main/java/io/github/ngspace/hudder/v2runtime/V2Runtime.java b/src/main/java/io/github/ngspace/hudder/v2runtime/V2Runtime.java index 56483b4..157923c 100644 --- a/src/main/java/io/github/ngspace/hudder/v2runtime/V2Runtime.java +++ b/src/main/java/io/github/ngspace/hudder/v2runtime/V2Runtime.java @@ -60,4 +60,12 @@ public Object getVariable(String name) { if (object==null) return compiler.getDynamicVariable(name); return object; } + + public V2Runtime getScope() { + return scope; + } + + public V2Runtime getMasterScope() { + return scope == null ? this : scope.getMasterScope(); + } } \ No newline at end of file diff --git a/src/main/java/io/github/ngspace/hudder/v2runtime/methods/IMethod.java b/src/main/java/io/github/ngspace/hudder/v2runtime/methods/IMethod.java index 58b0745..13c85b5 100644 --- a/src/main/java/io/github/ngspace/hudder/v2runtime/methods/IMethod.java +++ b/src/main/java/io/github/ngspace/hudder/v2runtime/methods/IMethod.java @@ -1,17 +1,28 @@ package io.github.ngspace.hudder.v2runtime.methods; import io.github.ngspace.hudder.compilers.abstractions.ATextCompiler; +import io.github.ngspace.hudder.compilers.abstractions.AV2Compiler; +import io.github.ngspace.hudder.compilers.abstractions.ATextCompiler.CharPosition; import io.github.ngspace.hudder.compilers.utils.CompileException; import io.github.ngspace.hudder.compilers.utils.CompileState; import io.github.ngspace.hudder.main.config.HudderConfig; import io.github.ngspace.hudder.utils.ObjectWrapper; +import io.github.ngspace.hudder.v2runtime.V2Runtime; +/** + * @deprecated use {@link V2IMethod} + */ @FunctionalInterface -public interface IMethod { +@Deprecated(since = "9.2.0", forRemoval = false) +public interface IMethod extends V2IMethod { + @Deprecated + @Override public default boolean isDeprecated(String name) { return false; } + @Deprecated + @Override public default String getDeprecationWarning(String name) { return name + " is Deprecated"; } @@ -24,6 +35,14 @@ public default String getDeprecationWarning(String name) { * @param args - the parameters supplied to this method * @throws CompileException - if the method is not called properly or is unable to execute. */ + @Deprecated public void invoke(HudderConfig ci, CompileState meta, ATextCompiler comp, String type, int line, int charpos, ObjectWrapper... args) throws CompileException; + + @Deprecated + @Override + default void invoke(HudderConfig ci, CompileState meta, AV2Compiler comp, V2Runtime runtime, String type, + CharPosition pos, ObjectWrapper... args) throws CompileException { + invoke(ci, meta, comp, type, pos.line, pos.charpos, args); + } } diff --git a/src/main/java/io/github/ngspace/hudder/v2runtime/methods/ItemStackMethods.java b/src/main/java/io/github/ngspace/hudder/v2runtime/methods/ItemStackMethods.java index 050f864..2646ec2 100644 --- a/src/main/java/io/github/ngspace/hudder/v2runtime/methods/ItemStackMethods.java +++ b/src/main/java/io/github/ngspace/hudder/v2runtime/methods/ItemStackMethods.java @@ -1,28 +1,30 @@ package io.github.ngspace.hudder.v2runtime.methods; -import io.github.ngspace.hudder.compilers.abstractions.ATextCompiler; +import io.github.ngspace.hudder.compilers.abstractions.ATextCompiler.CharPosition; +import io.github.ngspace.hudder.compilers.abstractions.AV2Compiler; import io.github.ngspace.hudder.compilers.utils.CompileException; import io.github.ngspace.hudder.compilers.utils.CompileState; import io.github.ngspace.hudder.main.config.HudderConfig; import io.github.ngspace.hudder.uielements.ItemElement; import io.github.ngspace.hudder.utils.ObjectWrapper; +import io.github.ngspace.hudder.v2runtime.V2Runtime; import net.minecraft.client.Minecraft; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.Identifier; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.item.ItemStack; -public class ItemStackMethods implements IMethod { +public class ItemStackMethods implements V2IMethod { protected static Minecraft mc = Minecraft.getInstance(); @Override - public void invoke(HudderConfig ci, CompileState meta, ATextCompiler comp, String type, int line, int charpos, ObjectWrapper... args) throws CompileException { + public void invoke(HudderConfig ci, CompileState meta, AV2Compiler comp, V2Runtime runtime, String type, CharPosition pos, ObjectWrapper... args) throws CompileException { int offset = "slot".equals(type)||"item".equals(type) ? 1:0; if (args.length<2+offset) { throw new CompileException("\""+type+"\" only accepts ;"+type +("slot".equals(type)?",[slot]":"") +("item".equals(type)?",[item]":"") - +",[x],[y],,;", line, charpos); + +",[x],[y],,;", pos); } double x = args[0+offset].asDouble(); double y = args[1+offset].asDouble(); diff --git a/src/main/java/io/github/ngspace/hudder/v2runtime/methods/LoadMethod.java b/src/main/java/io/github/ngspace/hudder/v2runtime/methods/LoadMethod.java index 8361c1a..f5c9b44 100644 --- a/src/main/java/io/github/ngspace/hudder/v2runtime/methods/LoadMethod.java +++ b/src/main/java/io/github/ngspace/hudder/v2runtime/methods/LoadMethod.java @@ -1,6 +1,8 @@ package io.github.ngspace.hudder.v2runtime.methods; import io.github.ngspace.hudder.compilers.abstractions.ATextCompiler; +import io.github.ngspace.hudder.compilers.abstractions.ATextCompiler.CharPosition; +import io.github.ngspace.hudder.compilers.abstractions.AV2Compiler; import io.github.ngspace.hudder.compilers.utils.CompileException; import io.github.ngspace.hudder.compilers.utils.CompileState; import io.github.ngspace.hudder.compilers.utils.Compilers; @@ -8,10 +10,12 @@ import io.github.ngspace.hudder.main.config.HudderConfig; import io.github.ngspace.hudder.utils.HudFileUtils; import io.github.ngspace.hudder.utils.ObjectWrapper; +import io.github.ngspace.hudder.v2runtime.V2Runtime; -public class LoadMethod implements IMethod { +public class LoadMethod implements V2IMethod { @Override - public void invoke(HudderConfig ci, CompileState meta, ATextCompiler comp, String type, int line, int charpos, ObjectWrapper... args) throws CompileException { + public void invoke(HudderConfig ci, CompileState meta, AV2Compiler comp, V2Runtime runtime, String type, + CharPosition charpos, ObjectWrapper... args) throws CompileException { if (args.length<1) throw new CompileException("\""+type+"\" only accepts ;"+type+",[file],,;"); String file = null; @@ -24,12 +28,13 @@ public void invoke(HudderConfig ci, CompileState meta, ATextCompiler comp, Strin boolean AddText = (args.length<2 || args[1].asBoolean()) || type.equals("add"); ATextCompiler ecompiler=(args.length>2?Compilers.getCompilerFromName(args[2].asString()):comp); for (var i : HudCompilationManager.precomplistners) i.accept(ecompiler); - meta.combineWithResult(ecompiler.compile(ci, HudFileUtils.readFile(file), file), AddText); + CompileState state = runtime.getMasterScope().compileState; + state.combineWithResult(ecompiler.compile(ci, HudFileUtils.readFile(file), file), AddText); for (var i : HudCompilationManager.postcomplistners) i.accept(ecompiler); } catch (IllegalArgumentException e) { throw new CompileException(e.getLocalizedMessage()); } catch (CompileException e) { - throw new CompileException(e.getFailureMessage() +"\nRun Failed for hud file " + file, line, charpos); + throw new CompileException(e.getFailureMessage() +"\nRun Failed for hud file " + file, charpos); } } } diff --git a/src/main/java/io/github/ngspace/hudder/v2runtime/methods/MethodHandler.java b/src/main/java/io/github/ngspace/hudder/v2runtime/methods/MethodHandler.java index 806fed0..9002401 100644 --- a/src/main/java/io/github/ngspace/hudder/v2runtime/methods/MethodHandler.java +++ b/src/main/java/io/github/ngspace/hudder/v2runtime/methods/MethodHandler.java @@ -16,7 +16,7 @@ public class MethodHandler { - public static Map methods = new HashMap(); + public static Map methods = new HashMap(); public static final String[] Var = {"[Variable]"}; public static final String[] TextArg = {"[Text]"}; public MethodHandler() { @@ -25,31 +25,31 @@ public MethodHandler() { "pants", "boots", "offhand"); //Text and compiling - bindConsumer((c,m,a,t,l,ch,s)->m.setTextLocation(t,(float) (s.length>0?s[0].asDouble():c.scale)), + bindConsumer((c,m,a,r,t,ch,s)->m.setTextLocation(t,(float) (s.length>0?s[0].asDouble():c.scale)), BOTTOMRIGHT, TOPLEFT, TOPRIGHT, BOTTOMLEFT, MUTE); //Compiler and Variables bindConsumer(new LoadMethod(), "load", "execute", "compile", "run", "add"); //Logging and errors - bindConsumer((c,m,a,t,l,ch,s)->{throw new CompileException(s[0].asString(),l,ch);},1, TextArg, "throw"); + bindConsumer((c,m,a,r,t,ch,s)->{throw new CompileException(s[0].asString(),ch);},1, TextArg, "throw"); } - public void bindConsumer(IMethod method, String... names) { + public void bindConsumer(V2IMethod method, String... names) { for(String name:names) methods.put(name.toLowerCase(),method); } - public void bindConsumer(IMethod method, int length, String[] args, String... names) { - IMethod newmethod = (config,meta,compiler,name,l,c,vals) -> { + public void bindConsumer(V2IMethod method, int length, String[] args, String... names) { + V2IMethod newmethod = (config,meta,compiler,runtime,name,charpos,vals) -> { if (vals.length