From 1da58d2732529e6ef1d21e4d80e13890f5dd73cd Mon Sep 17 00:00:00 2001 From: wuritz Date: Sat, 2 Aug 2025 12:29:53 +0200 Subject: [PATCH 1/7] =?UTF-8?q?esk=C3=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 44 +++++++++++++++++-- proguard-rules.pro | 32 ++++++++++++++ settings.gradle | 2 + .../modules/combat/GenyoAutoCrystal.java | 2 - .../addon/modules/misc/CombatBrainrot.java | 23 ++++++++-- untitled/build.gradle.kts | 19 ++++++++ 6 files changed, 113 insertions(+), 9 deletions(-) create mode 100644 proguard-rules.pro create mode 100644 untitled/build.gradle.kts diff --git a/build.gradle b/build.gradle index faedcaf..0f919d9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,11 +1,22 @@ +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath "com.guardsquare:proguard-gradle:7.4.2" + } +} + plugins { + id 'base' id "fabric-loom" version "1.10-SNAPSHOT" } +version = project.mod_version +group = project.maven_group + base { - archivesBaseName = project.archives_base_name - version = project.mod_version - group = project.maven_group + archivesName.set(project.archives_base_name) } loom { @@ -13,6 +24,7 @@ loom { } repositories { + mavenCentral() maven { name = "Meteor Dev Releases" url = "https://maven.meteordev.org/releases" @@ -46,11 +58,16 @@ tasks { } jar { + archiveClassifier.set('dev') from("LICENSE") { - rename { "${it}_${project.base.archivesBaseName}" } + rename { "${it}_${archiveBaseName.get()}" } } } + remapJar { + archiveClassifier.set('reobf') // my-mod-1.0.0-reobf.jar + } + java { sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 @@ -61,3 +78,22 @@ tasks { it.options.release = 21 } } + +import net.fabricmc.loom.task.RemapJarTask +import proguard.gradle.ProGuardTask + +tasks.register("proguardObf", ProGuardTask) { ProGuardTask t -> + description = "Obfuscate and shrink the reobf JAR" + + dependsOn "remapJar" + def reobfJar = file("$buildDir/libs/${archivesBaseName}-${version}-reobf.jar") + inputs.file reobfJar + injars reobfJar + outjars file("$buildDir/libs/${archivesBaseName}-${version}-obf.jar") + libraryjars files(configurations.modImplementation) // only your Meteor Client + other libs + configuration "proguard-rules.pro" +} + +tasks.build { + dependsOn "proguardObf" +} diff --git a/proguard-rules.pro b/proguard-rules.pro new file mode 100644 index 0000000..9b73389 --- /dev/null +++ b/proguard-rules.pro @@ -0,0 +1,32 @@ +# 0) Don’t fail on missing library classes +-ignorewarnings +-dontwarn net.minecraft.** +-dontwarn net.fabricmc.** +-dontwarn meteordevelopment.** + +# 1) Preserve ALL annotation metadata +-keepattributes *Annotation*,InnerClasses,EnclosingMethod,Signature + +# 2) Keep Mixin annotation & your mixins +-keep @interface org.spongepowered.asm.mixin.Mixin +-keep class com.genyo.addon.mixin.** { *; } + +# 3) Keep **all** of your addon’s code (so Meteor’s reflection can see your Settings, Commands, etc.) +-keep class com.genyo.addon.** { *; } + +# 4) Keep your addon’s main entrypoint (by name) +-keep class com.genyo.addon.GenyoAddon { + public (); +} + +# 5) Keep Fabric & Meteor APIs you use reflectively +-dontwarn net.fabricmc.** +-keep class net.fabricmc.** { *; } + +-dontwarn meteordevelopment.** +-keep class meteordevelopment.** { *; } + +# 6) Shrink/optimize flags +-dontshrink +-dontoptimize +-allowaccessmodification diff --git a/settings.gradle b/settings.gradle index b02216b..ebb2a84 100644 --- a/settings.gradle +++ b/settings.gradle @@ -8,3 +8,5 @@ pluginManagement { gradlePluginPortal() } } + +include 'untitled' \ No newline at end of file diff --git a/src/main/java/com/genyo/addon/modules/combat/GenyoAutoCrystal.java b/src/main/java/com/genyo/addon/modules/combat/GenyoAutoCrystal.java index b1f72f3..78a035d 100644 --- a/src/main/java/com/genyo/addon/modules/combat/GenyoAutoCrystal.java +++ b/src/main/java/com/genyo/addon/modules/combat/GenyoAutoCrystal.java @@ -731,8 +731,6 @@ public void onPlayerUpdate(PlayerTickEvent event) EndCrystalEntity crystalEntity = intersectingCrystalCheck(placeCrystal.getDamageData()); if (crystalEntity != null) { - GenyoAddon.LOG.info("fewkjkfewf"); - double self = ExplosionUtil.getDamageTo(mc.player, crystalEntity.getPos(), blockDestruction.get(), selfExtrapolate.get() ? extrapolateTicks.get() : 0, false); if (!safety.get() || !playerDamageCheck(self)) diff --git a/src/main/java/com/genyo/addon/modules/misc/CombatBrainrot.java b/src/main/java/com/genyo/addon/modules/misc/CombatBrainrot.java index 261ddd6..dc7f039 100644 --- a/src/main/java/com/genyo/addon/modules/misc/CombatBrainrot.java +++ b/src/main/java/com/genyo/addon/modules/misc/CombatBrainrot.java @@ -7,13 +7,19 @@ import com.genyo.addon.utils.math.timer.CacheTimer; import com.genyo.addon.utils.math.timer.Timer; import meteordevelopment.meteorclient.events.entity.player.AttackEntityEvent; +import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.settings.StringListSetting; import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.orbit.EventHandler; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.entity.Entity; import net.minecraft.entity.decoration.EndCrystalEntity; +import net.minecraft.network.packet.c2s.play.PlayerInteractBlockC2SPacket; +import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket; import java.util.ArrayList; import java.util.List; @@ -35,7 +41,7 @@ public CombatBrainrot() { private final Setting delay = sgGeneral.add(new FloatSetting.Builder() .name("Delay") - .description("to maybe not get kicked or smth idk (in milliseconds)") + .description("to maybe not get kicked or smth idk (in seconds)") .min(0.1f) .defaultValue(0.2f) .max(1f) @@ -78,12 +84,23 @@ public void onTick(TickEvent.Pre event) { } @EventHandler - public void onAttackEntity(AttackEntityEvent event) { + public void onPacketSend(PacketEvent.Send event) { if (mc.player == null || mc.world == null) return; + if (mc.getServer() == null) return; - if (!(event.entity instanceof EndCrystalEntity)) return; + if (event.packet instanceof PlayerInteractEntityC2SPacket packet) { + Entity entity = packet.getEntity(mc.getServer().getWorld(mc.player.getWorld().getRegistryKey())); + if (entity == null) return; + if (entity instanceof EndCrystalEntity) { + queueNext(); + } + } + } + + private void queueNext() { queue.add(brainrots.get().get(MathUtil.pickRandom(brainrots.get()))); + timer.reset(); } } diff --git a/untitled/build.gradle.kts b/untitled/build.gradle.kts new file mode 100644 index 0000000..1e69985 --- /dev/null +++ b/untitled/build.gradle.kts @@ -0,0 +1,19 @@ +plugins { + id("java") +} + +group = "com.genyo" +version = "0.8.0" + +repositories { + mavenCentral() +} + +dependencies { + testImplementation(platform("org.junit:junit-bom:5.10.0")) + testImplementation("org.junit.jupiter:junit-jupiter") +} + +tasks.test { + useJUnitPlatform() +} \ No newline at end of file From c587f04f64074f4183894ed156ce8f51152c0521 Mon Sep 17 00:00:00 2001 From: wuritz Date: Sat, 2 Aug 2025 12:30:32 +0200 Subject: [PATCH 2/7] =?UTF-8?q?esk=C3=BC=C3=BC=C3=BC=C3=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/genyo/addon/modules/world/GenyoSelfTrap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/genyo/addon/modules/world/GenyoSelfTrap.java b/src/main/java/com/genyo/addon/modules/world/GenyoSelfTrap.java index ab5a401..bbbd705 100644 --- a/src/main/java/com/genyo/addon/modules/world/GenyoSelfTrap.java +++ b/src/main/java/com/genyo/addon/modules/world/GenyoSelfTrap.java @@ -46,7 +46,7 @@ public class GenyoSelfTrap extends PlacerModule { public GenyoSelfTrap() { - super(GenyoAddon.GENYO, "Genyo SelfTrap V2", "a funny one for sure."); + super(GenyoAddon.GENYO, "Genyo SelfTrap", "a funny one for sure."); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); From b0b42dd6f664dbc89730e65cb778f7409d579844 Mon Sep 17 00:00:00 2001 From: wuritz Date: Mon, 4 Aug 2025 10:42:14 +0200 Subject: [PATCH 3/7] auto swap --- gradle.properties | 2 +- src/main/java/com/genyo/addon/GenyoAddon.java | 5 +- .../com/genyo/addon/hud/ActiveGenyoHud.java | 2 +- .../java/com/genyo/addon/hud/PacketsHud.java | 117 ++++ .../managers/player/InventoryManager.java | 8 +- .../genyo/addon/modules/misc/PacketDebug.java | 126 +++++ .../addon/modules/world/GenyoAutoMine.java | 533 +++++++++++------- .../addon/modules/world/GenyoSelfTrap.java | 2 +- .../addon/modules/world/GenyoSurroundV2.java | 4 +- 9 files changed, 578 insertions(+), 221 deletions(-) create mode 100644 src/main/java/com/genyo/addon/hud/PacketsHud.java create mode 100644 src/main/java/com/genyo/addon/modules/misc/PacketDebug.java diff --git a/gradle.properties b/gradle.properties index 1bb129f..4b908ea 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ yarn_mappings=1.21.4+build.8 loader_version=0.16.14 # Mod Properties -mod_version=0.8.0 +mod_version=0.8.1 maven_group=com.genyo archives_base_name=genyo-addon diff --git a/src/main/java/com/genyo/addon/GenyoAddon.java b/src/main/java/com/genyo/addon/GenyoAddon.java index eb17827..0faa23d 100644 --- a/src/main/java/com/genyo/addon/GenyoAddon.java +++ b/src/main/java/com/genyo/addon/GenyoAddon.java @@ -1,6 +1,7 @@ package com.genyo.addon; import com.genyo.addon.hud.ActiveGenyoHud; +import com.genyo.addon.hud.PacketsHud; import com.genyo.addon.modules.combat.*; import com.genyo.addon.modules.misc.*; import com.genyo.addon.modules.movement.GenyoVelocity; @@ -96,7 +97,6 @@ private void initModules(Modules modules) { modules.add(new GenyoWelcome()); modules.add(new GenyoSkinBlink()); modules.add(new GenyoGoodbye()); - modules.add(new GenyoAutoMine()); modules.add(new GenyoSurroundV2()); modules.add(new GenyoAutoCrystal()); modules.add(new GenyoDiscord()); @@ -112,12 +112,15 @@ private void initModules(Modules modules) { modules.add(new GenyoGhostBlocks()); modules.add(new GenyoSelfTrap()); modules.add(new CombatBrainrot()); + modules.add(new PacketDebug()); + modules.add(new GenyoAutoMine()); } private void initHUD(Hud hud) { hud.register(PvPNeccessaryHud.INFO); hud.register(InCombatHud.INFO); hud.register(ActiveGenyoHud.INFO); + hud.register(PacketsHud.INFO); } @Override diff --git a/src/main/java/com/genyo/addon/hud/ActiveGenyoHud.java b/src/main/java/com/genyo/addon/hud/ActiveGenyoHud.java index f855bae..0aa7f70 100644 --- a/src/main/java/com/genyo/addon/hud/ActiveGenyoHud.java +++ b/src/main/java/com/genyo/addon/hud/ActiveGenyoHud.java @@ -40,7 +40,7 @@ public class ActiveGenyoHud extends HudElement { private final Setting showKeybind = sgGeneral.add(new BoolSetting.Builder() .name("show-keybind") .description("Shows the module's keybind next to its name.") - .defaultValue(false) + .defaultValue(true) .build() ); diff --git a/src/main/java/com/genyo/addon/hud/PacketsHud.java b/src/main/java/com/genyo/addon/hud/PacketsHud.java new file mode 100644 index 0000000..0829745 --- /dev/null +++ b/src/main/java/com/genyo/addon/hud/PacketsHud.java @@ -0,0 +1,117 @@ +package com.genyo.addon.hud; + +import com.genyo.addon.GenyoAddon; +import com.genyo.addon.managers.Managers; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.systems.hud.Hud; +import meteordevelopment.meteorclient.systems.hud.HudElement; +import meteordevelopment.meteorclient.systems.hud.HudElementInfo; +import meteordevelopment.meteorclient.systems.hud.HudRenderer; +import meteordevelopment.meteorclient.utils.render.color.Color; +import meteordevelopment.meteorclient.utils.render.color.SettingColor; + +public class PacketsHud extends HudElement { + + public static final HudElementInfo INFO = new HudElementInfo<>(GenyoAddon.HUD_GROUP, "packets", "Displays the amount of incoming and outgoing packets. (out <- in)", PacketsHud::new); + public PacketsHud() { super(INFO); } + + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgScale = settings.createGroup("Scale"); + private final SettingGroup sgBackground = settings.createGroup("Background"); + + private double originalWidth, originalHeight; + + public final Setting shadow = sgGeneral.add(new BoolSetting.Builder() + .name("shadow") + .description("Renders shadow behind text.") + .defaultValue(true) + .build() + ); + + public final Setting border = sgGeneral.add(new IntSetting.Builder() + .name("border") + .description("How much space to add around the text.") + .defaultValue(0) + .onChanged(integer -> super.setSize(originalWidth + integer * 2, originalHeight + integer * 2)) + .build() + ); + + private final Setting invertColors = sgGeneral.add(new BoolSetting.Builder() + .name("Invert Colors") + .description("Invert the colors") + .defaultValue(true) + .build() + ); + + // Scale + + private final Setting customScale = sgScale.add(new BoolSetting.Builder() + .name("custom-scale") + .description("Applies a custom scale to this hud element.") + .defaultValue(false) + .visible(() -> false) + .build() + ); + + private final Setting scale = sgScale.add(new DoubleSetting.Builder() + .name("scale") + .description("Custom scale.") + .visible(customScale::get) + .defaultValue(1) + .min(0.5) + .sliderRange(0.5, 3) + .build() + ); + + // Background + + private final Setting background = sgBackground.add(new BoolSetting.Builder() + .name("background") + .description("Displays background.") + .defaultValue(false) + .build() + ); + + private final Setting backgroundColor = sgBackground.add(new ColorSetting.Builder() + .name("background-color") + .description("Color used for the background.") + .visible(background::get) + .defaultValue(new SettingColor(25, 25, 25, 50)) + .build() + ); + + private double getScale() { + return customScale.get() ? scale.get() : Hud.get().getTextScale(); + } + + @Override + public void setSize(double width, double height) { + this.originalWidth = width; + this.originalHeight = height; + super.setSize(width + border.get() * 2, height + border.get() * 2); + } + + @Override + public void render(HudRenderer renderer) { + if (isInEditor() && !isActive()) { + renderer.line(x, y, x + getWidth(), y + getHeight(), Color.GRAY); + renderer.line(x, y + getHeight(), x + getWidth(), y, Color.GRAY); + } + + double x = this.x + border.get(); + double y = this.y + border.get(); + + String packetsString = "Packets: "; + renderer.text(packetsString, x, y, invertColors.get() ? Color.GRAY : Color.WHITE, shadow.get(), getScale()); + + String thing = String.format("%s <- %s", Managers.NETWORK.getOutgoingPPS(), Managers.NETWORK.getIncomingPPS()); + renderer.text(thing, x + renderer.textWidth(packetsString) + (renderer.textWidth(" ") * getScale()), y, invertColors.get() ? Color.WHITE : Color.GRAY, shadow.get(), getScale()); + + setSize(renderer.textWidth(packetsString + thing), renderer.textHeight(shadow.get(), getScale())); + + if (background.get()) { + renderer.quad(this.x, y, getWidth(), getHeight(), backgroundColor.get()); + } + } + +} diff --git a/src/main/java/com/genyo/addon/managers/player/InventoryManager.java b/src/main/java/com/genyo/addon/managers/player/InventoryManager.java index 466b2bc..04f9701 100644 --- a/src/main/java/com/genyo/addon/managers/player/InventoryManager.java +++ b/src/main/java/com/genyo/addon/managers/player/InventoryManager.java @@ -41,12 +41,11 @@ public class InventoryManager { @EventHandler public void onPacketSend(final PacketEvent.Send event) { - if (event.packet instanceof UpdateSelectedSlotC2SPacket packet) - { + if (event.packet instanceof UpdateSelectedSlotC2SPacket packet) { final int packetSlot = packet.getSelectedSlot(); if (!PlayerInventory.isValidHotbarIndex(packetSlot) || slot == packetSlot) { - event.cancel(); + event.setCancelled(true); return; } slot = packetSlot; @@ -219,7 +218,7 @@ public boolean isDesynced() // public void closeScreen() { - mc.getNetworkHandler().sendPacket(new CloseHandledScreenC2SPacket(mc.player.currentScreenHandler.syncId)); + Managers.NETWORK.sendPacket(new CloseHandledScreenC2SPacket(mc.player.currentScreenHandler.syncId)); } /** @@ -257,6 +256,7 @@ public int findEmptySlot() } /** + * @param slot * @param button * @param type */ diff --git a/src/main/java/com/genyo/addon/modules/misc/PacketDebug.java b/src/main/java/com/genyo/addon/modules/misc/PacketDebug.java new file mode 100644 index 0000000..60697bb --- /dev/null +++ b/src/main/java/com/genyo/addon/modules/misc/PacketDebug.java @@ -0,0 +1,126 @@ +package com.genyo.addon.modules.misc; + +import com.genyo.addon.GenyoAddon; +import com.genyo.addon.modules.GenyoModule; +import meteordevelopment.meteorclient.events.packets.PacketEvent; +import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.utils.network.PacketUtils; +import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.network.packet.Packet; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class PacketDebug extends GenyoModule { + + public PacketDebug() { + super(GenyoAddon.GENYO, "packet-debug", "yweoikfjwekfjhewkfjwehfkjefhwehjkfhwehfkew."); + } + + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + + private final Setting>>> blacklist = sgGeneral.add(new PacketListSetting.Builder() + .name("Blacklisted Packets") + .description("black >:(") + .filter(aClass -> PacketUtils.getC2SPackets().contains(aClass)) + .build() + ); + + private final Setting toChat = sgGeneral.add(new BoolSetting.Builder() + .name("Send in Chat") + .description("sends the logs to chat (only client side)") + .defaultValue(true) + .build() + ); + + private final Setting threshold = sgGeneral.add(new IntSetting.Builder() + .name("Threshold") + .description("Minimum amount to reach for packets to be logged in a single tick") + .min(0) + .defaultValue(10) + .max(30) + .build() + ); + + private final Setting logTicks = sgGeneral.add(new IntSetting.Builder() + .name("Tick Amount") + .description("how many ticks to wait to log all the packets") + .min(1) + .defaultValue(10) + .max(20) + .visible(() -> threshold.get() > 0) + .build() + ); + + private int currentAmount; + private int tickTimer; + private Set queue = new HashSet<>(); + + @Override + public void onActivate() { + currentAmount = 0; + tickTimer = 0; + queue.clear(); + } + + @Override + public void onDeactivate() { + currentAmount = 0; + tickTimer = 0; + queue.clear(); + } + + @EventHandler + public void onTick(TickEvent.Post event) { + if (mc.world == null || mc.player == null) return; + if (threshold.get() == 0) return; + + if (logTicks.get() != 0) tickTimer++; + + if (currentAmount >= threshold.get()) { + if (logTicks.get() != 0) { + if (!(tickTimer > logTicks.get())) return; + + if (toChat.get()) { + sendInfo("Sent packets (" + currentAmount + ") in the last " + logTicks.get().toString() + " ticks: " + queue.toString()); + } else { + GenyoAddon.LOG.info("Sent packets (" + currentAmount + ") in the last " + logTicks.get().toString() + " ticks: " + queue.toString()); + } + + tickTimer = 0; + } else { + if (toChat.get()) { + sendInfo("Sent packets (" + currentAmount + ") in the last tick: " + queue.toString()); + } else { + GenyoAddon.LOG.info("Sent packets (" + currentAmount + ") in the last tick: " + queue.toString()); + } + } + + currentAmount = 0; + queue.clear(); + } + } + + @EventHandler + public void onPacketSent(PacketEvent.Sent event) { + if (mc.world == null || mc.player == null) return; + + if (!blacklist.get().contains(event.packet.getClass()) && PacketUtils.getC2SPackets().contains(event.packet.getClass())) { + if (threshold.get() > 0) { + currentAmount++; + queue.add(event.packet.getClass().getSimpleName()); + } else { + if (toChat.get()) { + sendInfo("Sent packet: " + event.packet.getClass().getSimpleName()); + } else { + GenyoAddon.LOG.info("Sent packet: " + event.packet.getClass().getSimpleName()); + } + } + } + } + +} diff --git a/src/main/java/com/genyo/addon/modules/world/GenyoAutoMine.java b/src/main/java/com/genyo/addon/modules/world/GenyoAutoMine.java index 4bff328..0031b4a 100644 --- a/src/main/java/com/genyo/addon/modules/world/GenyoAutoMine.java +++ b/src/main/java/com/genyo/addon/modules/world/GenyoAutoMine.java @@ -4,11 +4,15 @@ import com.genyo.addon.events.AttackBlockEvent; import com.genyo.addon.managers.Managers; import com.genyo.addon.modules.GenyoModule; +import com.genyo.addon.modules.combat.GenyoAutoCrystal; import com.genyo.addon.render.animation.Animation; import com.genyo.addon.settings.FloatSetting; import com.genyo.addon.utils.GEntityUtils; import com.genyo.addon.utils.math.GPositionUtils; import com.genyo.addon.utils.math.MathUtil; +import com.genyo.addon.utils.math.timer.CacheTimer; +import com.genyo.addon.utils.math.timer.Timer; +import com.genyo.addon.utils.player.RotationUtil; import com.genyo.addon.utils.render.ColorUtil; import com.genyo.addon.utils.world.BlastResistantBlocks; import meteordevelopment.meteorclient.events.packets.PacketEvent; @@ -18,16 +22,14 @@ import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Block; -import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; import net.minecraft.block.ShapeContext; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.EntityPose; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.packet.c2s.play.HandSwingC2SPacket; @@ -38,22 +40,24 @@ import net.minecraft.util.math.*; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; +import org.jetbrains.annotations.NotNull; import java.util.*; public class GenyoAutoMine extends GenyoModule { public GenyoAutoMine() { - super(GenyoAddon.GENYO, "genyo-auto-mine", "dábül"); + super(GenyoAddon.GENYO, "Genyo AutoMine", "fasz"); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgSelection = settings.createGroup("Selection"); + private final SettingGroup sgRender = settings.createGroup("Render"); private final Setting multitask = sgGeneral.add(new BoolSetting.Builder() .name("Allow Multitask") .description("Allows actions while using items") - .defaultValue(false) + .defaultValue(true) .build() ); @@ -112,14 +116,14 @@ public GenyoAutoMine() { .build() ); - private final Setting antiCrawl = sgGeneral.add(new BoolSetting.Builder() + private final Setting antiCrawl = sgSelection.add(new BoolSetting.Builder() .name("Anti Crawl") .description("Attempts to stop player from crawling") .defaultValue(false) .build() ); - private final Setting head = sgGeneral.add(new BoolSetting.Builder() + private final Setting head = sgSelection.add(new BoolSetting.Builder() .name("Target Body") .description("Attempts to mine players face blocks") .defaultValue(false) @@ -127,7 +131,7 @@ public GenyoAutoMine() { .build() ); - private final Setting aboveHead = sgGeneral.add(new BoolSetting.Builder() + private final Setting aboveHead = sgSelection.add(new BoolSetting.Builder() .name("Target Head") .description("Attempts to mine above players head") .defaultValue(false) @@ -138,7 +142,7 @@ public GenyoAutoMine() { private final Setting doubleBreak = sgGeneral.add(new BoolSetting.Builder() .name("Double Break") .description("Allows you to mine two blocks at once") - .defaultValue(false) + .defaultValue(true) .build() ); @@ -155,14 +159,14 @@ public GenyoAutoMine() { private final Setting remine = sgGeneral.add(new EnumSetting.Builder() .name("Remine") .description("Remines already mined blocks") - .defaultValue(RemineMode.NORMAL) + .defaultValue(RemineMode.INSTANT) .build() ); private final Setting packetInstant = sgGeneral.add(new BoolSetting.Builder() .name("Fast") .description("Instant mines on packet") - .defaultValue(false) + .defaultValue(true) .visible(() -> remine.get() == RemineMode.INSTANT) .build() ); @@ -171,14 +175,14 @@ public GenyoAutoMine() { .name("Range") .description("The range to mine blocks") .min(0.1f) - .defaultValue(4.0f) + .defaultValue(6.0f) .max(6.0f) .build() ); private final Setting speed = sgGeneral.add(new FloatSetting.Builder() .name("Speed") - .description("The speed to mine blocks") + .description("The speed to mine blocks (idk what the fuck this is)") .min(0.1f) .defaultValue(1.0f) .max(1.0f) @@ -200,6 +204,13 @@ public GenyoAutoMine() { .build() ); + private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() + .name("Rotate") + .description("yes") + .defaultValue(true) + .build() + ); + private final Setting switchReset = sgGeneral.add(new BoolSetting.Builder() .name("Switch Reset") .description("Resets mining after switching items") @@ -229,28 +240,30 @@ public GenyoAutoMine() { .build() ); - private final Setting color = sgGeneral.add(new ColorSetting.Builder() + // Render + + private final Setting render = sgRender.add(new BoolSetting.Builder() + .name("Render") + .description("wa") + .defaultValue(true) + .build() + ); + + private final Setting mineColor = sgRender.add(new ColorSetting.Builder() .name("Mine Color") .description("The mine render color") - .defaultValue(new SettingColor(255, 0, 0, 45)) + .defaultValue(new SettingColor(255, 0, 0, 255)) .build() ); - private final Setting colorDone = sgGeneral.add(new ColorSetting.Builder() + private final Setting colorDone = sgRender.add(new ColorSetting.Builder() .name("Done Color") .description("The done render color") - .defaultValue(new SettingColor(0, 255, 0, 45)) + .defaultValue(new SettingColor(0, 255, 0, 255)) .build() ); - private final Setting render = sgGeneral.add(new BoolSetting.Builder() - .name("Render") - .description("wa") - .defaultValue(true) - .build() - ); - - private final Setting fadeTime = sgGeneral.add(new IntSetting.Builder() + private final Setting fadeTime = sgRender.add(new IntSetting.Builder() .name("Fade Time") .description("Time to fade") .min(0) @@ -260,11 +273,10 @@ public GenyoAutoMine() { .build() ); - private final Setting smoothColor = sgGeneral.add(new BoolSetting.Builder() + private final Setting smoothColor = sgRender.add(new BoolSetting.Builder() .name("Smooth Color") .description("Interpolates from start to done color") .defaultValue(false) - .visible(() -> false) // ?????????? .build() ); @@ -272,7 +284,7 @@ public GenyoAutoMine() { private MineData packetMine, instantMine; // mining2 should always be the instant mine private boolean packetSwapBack; private boolean manualOverride; - private int remineTimer = 0; // TODO: tick timer + private final Timer remineTimer = new CacheTimer(); private boolean changedInstantMine; private boolean waitForPacketMine; @@ -284,71 +296,85 @@ public GenyoAutoMine() { private final Queue autoMineQueue = new ArrayDeque<>(); private int autoMineTickDelay; - private MineAnimation packetMineAnim = new MineAnimation(MineData.empty(), new Animation(true, 200)); - private MineAnimation instantMineAnim = new MineAnimation(MineData.empty(), new Animation(true, 200)); + private MineAnimation packetMineAnim = new MineAnimation( + MineData.empty(), new Animation(true, 200)); + private MineAnimation instantMineAnim = new MineAnimation( + MineData.empty(), new Animation(true, 200)); @Override - public void onDeactivate() { + public void onDeactivate() + { autoMineQueue.clear(); playerTarget = null; packetMine = null; - - if (instantMine != null) { + if (instantMine != null) + { abortMining(instantMine); instantMine = null; } - packetMineAnim = new MineAnimation(MineData.empty(), new Animation(true, 200)); instantMineAnim = new MineAnimation(MineData.empty(), new Animation(true, 200)); - autoMineTickDelay = 0; antiCrawlTicks = 0; manualOverride = false; antiCrawlOverride = false; waitForPacketMine = false; packetMineStuck = false; - if (packetSwapBack) { + if (packetSwapBack) + { Managers.INVENTORY.syncToClient(); packetSwapBack = false; } } @EventHandler - public void onTick(TickEvent.Pre event) { - if (mc.player == null) return; - if (mc.player.isCreative() || mc.player.isSpectator()) return; - - remineTimer++; + public void onTick(TickEvent.Pre event) + { + if (mc.player.isCreative() || mc.player.isSpectator()) + { + return; + } - PlayerEntity currentTarget = getClosestPlayer((double) enemyRange.get()); + PlayerEntity currentTarget = getClosestPlayer(enemyRange.get()); boolean targetChanged = playerTarget != null && playerTarget != currentTarget; playerTarget = currentTarget; - if (isInstantMineComplete()) { - if (changedInstantMine) changedInstantMine = false; - if (waitForPacketMine) waitForPacketMine = false; + if (isInstantMineComplete()) + { + if (changedInstantMine) + { + changedInstantMine = false; + } + if (waitForPacketMine) + { + waitForPacketMine = false; + } } autoMineTickDelay--; antiCrawlTicks--; // Mining packet handling - if (packetMine != null && packetMine.getTicksMining() > mineTicks.get()) { + if (packetMine != null && packetMine.getTicksMining() > mineTicks.get()) + { packetMineStuck = true; packetMineAnim.animation.setState(false); - if (packetSwapBack) { + if (packetSwapBack) + { Managers.INVENTORY.syncToClient(); packetSwapBack = false; } packetMine = null; - if (!isInstantMineComplete()) { + if (!isInstantMineComplete()) + { waitForPacketMine = true; } } - if (packetMine != null) { - final float damageDelta = mc.world.getBlockState(packetMine.getPos()).calcBlockBreakingDelta(mc.player, mc.world, packetMine.getPos()); - + if (packetMine != null) + { + final float damageDelta = Modules.get().get(GenyoSpeedmine.class).calcBlockBreakingDelta( + packetMine.getState(), mc.world, packetMine.getPos()); packetMine.addBlockDamage(damageDelta); int slot = packetMine.getBestSlot(); @@ -356,8 +382,7 @@ public void onTick(TickEvent.Pre event) { || packetMineStuck ? damageDelta : 0.0f); if (damageDone >= 1.0f && slot != -1 && !checkMultitask()) { - //Managers.INVENTORY.setSlot(slot); - InvUtils.move().slot(slot); + Managers.INVENTORY.setSlot(slot); packetSwapBack = true; if (packetMineStuck) { @@ -388,30 +413,39 @@ public void onTick(TickEvent.Pre event) { if (instantMine != null) { final double distance = mc.player.getEyePos().squaredDistanceTo(instantMine.getPos().toCenterPos()); - if (distance > MathUtil.squared(range.get()) || instantMine.getTicksMining() > mineTicks.get()) { + if (distance > MathUtil.squared(range.get()) + || instantMine.getTicksMining() > mineTicks.get()) + { abortMining(instantMine); instantMineAnim.animation.setState(false); instantMine = null; } } - if (instantMine != null) { - final float damageDelta = mc.world.getBlockState(instantMine.getPos()).calcBlockBreakingDelta(mc.player, mc.world, instantMine.getPos()); - + if (instantMine != null) + { + final float damageDelta = Modules.get().get(GenyoSpeedmine.class).calcBlockBreakingDelta( + instantMine.getState(), mc.world, instantMine.getPos()); instantMine.addBlockDamage(damageDelta); - if (instantMine.getBlockDamage() >= speed.get()) { + if (instantMine.getBlockDamage() >= speed.get()) + { boolean canMine = canMine(instantMine.getState()); boolean canPlace = mc.world.canPlace(instantMine.getState(), instantMine.getPos(), ShapeContext.absent()); - if (canMine) { + if (canMine) + { instantMine.markAttemptedMine(); - } else { + } + else + { instantMine.resetMiningTicks(); - if (remine.get() == RemineMode.NORMAL || remine.get() == RemineMode.FAST) { + if (remine.get() == RemineMode.NORMAL || remine.get() == RemineMode.FAST) + { instantMine.setTotalBlockDamage(0.0f, 0.0f); } - if (manualOverride) { + if (manualOverride) + { manualOverride = false; // Clear our old manual mine abortMining(instantMine); @@ -420,16 +454,22 @@ public void onTick(TickEvent.Pre event) { } } - boolean passedRemine = remine.get() == RemineMode.INSTANT || (remineTimer >= 500); - + boolean passedRemine = remine.get() == RemineMode.INSTANT || remineTimer.passed(500); if (instantMine != null && (remine.get() == RemineMode.INSTANT && packetInstant.get() && packetMine == null && canPlace || canMine && passedRemine) && (!checkMultitask() || multitask.get() || swap.get() == Swap.OFF)) { stopMining(instantMine); - remineTimer = 0; + remineTimer.reset(); + + if (Modules.get().isActive(GenyoAutoCrystal.class) + && Modules.get().get(GenyoAutoCrystal.class).shouldPreForcePlace()) + { + Modules.get().get(GenyoAutoCrystal.class).placeCrystalForTarget(playerTarget, instantMine.getPos().down()); + } - if (remine.get() == RemineMode.FAST) { + if (remine.get() == RemineMode.FAST) + { startMining(instantMine); } } @@ -437,31 +477,33 @@ public void onTick(TickEvent.Pre event) { } // Clear overrides - if (manualOverride && (instantMine == null || instantMine.getGoal() != MiningGoal.MANUAL)) { + if (manualOverride && (instantMine == null || instantMine.getGoal() != MiningGoal.MANUAL)) + { manualOverride = false; } - if (antiCrawlOverride && (instantMine == null || instantMine.getGoal() != MiningGoal.PREVENT_CRAWL)) { + if (antiCrawlOverride && (instantMine == null || instantMine.getGoal() != MiningGoal.PREVENT_CRAWL)) + { antiCrawlOverride = false; } - if (auto.get()) { - if (!autoMineQueue.isEmpty() && autoMineTickDelay <= 0) { + if (auto.get()) + { + if (!autoMineQueue.isEmpty() && autoMineTickDelay <= 0) + { MineData nextMine = autoMineQueue.poll(); - if (nextMine != null) { - startMining(nextMine); - autoMineTickDelay = 5; - - nextMine = autoMineQueue.poll(); - if (nextMine == null) return; + if (nextMine != null) + { startMining(nextMine); autoMineTickDelay = 5; } } BlockPos antiCrawlPos = getAntiCrawlPos(playerTarget); - if (antiCrawlOverride) { - if (mc.player.getPose().equals(EntityPose.SWIMMING)) { + if (antiCrawlOverride) + { + if (mc.player.getPose().equals(EntityPose.SWIMMING)) + { antiCrawlTicks = 10; } @@ -472,25 +514,33 @@ public void onTick(TickEvent.Pre event) { } } - if (autoMineQueue.isEmpty() && !manualOverride && !antiCrawlOverride) { + if (autoMineQueue.isEmpty() && !manualOverride && !antiCrawlOverride) + { if (antiCrawl.get() && mc.player.getPose().equals(EntityPose.SWIMMING) && antiCrawlPos != null) { MineData data = new MineData(antiCrawlPos, strictDirection.get() ? - mc.player.getHorizontalFacing() : Direction.UP, MiningGoal.PREVENT_CRAWL); + Managers.INTERACT.getInteractDirection(antiCrawlPos, false) : Direction.UP, MiningGoal.PREVENT_CRAWL); if (isInstantMineComplete() || !instantMine.equals(data)) { startAutoMine(data); antiCrawlOverride = true; } - } else if (playerTarget != null && !targetChanged) { + } + + else if (playerTarget != null && !targetChanged) + { BlockPos targetPos = GEntityUtils.getRoundedBlockPos(playerTarget); boolean bedrockPhased = GPositionUtils.isBedrock(playerTarget.getBoundingBox(), targetPos) && !playerTarget.isCrawling(); - if (!isInstantMineComplete() && checkDataY(instantMine, targetPos, bedrockPhased)) { + if (!isInstantMineComplete() && checkDataY(instantMine, targetPos, bedrockPhased)) + { abortMining(instantMine); instantMineAnim.animation.setState(false); instantMine = null; - } else if (packetMine != null && checkDataY(packetMine, targetPos, bedrockPhased)) { + } + + else if (packetMine != null && checkDataY(packetMine, targetPos, bedrockPhased)) + { packetMineAnim.animation.setState(false); if (packetSwapBack) { @@ -499,17 +549,21 @@ public void onTick(TickEvent.Pre event) { } packetMine = null; waitForPacketMine = false; - } else { + } + + else + { List phasedBlocks = getPhaseBlocks(playerTarget, targetPos, bedrockPhased); MineData bestMine; if (!phasedBlocks.isEmpty()) { BlockPos pos1 = phasedBlocks.removeFirst(); - GenyoAddon.LOG.info(phasedBlocks.toString()); - bestMine = new MineData(pos1, strictDirection.get() ? mc.player.getHorizontalFacing() : Direction.UP); + bestMine = new MineData(pos1, strictDirection.get() ? + Managers.INTERACT.getInteractDirection(pos1, false) : Direction.UP); - if (packetMine == null && doubleBreak.get() || isInstantMineComplete()) { + if (packetMine == null && doubleBreak.get() || isInstantMineComplete()) + { startAutoMine(bestMine); } } @@ -526,16 +580,22 @@ public void onTick(TickEvent.Pre event) { } } } - } else { - if (!isInstantMineComplete() && instantMine.getGoal() == MiningGoal.MINING_ENEMY) { + } + + else + { + if (!isInstantMineComplete() && instantMine.getGoal() == MiningGoal.MINING_ENEMY) + { abortMining(instantMine); instantMineAnim.animation.setState(false); instantMine = null; } - if (packetMine != null && packetMine.getGoal() == MiningGoal.MINING_ENEMY) { + if (packetMine != null && packetMine.getGoal() == MiningGoal.MINING_ENEMY) + { packetMineAnim.animation.setState(false); - if (packetSwapBack) { + if (packetSwapBack) + { Managers.INVENTORY.syncToClient(); packetSwapBack = false; } @@ -548,16 +608,20 @@ public void onTick(TickEvent.Pre event) { } @EventHandler - public void onAttackBlock(AttackBlockEvent event) { - if (mc.player == null && mc.world == null) return; - if (mc.player.isCreative() || mc.player.isSpectator()) return; - - if (event.state.getBlock() == null) return; + public void onAttackBlock(AttackBlockEvent event) + { + if (mc.player.isCreative() || mc.player.isSpectator()) + { + return; + } event.cancel(); // Do not try to break unbreakable blocks - if (event.state.getBlock().getHardness() == -1.0f || !canMine(event.state) || isMining(event.pos)) return; + if (event.state.getBlock().getHardness() == -1.0f || !canMine(event.state) || isMining(event.pos)) + { + return; + } MineData data = new MineData(event.pos, event.direction, MiningGoal.MANUAL); @@ -567,7 +631,8 @@ public void onAttackBlock(AttackBlockEvent event) { manualOverride = true; } - if (!doubleBreak.get()) { + if (!doubleBreak.get()) + { instantMine = data; startMining(instantMine); mc.player.swingHand(Hand.MAIN_HAND, false); @@ -575,12 +640,16 @@ public void onAttackBlock(AttackBlockEvent event) { } boolean updateChanged = false; - if (!isInstantMineComplete() && !changedInstantMine) { - if (packetMine == null) { + if (!isInstantMineComplete() && !changedInstantMine) + { + if (packetMine == null) + { packetMine = instantMine.copy(); packetMineAnim = new MineAnimation(packetMine, new Animation(true, fadeTime.get())); - } else { + } + else + { updateChanged = true; } } @@ -588,43 +657,63 @@ public void onAttackBlock(AttackBlockEvent event) { instantMine = data; startMining(instantMine); mc.player.swingHand(Hand.MAIN_HAND, false); - if (updateChanged) changedInstantMine = true; + if (updateChanged) + { + changedInstantMine = true; + } } @EventHandler - public void onPacketSent(PacketEvent.Sent event) { - if (event.packet instanceof UpdateSelectedSlotC2SPacket && switchReset.get() && instantMine != null) { + public void onPacketSend(PacketEvent.Send event) + { + if (event.packet instanceof UpdateSelectedSlotC2SPacket && switchReset.get() && instantMine != null) + { instantMine.setTotalBlockDamage(0.0f, 0.0f); } } @EventHandler - public void onPacketReceive(PacketEvent.Receive event) { - if (event.packet instanceof BlockUpdateS2CPacket packet && canMine(packet.getState())) { - if (antiCrawlOverride && packet.getPos().equals(getAntiCrawlPos(playerTarget))) { + public void onPacketReceive(PacketEvent.Receive event) + { + if (event.packet instanceof BlockUpdateS2CPacket packet && canMine(packet.getState())) + { + if (antiCrawlOverride && packet.getPos().equals(getAntiCrawlPos(playerTarget))) + { antiCrawlTicks = 10; } } } - public void startAutoMine(MineData data) { - if (!canMine(data.getState()) || isMining(data.getPos())) return; + public void startAutoMine(MineData data) + { + if (!canMine(data.getState()) || isMining(data.getPos())) + { + return; + } - if (!doubleBreak.get()) { + if (!doubleBreak.get()) + { instantMine = data; autoMineQueue.offer(data); return; } - if (changedInstantMine && !isInstantMineComplete() || waitForPacketMine) return; + if (changedInstantMine && !isInstantMineComplete() || waitForPacketMine) + { + return; + } boolean updateChanged = false; - if (!isInstantMineComplete() && !changedInstantMine) { - if (packetMine == null) { + if (!isInstantMineComplete() && !changedInstantMine) + { + if (packetMine == null) + { packetMine = instantMine.copy(); packetMineAnim = new MineAnimation(packetMine, new Animation(true, fadeTime.get())); - } else { + } + else + { updateChanged = true; } } @@ -632,14 +721,17 @@ public void startAutoMine(MineData data) { instantMine = data; autoMineQueue.offer(data); - if (updateChanged) { + if (updateChanged) + { changedInstantMine = true; } } - public MineData getInstantMine(List miningBlocks, boolean bedrockPhased) { + public MineData getInstantMine(List miningBlocks, boolean bedrockPhased) + { PriorityQueue validInstantMines = new PriorityQueue<>(); - for (BlockPos blockPos : miningBlocks) { + for (BlockPos blockPos : miningBlocks) + { BlockState state1 = mc.world.getBlockState(blockPos); if (!isAutoMineBlock(state1.getBlock())) // bedrock mine exploit!! { @@ -647,17 +739,25 @@ public MineData getInstantMine(List miningBlocks, boolean bedrockPhase } double dist = mc.player.getEyePos().squaredDistanceTo(blockPos.toCenterPos()); - if (dist > MathUtil.squared(range.get())) continue; + if (dist > MathUtil.squared(range.get())) + { + continue; + } BlockState state2 = mc.world.getBlockState(blockPos.down()); - if (bedrockPhased || state2.isOf(Blocks.OBSIDIAN) || state2.isOf(Blocks.BEDROCK)) { - Direction direction = strictDirection.get() ? mc.player.getHorizontalFacing() : Direction.UP; + if (bedrockPhased || state2.isOf(Blocks.OBSIDIAN) || state2.isOf(Blocks.BEDROCK)) + { + Direction direction = strictDirection.get() ? + Managers.INTERACT.getInteractDirection(blockPos, false) : Direction.UP; validInstantMines.add(new MineData(blockPos, direction)); } } - if (validInstantMines.isEmpty()) return null; + if (validInstantMines.isEmpty()) + { + return null; + } return validInstantMines.peek(); } @@ -667,17 +767,27 @@ public List getPhaseBlocks(PlayerEntity player, BlockPos playerPos, bo List phaseBlocks = GPositionUtils.getAllInBox(player.getBoundingBox(), targetBedrockPhased && head.get() ? playerPos.up() : playerPos); - phaseBlocks.removeIf(p -> { + phaseBlocks.removeIf(p -> + { BlockState state = mc.world.getBlockState(p); - if (!isAutoMineBlock(state.getBlock()) || !canMine(state) || isMining(p)) return true; + if (!isAutoMineBlock(state.getBlock()) || !canMine(state) || isMining(p)) + { + return true; + } double dist = mc.player.getEyePos().squaredDistanceTo(p.toCenterPos()); - if (dist > MathUtil.squared(range.get())) return true; + if (dist > MathUtil.squared(range.get())) + { + return true; + } return avoidSelf.get() && intersectsPlayer(p); }); - if (targetBedrockPhased && aboveHead.get()) phaseBlocks.add(playerPos.up(2)); + if (targetBedrockPhased && aboveHead.get()) + { + phaseBlocks.add(playerPos.up(2)); + } return phaseBlocks; } @@ -689,12 +799,13 @@ public List getPhaseBlocks(PlayerEntity player, BlockPos playerPos, bo */ public List getMiningBlocks(PlayerEntity player, BlockPos playerPos, boolean bedrockPhased) { - List surroundingBlocks = Modules.get().get(GenyoSurround.class).getSurroundNoDown(player, range.get()); + List surroundingBlocks = Modules.get().get(GenyoSurroundV2.class).getSurroundNoDown(player, range.get()); List miningBlocks; if (bedrockPhased) { List facePlaceBlocks = new ArrayList<>(); - if (head.get()) { + if (head.get()) + { facePlaceBlocks.addAll(surroundingBlocks.stream().map(BlockPos::up).toList()); } @@ -749,28 +860,36 @@ private boolean checkDataY(MineData data, BlockPos targetPos, boolean bedrockPha private boolean intersectsPlayer(BlockPos pos) { - List playerBlocks = Modules.get().get(GenyoSurround.class).getPlayerBlocks(mc.player); - List surroundingBlocks = Modules.get().get(GenyoSurround.class).getSurroundNoDown(mc.player); + List playerBlocks = Modules.get().get(GenyoSurroundV2.class).getPlayerBlocks(mc.player); + List surroundingBlocks = Modules.get().get(GenyoSurroundV2.class).getSurroundNoDown(mc.player); return playerBlocks.contains(pos) || surroundingBlocks.contains(pos); } @EventHandler - public void onRender3D(Render3DEvent event) { - if (mc.player == null && mc.world == null) return; - if (mc.player.isCreative() || mc.player.isSpectator()) return; + public void onRender3D(Render3DEvent event) + { + if (mc.player.isCreative() || mc.player.isSpectator()) + { + return; + } + + if (!render.get()) return; if (instantMineAnim != null && instantMineAnim.animation().getFactor() > 0.01f) { - renderMiningData(event.matrices, event.tickDelta, instantMineAnim, true, event.renderer); + renderMiningData(event.renderer, event.tickDelta, + instantMineAnim, true); } if (doubleBreak.get() && packetMineAnim != null && packetMineAnim.animation().getFactor() > 0.01f) { - renderMiningData(event.matrices, event.tickDelta, packetMineAnim, false, event.renderer); + renderMiningData(event.renderer, event.tickDelta, + packetMineAnim, false); } } - public void renderMiningData(MatrixStack matrixStack, float tickDelta, MineAnimation mineAnimation, boolean instantMine, Renderer3D renderer) + public void renderMiningData(Renderer3D renderer, float tickDelta, + MineAnimation mineAnimation, boolean instantMine) { MineData data = mineAnimation.data(); Animation animation = mineAnimation.animation(); @@ -779,18 +898,23 @@ public void renderMiningData(MatrixStack matrixStack, float tickDelta, MineAnima Color boxColor; Color lineColor; - if (smoothColor.get()) { - boxColor = !canMine(data.getState()) ? colorDone.get() : ColorUtil.interpolateColor(Math.min(data.getBlockDamage(), 1.0f), colorDone.get(), color.get()); - lineColor = !canMine(data.getState()) ? colorDone.get() : ColorUtil.interpolateColor(Math.min(data.getBlockDamage(), 1.0f), colorDone.get(), color.get()); - } else { - boxColor = data.getBlockDamage() >= 0.95f || !canMine(data.getState()) ? colorDone.get() : color.get(); - lineColor = data.getBlockDamage() >= 0.95f || !canMine(data.getState()) ? colorDone.get() : color.get(); + if (smoothColor.get()) + { + boxColor = !canMine(data.getState()) ? colorDone.get().a(boxAlpha) : + ColorUtil.interpolateColor(Math.min(data.getBlockDamage(), 1.0f), colorDone.get().a(boxAlpha), mineColor.get().a(boxAlpha)); + lineColor = !canMine(data.getState()) ? colorDone.get().a(lineAlpha) : + ColorUtil.interpolateColor(Math.min(data.getBlockDamage(), 1.0f), colorDone.get().a(lineAlpha), mineColor.get().a(lineAlpha)); + } + else + { + boxColor = data.getBlockDamage() >= 0.95f || !canMine(data.getState()) ? colorDone.get().a(boxAlpha) : mineColor.get().a(boxAlpha); + lineColor = data.getBlockDamage() >= 0.95f || !canMine(data.getState()) ? colorDone.get().a(lineAlpha) : mineColor.get().a(lineAlpha); } BlockPos mining = data.getPos(); VoxelShape outlineShape = VoxelShapes.fullCube(); - - if (!instantMine || data.getBlockDamage() < speed.get()) { + if (!instantMine || data.getBlockDamage() < speed.get()) + { outlineShape = data.getState().getOutlineShape(mc.world, mining); outlineShape = outlineShape.isEmpty() ? VoxelShapes.fullCube() : outlineShape; } @@ -804,14 +928,12 @@ public void renderMiningData(MatrixStack matrixStack, float tickDelta, MineAnima double dz = (render1.maxZ - render1.minZ) / 2.0; final Box scaled = new Box(center, center).expand(dx * scale, dy * scale, dz * scale); - renderer.box(scaled, boxColor, lineColor, ShapeMode.Both, 1); - //RenderManager.renderBox(matrixStack, scaled, boxColor); - //RenderManager.renderBoundingBox(matrixStack, scaled, 1.5f, lineColor); + renderer.box(scaled, boxColor, lineColor, ShapeMode.Both, 0); } public void startMining(MineData data) { - /*if (rotate.get()) + if (rotate.get()) { float[] rotations = RotationUtil.getRotationsTo(mc.player.getEyePos(), data.getPos().toCenterPos()); if (grim.get()) @@ -822,7 +944,7 @@ public void startMining(MineData data) { setRotation(rotations[0], rotations[1]); } - }*/ + } if (doubleBreak.get()) { @@ -830,85 +952,67 @@ public void startMining(MineData data) // https://github.com/GrimAnticheat/Grim/blob/2.0/src/main/java/ac/grim/grimac/checks/impl/misc/FastBreak.java#L98 if (grimNew.get()) { - if (anticheat.get()) { - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket( + if (!anticheat.get()) + { + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, data.getPos(), data.getDirection())); - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket( + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, data.getPos(), data.getDirection())); - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket( + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( PlayerActionC2SPacket.Action.ABORT_DESTROY_BLOCK, data.getPos(), data.getDirection())); - } else { - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket( + } + else + { + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, data.getPos(), data.getDirection())); } - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket( + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, data.getPos(), data.getDirection())); - mc.getNetworkHandler().sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); - mc.getNetworkHandler().sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); - mc.getNetworkHandler().sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); - } else { - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket( + Managers.NETWORK.sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); + Managers.NETWORK.sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); + Managers.NETWORK.sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); + } + else + { + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, data.getPos(), data.getDirection())); - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket( + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, data.getPos(), data.getDirection())); - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket( + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, data.getPos(), data.getDirection())); - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket( + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, data.getPos(), data.getDirection())); - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket( + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, data.getPos(), data.getDirection())); - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket( + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, data.getPos(), data.getDirection())); - mc.getNetworkHandler().sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); + Managers.NETWORK.sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); } - } else { - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket( + } + else + { + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, data.getPos(), data.getDirection())); } - /*if (rotate.get() && grim.get()) + if (rotate.get() && grim.get()) { Managers.ROTATION.setRotationSilentSync(); - }*/ + } instantMineAnim = new MineAnimation(data, new Animation(true, fadeTime.get())); } - private boolean startMiningV2(MineData data) { - // --- START Packet --- - Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( - PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, data.getPos(), data.getDirection())); - - // --- STOP Packet (delayed to avoid canceling START immediately) --- - mc.execute(() -> Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( - PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, data.getPos(), data.getDirection()))); - - // Hand Swing - Managers.NETWORK.sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); - - // --- Fallback resend after small delay --- - mc.execute(() -> { - if (!mc.world.getBlockState(data.getPos()).isAir()) { - Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( - PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, data.getPos(), data.getDirection())); - Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( - PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, data.getPos(), data.getDirection())); - } - }); - - return true; - } - public void abortMining(MineData data) { - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket( + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( PlayerActionC2SPacket.Action.ABORT_DESTROY_BLOCK, data.getPos(), data.getDirection())); } public void stopMining(MineData data) { - /*if (rotate.get()) + if (rotate.get()) { float[] rotations = RotationUtil.getRotationsTo(mc.player.getEyePos(), data.getPos().toCenterPos()); if (grim.get()) @@ -919,7 +1023,7 @@ public void stopMining(MineData data) { setRotation(rotations[0], rotations[1]); } - }*/ + } int slot = data.getBestSlot(); if (slot != -1) @@ -934,17 +1038,17 @@ public void stopMining(MineData data) swapSync(slot); } - /*if (rotate.get() && grim.get()) + if (rotate.get() && grim.get()) { Managers.ROTATION.setRotationSilentSync(); - }*/ + } } private void stopMiningInternal(MineData data) { - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket( + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, data.getPos(), data.getDirection())); - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket( + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( PlayerActionC2SPacket.Action.ABORT_DESTROY_BLOCK, data.getPos(), data.getDirection())); } @@ -1017,8 +1121,7 @@ public boolean canMine(BlockState state) public static class MineData implements Comparable { - private final MinecraftClient mc = MinecraftClient.getInstance(); - + private static final MinecraftClient mc = MinecraftClient.getInstance(); private final BlockPos pos; private final Direction direction; private final MiningGoal goal; @@ -1043,11 +1146,16 @@ public MineData(BlockPos pos, Direction direction, MiningGoal goal) private double getPriority() { double dist = mc.player.getEyePos().squaredDistanceTo(pos.down().toCenterPos()); + if (dist <= Modules.get().get(GenyoAutoCrystal.class).getPlaceRange()) + { + return 10.0f; + } + return 0.0f; } @Override - public int compareTo(MineData o) + public int compareTo(@NotNull MineData o) { return Double.compare(getPriority(), o.getPriority()); } @@ -1129,34 +1237,39 @@ public BlockState getState() public int getBestSlot() { - return InvUtils.findFastestTool(getState()).slot(); + return Modules.get().get(GenyoAutoTool.class).getBestToolNoFallback(getState()); } } public record MineAnimation(MineData data, Animation animation) {} - public enum MiningGoal { + public enum MiningGoal + { MANUAL, MINING_ENEMY, PREVENT_CRAWL } - public enum RemineMode { + public enum RemineMode + { INSTANT, NORMAL, FAST } - public enum Selection { + public enum Selection + { WHITELIST, BLACKLIST, ALL } - public enum Swap { + public enum Swap + { NORMAL, SILENT, SILENT_ALT, OFF } + } diff --git a/src/main/java/com/genyo/addon/modules/world/GenyoSelfTrap.java b/src/main/java/com/genyo/addon/modules/world/GenyoSelfTrap.java index bbbd705..79673b7 100644 --- a/src/main/java/com/genyo/addon/modules/world/GenyoSelfTrap.java +++ b/src/main/java/com/genyo/addon/modules/world/GenyoSelfTrap.java @@ -211,7 +211,7 @@ public void onTick(TickEvent.Pre event) { blocksPlaced = 0; if (jumpDisable.get() && (mc.player.getY() - prevY > 0.5 || mc.player.fallDistance > 1.5f)) { - sendInfo("Player jumped, disabling."); + sendDisableMsg("Player jumped, disabling."); toggle(); return; } diff --git a/src/main/java/com/genyo/addon/modules/world/GenyoSurroundV2.java b/src/main/java/com/genyo/addon/modules/world/GenyoSurroundV2.java index bdd3df3..931345c 100644 --- a/src/main/java/com/genyo/addon/modules/world/GenyoSurroundV2.java +++ b/src/main/java/com/genyo/addon/modules/world/GenyoSurroundV2.java @@ -207,10 +207,9 @@ public void onDeactivate() { @EventHandler public void onTick(TickEvent.Pre event) { blocksPlaced = 0; - //if (SelfTrapModule.getInstance().isEnabled()) return; if (jumpDisable.get() && (mc.player.getY() - prevY > 0.5 || mc.player.fallDistance > 1.5f)) { - sendInfo("Player jumped, disabling."); + sendDisableMsg("Player jumped, disabling."); toggle(); return; } @@ -428,7 +427,6 @@ public List getSurround(PlayerEntity player) BlockPos blockerPos = surroundPos.offset(direction); if (playerBlocks.contains(blockerPos) - //|| AutoMineModule.getInstance().getMiningBlock() == blockerPos) // Dont want to help our opponent surround || Modules.get().get(GenyoAutoMine.class).getMiningBlock() == blockerPos) // Dont want to help our opponent surround { continue; From 571152c1bec00a3c279e6e914ba201d40b54291e Mon Sep 17 00:00:00 2001 From: wuritz Date: Tue, 5 Aug 2025 16:34:37 +0200 Subject: [PATCH 4/7] cuccok --- src/main/java/com/genyo/addon/GenyoAddon.java | 24 +- .../events/meteor/SettingChangedEvent.java | 17 - .../addon/events/world/AddEntityEvent.java | 16 + .../com/genyo/addon/managers/Managers.java | 1 + .../genyo/addon/managers/SocialManager.java | 17 + .../managers/network/GDTogglerManager.java | 2 +- .../DefaultSettingsWidgetFactoryMixin.java | 4 +- .../entity/player/MixinPlayerListEntry.java | 39 ++ .../addon/mixin/meteor/MixinSetting.java | 19 - .../MixinClientPlayNetworkHandler.java | 2 +- .../network/MixinClientPlayerEntity.java | 2 - .../addon/mixin/world/MixinClientWorld.java | 11 + .../{ => systems}/hud/ActiveGenyoHud.java | 4 +- .../systems/hud/BetterPlayerRadarHud.java | 308 +++++++++++ .../addon/{ => systems}/hud/InCombatHud.java | 3 +- .../addon/{ => systems}/hud/PacketsHud.java | 5 +- .../{ => systems}/hud/PvPNeccessaryHud.java | 3 +- .../genyo/addon/systems/hud/WatermarkHud.java | 71 +++ .../{ => systems}/modules/GenyoModule.java | 2 +- .../{ => systems}/modules/PlacerModule.java | 3 +- .../modules/combat/GenyoAutoArmor.java | 286 +++++++++++ .../modules/combat/GenyoAutoCrystal.java | 185 ++++--- .../modules/combat/GenyoAutoTotem.java | 18 +- .../systems/modules/combat/GenyoAutoTrap.java | 480 ++++++++++++++++++ .../systems/modules/combat/GenyoAutoXP.java | 162 ++++++ .../modules/combat/GenyoCriticals.java | 10 +- .../modules/combat/GenyoReplenish.java | 4 +- .../modules/combat/KFCSpawnKill.java | 10 +- .../modules/misc/CombatBrainrot.java | 10 +- .../modules/misc/GenyoAutoEZ.java | 4 +- .../modules/misc/GenyoDiscord.java | 5 +- .../modules/misc/GenyoGoodbye.java | 8 +- .../modules/misc/GenyoSkinBlink.java | 24 +- .../modules/misc/GenyoWelcome.java | 8 +- .../modules/misc/PacketDebug.java | 7 +- .../modules/movement/GenyoVelocity.java | 8 +- .../modules/visual/AngelSexHulkenberg.java | 4 +- .../systems/modules/visual/GenyoCapes.java | 20 + .../modules/visual/GenyoPenisESP.java | 10 +- .../modules/world/GenyoAutoMine.java | 8 +- .../modules/world/GenyoAutoTool.java | 4 +- .../modules/world/GenyoGhostBlocks.java | 4 +- .../modules/world/GenyoScaffold.java | 4 +- .../modules/world/GenyoSelfTrap.java | 6 +- .../modules/world/GenyoSpeedmine.java | 357 ++++--------- .../modules/world/GenyoSurround.java | 4 +- .../modules/world/GenyoSurroundV2.java | 6 +- .../screens/ListGroupScreen.java | 8 +- .../{ => systems}/settings/FloatSetting.java | 2 +- .../settings/playerlist/ListGroupSetting.java | 4 +- .../settings/playerlist/ListPlayer.java | 2 +- .../settings/playerlist/PLGroup.java | 2 +- .../addon/utils/math/timer/TickTimer.java | 71 +++ .../resources/assets/genyo/textures/cape.png | Bin 0 -> 1398 bytes src/main/resources/genyo.mixins.json | 2 +- 55 files changed, 1806 insertions(+), 494 deletions(-) delete mode 100644 src/main/java/com/genyo/addon/events/meteor/SettingChangedEvent.java create mode 100644 src/main/java/com/genyo/addon/events/world/AddEntityEvent.java create mode 100644 src/main/java/com/genyo/addon/managers/SocialManager.java create mode 100644 src/main/java/com/genyo/addon/mixin/entity/player/MixinPlayerListEntry.java delete mode 100644 src/main/java/com/genyo/addon/mixin/meteor/MixinSetting.java rename src/main/java/com/genyo/addon/{ => systems}/hud/ActiveGenyoHud.java (99%) create mode 100644 src/main/java/com/genyo/addon/systems/hud/BetterPlayerRadarHud.java rename src/main/java/com/genyo/addon/{ => systems}/hud/InCombatHud.java (98%) rename src/main/java/com/genyo/addon/{ => systems}/hud/PacketsHud.java (95%) rename src/main/java/com/genyo/addon/{ => systems}/hud/PvPNeccessaryHud.java (98%) create mode 100644 src/main/java/com/genyo/addon/systems/hud/WatermarkHud.java rename src/main/java/com/genyo/addon/{ => systems}/modules/GenyoModule.java (99%) rename src/main/java/com/genyo/addon/{ => systems}/modules/PlacerModule.java (98%) create mode 100644 src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoArmor.java rename src/main/java/com/genyo/addon/{ => systems}/modules/combat/GenyoAutoCrystal.java (94%) rename src/main/java/com/genyo/addon/{ => systems}/modules/combat/GenyoAutoTotem.java (97%) create mode 100644 src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoTrap.java create mode 100644 src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoXP.java rename src/main/java/com/genyo/addon/{ => systems}/modules/combat/GenyoCriticals.java (97%) rename src/main/java/com/genyo/addon/{ => systems}/modules/combat/GenyoReplenish.java (98%) rename src/main/java/com/genyo/addon/{ => systems}/modules/combat/KFCSpawnKill.java (99%) rename src/main/java/com/genyo/addon/{ => systems}/modules/misc/CombatBrainrot.java (89%) rename src/main/java/com/genyo/addon/{ => systems}/modules/misc/GenyoAutoEZ.java (98%) rename src/main/java/com/genyo/addon/{ => systems}/modules/misc/GenyoDiscord.java (98%) rename src/main/java/com/genyo/addon/{ => systems}/modules/misc/GenyoGoodbye.java (94%) rename src/main/java/com/genyo/addon/{ => systems}/modules/misc/GenyoSkinBlink.java (68%) rename src/main/java/com/genyo/addon/{ => systems}/modules/misc/GenyoWelcome.java (95%) rename src/main/java/com/genyo/addon/{ => systems}/modules/misc/PacketDebug.java (95%) rename src/main/java/com/genyo/addon/{ => systems}/modules/movement/GenyoVelocity.java (98%) rename src/main/java/com/genyo/addon/{ => systems}/modules/visual/AngelSexHulkenberg.java (99%) create mode 100644 src/main/java/com/genyo/addon/systems/modules/visual/GenyoCapes.java rename src/main/java/com/genyo/addon/{ => systems}/modules/visual/GenyoPenisESP.java (95%) rename src/main/java/com/genyo/addon/{ => systems}/modules/world/GenyoAutoMine.java (99%) rename src/main/java/com/genyo/addon/{ => systems}/modules/world/GenyoAutoTool.java (95%) rename src/main/java/com/genyo/addon/{ => systems}/modules/world/GenyoGhostBlocks.java (97%) rename src/main/java/com/genyo/addon/{ => systems}/modules/world/GenyoScaffold.java (99%) rename src/main/java/com/genyo/addon/{ => systems}/modules/world/GenyoSelfTrap.java (99%) rename src/main/java/com/genyo/addon/{ => systems}/modules/world/GenyoSpeedmine.java (70%) rename src/main/java/com/genyo/addon/{ => systems}/modules/world/GenyoSurround.java (98%) rename src/main/java/com/genyo/addon/{ => systems}/modules/world/GenyoSurroundV2.java (99%) rename src/main/java/com/genyo/addon/{ => systems}/screens/ListGroupScreen.java (95%) rename src/main/java/com/genyo/addon/{ => systems}/settings/FloatSetting.java (98%) rename src/main/java/com/genyo/addon/{ => systems}/settings/playerlist/ListGroupSetting.java (98%) rename src/main/java/com/genyo/addon/{ => systems}/settings/playerlist/ListPlayer.java (98%) rename src/main/java/com/genyo/addon/{ => systems}/settings/playerlist/PLGroup.java (96%) create mode 100644 src/main/java/com/genyo/addon/utils/math/timer/TickTimer.java create mode 100644 src/main/resources/assets/genyo/textures/cape.png diff --git a/src/main/java/com/genyo/addon/GenyoAddon.java b/src/main/java/com/genyo/addon/GenyoAddon.java index 0faa23d..adb5f36 100644 --- a/src/main/java/com/genyo/addon/GenyoAddon.java +++ b/src/main/java/com/genyo/addon/GenyoAddon.java @@ -1,20 +1,18 @@ package com.genyo.addon; -import com.genyo.addon.hud.ActiveGenyoHud; -import com.genyo.addon.hud.PacketsHud; -import com.genyo.addon.modules.combat.*; -import com.genyo.addon.modules.misc.*; -import com.genyo.addon.modules.movement.GenyoVelocity; -import com.genyo.addon.modules.visual.AngelSexHulkenberg; -import com.genyo.addon.modules.visual.GenyoPenisESP; -import com.genyo.addon.modules.world.*; +import com.genyo.addon.systems.hud.*; +import com.genyo.addon.systems.modules.combat.*; +import com.genyo.addon.systems.modules.misc.*; +import com.genyo.addon.systems.modules.movement.GenyoVelocity; +import com.genyo.addon.systems.modules.visual.AngelSexHulkenberg; +import com.genyo.addon.systems.modules.visual.GenyoCapes; +import com.genyo.addon.systems.modules.visual.GenyoPenisESP; import com.genyo.addon.systems.enemies.EnemiesTab; -import com.genyo.addon.hud.InCombatHud; -import com.genyo.addon.hud.PvPNeccessaryHud; import com.genyo.addon.managers.Managers; import com.genyo.addon.systems.enemies.Enemies; import com.genyo.addon.systems.incombat.InCombatSystem; import com.genyo.addon.systems.incombat.InCombatTab; +import com.genyo.addon.systems.modules.world.*; import com.mojang.logging.LogUtils; import meteordevelopment.meteorclient.addons.GithubRepo; import meteordevelopment.meteorclient.addons.MeteorAddon; @@ -114,6 +112,10 @@ private void initModules(Modules modules) { modules.add(new CombatBrainrot()); modules.add(new PacketDebug()); modules.add(new GenyoAutoMine()); + modules.add(new GenyoAutoXP()); + modules.add(new GenyoAutoArmor()); + modules.add(new GenyoAutoTrap()); + modules.add(new GenyoCapes()); } private void initHUD(Hud hud) { @@ -121,6 +123,8 @@ private void initHUD(Hud hud) { hud.register(InCombatHud.INFO); hud.register(ActiveGenyoHud.INFO); hud.register(PacketsHud.INFO); + hud.register(WatermarkHud.INFO); + hud.register(BetterPlayerRadarHud.INFO); } @Override diff --git a/src/main/java/com/genyo/addon/events/meteor/SettingChangedEvent.java b/src/main/java/com/genyo/addon/events/meteor/SettingChangedEvent.java deleted file mode 100644 index 4e4db2b..0000000 --- a/src/main/java/com/genyo/addon/events/meteor/SettingChangedEvent.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.genyo.addon.events.meteor; - -import meteordevelopment.meteorclient.settings.Setting; - -public class SettingChangedEvent { - - private static final SettingChangedEvent INSTANCE = new SettingChangedEvent(); - - public Setting setting; - - public static SettingChangedEvent get(Setting setting) { - INSTANCE.setting = setting; - - return INSTANCE; - } - -} diff --git a/src/main/java/com/genyo/addon/events/world/AddEntityEvent.java b/src/main/java/com/genyo/addon/events/world/AddEntityEvent.java new file mode 100644 index 0000000..891d5c9 --- /dev/null +++ b/src/main/java/com/genyo/addon/events/world/AddEntityEvent.java @@ -0,0 +1,16 @@ +package com.genyo.addon.events.world; + +import net.minecraft.entity.Entity; + +public class AddEntityEvent { + + private static final AddEntityEvent INSTANCE = new AddEntityEvent(); + public Entity entity; + + public static AddEntityEvent get(Entity entity) { + INSTANCE.entity = entity; + + return INSTANCE; + } + +} diff --git a/src/main/java/com/genyo/addon/managers/Managers.java b/src/main/java/com/genyo/addon/managers/Managers.java index d00fd61..c4f3951 100644 --- a/src/main/java/com/genyo/addon/managers/Managers.java +++ b/src/main/java/com/genyo/addon/managers/Managers.java @@ -29,6 +29,7 @@ public class Managers { public static final PositionManager POSITION = new PositionManager(); public static final AntiCheatManager ANTICHEAT = new AntiCheatManager(); public static final TickManager TICK = new TickManager(); + public static final SocialManager SOCIAL = new SocialManager(); public static void subscribe() { MeteorClient.EVENT_BUS.subscribe(COMBAT); diff --git a/src/main/java/com/genyo/addon/managers/SocialManager.java b/src/main/java/com/genyo/addon/managers/SocialManager.java new file mode 100644 index 0000000..769a477 --- /dev/null +++ b/src/main/java/com/genyo/addon/managers/SocialManager.java @@ -0,0 +1,17 @@ +package com.genyo.addon.managers; + +import meteordevelopment.meteorclient.systems.friends.Friend; +import meteordevelopment.meteorclient.systems.friends.Friends; +import net.minecraft.entity.player.PlayerEntity; + +public class SocialManager { + + public boolean isFriend(PlayerEntity player) { + return Friends.get().isFriend(player); + } + + public boolean isFriend(String name) { + if (Friends.get().get(name) != null) return true; + return false; + } +} diff --git a/src/main/java/com/genyo/addon/managers/network/GDTogglerManager.java b/src/main/java/com/genyo/addon/managers/network/GDTogglerManager.java index ab32369..eef494c 100644 --- a/src/main/java/com/genyo/addon/managers/network/GDTogglerManager.java +++ b/src/main/java/com/genyo/addon/managers/network/GDTogglerManager.java @@ -1,6 +1,6 @@ package com.genyo.addon.managers.network; -import com.genyo.addon.modules.misc.GenyoDiscord; +import com.genyo.addon.systems.modules.misc.GenyoDiscord; import com.genyo.addon.utils.GenyoChatUtils; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.systems.modules.Modules; diff --git a/src/main/java/com/genyo/addon/mixin/DefaultSettingsWidgetFactoryMixin.java b/src/main/java/com/genyo/addon/mixin/DefaultSettingsWidgetFactoryMixin.java index 82dff8f..483a487 100644 --- a/src/main/java/com/genyo/addon/mixin/DefaultSettingsWidgetFactoryMixin.java +++ b/src/main/java/com/genyo/addon/mixin/DefaultSettingsWidgetFactoryMixin.java @@ -1,7 +1,7 @@ package com.genyo.addon.mixin; -import com.genyo.addon.settings.FloatSetting; -import com.genyo.addon.settings.playerlist.ListGroupSetting; +import com.genyo.addon.systems.settings.FloatSetting; +import com.genyo.addon.systems.settings.playerlist.ListGroupSetting; import meteordevelopment.meteorclient.gui.DefaultSettingsWidgetFactory; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.utils.SettingsWidgetFactory; diff --git a/src/main/java/com/genyo/addon/mixin/entity/player/MixinPlayerListEntry.java b/src/main/java/com/genyo/addon/mixin/entity/player/MixinPlayerListEntry.java new file mode 100644 index 0000000..c0fa2c1 --- /dev/null +++ b/src/main/java/com/genyo/addon/mixin/entity/player/MixinPlayerListEntry.java @@ -0,0 +1,39 @@ +package com.genyo.addon.mixin.entity.player; + +import com.genyo.addon.systems.modules.visual.GenyoCapes; +import com.mojang.authlib.GameProfile; +import meteordevelopment.meteorclient.systems.modules.Modules; +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.client.util.SkinTextures; +import net.minecraft.util.Identifier; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +@Mixin(PlayerListEntry.class) +public abstract class MixinPlayerListEntry { + + @Shadow + @Final + private GameProfile profile; + + @Inject(method = "getSkinTextures", at = @At("TAIL"), cancellable = true) + private void getSkinTextures(CallbackInfoReturnable info) { + if (((profile.getName().equals(mc.player.getGameProfile().getName()) + && profile.getId().equals(mc.player.getGameProfile().getId()))) + && Modules.get().isActive(GenyoCapes.class) + && Modules.get().get(GenyoCapes.class).getCapeTexture() != null) + { + Identifier identifier = Modules.get().get(GenyoCapes.class).getCapeTexture(); + SkinTextures texture = info.getReturnValue(); + + info.setReturnValue(new SkinTextures(texture.texture(), texture.textureUrl(), identifier, identifier, texture.model(), texture.secure())); + } + } + +} diff --git a/src/main/java/com/genyo/addon/mixin/meteor/MixinSetting.java b/src/main/java/com/genyo/addon/mixin/meteor/MixinSetting.java deleted file mode 100644 index 81babc5..0000000 --- a/src/main/java/com/genyo/addon/mixin/meteor/MixinSetting.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.genyo.addon.mixin.meteor; - -import com.genyo.addon.events.meteor.SettingChangedEvent; -import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.settings.Setting; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(Setting.class) -public class MixinSetting { - - /*@Inject(method = "onChanged()V", at = @At("TAIL")) - protected void injectOnChanged(CallbackInfo ci) { - MeteorClient.EVENT_BUS.post(SettingChangedEvent.get((Setting) (Object) this)); - }*/ - -} diff --git a/src/main/java/com/genyo/addon/mixin/network/MixinClientPlayNetworkHandler.java b/src/main/java/com/genyo/addon/mixin/network/MixinClientPlayNetworkHandler.java index 263b6bf..113edca 100644 --- a/src/main/java/com/genyo/addon/mixin/network/MixinClientPlayNetworkHandler.java +++ b/src/main/java/com/genyo/addon/mixin/network/MixinClientPlayNetworkHandler.java @@ -2,7 +2,7 @@ import com.genyo.addon.mixin.accessor.AccessorClientConnection; import com.genyo.addon.imixins.IClientPlayNetworkHandler; -import com.genyo.addon.modules.movement.GenyoVelocity; +import com.genyo.addon.systems.modules.movement.GenyoVelocity; import meteordevelopment.meteorclient.mixininterface.IExplosionS2CPacket; import meteordevelopment.meteorclient.systems.modules.Modules; import net.minecraft.client.network.ClientPlayNetworkHandler; diff --git a/src/main/java/com/genyo/addon/mixin/network/MixinClientPlayerEntity.java b/src/main/java/com/genyo/addon/mixin/network/MixinClientPlayerEntity.java index a23b383..54d6c5c 100644 --- a/src/main/java/com/genyo/addon/mixin/network/MixinClientPlayerEntity.java +++ b/src/main/java/com/genyo/addon/mixin/network/MixinClientPlayerEntity.java @@ -5,7 +5,6 @@ import com.genyo.addon.events.network.*; import com.genyo.addon.imixins.IClientPlayerEntity; import meteordevelopment.meteorclient.MeteorClient; -import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.util.Hand; import org.spongepowered.asm.mixin.Mixin; @@ -15,7 +14,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import static com.genyo.addon.modules.GenyoModule.fullNullCheck; import static meteordevelopment.meteorclient.MeteorClient.mc; @Mixin(ClientPlayerEntity.class) diff --git a/src/main/java/com/genyo/addon/mixin/world/MixinClientWorld.java b/src/main/java/com/genyo/addon/mixin/world/MixinClientWorld.java index 9e98998..f6ac961 100644 --- a/src/main/java/com/genyo/addon/mixin/world/MixinClientWorld.java +++ b/src/main/java/com/genyo/addon/mixin/world/MixinClientWorld.java @@ -1,5 +1,6 @@ package com.genyo.addon.mixin.world; +import com.genyo.addon.events.world.AddEntityEvent; import com.genyo.addon.events.world.RemoveEntityEvent; import meteordevelopment.meteorclient.MeteorClient; import net.minecraft.client.world.ClientWorld; @@ -31,4 +32,14 @@ private void hookRemoveEntity(int entityId, Entity.RemovalReason removalReason, MeteorClient.EVENT_BUS.post(removeEntityEvent); } + /** + * @param entity + * @param ci + */ + @Inject(method = "addEntity", at = @At(value = "HEAD")) + private void hookAddEntity(Entity entity, CallbackInfo ci) + { + MeteorClient.EVENT_BUS.post(AddEntityEvent.get(entity)); + } + } diff --git a/src/main/java/com/genyo/addon/hud/ActiveGenyoHud.java b/src/main/java/com/genyo/addon/systems/hud/ActiveGenyoHud.java similarity index 99% rename from src/main/java/com/genyo/addon/hud/ActiveGenyoHud.java rename to src/main/java/com/genyo/addon/systems/hud/ActiveGenyoHud.java index 0aa7f70..f70c198 100644 --- a/src/main/java/com/genyo/addon/hud/ActiveGenyoHud.java +++ b/src/main/java/com/genyo/addon/systems/hud/ActiveGenyoHud.java @@ -1,7 +1,7 @@ -package com.genyo.addon.hud; +package com.genyo.addon.systems.hud; import com.genyo.addon.GenyoAddon; -import com.genyo.addon.modules.GenyoModule; +import com.genyo.addon.systems.modules.GenyoModule; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.hud.*; import meteordevelopment.meteorclient.systems.modules.Module; diff --git a/src/main/java/com/genyo/addon/systems/hud/BetterPlayerRadarHud.java b/src/main/java/com/genyo/addon/systems/hud/BetterPlayerRadarHud.java new file mode 100644 index 0000000..420712c --- /dev/null +++ b/src/main/java/com/genyo/addon/systems/hud/BetterPlayerRadarHud.java @@ -0,0 +1,308 @@ +package com.genyo.addon.systems.hud; + +import com.genyo.addon.GenyoAddon; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.systems.friends.Friends; +import meteordevelopment.meteorclient.systems.hud.*; +import meteordevelopment.meteorclient.utils.entity.EntityUtils; +import meteordevelopment.meteorclient.utils.player.PlayerUtils; +import meteordevelopment.meteorclient.utils.render.color.Color; +import meteordevelopment.meteorclient.utils.render.color.SettingColor; +import net.minecraft.client.gui.PlayerSkinDrawer; +import net.minecraft.client.network.AbstractClientPlayerEntity; +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.entity.player.PlayerEntity; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +public class BetterPlayerRadarHud extends HudElement { + + public static final HudElementInfo INFO = new HudElementInfo<>(GenyoAddon.HUD_GROUP, "player-radar", "Displays players in your visual range.", BetterPlayerRadarHud::new); + + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgFeatures = settings.createGroup("Features"); + private final SettingGroup sgScale = settings.createGroup("Scale"); + private final SettingGroup sgBackground = settings.createGroup("Background"); + + // General + + private final Setting limit = sgGeneral.add(new IntSetting.Builder() + .name("limit") + .description("The max number of players to show.") + .defaultValue(10) + .min(1) + .sliderRange(1, 20) + .build() + ); + + private final Setting friends = sgGeneral.add(new BoolSetting.Builder() + .name("display-friends") + .description("Whether to show friends or not.") + .defaultValue(true) + .build() + ); + + private final Setting shadow = sgGeneral.add(new BoolSetting.Builder() + .name("shadow") + .description("Renders shadow behind text.") + .defaultValue(true) + .build() + ); + + private final Setting primaryColor = sgGeneral.add(new ColorSetting.Builder() + .name("primary-color") + .description("Primary color.") + .defaultValue(new SettingColor()) + .build() + ); + + private final Setting secondaryColor = sgGeneral.add(new ColorSetting.Builder() + .name("secondary-color") + .description("Secondary color.") + .defaultValue(new SettingColor(175, 175, 175)) + .build() + ); + + private final Setting alignment = sgGeneral.add(new EnumSetting.Builder() + .name("alignment") + .description("Horizontal alignment.") + .defaultValue(Alignment.Auto) + .build() + ); + + private final Setting border = sgGeneral.add(new IntSetting.Builder() + .name("border") + .description("How much space to add around the element.") + .defaultValue(0) + .build() + ); + + // Features + + private final Setting heads = sgFeatures.add(new BoolSetting.Builder() + .name("Heads") + .description("Display head icons") + .defaultValue(true) + .build() + ); + + private final Setting distance = sgFeatures.add(new BoolSetting.Builder() + .name("distance") + .description("Shows the distance to the player next to their name.") + .defaultValue(false) + .build() + ); + + private final Setting health = sgFeatures.add(new BoolSetting.Builder() + .name("Health") + .description("Display health") + .defaultValue(true) + .build() + ); + + private final Setting ping = sgFeatures.add(new BoolSetting.Builder() + .name("Ping") + .description("Display ping") + .defaultValue(true) + .build() + ); + + // Scale + + private final Setting customScale = sgScale.add(new BoolSetting.Builder() + .name("custom-scale") + .description("Applies a custom scale to this hud element.") + .defaultValue(false) + .visible(() -> false) + .build() + ); + + private final Setting scale = sgScale.add(new DoubleSetting.Builder() + .name("scale") + .description("Custom scale.") + .visible(customScale::get) + .defaultValue(1) + .min(0.5) + .sliderRange(0.5, 3) + .build() + ); + + // Background + + private final Setting background = sgBackground.add(new BoolSetting.Builder() + .name("background") + .description("Displays background.") + .defaultValue(false) + .build() + ); + + private final Setting backgroundColor = sgBackground.add(new ColorSetting.Builder() + .name("background-color") + .description("Color used for the background.") + .visible(background::get) + .defaultValue(new SettingColor(25, 25, 25, 50)) + .build() + ); + + private final List players = new ArrayList<>(); + private final Color WHITE = new Color(255, 255, 255); + private final Color RED = new Color(255, 25, 25); + private final Color AMBER = new Color(255, 105, 25); + private final Color GREEN = new Color(25, 252, 25); + private final Color GOLD = new Color(232, 185, 35); + + public BetterPlayerRadarHud() { + super(INFO); + } + + @Override + public void setSize(double width, double height) { + super.setSize(width + border.get() * 2, height + border.get() * 2); + } + + @Override + protected double alignX(double width, Alignment alignment) { + return box.alignX(getWidth() - border.get() * 2, width, alignment); + } + + @Override + public void tick(HudRenderer renderer) { + double width = renderer.textWidth("Players:", shadow.get(), getScale()); + double height = renderer.textHeight(shadow.get(), getScale()); + + if (mc.world == null) { + setSize(width, height); + return; + } + + for (PlayerEntity player : getPlayers()) { + if (player.equals(mc.player)) continue; + if (!friends.get() && Friends.get().isFriend(player)) continue; + + String text = player.getName().getString(); + if (heads.get()) text += "as"; // 2 letter space + if (distance.get()) text += String.format("| %sm", Math.round(PlayerUtils.distanceToCamera(player) * 10.0) / 10.0); + if (ping.get()) text += String.format("| %sms", EntityUtils.getPing(player)); + + // Health + float absorption = player.getAbsorptionAmount(); + int healthInt = Math.round(player.getHealth() + absorption); + + String healthText = String.format("| %s", healthInt); + + if (health.get()) text += healthText; + + width = Math.max(width, renderer.textWidth(text, shadow.get(), getScale())); + height += renderer.textHeight(shadow.get(), getScale()) + 2; + } + + setSize(width, height); + } + + @Override + public void render(HudRenderer renderer) { + double y = this.y + border.get(); + + if (background.get()) { + renderer.quad(this.x, this.y, getWidth(), getHeight(), backgroundColor.get()); + } + + renderer.text("Players:", x + border.get() + alignX(renderer.textWidth("Players:", shadow.get(), getScale()), alignment.get()), y, secondaryColor.get(), shadow.get(), getScale()); + + if (mc.world == null) return; + double spaceWidth = renderer.textWidth(" ", shadow.get(), getScale()); + + for (PlayerEntity entity : getPlayers()) { + if (entity.equals(mc.player)) continue; + if (!friends.get() && Friends.get().isFriend(entity)) continue; + + String text = entity.getName().getString(); + Color color = PlayerUtils.getPlayerColor(entity, primaryColor.get()); + + // Strings + String distanceText = null; + String healthText = null; + String pingText = null; + + // Health + Color healthColor = null; + + + double width = renderer.textWidth(text, shadow.get(), getScale()); + + + if (distance.get()) { + width += spaceWidth; + distanceText = String.format("(%.1fm)", mc.getCameraEntity().distanceTo(entity)); + width += renderer.textWidth(distanceText, shadow.get(), getScale()); + } + + double x = this.x + border.get() + + alignX(width, alignment.get()); + y += renderer.textHeight(shadow.get(), getScale()) + 2; + + if (heads.get()) { + x += 16 + spaceWidth; + + PlayerListEntry entry = mc.getNetworkHandler().getPlayerListEntry(entity.getUuid()); + if (entry != null) { + PlayerSkinDrawer.draw(renderer.drawContext, entry.getSkinTextures(), (int) this.x + border.get(), (int) y, (int) 16); + } + } + + if (ping.get()) { + int ping = EntityUtils.getPing(entity); + width += spaceWidth; + pingText = "| " + ping + "ms"; + width += renderer.textWidth(pingText, shadow.get(), getScale()); + } + + if (health.get()) { + // Health + float absorption = entity.getAbsorptionAmount(); + int healthInt = Math.round(entity.getHealth() + absorption); + double healthPercentage = healthInt / (entity.getMaxHealth() + absorption); + + if (healthPercentage <= 0.333) healthColor = RED; + else if (healthPercentage <= 0.666) healthColor = AMBER; + else healthColor = GREEN; + + width += spaceWidth; + healthText = String.format("| %s", healthInt); + width += renderer.textWidth(healthText, shadow.get(), getScale()); + } + + x = renderer.text(text, x, y, color, shadow.get()); + if (distance.get()) { + renderer.text(distanceText, x + spaceWidth, y, secondaryColor.get(), shadow.get(), getScale()); + x += spaceWidth + renderer.textWidth(distanceText, shadow.get(), getScale()); + } + if (ping.get()) { + renderer.text(pingText, x + spaceWidth, y, secondaryColor.get(), shadow.get(), getScale()); + x += spaceWidth + renderer.textWidth(pingText, shadow.get(), getScale()); + } + if (health.get()) { + renderer.text(healthText, x + spaceWidth, y, healthColor, shadow.get(), getScale()); + x += spaceWidth; + } + } + } + + private List getPlayers() { + players.clear(); + players.addAll(mc.world.getPlayers()); + if (players.size() > limit.get()) players.subList(limit.get() - 1, players.size() - 1).clear(); + players.sort(Comparator.comparingDouble(e -> e.squaredDistanceTo(mc.getCameraEntity()))); + + return players; + } + + private double getScale() { + return customScale.get() ? scale.get() : Hud.get().getTextScale(); + } + +} diff --git a/src/main/java/com/genyo/addon/hud/InCombatHud.java b/src/main/java/com/genyo/addon/systems/hud/InCombatHud.java similarity index 98% rename from src/main/java/com/genyo/addon/hud/InCombatHud.java rename to src/main/java/com/genyo/addon/systems/hud/InCombatHud.java index 7c2a3fc..d0c4f7a 100644 --- a/src/main/java/com/genyo/addon/hud/InCombatHud.java +++ b/src/main/java/com/genyo/addon/systems/hud/InCombatHud.java @@ -1,4 +1,4 @@ -package com.genyo.addon.hud; +package com.genyo.addon.systems.hud; import com.genyo.addon.GenyoAddon; import com.genyo.addon.systems.incombat.CombatPerson; @@ -7,7 +7,6 @@ import meteordevelopment.meteorclient.systems.hud.*; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.entity.player.PlayerEntity; import static meteordevelopment.meteorclient.MeteorClient.mc; diff --git a/src/main/java/com/genyo/addon/hud/PacketsHud.java b/src/main/java/com/genyo/addon/systems/hud/PacketsHud.java similarity index 95% rename from src/main/java/com/genyo/addon/hud/PacketsHud.java rename to src/main/java/com/genyo/addon/systems/hud/PacketsHud.java index 0829745..4fbea63 100644 --- a/src/main/java/com/genyo/addon/hud/PacketsHud.java +++ b/src/main/java/com/genyo/addon/systems/hud/PacketsHud.java @@ -1,4 +1,4 @@ -package com.genyo.addon.hud; +package com.genyo.addon.systems.hud; import com.genyo.addon.GenyoAddon; import com.genyo.addon.managers.Managers; @@ -49,7 +49,6 @@ public class PacketsHud extends HudElement { .name("custom-scale") .description("Applies a custom scale to this hud element.") .defaultValue(false) - .visible(() -> false) .build() ); @@ -105,7 +104,7 @@ public void render(HudRenderer renderer) { renderer.text(packetsString, x, y, invertColors.get() ? Color.GRAY : Color.WHITE, shadow.get(), getScale()); String thing = String.format("%s <- %s", Managers.NETWORK.getOutgoingPPS(), Managers.NETWORK.getIncomingPPS()); - renderer.text(thing, x + renderer.textWidth(packetsString) + (renderer.textWidth(" ") * getScale()), y, invertColors.get() ? Color.WHITE : Color.GRAY, shadow.get(), getScale()); + renderer.text(thing, x + renderer.textWidth(packetsString, shadow.get(), getScale()) + (renderer.textWidth(" ") * getScale()), y, invertColors.get() ? Color.WHITE : Color.GRAY, shadow.get(), getScale()); setSize(renderer.textWidth(packetsString + thing), renderer.textHeight(shadow.get(), getScale())); diff --git a/src/main/java/com/genyo/addon/hud/PvPNeccessaryHud.java b/src/main/java/com/genyo/addon/systems/hud/PvPNeccessaryHud.java similarity index 98% rename from src/main/java/com/genyo/addon/hud/PvPNeccessaryHud.java rename to src/main/java/com/genyo/addon/systems/hud/PvPNeccessaryHud.java index 55bf66c..7c1167a 100644 --- a/src/main/java/com/genyo/addon/hud/PvPNeccessaryHud.java +++ b/src/main/java/com/genyo/addon/systems/hud/PvPNeccessaryHud.java @@ -1,7 +1,6 @@ -package com.genyo.addon.hud; +package com.genyo.addon.systems.hud; import com.genyo.addon.GenyoAddon; -import com.genyo.addon.utils.GInvUtils; import com.genyo.addon.utils.HudUtils; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.hud.HudElement; diff --git a/src/main/java/com/genyo/addon/systems/hud/WatermarkHud.java b/src/main/java/com/genyo/addon/systems/hud/WatermarkHud.java new file mode 100644 index 0000000..f9c675b --- /dev/null +++ b/src/main/java/com/genyo/addon/systems/hud/WatermarkHud.java @@ -0,0 +1,71 @@ +package com.genyo.addon.systems.hud; + +import com.genyo.addon.GenyoAddon; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.systems.hud.Hud; +import meteordevelopment.meteorclient.systems.hud.HudElement; +import meteordevelopment.meteorclient.systems.hud.HudElementInfo; +import meteordevelopment.meteorclient.systems.hud.HudRenderer; +import meteordevelopment.meteorclient.utils.render.color.Color; +import meteordevelopment.meteorclient.utils.render.color.SettingColor; + +public class WatermarkHud extends HudElement { + + public static final HudElementInfo INFO = new HudElementInfo<>(GenyoAddon.HUD_GROUP, "watermark", "The best thing in the entire addon.", WatermarkHud::new); + + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgScale = settings.createGroup("Scale"); + + private final Setting shadow = sgGeneral.add(new BoolSetting.Builder() + .name("shadow") + .description("Renders shadow behind text.") + .defaultValue(true) + .build() + ); + + private final Setting color = sgGeneral.add(new ColorSetting.Builder() + .name("Color") + .description("The") + .defaultValue(Color.WHITE) + .build() + ); + + // Scale + + private final Setting customScale = sgScale.add(new BoolSetting.Builder() + .name("custom-scale") + .description("Applies a custom scale to this hud element.") + .defaultValue(false) + .build() + ); + + private final Setting scale = sgScale.add(new DoubleSetting.Builder() + .name("scale") + .description("Custom scale.") + .visible(customScale::get) + .defaultValue(1) + .min(0.5) + .sliderRange(0.5, 3) + .build() + ); + + public WatermarkHud() { + super(INFO); + } + + private double getScale() { + return customScale.get() ? scale.get() : Hud.get().getTextScale(); + } + + @Override + public void tick(HudRenderer renderer) { + setSize(renderer.textWidth("Genyo " + GenyoAddon.VERSION, shadow.get(), getScale()), renderer.textHeight(shadow.get(), getScale())); + } + + @Override + public void render(HudRenderer renderer) { + renderer.text("Genyo ", x, y, color.get(), shadow.get(), getScale()); + renderer.text(GenyoAddon.VERSION.toString(), x + renderer.textWidth("Genyo ", shadow.get(), getScale()), y, color.get(), shadow.get(), getScale()); + } + +} diff --git a/src/main/java/com/genyo/addon/modules/GenyoModule.java b/src/main/java/com/genyo/addon/systems/modules/GenyoModule.java similarity index 99% rename from src/main/java/com/genyo/addon/modules/GenyoModule.java rename to src/main/java/com/genyo/addon/systems/modules/GenyoModule.java index dad9fee..c1d263d 100644 --- a/src/main/java/com/genyo/addon/modules/GenyoModule.java +++ b/src/main/java/com/genyo/addon/systems/modules/GenyoModule.java @@ -1,4 +1,4 @@ -package com.genyo.addon.modules; +package com.genyo.addon.systems.modules; import com.genyo.addon.managers.Managers; import com.genyo.addon.managers.player.rotation.Rotation; diff --git a/src/main/java/com/genyo/addon/modules/PlacerModule.java b/src/main/java/com/genyo/addon/systems/modules/PlacerModule.java similarity index 98% rename from src/main/java/com/genyo/addon/modules/PlacerModule.java rename to src/main/java/com/genyo/addon/systems/modules/PlacerModule.java index 86e4fcf..1b8d652 100644 --- a/src/main/java/com/genyo/addon/modules/PlacerModule.java +++ b/src/main/java/com/genyo/addon/systems/modules/PlacerModule.java @@ -1,4 +1,4 @@ -package com.genyo.addon.modules; +package com.genyo.addon.systems.modules; import com.genyo.addon.managers.Managers; import com.genyo.addon.managers.player.rotation.Rotation; @@ -10,7 +10,6 @@ import net.minecraft.block.Blocks; import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; import java.util.HashSet; import java.util.LinkedList; diff --git a/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoArmor.java b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoArmor.java new file mode 100644 index 0000000..dabcac9 --- /dev/null +++ b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoArmor.java @@ -0,0 +1,286 @@ +package com.genyo.addon.systems.modules.combat; + +import com.genyo.addon.GenyoAddon; +import com.genyo.addon.events.network.PlayerTickEvent; +import com.genyo.addon.managers.Managers; +import com.genyo.addon.systems.modules.GenyoModule; +import com.genyo.addon.systems.settings.FloatSetting; +import meteordevelopment.meteorclient.settings.BoolSetting; +import meteordevelopment.meteorclient.settings.EnumSetting; +import meteordevelopment.meteorclient.settings.Setting; +import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.client.gui.screen.ingame.InventoryScreen; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.item.ArmorItem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.entry.RegistryEntry; + +import java.util.PriorityQueue; +import java.util.Queue; + +public class GenyoAutoArmor extends GenyoModule { + + public GenyoAutoArmor() { + super(GenyoAddon.GENYO, "genyo-auto-armor", "Automatically replaces armor pieces."); + } + + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + + private final Setting priorityConfig = sgGeneral.add(new EnumSetting.Builder() + .name("Priority") + .description("Armor enchantment priority") + .defaultValue(Priority.BLAST_PROTECTION) + .build() + ); + + private final Setting minDurabilityConfig = sgGeneral.add(new FloatSetting.Builder() + .name("Min Durability") + .description("Durability percent to replace armor") + .min(0.0f) + .defaultValue(0.0f) + .max(20.0f) + .build() + ); + + private final Setting elytraPriorityConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Elytra Priority") + .description("Prioritizes existing elytras in the chestplate armor slot") + .defaultValue(true) + .build() + ); + + private final Setting blastLeggingsConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Leggings - Blast Priority") + .description("Prioritizes Blast Protection leggings") + .defaultValue(true) + .build() + ); + + private final Setting noBindingConfig = sgGeneral.add(new BoolSetting.Builder() + .name("No Binding") + .description("Avoids armor with the Curse of Binding enchantment") + .defaultValue(true) + .build() + ); + + private final Setting inventoryConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Allow Inventory") + .description("Allows armor to be swapped while in the inventory menu") + .defaultValue(false) + .build() + ); + + // + private final Queue helmet = new PriorityQueue<>(); + private final Queue chestplate = new PriorityQueue<>(); + private final Queue leggings = new PriorityQueue<>(); + private final Queue boots = new PriorityQueue<>(); + + @EventHandler + public void onTick(PlayerTickEvent event) + { + if (mc.currentScreen != null && !(mc.currentScreen instanceof InventoryScreen && inventoryConfig.get())) + { + return; + } + // + helmet.clear(); + chestplate.clear(); + leggings.clear(); + boots.clear(); + for (int j = 0; j < 36; j++) + { + ItemStack stack = mc.player.getInventory().getStack(j); + if (stack.isEmpty() || !(stack.getItem() instanceof ArmorItem armor)) + { + continue; + } + if (noBindingConfig.get() && hasEnchantment(stack, Enchantments.BINDING_CURSE)) + { + continue; + } + int index = stack.get(DataComponentTypes.EQUIPPABLE).slot().getEntitySlotId(); + float dura = (stack.getMaxDamage() - stack.getDamage()) / (float) stack.getMaxDamage(); + if (dura < minDurabilityConfig.get()) + { + continue; + } + ArmorSlot data = new ArmorSlot(index, j, stack); + switch (index) + { + case 0 -> helmet.add(data); + case 1 -> chestplate.add(data); + case 2 -> leggings.add(data); + case 3 -> boots.add(data); + } + } + for (int i = 0; i < 4; i++) + { + ItemStack armorStack = mc.player.getInventory().getArmorStack(i); + if (elytraPriorityConfig.get() && armorStack.getItem() == Items.ELYTRA) + { + continue; + } + float armorDura = (armorStack.getMaxDamage() - armorStack.getDamage()) / (float) armorStack.getMaxDamage(); + if (!armorStack.isEmpty() || armorDura >= minDurabilityConfig.get()) + { + continue; + } + switch (i) + { + case 0 -> + { + if (!helmet.isEmpty()) + { + ArmorSlot helmetSlot = helmet.poll(); + swapArmor(helmetSlot.getType(), helmetSlot.getSlot()); + } + } + case 1 -> + { + if (!chestplate.isEmpty()) + { + ArmorSlot chestSlot = chestplate.poll(); + swapArmor(chestSlot.getType(), chestSlot.getSlot()); + } + } + case 2 -> + { + if (!leggings.isEmpty()) + { + ArmorSlot leggingsSlot = leggings.poll(); + swapArmor(leggingsSlot.getType(), leggingsSlot.getSlot()); + } + } + case 3 -> + { + if (!boots.isEmpty()) + { + ArmorSlot bootsSlot = boots.poll(); + swapArmor(bootsSlot.getType(), bootsSlot.getSlot()); + } + } + } + } + } + + public void swapArmor(int armorSlot, int slot) + { + ItemStack stack = mc.player.getInventory().getArmorStack(armorSlot); + // + armorSlot = 8 - armorSlot; + Managers.INVENTORY.pickupSlot(slot < 9 ? slot + 36 : slot); + boolean rt = !stack.isEmpty(); + Managers.INVENTORY.pickupSlot(armorSlot); + if (rt) + { + Managers.INVENTORY.pickupSlot(slot < 9 ? slot + 36 : slot); + } + } + + public enum Priority + { + BLAST_PROTECTION(Enchantments.BLAST_PROTECTION), + PROTECTION(Enchantments.PROTECTION), + PROJECTILE_PROTECTION(Enchantments.PROJECTILE_PROTECTION); + + // + private final RegistryKey enchant; + + Priority(RegistryKey enchant) + { + this.enchant = enchant; + } + + public RegistryKey getEnchantment() + { + return enchant; + } + } + + public boolean hasEnchantment(ItemStack armorStack, RegistryKey enchantment) + { + if (armorStack.getComponents().contains(DataComponentTypes.ENCHANTMENTS)) + { + for (RegistryEntry entry : armorStack.getComponents() + .get(DataComponentTypes.ENCHANTMENTS).getEnchantments()) + { + if (entry.getKey().isPresent() && entry.getKey().get().equals(enchantment)) + { + return true; + } + } + } + return false; + } + + // + public class ArmorSlot implements Comparable + { + // + private final int armorType; + private final int slot; + private final ItemStack armorStack; + + public ArmorSlot(int armorType, int slot, ItemStack armorStack) + { + this.armorType = armorType; + this.slot = slot; + this.armorStack = armorStack; + } + + @Override + public int compareTo(ArmorSlot other) + { + if (armorType != other.armorType) + { + return 0; + } + final ItemStack otherStack = other.getArmorStack(); + + int armorDura = armorStack.getMaxDamage() - armorStack.getDamage(); + int otherDura = other.armorStack.getMaxDamage() - other.armorStack.getDamage(); + int durabilityDiff = armorDura - otherDura; + + if (durabilityDiff != 0) + { + return durabilityDiff; + } + RegistryKey enchantment = priorityConfig.get().getEnchantment(); + if (blastLeggingsConfig.get() && armorType == 2 + && hasEnchantment(armorStack, Enchantments.BLAST_PROTECTION)) + { + return -1; + } + if (hasEnchantment(armorStack, enchantment)) + { + return hasEnchantment(otherStack, enchantment) ? 0 : -1; + } + else + { + return hasEnchantment(otherStack, enchantment) ? 1 : 0; + } + } + + public ItemStack getArmorStack() + { + return armorStack; + } + + public int getType() + { + return armorType; + } + + public int getSlot() + { + return slot; + } + } + +} diff --git a/src/main/java/com/genyo/addon/modules/combat/GenyoAutoCrystal.java b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoCrystal.java similarity index 94% rename from src/main/java/com/genyo/addon/modules/combat/GenyoAutoCrystal.java rename to src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoCrystal.java index 78a035d..adf7aca 100644 --- a/src/main/java/com/genyo/addon/modules/combat/GenyoAutoCrystal.java +++ b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoCrystal.java @@ -1,14 +1,20 @@ -package com.genyo.addon.modules.combat; +package com.genyo.addon.systems.modules.combat; import com.genyo.addon.GenyoAddon; +import com.genyo.addon.events.network.DisconnectEvent; +import com.genyo.addon.events.world.AddEntityEvent; +import com.genyo.addon.systems.modules.PlacerModule; +import com.genyo.addon.systems.settings.FloatSetting; +import com.genyo.addon.utils.player.RotationUtil; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.utils.render.color.Color; +import meteordevelopment.meteorclient.utils.render.color.SettingColor; import com.genyo.addon.events.network.PlayerTickEvent; import com.genyo.addon.events.RunTickEvent; import com.genyo.addon.managers.Managers; -import com.genyo.addon.modules.GenyoModule; -import com.genyo.addon.modules.world.GenyoAutoMine; -import com.genyo.addon.modules.world.GenyoSurroundV2; +import com.genyo.addon.systems.modules.world.GenyoAutoMine; +import com.genyo.addon.systems.modules.world.GenyoSurroundV2; import com.genyo.addon.render.animation.Animation; -import com.genyo.addon.settings.FloatSetting; import com.genyo.addon.utils.collection.EvictingQueue; import com.genyo.addon.utils.entity.EntityUtil; import com.genyo.addon.utils.math.PerSecondCounter; @@ -19,20 +25,14 @@ import com.genyo.addon.utils.world.BlastResistantBlocks; import com.genyo.addon.utils.world.ExplosionUtil; import com.google.common.collect.Lists; -import meteordevelopment.meteorclient.events.entity.EntityAddedEvent; -import meteordevelopment.meteorclient.events.game.GameLeftEvent; import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.render.Render2DEvent; import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.renderer.text.TextRenderer; -import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.combat.CrystalAura; import meteordevelopment.meteorclient.utils.render.NametagUtils; -import meteordevelopment.meteorclient.utils.render.color.Color; -import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -62,13 +62,14 @@ import net.minecraft.world.RaycastContext; import org.joml.Vector3d; +import java.text.DecimalFormat; import java.util.*; import java.util.concurrent.*; -public class GenyoAutoCrystal extends GenyoModule { +public class GenyoAutoCrystal extends PlacerModule { public GenyoAutoCrystal() { - super(GenyoAddon.GENYO, "genyo-auto-crystal", "neger cock neger cock neger cock"); + super(GenyoAddon.GENYO, "Genyo AutoCrystal", "asd"); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -634,17 +635,12 @@ public GenyoAutoCrystal() { private final Map antiStuckCrystals = new HashMap<>(); private final List stuckCrystals = new CopyOnWriteArrayList<>(); - // Genyo sajkhfjwehfjhwekjfhjkwefew - private final BlockPos.Mutable placeRenderPos = new BlockPos.Mutable(); - private final Vector3d vec3 = new Vector3d(); - private int placeRenderTimer, breakRenderTimer; - private final ExecutorService executor = Executors.newFixedThreadPool(2); - /*@Override - public String getModuleData() + @Override + public String getInfoString() { - if (debug.get()) + if (debugDamage.get()) { return String.format("%sms, %.0f, %dms, %d".formatted( new DecimalFormat("0.00") @@ -659,7 +655,7 @@ public String getModuleData() lastAttackTimer.passed(((20.0f - breakSpeed.get()) * 50.0f) + 2000.0f) ? 0 : getBreakMs(), crystalCounter.getPerSecond()); } - }*/ + } @Override public void onDeactivate() @@ -680,14 +676,16 @@ public void onDeactivate() } @EventHandler - public void onGameLeft(GameLeftEvent event) { + public void onDisconnect(DisconnectEvent event) + { if (disableDeath.get()) { - this.toggle(); + toggle(); + sendDisableMsg("Disabled on death."); } else { - this.onDeactivate(); + onDeactivate(); } } @@ -699,7 +697,6 @@ public void onPlayerUpdate(PlayerTickEvent event) return; } - for (AntiStuckData d : stuckCrystals) { double dist = mc.player.squaredDistanceTo(d.pos()); @@ -774,7 +771,7 @@ else if (placeCrystal != null) { crystalRotation = placeCrystal.damageData.toCenterPos().add(0.0, 0.5, 0.0); } - /*if (rotate.get() && crystalRotation != null && (placeCrystal == null || canHoldCrystal())) + if (rotate.get() && crystalRotation != null && (placeCrystal == null || canHoldCrystal())) { float[] rotations = RotationUtil.getRotationsTo(mc.player.getEyePos(), crystalRotation); if (strictRotate.get() == Rotate.FULL || strictRotate.get() == Rotate.SEMI && attackRotate) @@ -816,7 +813,7 @@ else if (placeCrystal != null) if (isRotationBlocked() || !rotated && rotate.get()) { return; - }*/ + } // if (rotateSilent.get() && silentRotations != null) { // setRotationSilent(silentRotations[0], silentRotations[1]); // } @@ -850,8 +847,10 @@ else if (placeCrystal != null) @EventHandler public void onRunTick(RunTickEvent event) { - if (mc.player == null) return; - + if (mc.player == null) + { + return; + } final Hand hand = getCrystalHand(); if (attackDelay.get() > 0.0) { @@ -864,9 +863,44 @@ public void onRunTick(RunTickEvent event) } } + @EventHandler + public void onRender2D(Render2DEvent event) { + if (!render.get()) return; + + BlockPos renderPos1 = null; + + double factor = 0.0f; + for (Map.Entry set : fadeList.entrySet()) + { + if (set.getValue().getFactor() > factor) + { + renderPos1 = set.getKey(); + factor = set.getValue().getFactor(); + } + } + + if (debugDamage.get() && renderPos1 != null) + { + Vector3d pos = new Vector3d(renderPos1.getX() + 0.5, renderPos1.getY() + 0.5, renderPos1.getZ() + 0.5); + if (NametagUtils.to2D(pos, damageTextScale.get())) { + NametagUtils.begin(pos); + TextRenderer.get().begin(1, false, true); + + String text = String.format("%.1f", renderDamage); + double w = TextRenderer.get().getWidth(text) / 2; + TextRenderer.get().render(text, -w, 0, Color.WHITE.a((int) (255 * factor)), true); + + TextRenderer.get().end(); + NametagUtils.end(); + } + } + } + @EventHandler public void onRender3D(Render3DEvent event) { + if (mc.world == null || mc.player == null) return; + if (render.get()) { BlockPos renderPos1 = null; @@ -891,15 +925,9 @@ public void onRender3D(Render3DEvent event) Color boxColor = color.get().a(boxAlpha); Color lineColor = color.get().a(lineAlpha); - event.renderer.box(BlockPos.ofFloored(set.getKey().toCenterPos()), boxColor, lineColor, ShapeMode.Both, 0); + event.renderer.box(set.getKey(), boxColor, lineColor, ShapeMode.Both, 0); } - /*if (debugDamage.get() && renderPos1 != null) - { - RenderManager.renderSign(String.format("%.1f", renderDamage), - renderPos1.toCenterPos(), new Color(255, 255, 255, (int) (255.0f * factor)).getRGB()); - }*/ - fadeList.entrySet().removeIf(e -> e.getValue().getFactor() == 0.0); @@ -911,30 +939,13 @@ public void onRender3D(Render3DEvent event) } } - @EventHandler - private void onRender2D(Render2DEvent event) { - if (!debugDamage.get()) return; - //if (placeRenderTimer <= 0 && breakRenderTimer <= 0) return; - - vec3.set(placeRenderPos.getX() + 0.5, placeRenderPos.getY() + 0.5, placeRenderPos.getZ() + 0.5); - - if (NametagUtils.to2D(vec3, damageTextScale.get())) { - NametagUtils.begin(vec3); - TextRenderer.get().begin(1, false, true); - - String text = String.format("%.1f", renderDamage); - double w = TextRenderer.get().getWidth(text) / 2; - TextRenderer.get().render(text, -w, 0, color.get().a(255), true); - - TextRenderer.get().end(); - NametagUtils.end(); - } - } - @EventHandler(priority = Integer.MAX_VALUE) public void onPacketReceive(PacketEvent.Receive event) { - if (mc.player == null || mc.world == null) return; + if (mc.player == null || mc.world == null) + { + return; + } if (event.packet instanceof BundleS2CPacket packet) { @@ -1013,11 +1024,12 @@ private void handleServerPackets(Packet serverPacket) } @EventHandler - public void onEntityAdded(EntityAddedEvent event) + public void onAddEntity(AddEntityEvent event) { - if (!(event.entity instanceof EndCrystalEntity crystalEntity)) return; - - + if (!(event.entity instanceof EndCrystalEntity crystalEntity)) + { + return; + } Vec3d crystalPos = crystalEntity.getPos(); BlockPos blockPos = BlockPos.ofFloored(crystalPos.add(0.0, -1.0, 0.0)); renderSpawnPos = blockPos; @@ -1058,7 +1070,7 @@ else if (instantCalc.get()) { if (entity == null || !entity.isAlive() || entity == mc.player || !isValidTarget(entity) - || (entity instanceof PlayerEntity && Friends.get().isFriend((PlayerEntity) entity))) + || (entity instanceof PlayerEntity player && Friends.get().isFriend(player))) { continue; } @@ -1100,9 +1112,10 @@ else if (instantCalc.get()) @EventHandler public void onPacketSend(PacketEvent.Send event) { - if (mc.player == null) return; - - + if (mc.player == null) + { + return; + } if (event.packet instanceof UpdateSelectedSlotC2SPacket) { lastSwapTimer.reset(); @@ -1201,14 +1214,14 @@ private void attackInternal(int crystalEntity, Hand hand) EndCrystalEntity entity2 = new EndCrystalEntity(mc.world, 0.0, 0.0, 0.0); entity2.setId(crystalEntity); PlayerInteractEntityC2SPacket packet = PlayerInteractEntityC2SPacket.attack(entity2, mc.player.isSneaking()); - mc.getNetworkHandler().sendPacket(packet); + Managers.NETWORK.sendPacket(packet); if (swing.get()) { mc.player.swingHand(hand); } else { - mc.getNetworkHandler().sendPacket(new HandSwingC2SPacket(hand)); + Managers.NETWORK.sendPacket(new HandSwingC2SPacket(hand)); } attackPackets.put(crystalEntity, System.currentTimeMillis()); @@ -1238,10 +1251,10 @@ private void placeSequentialCrystal(Hand hand) private void placeCrystal(BlockPos blockPos, Hand hand) { - /*if (isRotationBlocked() || !rotated && rotate.get()) + if (isRotationBlocked() || !rotated && rotate.get()) { return; - }*/ + } placeCrystal(blockPos, hand, true); } @@ -1253,6 +1266,13 @@ public void placeCrystal(BlockPos blockPos, Hand hand, boolean checkPlacement) return; } Direction sidePlace = getPlaceDirection(blockPos); + // Vec3d vec3d = mc.player.getCameraPosVec(1.0f); + // Vec3d vec3d1 = RotationUtil.getRotationVector(); + // Vec3d vec3d3 = vec3d.add(vec3d1.x * placeRange.get(), + // vec3d1.y * placeRange.get(), vec3d1.z * placeRange.get()); + // HitResult hitResult = mc.world.raycast(new RaycastContext(vec3d, vec3d3, + // RaycastContext.ShapeType.OUTLINE, + // RaycastContext.FluidHandling.NONE, mc.player)); BlockHitResult result = new BlockHitResult(blockPos.toCenterPos(), sidePlace, blockPos, false); if (autoSwap.get() != Swap.OFF && hand != Hand.OFF_HAND && getCrystalHand() == null) { @@ -1281,16 +1301,16 @@ else if (autoSwap.get() == Swap.SILENT) } } placeInternal(result, Hand.MAIN_HAND); - - placeRenderPos.set(blockPos); - placePackets.put(blockPos, System.currentTimeMillis()); if (canSwap) { - if (autoSwap.get() == Swap.SILENT_ALT) { + if (autoSwap.get() == Swap.SILENT_ALT) + { mc.interactionManager.clickSlot(mc.player.playerScreenHandler.syncId, crystalSlot + 36, mc.player.getInventory().selectedSlot, SlotActionType.SWAP, mc.player); - } else if (autoSwap.get() == Swap.SILENT) { + } + else if (autoSwap.get() == Swap.SILENT) + { Managers.INVENTORY.syncToClient(); } } @@ -1322,8 +1342,7 @@ private void placeInternal(BlockHitResult result, Hand hand) // Entity ID predict if (idPredict.get()) { - //boolean flag = AutoXPModule.getInstance().isEnabled() || mc.player.isUsingItem() && mc.player.getStackInHand(mc.player.getActiveHand()).getItem() instanceof ExperienceBottleItem; - boolean flag = mc.player.isUsingItem() && mc.player.getStackInHand(mc.player.getActiveHand()).getItem() instanceof ExperienceBottleItem; + boolean flag = Modules.get().isActive(GenyoAutoXP.class) || mc.player.isUsingItem() && mc.player.getStackInHand(mc.player.getActiveHand()).getItem() instanceof ExperienceBottleItem; int id = (int) (predictId + 1); if (flag || attackPackets.containsKey(id)) { @@ -1439,7 +1458,7 @@ private DamageData calculateAttackCrystal(List entitie { if (entity == null || !entity.isAlive() || entity == mc.player || !isValidTarget(entity) - || (entity instanceof PlayerEntity && Friends.get().isFriend((PlayerEntity) entity))) + || (entity instanceof PlayerEntity player && Friends.get().isFriend(player))) { continue; } @@ -1460,7 +1479,7 @@ private DamageData calculateAttackCrystal(List entitie { Set miningPositions = new HashSet<>(); BlockPos miningBlock = Modules.get().get(GenyoAutoMine.class).getMiningBlock(); - if (Modules.get().get(GenyoAutoMine.class).isActive() && miningBlock != null) + if (Modules.get().isActive(GenyoAutoMine.class) && miningBlock != null) { miningPositions.add(miningBlock); } @@ -1572,7 +1591,7 @@ private DamageData calculatePlaceCrystal(List placeBlocks, L { if (entity == null || !entity.isAlive() || entity == mc.player || !isValidTarget(entity) - || (entity instanceof PlayerEntity && Friends.get().isFriend((PlayerEntity) entity))) + || (entity instanceof PlayerEntity player && Friends.get().isFriend(player))) { continue; } @@ -1593,7 +1612,7 @@ private DamageData calculatePlaceCrystal(List placeBlocks, L { Set miningPositions = new HashSet<>(); BlockPos miningBlock = Modules.get().get(GenyoAutoMine.class).getMiningBlock(); - if (Modules.get().get(GenyoAutoMine.class).isActive() && miningBlock != null) + if (Modules.get().isActive(GenyoAutoMine.class) && miningBlock != null) { miningPositions.add(miningBlock); } @@ -1701,8 +1720,8 @@ public void placeCrystalForTarget(PlayerEntity target, BlockPos blockPos) return; } - /*float[] rotations = RotationUtil.getRotationsTo(mc.player.getEyePos(), blockPos.toCenterPos()); - setRotation(rotations[0], rotations[1]);*/ + float[] rotations = RotationUtil.getRotationsTo(mc.player.getEyePos(), blockPos.toCenterPos()); + setRotation(rotations[0], rotations[1]); placeCrystal(blockPos, Hand.MAIN_HAND, false); fadeList.put(blockPos, new Animation(true, fadeTime.get())); } diff --git a/src/main/java/com/genyo/addon/modules/combat/GenyoAutoTotem.java b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoTotem.java similarity index 97% rename from src/main/java/com/genyo/addon/modules/combat/GenyoAutoTotem.java rename to src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoTotem.java index a48b457..e448f3d 100644 --- a/src/main/java/com/genyo/addon/modules/combat/GenyoAutoTotem.java +++ b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoTotem.java @@ -1,11 +1,10 @@ -package com.genyo.addon.modules.combat; +package com.genyo.addon.systems.modules.combat; import com.genyo.addon.GenyoAddon; -import com.genyo.addon.events.meteor.SettingChangedEvent; import com.genyo.addon.events.world.LoadWorldEvent; import com.genyo.addon.managers.Managers; -import com.genyo.addon.modules.GenyoModule; -import com.genyo.addon.settings.FloatSetting; +import com.genyo.addon.systems.modules.GenyoModule; +import com.genyo.addon.systems.settings.FloatSetting; import com.genyo.addon.utils.math.timer.CacheTimer; import com.genyo.addon.utils.math.timer.Timer; import com.genyo.addon.utils.player.InventoryUtil; @@ -25,7 +24,6 @@ import net.minecraft.network.packet.s2c.play.HealthUpdateS2CPacket; import net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket; import net.minecraft.screen.slot.SlotActionType; -import net.minecraft.text.Text; import net.minecraft.util.hit.BlockHitResult; import java.util.LinkedHashSet; @@ -99,6 +97,7 @@ public GenyoAutoTotem() { .defaultValue(1) .max(9) .visible(mainhandTotemConfig::get) + .onChanged(this::resetMainhandSwap) .build() ); @@ -341,13 +340,8 @@ private Set getFailureReasons() return failureReasonsSet; } - @EventHandler - public void onConfigUpdate(SettingChangedEvent event) - { - if (event.setting == totemSlotConfig) - { - mainhandSwapTimer.reset(); - } + private void resetMainhandSwap(Integer integer) { + mainhandSwapTimer.reset(); } private boolean checkLethal() diff --git a/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoTrap.java b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoTrap.java new file mode 100644 index 0000000..d99975f --- /dev/null +++ b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoTrap.java @@ -0,0 +1,480 @@ +package com.genyo.addon.systems.modules.combat; + +import com.genyo.addon.GenyoAddon; +import com.genyo.addon.events.network.PlayerTickEvent; +import com.genyo.addon.managers.Managers; +import com.genyo.addon.systems.modules.PlacerModule; +import com.genyo.addon.render.animation.Animation; +import com.genyo.addon.systems.settings.FloatSetting; +import com.genyo.addon.utils.math.GPositionUtils; +import com.genyo.addon.utils.math.MathUtil; +import com.genyo.addon.utils.world.BlastResistantBlocks; +import com.google.common.collect.Lists; +import meteordevelopment.meteorclient.events.packets.PacketEvent; +import meteordevelopment.meteorclient.events.render.Render3DEvent; +import meteordevelopment.meteorclient.renderer.ShapeMode; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.world.AirPlace; +import meteordevelopment.meteorclient.utils.render.color.Color; +import meteordevelopment.meteorclient.utils.render.color.SettingColor; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.block.BlockState; +import net.minecraft.block.ShapeContext; +import net.minecraft.entity.Entity; +import net.minecraft.entity.decoration.EndCrystalEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.packet.Packet; +import net.minecraft.network.packet.c2s.play.HandSwingC2SPacket; +import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket; +import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket; +import net.minecraft.network.packet.s2c.play.BundleS2CPacket; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3i; + +import java.util.*; + +public class GenyoAutoTrap extends PlacerModule { + + public GenyoAutoTrap() { + super(GenyoAddon.GENYO, "genyo-auto-trap", "Fully traps enemies with blocks."); + } + + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgRender = settings.createGroup("Render"); + + private final Setting placeRangeConfig = sgGeneral.add(new FloatSetting.Builder() + .name("Place Range") + .description("The placement range for trap") + .min(0.0f) + .defaultValue(4.0f) + .max(6.0f) + .build() + ); + + private final Setting rotateConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Rotate") + .description("Rotates to block before placing") + .defaultValue(false) + .build() + ); + + private final Setting attackConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Attack") + .description("Attacks crystals in the way of trap") + .defaultValue(true) + .build() + ); + + private final Setting extendConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Extend") + .description("Extends trap if the player is not in the center of a block") + .defaultValue(true) + .build() + ); + + private final Setting supportConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Support") + .description("Creates a floor for the trap if there is none") + .defaultValue(false) + .build() + ); + + private final Setting headConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Head") + .description("Place a block at targets head") + .defaultValue(true) + .build() + ); + + private final Setting antiStepConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Prevent Step") + .description("Prevents target from stepping out of the trap") + .defaultValue(false) + .build() + ); + + private final Setting shiftTicksConfig = sgGeneral.add(new IntSetting.Builder() + .name("Shift Ticks") + .description("The number of blocks to place per tick") + .min(1) + .defaultValue(2) + .max(10) + .build() + ); + + private final Setting shiftDelayConfig = sgGeneral.add(new FloatSetting.Builder() + .name("Shift Delay") + .description("The delay between each block placement interval") + .min(0.0f) + .defaultValue(1.0f) + .max(5.0f) + .build() + ); + + private final Setting autoDisableConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Auto Disable") + .description("Disables after placing the blocks") + .defaultValue(true) + .build() + ); + + // Render + + private final Setting renderConfig = sgRender.add(new BoolSetting.Builder() + .name("Render") + .description("Renders where trap is placing blocks") + .defaultValue(false) + .build() + ); + + private final Setting color = sgRender.add(new ColorSetting.Builder() + .name("Render Color") + .description("asdsadsadsadsadsa") + .defaultValue(new Color(236, 243, 122, 40)) + .build() + ); + + private final Setting fadeTimeConfig = sgRender.add(new IntSetting.Builder() + .name("Fade-Time") + .description("Time to fade") + .min(0) + .defaultValue(250) + .max(1000) + .visible(() -> false) + .build() + ); + + private List surround = new ArrayList<>(); + private List placements = new ArrayList<>(); + private final Map packets = new HashMap<>(); + private final Map fadeList = new HashMap<>(); + private int blocksPlaced; + + @Override + public void onDeactivate() + { + surround.clear(); + placements.clear(); + packets.clear(); + fadeList.clear(); + } + + @EventHandler + public void onPlayerTick(PlayerTickEvent event) + { + blocksPlaced = 0; + + if (!multitaskConfig.get() && mc.player.isUsingItem()) + { + surround.clear(); + placements.clear(); + return; + } + + final int slot = getResistantBlockItem(); + if (slot == -1) + { + surround.clear(); + placements.clear(); + return; + } + PlayerEntity trapTarget = getTrapTarget(); + if (trapTarget == null) + { + surround.clear(); + placements.clear(); + return; + } + + BlockPos targetBlockPos = GPositionUtils.getRoundedBlockPos(trapTarget.getX(), trapTarget.getY(), trapTarget.getZ()); + surround = getSurround(targetBlockPos, trapTarget); + if (surround.isEmpty()) + { + return; + } + if (attackConfig.get()) + { + attackBlockingCrystals(surround); + } + placements = getPlacementsFromSurround(surround); + if (placements.isEmpty()) + { + if (autoDisableConfig.get()) + { + toggle(); + sendDisableMsg("No placements found."); + } + return; + } + if (supportConfig.get()) + { + for (BlockPos block : new ArrayList<>(placements)) + { + if (block.getY() > targetBlockPos.getY()) + { + continue; + } + Direction direction = Managers.INTERACT.getInteractDirectionInternal(block, strictDirectionConfig.get()); + if (direction == null) + { + placements.add(block.down()); + } + } + } + placements.sort(Comparator.comparingInt(Vec3i::getY)); + while (blocksPlaced < shiftTicksConfig.get()) + { + if (blocksPlaced >= placements.size()) + { + break; + } + BlockPos targetPos = placements.get(blocksPlaced); + blocksPlaced++; + // All rotations for shift ticks must send extra packet + // This may not work on all servers + placeBlock(targetPos, slot); + } + + if (rotateConfig.get()) + { + Managers.ROTATION.setRotationSilentSync(); + } + } + + @EventHandler + public void onPacketReceive(PacketEvent.Receive event) + { + if (mc.player == null || mc.world == null) + { + return; + } + if (event.packet instanceof BundleS2CPacket packet) + { + for (Packet packet1 : packet.getPackets()) + { + handlePackets(packet1); + } + } + else + { + handlePackets(event.packet); + } + } + + private void handlePackets(Packet serverPacket) + { + if (serverPacket instanceof BlockUpdateS2CPacket packet) + { + final BlockState blockState = packet.getState(); + final BlockPos targetPos = packet.getPos(); + if (surround.contains(targetPos)) + { + if (blockState.isReplaceable() && mc.world.canPlace(DEFAULT_OBSIDIAN_STATE, targetPos, ShapeContext.absent())) + { + final int slot = getResistantBlockItem(); + if (slot == -1) + { + return; + } + placeBlock(targetPos, slot); + } + else if (BlastResistantBlocks.isBlastResistant(blockState)) + { + packets.remove(targetPos); + } + } + } + } + + private void placeBlock(BlockPos pos, int slot) + { + Managers.INTERACT.placeBlock(pos, slot, strictDirectionConfig.get(), false, true, (state, angles) -> + { + if (rotateConfig.get() && state) + { + Managers.ROTATION.setRotationSilent(angles[0], angles[1]); + } + }); + packets.put(pos, System.currentTimeMillis()); + } + + private PlayerEntity getTrapTarget() + { + final List entities = Lists.newArrayList(mc.world.getEntities()); + return (PlayerEntity) entities.stream() + .filter(e -> e instanceof PlayerEntity player && e.isAlive() && mc.player != e && !Managers.SOCIAL.isFriend(player)) + .filter(e -> mc.player.squaredDistanceTo(e) <= MathUtil.squared(placeRangeConfig.get())) + .min(Comparator.comparingDouble(e -> mc.player.squaredDistanceTo(e))) + .orElse(null); + } + + public void attackBlockingCrystals(List posList) + { + for (BlockPos pos : posList) + { + Entity crystalEntity = mc.world.getOtherEntities(null, new Box(pos)).stream() + .filter(e -> e instanceof EndCrystalEntity).findFirst().orElse(null); + if (crystalEntity == null) + { + continue; + } + Managers.NETWORK.sendPacket(PlayerInteractEntityC2SPacket.attack(crystalEntity, mc.player.isSneaking())); + Managers.NETWORK.sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); + return; + } + } + + public List getPlacementsFromSurround(List surround) + { + List placements = new ArrayList<>(); + for (BlockPos surroundPos : surround) + { + Long placed = packets.get(surroundPos); + if (shiftDelayConfig.get() > 0.0f && placed != null && System.currentTimeMillis() - placed < shiftDelayConfig.get() * 50.0f) + { + continue; + } + if (!mc.world.getBlockState(surroundPos).isReplaceable()) + { + continue; + } + double dist = mc.player.squaredDistanceTo(surroundPos.toCenterPos()); + if (dist > MathUtil.squared(placeRangeConfig.get())) + { + continue; + } + + if (mc.world.canPlace(DEFAULT_OBSIDIAN_STATE, surroundPos, ShapeContext.absent())) + { + placements.add(surroundPos); + } + } + return placements; + } + + public List getSurround(BlockPos playerPos, PlayerEntity player) + { + List surroundBlocks = new ArrayList<>(); + List playerBlocks = getPlayerBlocks(playerPos, player); + for (BlockPos pos : playerBlocks) + { + for (Direction dir : Direction.values()) + { + if (!dir.getAxis().isHorizontal()) + { + continue; + } + BlockPos pos1 = pos.offset(dir); + if (surroundBlocks.contains(pos1) || playerBlocks.contains(pos1)) + { + continue; + } + + surroundBlocks.add(pos1); + surroundBlocks.add(pos1.up()); + } + } + if (headConfig.get()) + { + boolean support = false; + final List headBlocks = new ArrayList<>(); + for (BlockPos pos : playerBlocks) + { + BlockPos headPos = pos.offset(Direction.UP, 2); + if (!mc.world.getBlockState(headPos).isReplaceable()) + { + support = true; + } + headBlocks.add(headPos); + if (antiStepConfig.get()) + { + BlockPos antiStepPos = pos.offset(Direction.UP, 3); + headBlocks.add(antiStepPos); + } + } + if (!Modules.get().isActive(AirPlace.class)) + { + BlockPos supportingPos = null; + double min = Double.MAX_VALUE; + for (BlockPos pos : surroundBlocks) + { + BlockPos pos1 = pos.offset(Direction.UP, 2); + if (!mc.world.getBlockState(pos1).isReplaceable()) + { + support = true; + break; + } + double dist = mc.player.squaredDistanceTo(pos1.toCenterPos()); + if (dist < min) + { + supportingPos = pos1; + min = dist; + } + } + if (supportingPos != null && !support) + { + surroundBlocks.add(supportingPos); + } + } + surroundBlocks.addAll(headBlocks); + } + return surroundBlocks; + } + + public List getPlayerBlocks(BlockPos playerPos, PlayerEntity entity) + { + final List playerBlocks = new ArrayList<>(); + if (extendConfig.get()) + { + playerBlocks.addAll(GPositionUtils.getAllInBox(entity.getBoundingBox(), playerPos)); + } + else + { + playerBlocks.add(playerPos); + } + return playerBlocks; + } + + @EventHandler + public void onRender3D(Render3DEvent event) + { + if (renderConfig.get()) + { + for (Map.Entry set : fadeList.entrySet()) + { + set.getValue().setState(false); + int boxAlpha = (int) (40 * set.getValue().getFactor()); + int lineAlpha = (int) (100 * set.getValue().getFactor()); + + Color boxColor = color.get().a(boxAlpha); + Color lineColor = color.get().a(lineAlpha); + + event.renderer.box(set.getKey(), boxColor, lineColor, ShapeMode.Both, 0); + } + + if (placements.isEmpty()) + { + return; + } + + for (BlockPos pos : placements) + { + Animation animation = new Animation(true, fadeTimeConfig.get()); + fadeList.put(pos, animation); + } + } + + fadeList.entrySet().removeIf(e -> + e.getValue().getFactor() == 0.0); + } + + public boolean isPlacing() + { + return !placements.isEmpty(); + } + +} diff --git a/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoXP.java b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoXP.java new file mode 100644 index 0000000..cd3c216 --- /dev/null +++ b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoXP.java @@ -0,0 +1,162 @@ +package com.genyo.addon.systems.modules.combat; + +import com.genyo.addon.GenyoAddon; +import com.genyo.addon.events.network.PlayerTickEvent; +import com.genyo.addon.managers.Managers; +import com.genyo.addon.systems.modules.GenyoModule; +import com.genyo.addon.utils.math.timer.TickTimer; +import meteordevelopment.meteorclient.settings.BoolSetting; +import meteordevelopment.meteorclient.settings.IntSetting; +import meteordevelopment.meteorclient.settings.Setting; +import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ExperienceBottleItem; +import net.minecraft.item.ItemStack; +import net.minecraft.network.packet.c2s.play.PlayerInteractItemC2SPacket; +import net.minecraft.util.Hand; + +public class GenyoAutoXP extends GenyoModule { + + public GenyoAutoXP() { + super(GenyoAddon.GENYO, "Genyo AutoXP", "better than blackout"); + } + + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + + private final Setting multitaskConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Multitask") + .description("Allows you to throw xp while using items") + .defaultValue(true) + .build() + ); + + private final Setting delayConfig = sgGeneral.add(new IntSetting.Builder() + .name("Delay") + .description("Delay to throw xp in ticks") + .min(1) + .defaultValue(1) + .max(10) + .build() + ); + + private final Setting shiftTicksConfig = sgGeneral.add(new IntSetting.Builder() + .name("Shift Ticks") + .description("The number of XP bottles to throw in one tick") + .min(1) + .defaultValue(1) + .max(64) + .build() + ); + + private final Setting durabilityCheckConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Durability Check") + .description("Check if your armor and held item durability is full then disables if it is") + .defaultValue(true) + .build() + ); + + private final Setting rotateConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Rotate") + .description("Rotates the player while throwing xp") + .defaultValue(false) + .build() + ); + + private final Setting swingConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Swing") + .description("Swings hand while throwing xp") + .defaultValue(false) + .build() + ); + + private final TickTimer delayTimer = new TickTimer(); + + @EventHandler + public void onPlayerTick(PlayerTickEvent event) + { + if (mc.player == null || !delayTimer.passed(delayConfig.get())) + { + return; + } + + if (mc.player.isUsingItem() && !multitaskConfig.get()) + { + return; + } + + if (durabilityCheckConfig.get() && areItemsFullDura(mc.player)) + { + toggle(); + sendDisableMsg("Max durability reached."); + return; + } + + int slot = -1; + for (int i = 0; i < 9; i++) + { + ItemStack stack = mc.player.getInventory().getStack(i); + if (stack.getItem() instanceof ExperienceBottleItem) + { + slot = i; + break; + } + } + if (slot == -1) + { + toggle(); + sendDisableMsg("No XP bottles in hotbar."); + return; + } + + Managers.INVENTORY.setSlot(slot); + if (rotateConfig.get()) + { + setRotation(mc.player.getYaw(), 90.0f); + if (isRotationBlocked()) + { + return; + } + } + for (int i = 0; i < shiftTicksConfig.get(); i++) + { + Managers.NETWORK.sendSequencedPacket(id -> new PlayerInteractItemC2SPacket(Hand.MAIN_HAND, id, mc.player.getYaw(), mc.player.getPitch())); + if (swingConfig.get()) + { + mc.player.swingHand(Hand.MAIN_HAND); + } + } + Managers.INVENTORY.syncToClient(); + delayTimer.reset(); + } + + private boolean areItemsFullDura(PlayerEntity player) + { + if (!isItemFullDura(player.getMainHandStack()) || !isItemFullDura(player.getOffHandStack())) + { + return false; + } + + for (ItemStack stack : player.getArmorItems()) + { + if (!isItemFullDura(stack)) + { + return false; + } + } + + return true; + } + + private boolean isItemFullDura(ItemStack stack) + { + if (stack.isEmpty()) + { + return true; + } + int maxDura = stack.getMaxDamage(); + int currentDura = stack.getDamage(); + return currentDura == 0 || maxDura == 0; + } + +} diff --git a/src/main/java/com/genyo/addon/modules/combat/GenyoCriticals.java b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoCriticals.java similarity index 97% rename from src/main/java/com/genyo/addon/modules/combat/GenyoCriticals.java rename to src/main/java/com/genyo/addon/systems/modules/combat/GenyoCriticals.java index 21a1783..88fe383 100644 --- a/src/main/java/com/genyo/addon/modules/combat/GenyoCriticals.java +++ b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoCriticals.java @@ -1,11 +1,11 @@ -package com.genyo.addon.modules.combat; +package com.genyo.addon.systems.modules.combat; import com.genyo.addon.GenyoAddon; import com.genyo.addon.managers.Managers; -import com.genyo.addon.modules.GenyoModule; -import com.genyo.addon.modules.world.GenyoAutoMine; -import com.genyo.addon.modules.world.GenyoSelfTrap; -import com.genyo.addon.modules.world.GenyoSurroundV2; +import com.genyo.addon.systems.modules.GenyoModule; +import com.genyo.addon.systems.modules.world.GenyoAutoMine; +import com.genyo.addon.systems.modules.world.GenyoSelfTrap; +import com.genyo.addon.systems.modules.world.GenyoSurroundV2; import com.genyo.addon.utils.GEntityUtils; import com.genyo.addon.utils.math.GPositionUtils; import com.genyo.addon.utils.math.timer.CacheTimer; diff --git a/src/main/java/com/genyo/addon/modules/combat/GenyoReplenish.java b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoReplenish.java similarity index 98% rename from src/main/java/com/genyo/addon/modules/combat/GenyoReplenish.java rename to src/main/java/com/genyo/addon/systems/modules/combat/GenyoReplenish.java index 6f9404d..68ae9d3 100644 --- a/src/main/java/com/genyo/addon/modules/combat/GenyoReplenish.java +++ b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoReplenish.java @@ -1,10 +1,10 @@ -package com.genyo.addon.modules.combat; +package com.genyo.addon.systems.modules.combat; import com.genyo.addon.GenyoAddon; import com.genyo.addon.events.entity.EntityDeathEvent; import com.genyo.addon.events.network.DisconnectEvent; import com.genyo.addon.events.network.PlayerTickEvent; -import com.genyo.addon.modules.GenyoModule; +import com.genyo.addon.systems.modules.GenyoModule; import com.genyo.addon.utils.math.timer.CacheTimer; import com.genyo.addon.utils.math.timer.Timer; import com.genyo.addon.utils.player.InventoryUtil; diff --git a/src/main/java/com/genyo/addon/modules/combat/KFCSpawnKill.java b/src/main/java/com/genyo/addon/systems/modules/combat/KFCSpawnKill.java similarity index 99% rename from src/main/java/com/genyo/addon/modules/combat/KFCSpawnKill.java rename to src/main/java/com/genyo/addon/systems/modules/combat/KFCSpawnKill.java index ce3a2df..5fea2fd 100644 --- a/src/main/java/com/genyo/addon/modules/combat/KFCSpawnKill.java +++ b/src/main/java/com/genyo/addon/systems/modules/combat/KFCSpawnKill.java @@ -1,16 +1,14 @@ -package com.genyo.addon.modules.combat; +package com.genyo.addon.systems.modules.combat; import com.genyo.addon.GenyoAddon; import com.genyo.addon.events.network.DisconnectEvent; import com.genyo.addon.events.network.PlayerTickEvent; -import com.genyo.addon.events.render.RenderWorldEvent; import com.genyo.addon.events.world.RemoveEntityEvent; import com.genyo.addon.managers.Managers; import com.genyo.addon.managers.world.tick.TickSync; -import com.genyo.addon.modules.GenyoModule; -import com.genyo.addon.modules.world.GenyoAutoMine; -import com.genyo.addon.render.RenderBuffers; -import com.genyo.addon.settings.FloatSetting; +import com.genyo.addon.systems.modules.GenyoModule; +import com.genyo.addon.systems.modules.world.GenyoAutoMine; +import com.genyo.addon.systems.settings.FloatSetting; import com.genyo.addon.utils.entity.EntityUtil; import com.genyo.addon.utils.math.timer.CacheTimer; import com.genyo.addon.utils.math.timer.Timer; diff --git a/src/main/java/com/genyo/addon/modules/misc/CombatBrainrot.java b/src/main/java/com/genyo/addon/systems/modules/misc/CombatBrainrot.java similarity index 89% rename from src/main/java/com/genyo/addon/modules/misc/CombatBrainrot.java rename to src/main/java/com/genyo/addon/systems/modules/misc/CombatBrainrot.java index dc7f039..cd9cf9e 100644 --- a/src/main/java/com/genyo/addon/modules/misc/CombatBrainrot.java +++ b/src/main/java/com/genyo/addon/systems/modules/misc/CombatBrainrot.java @@ -1,12 +1,11 @@ -package com.genyo.addon.modules.misc; +package com.genyo.addon.systems.modules.misc; import com.genyo.addon.GenyoAddon; -import com.genyo.addon.modules.GenyoModule; -import com.genyo.addon.settings.FloatSetting; +import com.genyo.addon.systems.modules.GenyoModule; +import com.genyo.addon.systems.settings.FloatSetting; import com.genyo.addon.utils.math.MathUtil; import com.genyo.addon.utils.math.timer.CacheTimer; import com.genyo.addon.utils.math.timer.Timer; -import meteordevelopment.meteorclient.events.entity.player.AttackEntityEvent; import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.Setting; @@ -14,11 +13,8 @@ import meteordevelopment.meteorclient.settings.StringListSetting; import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.orbit.EventHandler; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; import net.minecraft.entity.decoration.EndCrystalEntity; -import net.minecraft.network.packet.c2s.play.PlayerInteractBlockC2SPacket; import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket; import java.util.ArrayList; diff --git a/src/main/java/com/genyo/addon/modules/misc/GenyoAutoEZ.java b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoAutoEZ.java similarity index 98% rename from src/main/java/com/genyo/addon/modules/misc/GenyoAutoEZ.java rename to src/main/java/com/genyo/addon/systems/modules/misc/GenyoAutoEZ.java index fa2f52e..8ea06bf 100644 --- a/src/main/java/com/genyo/addon/modules/misc/GenyoAutoEZ.java +++ b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoAutoEZ.java @@ -1,7 +1,7 @@ -package com.genyo.addon.modules.misc; +package com.genyo.addon.systems.modules.misc; import com.genyo.addon.GenyoAddon; -import com.genyo.addon.modules.GenyoModule; +import com.genyo.addon.systems.modules.GenyoModule; import com.genyo.addon.systems.incombat.CombatPerson; import com.genyo.addon.systems.incombat.InCombatSystem; import com.genyo.addon.utils.math.MathUtil; diff --git a/src/main/java/com/genyo/addon/modules/misc/GenyoDiscord.java b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoDiscord.java similarity index 98% rename from src/main/java/com/genyo/addon/modules/misc/GenyoDiscord.java rename to src/main/java/com/genyo/addon/systems/modules/misc/GenyoDiscord.java index 91619d6..87eefe5 100644 --- a/src/main/java/com/genyo/addon/modules/misc/GenyoDiscord.java +++ b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoDiscord.java @@ -1,10 +1,9 @@ -package com.genyo.addon.modules.misc; +package com.genyo.addon.systems.modules.misc; import com.genyo.addon.GenyoAddon; -import com.genyo.addon.modules.GenyoModule; +import com.genyo.addon.systems.modules.GenyoModule; import meteordevelopment.discordipc.DiscordIPC; import meteordevelopment.discordipc.RichPresence; -import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.game.OpenScreenEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.gui.GuiTheme; diff --git a/src/main/java/com/genyo/addon/modules/misc/GenyoGoodbye.java b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoGoodbye.java similarity index 94% rename from src/main/java/com/genyo/addon/modules/misc/GenyoGoodbye.java rename to src/main/java/com/genyo/addon/systems/modules/misc/GenyoGoodbye.java index 882e582..01c5a5d 100644 --- a/src/main/java/com/genyo/addon/modules/misc/GenyoGoodbye.java +++ b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoGoodbye.java @@ -1,9 +1,9 @@ -package com.genyo.addon.modules.misc; +package com.genyo.addon.systems.modules.misc; import com.genyo.addon.GenyoAddon; -import com.genyo.addon.modules.GenyoModule; -import com.genyo.addon.settings.playerlist.ListGroupSetting; -import com.genyo.addon.settings.playerlist.PLGroup; +import com.genyo.addon.systems.modules.GenyoModule; +import com.genyo.addon.systems.settings.playerlist.ListGroupSetting; +import com.genyo.addon.systems.settings.playerlist.PLGroup; import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.IntSetting; diff --git a/src/main/java/com/genyo/addon/modules/misc/GenyoSkinBlink.java b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoSkinBlink.java similarity index 68% rename from src/main/java/com/genyo/addon/modules/misc/GenyoSkinBlink.java rename to src/main/java/com/genyo/addon/systems/modules/misc/GenyoSkinBlink.java index 608bbae..6faefb8 100644 --- a/src/main/java/com/genyo/addon/modules/misc/GenyoSkinBlink.java +++ b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoSkinBlink.java @@ -1,15 +1,20 @@ -package com.genyo.addon.modules.misc; +package com.genyo.addon.systems.modules.misc; import com.genyo.addon.GenyoAddon; import com.genyo.addon.mixin.accessor.AccessorGameOptions; -import com.genyo.addon.modules.GenyoModule; +import com.genyo.addon.systems.modules.GenyoModule; import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.gui.screens.settings.RegistryListSettingScreen; +import meteordevelopment.meteorclient.settings.BoolSetting; import meteordevelopment.meteorclient.settings.IntSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.orbit.EventHandler; import net.minecraft.entity.player.PlayerModelPart; +import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryKeys; +import java.rmi.registry.Registry; import java.util.HashSet; import java.util.Set; @@ -24,6 +29,13 @@ public class GenyoSkinBlink extends GenyoModule { .build() ); + private final Setting exclueCapes = sgGeneral.add(new BoolSetting.Builder() + .name("Exclude Capes") + .description("Don't blink capes.") + .defaultValue(true) + .build() + ); + public GenyoSkinBlink() { super(GenyoAddon.GENYO, "genyo-skin-blink", "i love kiwi. i love kiwi. i love kiwi. i love kiwi. "); } @@ -44,7 +56,11 @@ public void onDeactivate() { if (enabledParts == null || mc.options == null) return; timer = 0; - for (PlayerModelPart part : PlayerModelPart.values()) mc.options.setPlayerModelPart(part, enabledParts.contains(part)); + for (PlayerModelPart part : PlayerModelPart.values()) { + if (exclueCapes.get() && part.equals(PlayerModelPart.CAPE)) continue; + + mc.options.setPlayerModelPart(part, enabledParts.contains(part)); + } mc.options.sendClientSettings(); } @@ -57,6 +73,8 @@ public void onTick(TickEvent.Post event) { Set currentParts = ((AccessorGameOptions) mc.options).getPlayerModelParts(); for (PlayerModelPart part : PlayerModelPart.values()) { + if (exclueCapes.get() && part.equals(PlayerModelPart.CAPE)) continue; + mc.options.setPlayerModelPart(part, !currentParts.contains(part)); } diff --git a/src/main/java/com/genyo/addon/modules/misc/GenyoWelcome.java b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoWelcome.java similarity index 95% rename from src/main/java/com/genyo/addon/modules/misc/GenyoWelcome.java rename to src/main/java/com/genyo/addon/systems/modules/misc/GenyoWelcome.java index e6cae89..a6500cd 100644 --- a/src/main/java/com/genyo/addon/modules/misc/GenyoWelcome.java +++ b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoWelcome.java @@ -1,9 +1,9 @@ -package com.genyo.addon.modules.misc; +package com.genyo.addon.systems.modules.misc; import com.genyo.addon.GenyoAddon; -import com.genyo.addon.modules.GenyoModule; -import com.genyo.addon.settings.playerlist.ListGroupSetting; -import com.genyo.addon.settings.playerlist.PLGroup; +import com.genyo.addon.systems.modules.GenyoModule; +import com.genyo.addon.systems.settings.playerlist.ListGroupSetting; +import com.genyo.addon.systems.settings.playerlist.PLGroup; import com.mojang.authlib.GameProfile; import meteordevelopment.meteorclient.events.game.GameJoinedEvent; import meteordevelopment.meteorclient.events.game.GameLeftEvent; diff --git a/src/main/java/com/genyo/addon/modules/misc/PacketDebug.java b/src/main/java/com/genyo/addon/systems/modules/misc/PacketDebug.java similarity index 95% rename from src/main/java/com/genyo/addon/modules/misc/PacketDebug.java rename to src/main/java/com/genyo/addon/systems/modules/misc/PacketDebug.java index 60697bb..727625d 100644 --- a/src/main/java/com/genyo/addon/modules/misc/PacketDebug.java +++ b/src/main/java/com/genyo/addon/systems/modules/misc/PacketDebug.java @@ -1,18 +1,15 @@ -package com.genyo.addon.modules.misc; +package com.genyo.addon.systems.modules.misc; import com.genyo.addon.GenyoAddon; -import com.genyo.addon.modules.GenyoModule; +import com.genyo.addon.systems.modules.GenyoModule; import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.utils.network.PacketUtils; -import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.network.packet.Packet; -import java.util.ArrayList; import java.util.HashSet; -import java.util.List; import java.util.Set; public class PacketDebug extends GenyoModule { diff --git a/src/main/java/com/genyo/addon/modules/movement/GenyoVelocity.java b/src/main/java/com/genyo/addon/systems/modules/movement/GenyoVelocity.java similarity index 98% rename from src/main/java/com/genyo/addon/modules/movement/GenyoVelocity.java rename to src/main/java/com/genyo/addon/systems/modules/movement/GenyoVelocity.java index 809bcdf..f647003 100644 --- a/src/main/java/com/genyo/addon/modules/movement/GenyoVelocity.java +++ b/src/main/java/com/genyo/addon/systems/modules/movement/GenyoVelocity.java @@ -1,4 +1,4 @@ -package com.genyo.addon.modules.movement; +package com.genyo.addon.systems.modules.movement; import com.genyo.addon.GenyoAddon; import com.genyo.addon.events.entity.player.PushEntityEvent; @@ -9,9 +9,9 @@ import com.genyo.addon.mixin.accessor.AccessorBundlePacket; import com.genyo.addon.mixin.accessor.AccessorClientWorld; import com.genyo.addon.mixin.accessor.AccessorEntityVelocityUpdateS2CPacket; -import com.genyo.addon.modules.GenyoModule; -import com.genyo.addon.modules.world.GenyoSurroundV2; -import com.genyo.addon.settings.FloatSetting; +import com.genyo.addon.systems.modules.GenyoModule; +import com.genyo.addon.systems.modules.world.GenyoSurroundV2; +import com.genyo.addon.systems.settings.FloatSetting; import com.genyo.addon.utils.math.GPositionUtils; import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.settings.*; diff --git a/src/main/java/com/genyo/addon/modules/visual/AngelSexHulkenberg.java b/src/main/java/com/genyo/addon/systems/modules/visual/AngelSexHulkenberg.java similarity index 99% rename from src/main/java/com/genyo/addon/modules/visual/AngelSexHulkenberg.java rename to src/main/java/com/genyo/addon/systems/modules/visual/AngelSexHulkenberg.java index 63b714f..0c950b9 100644 --- a/src/main/java/com/genyo/addon/modules/visual/AngelSexHulkenberg.java +++ b/src/main/java/com/genyo/addon/systems/modules/visual/AngelSexHulkenberg.java @@ -1,9 +1,9 @@ -package com.genyo.addon.modules.visual; +package com.genyo.addon.systems.modules.visual; import com.genyo.addon.GenyoAddon; import com.genyo.addon.events.TotemPopEvent; import com.genyo.addon.mixin.entity.IEntity; -import com.genyo.addon.modules.GenyoModule; +import com.genyo.addon.systems.modules.GenyoModule; import com.genyo.addon.render.Render2DEngine; import com.genyo.addon.render.Render3DEngine; import com.genyo.addon.systems.enemies.Enemies; diff --git a/src/main/java/com/genyo/addon/systems/modules/visual/GenyoCapes.java b/src/main/java/com/genyo/addon/systems/modules/visual/GenyoCapes.java new file mode 100644 index 0000000..8c9c848 --- /dev/null +++ b/src/main/java/com/genyo/addon/systems/modules/visual/GenyoCapes.java @@ -0,0 +1,20 @@ +package com.genyo.addon.systems.modules.visual; + +import com.genyo.addon.GenyoAddon; +import com.genyo.addon.systems.modules.GenyoModule; +import net.minecraft.util.Identifier; + +public class GenyoCapes extends GenyoModule { + + private final Identifier capeTexture; + + public GenyoCapes() { + super(GenyoAddon.GENYO, "genyo-capes", "The thing"); + + this.capeTexture = Identifier.of(GenyoAddon.MOD_ID, "textures/cape.png"); + } + + public Identifier getCapeTexture() { + return capeTexture; + } +} diff --git a/src/main/java/com/genyo/addon/modules/visual/GenyoPenisESP.java b/src/main/java/com/genyo/addon/systems/modules/visual/GenyoPenisESP.java similarity index 95% rename from src/main/java/com/genyo/addon/modules/visual/GenyoPenisESP.java rename to src/main/java/com/genyo/addon/systems/modules/visual/GenyoPenisESP.java index de0dd00..3af3237 100644 --- a/src/main/java/com/genyo/addon/modules/visual/GenyoPenisESP.java +++ b/src/main/java/com/genyo/addon/systems/modules/visual/GenyoPenisESP.java @@ -1,23 +1,19 @@ -package com.genyo.addon.modules.visual; +package com.genyo.addon.systems.modules.visual; import com.genyo.addon.GenyoAddon; -import com.genyo.addon.modules.GenyoModule; +import com.genyo.addon.systems.modules.GenyoModule; import com.genyo.addon.render.Render3DEngine; -import com.genyo.addon.settings.FloatSetting; -import meteordevelopment.meteorclient.events.render.Render2DEvent; +import com.genyo.addon.systems.settings.FloatSetting; import meteordevelopment.meteorclient.events.render.Render3DEvent; -import meteordevelopment.meteorclient.renderer.Renderer2D; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.orbit.EventHandler; -import net.minecraft.client.gui.DrawContext; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.Vec3d; -import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/genyo/addon/modules/world/GenyoAutoMine.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoAutoMine.java similarity index 99% rename from src/main/java/com/genyo/addon/modules/world/GenyoAutoMine.java rename to src/main/java/com/genyo/addon/systems/modules/world/GenyoAutoMine.java index 0031b4a..11397b3 100644 --- a/src/main/java/com/genyo/addon/modules/world/GenyoAutoMine.java +++ b/src/main/java/com/genyo/addon/systems/modules/world/GenyoAutoMine.java @@ -1,12 +1,12 @@ -package com.genyo.addon.modules.world; +package com.genyo.addon.systems.modules.world; import com.genyo.addon.GenyoAddon; import com.genyo.addon.events.AttackBlockEvent; import com.genyo.addon.managers.Managers; -import com.genyo.addon.modules.GenyoModule; -import com.genyo.addon.modules.combat.GenyoAutoCrystal; +import com.genyo.addon.systems.modules.GenyoModule; +import com.genyo.addon.systems.modules.combat.GenyoAutoCrystal; import com.genyo.addon.render.animation.Animation; -import com.genyo.addon.settings.FloatSetting; +import com.genyo.addon.systems.settings.FloatSetting; import com.genyo.addon.utils.GEntityUtils; import com.genyo.addon.utils.math.GPositionUtils; import com.genyo.addon.utils.math.MathUtil; diff --git a/src/main/java/com/genyo/addon/modules/world/GenyoAutoTool.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoAutoTool.java similarity index 95% rename from src/main/java/com/genyo/addon/modules/world/GenyoAutoTool.java rename to src/main/java/com/genyo/addon/systems/modules/world/GenyoAutoTool.java index 87703e4..a22f22c 100644 --- a/src/main/java/com/genyo/addon/modules/world/GenyoAutoTool.java +++ b/src/main/java/com/genyo/addon/systems/modules/world/GenyoAutoTool.java @@ -1,8 +1,8 @@ -package com.genyo.addon.modules.world; +package com.genyo.addon.systems.modules.world; import com.genyo.addon.GenyoAddon; import com.genyo.addon.events.AttackBlockEvent; -import com.genyo.addon.modules.GenyoModule; +import com.genyo.addon.systems.modules.GenyoModule; import com.genyo.addon.utils.player.EnchantmentUtil; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/genyo/addon/modules/world/GenyoGhostBlocks.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoGhostBlocks.java similarity index 97% rename from src/main/java/com/genyo/addon/modules/world/GenyoGhostBlocks.java rename to src/main/java/com/genyo/addon/systems/modules/world/GenyoGhostBlocks.java index a7564ad..c6062fe 100644 --- a/src/main/java/com/genyo/addon/modules/world/GenyoGhostBlocks.java +++ b/src/main/java/com/genyo/addon/systems/modules/world/GenyoGhostBlocks.java @@ -1,8 +1,8 @@ -package com.genyo.addon.modules.world; +package com.genyo.addon.systems.modules.world; import com.genyo.addon.GenyoAddon; import com.genyo.addon.managers.Managers; -import com.genyo.addon.modules.GenyoModule; +import com.genyo.addon.systems.modules.GenyoModule; import meteordevelopment.meteorclient.events.entity.player.BreakBlockEvent; import meteordevelopment.meteorclient.events.entity.player.InteractBlockEvent; import meteordevelopment.meteorclient.settings.*; diff --git a/src/main/java/com/genyo/addon/modules/world/GenyoScaffold.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoScaffold.java similarity index 99% rename from src/main/java/com/genyo/addon/modules/world/GenyoScaffold.java rename to src/main/java/com/genyo/addon/systems/modules/world/GenyoScaffold.java index 43718b2..db47a4e 100644 --- a/src/main/java/com/genyo/addon/modules/world/GenyoScaffold.java +++ b/src/main/java/com/genyo/addon/systems/modules/world/GenyoScaffold.java @@ -1,9 +1,9 @@ -package com.genyo.addon.modules.world; +package com.genyo.addon.systems.modules.world; import com.genyo.addon.GenyoAddon; import com.genyo.addon.events.network.PlayerTickEvent; import com.genyo.addon.managers.Managers; -import com.genyo.addon.modules.PlacerModule; +import com.genyo.addon.systems.modules.PlacerModule; import com.genyo.addon.render.animation.Animation; import com.genyo.addon.utils.math.GPositionUtils; import com.genyo.addon.utils.player.MovementUtil; diff --git a/src/main/java/com/genyo/addon/modules/world/GenyoSelfTrap.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoSelfTrap.java similarity index 99% rename from src/main/java/com/genyo/addon/modules/world/GenyoSelfTrap.java rename to src/main/java/com/genyo/addon/systems/modules/world/GenyoSelfTrap.java index 79673b7..917e67e 100644 --- a/src/main/java/com/genyo/addon/modules/world/GenyoSelfTrap.java +++ b/src/main/java/com/genyo/addon/systems/modules/world/GenyoSelfTrap.java @@ -1,10 +1,10 @@ -package com.genyo.addon.modules.world; +package com.genyo.addon.systems.modules.world; import com.genyo.addon.GenyoAddon; import com.genyo.addon.managers.Managers; -import com.genyo.addon.modules.PlacerModule; +import com.genyo.addon.systems.modules.PlacerModule; import com.genyo.addon.render.animation.Animation; -import com.genyo.addon.settings.FloatSetting; +import com.genyo.addon.systems.settings.FloatSetting; import com.genyo.addon.utils.math.GPositionUtils; import com.genyo.addon.utils.math.MathUtil; import com.genyo.addon.utils.player.Rotation; diff --git a/src/main/java/com/genyo/addon/modules/world/GenyoSpeedmine.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoSpeedmine.java similarity index 70% rename from src/main/java/com/genyo/addon/modules/world/GenyoSpeedmine.java rename to src/main/java/com/genyo/addon/systems/modules/world/GenyoSpeedmine.java index 8bbc545..0f5425c 100644 --- a/src/main/java/com/genyo/addon/modules/world/GenyoSpeedmine.java +++ b/src/main/java/com/genyo/addon/systems/modules/world/GenyoSpeedmine.java @@ -1,14 +1,15 @@ -package com.genyo.addon.modules.world; +package com.genyo.addon.systems.modules.world; import com.genyo.addon.GenyoAddon; +import com.genyo.addon.systems.modules.GenyoModule; +import com.genyo.addon.systems.settings.FloatSetting; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.utils.render.color.Color; +import meteordevelopment.meteorclient.utils.render.color.SettingColor; import com.genyo.addon.events.AttackBlockEvent; -import com.genyo.addon.events.meteor.SettingChangedEvent; import com.genyo.addon.managers.Managers; -import com.genyo.addon.managers.player.rotation.Rotation; import com.genyo.addon.mixin.accessor.AccessorClientPlayerInteractionManager; -import com.genyo.addon.modules.GenyoModule; import com.genyo.addon.render.animation.Animation; -import com.genyo.addon.settings.FloatSetting; import com.genyo.addon.utils.collection.FirstOutQueue; import com.genyo.addon.utils.math.MathUtil; import com.genyo.addon.utils.player.EnchantmentUtil; @@ -18,11 +19,7 @@ import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.renderer.ShapeMode; -import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.utils.player.InvUtils; -import meteordevelopment.meteorclient.utils.render.color.Color; -import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.BlockState; import net.minecraft.client.MinecraftClient; @@ -30,8 +27,6 @@ import net.minecraft.entity.effect.StatusEffectUtil; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.item.PickaxeItem; import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.c2s.play.HandSwingC2SPacket; import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket; @@ -50,14 +45,9 @@ public class GenyoSpeedmine extends GenyoModule { public GenyoSpeedmine() { - super(GenyoAddon.GENYO, "genyo-speedmine", "TU TU TU TU..MAX VERSTAPPEN. TU TU TU TU..."); + super(GenyoAddon.GENYO, "Genyo Speedmine", "fasz fasz fsaz fasz"); } - private boolean warnedNoIron = false; - private long swapBackTime = 0; - private int swapBackSlot = -1; - - private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgBreak = settings.createGroup("Break"); private final SettingGroup sgBehaviour = settings.createGroup("Behaviour"); @@ -83,6 +73,7 @@ public GenyoSpeedmine() { .description("Allows you to mine two blocks at once") .defaultValue(false) .visible(() -> modeConfig.get() == SpeedmineMode.PACKET) + .onChanged(this::dbChanged) .build() ); @@ -202,14 +193,31 @@ public GenyoSpeedmine() { private long lastBreak; @Override - public void onDeactivate() { + public String getInfoString() + { + if (modeConfig.get() == SpeedmineMode.PACKET) + { + MiningData miningData = miningQueue.peek(); + if (miningData != null) + { + return String.format("%.1f", Math.min(miningData.getBlockDamage(), 1.0f)); + } + } + + return super.getInfoString(); + } + + @Override + public void onDeactivate() + { miningQueue.clear(); fadeList.clear(); Managers.INVENTORY.syncToClient(); } @Override - public void onActivate() { + public void onActivate() + { if (doubleBreakConfig.get()) { miningQueue = new FirstOutQueue<>(2); @@ -221,9 +229,12 @@ public void onActivate() { } @EventHandler - public void onTick(TickEvent.Pre event) + public void onTickPre(TickEvent.Pre event) { - if (mc.player == null || mc.player.isCreative() || mc.player.isSpectator()) return; + if (mc.player.isCreative() || mc.player.isSpectator()) + { + return; + } if (modeConfig.get() == SpeedmineMode.DAMAGE) { @@ -319,7 +330,10 @@ public void onTick(TickEvent.Pre event) @EventHandler public void onAttackBlock(AttackBlockEvent event) { - if (mc.player.isCreative() || mc.player.isSpectator() || modeConfig.get() != SpeedmineMode.PACKET) return; + if (mc.player.isCreative() || mc.player.isSpectator() || modeConfig.get() != SpeedmineMode.PACKET) + { + return; + } if (Modules.get().isActive(GenyoAutoMine.class)) { @@ -359,7 +373,7 @@ public void onPacketSend(PacketEvent.Send event) } @EventHandler - public void onPacketInbound(PacketEvent.Receive event) + public void onPacketReceive(PacketEvent.Receive event) { if (mc.player == null || modeConfig.get() != SpeedmineMode.PACKET) { @@ -403,22 +417,15 @@ private void handleBlockUpdatePacket(BlockUpdateS2CPacket packet) } } - @EventHandler - public void onConfigUpdate(SettingChangedEvent event) { - if ( event.setting == doubleBreakConfig) { - if (doubleBreakConfig.get()) miningQueue = new FirstOutQueue<>(2); - else miningQueue = new FirstOutQueue<>(1); + private void dbChanged(boolean value) { + if (value) + { + miningQueue = new FirstOutQueue<>(2); } - } - - private boolean hasIronPickaxe() { - for (int i = 0; i < mc.player.getInventory().size(); i++) { - ItemStack stack = mc.player.getInventory().getStack(i); - if (stack.getItem() == Items.IRON_PICKAXE) { - return true; - } + else + { + miningQueue = new FirstOutQueue<>(1); } - return false; } @EventHandler @@ -443,15 +450,12 @@ public void onRender3D(Render3DEvent event) Color boxColor; Color lineColor; - - boolean ironMissing = ironOnlyConfig.get() && !hasIronPickaxe(); - if (smoothColorConfig.get()) { boxColor = data.getState().isAir() ? colorDoneConfig.get().a(boxAlpha) : - ColorUtil.interpolateColor(Math.min(data.getBlockDamage(), 1.0f), colorDoneConfig.get().a(boxAlpha), colorDoneConfig.get().a(boxAlpha)); + ColorUtil.interpolateColor(Math.min(data.getBlockDamage(), 1.0f), colorDoneConfig.get().a(boxAlpha), colorConfig.get().a(boxAlpha)); lineColor = data.getState().isAir() ? colorDoneConfig.get().a(lineAlpha) : - ColorUtil.interpolateColor(Math.min(data.getBlockDamage(), 1.0f), colorDoneConfig.get().a(lineAlpha), colorDoneConfig.get().a(lineAlpha)); + ColorUtil.interpolateColor(Math.min(data.getBlockDamage(), 1.0f), colorDoneConfig.get().a(lineAlpha), colorConfig.get().a(lineAlpha)); } else { @@ -459,12 +463,6 @@ public void onRender3D(Render3DEvent event) lineColor = data.getBlockDamage() >= 0.95f || data.getState().isAir() ? colorDoneConfig.get().a(lineAlpha) : colorConfig.get().a(lineAlpha); } - // 🔹 Override with orange if Iron Only mode but no iron pickaxe - if (ironMissing) { - boxColor = Color.ORANGE.a(boxAlpha); - lineColor = Color.ORANGE.a(lineAlpha); - } - BlockPos mining = data.getPos(); VoxelShape outlineShape = data.getState().getOutlineShape(mc.world, mining); outlineShape = outlineShape.isEmpty() ? VoxelShapes.fullCube() : outlineShape; @@ -525,95 +523,55 @@ private void queueMiningData(MiningData data) } } - private boolean startMiningV1(MiningData data) { - if (data.isStarted()) return false; + private boolean startMining(MiningData data) + { + if (data.isStarted()) + { + return false; + } // https://github.com/GrimAnticheat/Grim/blob/2.0/src/main/java/ac/grim/grimac/checks/impl/misc/FastBreak.java#L76 // https://github.com/GrimAnticheat/Grim/blob/2.0/src/main/java/ac/grim/grimac/checks/impl/misc/FastBreak.java#L98 data.setStarted(); - - // 🔹 Swap to correct tool before sending START - int slot = data.getSlot(); - if (slot != -1 && slot != Managers.INVENTORY.getServerSlot()) { - swapTo(slot); - Managers.INVENTORY.syncToClient(); - } - - if (doubleBreakConfig.get()) { - if (grimNewConfig.get()) { - if (!miningAC.get()) { - Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( - PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, data.getPos(), data.getDirection())); - Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( - PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, data.getPos(), data.getDirection())); - Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( - PlayerActionC2SPacket.Action.ABORT_DESTROY_BLOCK, data.getPos(), data.getDirection())); - } else { - Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( - PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, data.getPos(), data.getDirection())); - } - + if (grimNewConfig.get()) + { + if (!miningAC.get()) + { Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, data.getPos(), data.getDirection())); - Managers.NETWORK.sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); - Managers.NETWORK.sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); - Managers.NETWORK.sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); - return true; + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( + PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, data.getPos(), data.getDirection())); + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( + PlayerActionC2SPacket.Action.ABORT_DESTROY_BLOCK, data.getPos(), data.getDirection())); + } + else + { + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( + PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, data.getPos(), data.getDirection())); } - Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( - PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, data.getPos(), data.getDirection())); - Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( - PlayerActionC2SPacket.Action.ABORT_DESTROY_BLOCK, data.getPos(), data.getDirection())); Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, data.getPos(), data.getDirection())); Managers.NETWORK.sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); - Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( - PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, data.getPos(), data.getDirection())); - Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( - PlayerActionC2SPacket.Action.ABORT_DESTROY_BLOCK, data.getPos(), data.getDirection())); - Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( - PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, data.getPos(), data.getDirection())); Managers.NETWORK.sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); - } else { - mc.getNetworkHandler().sendPacket(new PlayerActionC2SPacket( - PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, data.getPos(), data.getDirection())); - } - return true; - } - - private boolean startMining(MiningData data) { - if (data.isStarted()) return false; - data.setStarted(); - - // 🔹 Tool swap before mining - int slot = data.getSlot(); - if (slot != -1 && slot != Managers.INVENTORY.getServerSlot()) { - swapTo(slot); - Managers.INVENTORY.syncToClient(); + Managers.NETWORK.sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); + return true; } - // --- START Packet --- Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, data.getPos(), data.getDirection())); - - // --- STOP Packet (delayed to avoid canceling START immediately) --- - mc.execute(() -> Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( - PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, data.getPos(), data.getDirection()))); - - // Hand Swing + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( + PlayerActionC2SPacket.Action.ABORT_DESTROY_BLOCK, data.getPos(), data.getDirection())); + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( + PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, data.getPos(), data.getDirection())); + Managers.NETWORK.sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( + PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, data.getPos(), data.getDirection())); + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( + PlayerActionC2SPacket.Action.ABORT_DESTROY_BLOCK, data.getPos(), data.getDirection())); + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( + PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, data.getPos(), data.getDirection())); Managers.NETWORK.sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); - - // --- Fallback resend after small delay --- - mc.execute(() -> { - if (!mc.world.getBlockState(data.getPos()).isAir()) { - Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( - PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, data.getPos(), data.getDirection())); - Managers.NETWORK.sendPacket(new PlayerActionC2SPacket( - PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, data.getPos(), data.getDirection())); - } - }); - return true; } @@ -628,40 +586,36 @@ private void abortMining(MiningData data) Managers.INVENTORY.syncToClient(); } - private int findIronPickaxeSlot() { - for (int i = 0; i < mc.player.getInventory().size(); i++) { - ItemStack stack = mc.player.getInventory().getStack(i); - if (stack.getItem() == Items.IRON_PICKAXE) { - return i; - } - } - return -1; - } - private void stopMining(MiningData data) { - if (!data.isStarted() || data.getState().isAir()) return; - - // Handle rotation + if (!data.isStarted() || data.getState().isAir()) + { + return; + } if (rotateConfig.get()) { float[] rotations = RotationUtil.getRotationsTo(mc.player.getEyePos(), data.getPos().toCenterPos()); - if (grimConfig.get()) Managers.ROTATION.setRotationSilent(rotations[0], rotations[1]); - else Managers.ROTATION.setRotation(new Rotation(2, rotations[0], rotations[1])); + if (grimConfig.get()) + { + setRotationSilent(rotations[0], rotations[1]); + } + else + { + setRotation(rotations[0], rotations[1]); + } } - - // Get slots int slot = data.getSlot(); boolean canSwap = slot != -1 && slot != Managers.INVENTORY.getServerSlot(); - - // 🔹 Normal swap behavior - if (canSwap) swapTo(slot); - Managers.INVENTORY.syncToClient(); - mc.execute(() -> stopMiningInternal(data)); - if (canSwap) swapSync(slot); - + if (canSwap) + { + swapTo(slot); + } + stopMiningInternal(data); lastBreak = System.currentTimeMillis(); - + if (canSwap) + { + swapSync(slot); + } if (rotateConfig.get()) { Managers.ROTATION.setRotationSilentSync(); @@ -706,59 +660,6 @@ private boolean isDataPacketMine(MiningData data) return miningQueue.size() == 2 && data == miningQueue.getLast(); } - private float getBlockBreakingSpeed(BlockState block) { - if (ironOnlyConfig.get()) { - // Try to find iron pickaxe - int ironSlot = -1; - for (int i = 0; i < mc.player.getInventory().size(); i++) { - ItemStack stack = mc.player.getInventory().getStack(i); - if (stack.getItem() == Items.IRON_PICKAXE) { - ironSlot = i; - break; - } - } - - if (ironSlot != -1) { - // Use iron pickaxe speed - ItemStack stack = mc.player.getInventory().getStack(ironSlot); - return calculateSpeedFromStack(stack, block); - } - // No iron pickaxe → fall back to normal logic - } - - // Default: best available tool - int bestTool = Modules.get().get(GenyoAutoTool.class).getBestTool(block); - ItemStack stack = mc.player.getInventory().getStack(bestTool); - return calculateSpeedFromStack(stack, block); - } - - private float calculateSpeedFromStack(ItemStack stack, BlockState block) { - float speed = stack.getMiningSpeedMultiplier(block); - - if (speed > 1.0F) { - int efficiency = EnchantmentUtil.getLevel(stack, Enchantments.EFFICIENCY); - if (efficiency > 0 && !stack.isEmpty()) { - speed += (float) (efficiency * efficiency + 1); - } - } - if (StatusEffectUtil.hasHaste(mc.player)) { - speed *= 1.0f + (float) (StatusEffectUtil.getHasteAmplifier(mc.player) + 1) * 0.2f; - } - if (mc.player.hasStatusEffect(StatusEffects.MINING_FATIGUE)) { - float fatigueFactor = switch (mc.player.getStatusEffect(StatusEffects.MINING_FATIGUE).getAmplifier()) { - case 0 -> 0.3f; - case 1 -> 0.09f; - case 2 -> 0.0027f; - default -> 8.1e-4f; - }; - speed *= fatigueFactor; - } - if (!mc.player.isOnGround()) { - speed /= 5.0f; - } - return speed; - } - public float calcBlockBreakingDelta(BlockState state, BlockView world, BlockPos pos) { if (swapConfig.get() == Swap.OFF) @@ -777,10 +678,9 @@ public float calcBlockBreakingDelta(BlockState state, BlockView world, BlockPos } } - /*private float getBlockBreakingSpeed(BlockState block) + private float getBlockBreakingSpeed(BlockState block) { int tool = Modules.get().get(GenyoAutoTool.class).getBestTool(block); - //if (tool == -1) return 0.0f; float f = mc.player.getInventory().getStack(tool).getMiningSpeedMultiplier(block); if (f > 1.0F) { @@ -815,26 +715,13 @@ public float calcBlockBreakingDelta(BlockState state, BlockView world, BlockPos f /= 5.0f; } return f; - }*/ + } - /*private boolean canHarvest(BlockState state) + private boolean canHarvest(BlockState state) { if (state.isToolRequired()) { - int tool = InvUtils.findFastestTool(state).slot(); - return mc.player.getInventory().getStack(tool).isSuitableFor(state); - } - return true; - }*/ - private boolean canHarvest(BlockState state) { - if (state.isToolRequired()) { - int tool = InvUtils.findFastestTool(state).slot(); - - // Ensure a valid slot - if (tool < 0 || tool >= mc.player.getInventory().size()) { - return false; // No valid tool found - } - + int tool = Modules.get().get(GenyoAutoTool.class).getBestTool(state); return mc.player.getInventory().getStack(tool).isSuitableFor(state); } return true; @@ -915,45 +802,9 @@ public Direction getDirection() return direction; } - /*public int getSlot() + public int getSlot() { return Modules.get().get(GenyoAutoTool.class).getBestToolNoFallback(getState()); - }*/ - public int getSlot() { - GenyoSpeedmine speedmine = Modules.get().get(GenyoSpeedmine.class); - - if (speedmine.ironOnlyConfig.get()) { - // Try iron pickaxe first - for (int i = 0; i < mc.player.getInventory().size(); i++) { - ItemStack stack = mc.player.getInventory().getStack(i); - if (stack.getItem() == Items.IRON_PICKAXE) { - speedmine.warnedNoIron = false; // Reset warning if found - return i; - } - } - - // No iron pickaxe found — warn if not already warned - if (!speedmine.warnedNoIron) { - speedmine.sendError("No iron pickaxe found - using fallback tool."); - speedmine.warnedNoIron = true; - } - - // Fallback: Best available tool - int bestTool = Modules.get().get(GenyoAutoTool.class).getBestToolNoFallback(getState()); - if (bestTool != -1) { - return bestTool; - } - - // Last resort: current selected slot - return mc.player.getInventory().selectedSlot; - } - - // Default if Iron Only is off - int bestTool = Modules.get().get(GenyoAutoTool.class).getBestToolNoFallback(getState()); - if (bestTool != -1) { - return bestTool; - } - return mc.player.getInventory().selectedSlot; } public BlockState getState() diff --git a/src/main/java/com/genyo/addon/modules/world/GenyoSurround.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoSurround.java similarity index 98% rename from src/main/java/com/genyo/addon/modules/world/GenyoSurround.java rename to src/main/java/com/genyo/addon/systems/modules/world/GenyoSurround.java index 1168c9d..8b34664 100644 --- a/src/main/java/com/genyo/addon/modules/world/GenyoSurround.java +++ b/src/main/java/com/genyo/addon/systems/modules/world/GenyoSurround.java @@ -1,7 +1,7 @@ -package com.genyo.addon.modules.world; +package com.genyo.addon.systems.modules.world; import com.genyo.addon.GenyoAddon; -import com.genyo.addon.modules.GenyoModule; +import com.genyo.addon.systems.modules.GenyoModule; import com.genyo.addon.utils.math.GPositionUtils; import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.events.world.TickEvent; diff --git a/src/main/java/com/genyo/addon/modules/world/GenyoSurroundV2.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoSurroundV2.java similarity index 99% rename from src/main/java/com/genyo/addon/modules/world/GenyoSurroundV2.java rename to src/main/java/com/genyo/addon/systems/modules/world/GenyoSurroundV2.java index 931345c..03aa883 100644 --- a/src/main/java/com/genyo/addon/modules/world/GenyoSurroundV2.java +++ b/src/main/java/com/genyo/addon/systems/modules/world/GenyoSurroundV2.java @@ -1,10 +1,10 @@ -package com.genyo.addon.modules.world; +package com.genyo.addon.systems.modules.world; import com.genyo.addon.GenyoAddon; import com.genyo.addon.managers.Managers; -import com.genyo.addon.modules.PlacerModule; +import com.genyo.addon.systems.modules.PlacerModule; import com.genyo.addon.render.animation.Animation; -import com.genyo.addon.settings.FloatSetting; +import com.genyo.addon.systems.settings.FloatSetting; import com.genyo.addon.utils.math.GPositionUtils; import com.genyo.addon.utils.math.MathUtil; import com.genyo.addon.utils.player.Rotation; diff --git a/src/main/java/com/genyo/addon/screens/ListGroupScreen.java b/src/main/java/com/genyo/addon/systems/screens/ListGroupScreen.java similarity index 95% rename from src/main/java/com/genyo/addon/screens/ListGroupScreen.java rename to src/main/java/com/genyo/addon/systems/screens/ListGroupScreen.java index d7fca0c..08d1beb 100644 --- a/src/main/java/com/genyo/addon/screens/ListGroupScreen.java +++ b/src/main/java/com/genyo/addon/systems/screens/ListGroupScreen.java @@ -1,8 +1,8 @@ -package com.genyo.addon.screens; +package com.genyo.addon.systems.screens; -import com.genyo.addon.settings.playerlist.ListGroupSetting; -import com.genyo.addon.settings.playerlist.ListPlayer; -import com.genyo.addon.settings.playerlist.PLGroup; +import com.genyo.addon.systems.settings.playerlist.ListGroupSetting; +import com.genyo.addon.systems.settings.playerlist.ListPlayer; +import com.genyo.addon.systems.settings.playerlist.PLGroup; import com.genyo.addon.utils.GenyoChatUtils; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.WindowScreen; diff --git a/src/main/java/com/genyo/addon/settings/FloatSetting.java b/src/main/java/com/genyo/addon/systems/settings/FloatSetting.java similarity index 98% rename from src/main/java/com/genyo/addon/settings/FloatSetting.java rename to src/main/java/com/genyo/addon/systems/settings/FloatSetting.java index b70e4b0..acbb73e 100644 --- a/src/main/java/com/genyo/addon/settings/FloatSetting.java +++ b/src/main/java/com/genyo/addon/systems/settings/FloatSetting.java @@ -1,4 +1,4 @@ -package com.genyo.addon.settings; +package com.genyo.addon.systems.settings; import meteordevelopment.meteorclient.settings.IVisible; import meteordevelopment.meteorclient.settings.Setting; diff --git a/src/main/java/com/genyo/addon/settings/playerlist/ListGroupSetting.java b/src/main/java/com/genyo/addon/systems/settings/playerlist/ListGroupSetting.java similarity index 98% rename from src/main/java/com/genyo/addon/settings/playerlist/ListGroupSetting.java rename to src/main/java/com/genyo/addon/systems/settings/playerlist/ListGroupSetting.java index b11d34c..cfcadf0 100644 --- a/src/main/java/com/genyo/addon/settings/playerlist/ListGroupSetting.java +++ b/src/main/java/com/genyo/addon/systems/settings/playerlist/ListGroupSetting.java @@ -1,7 +1,7 @@ -package com.genyo.addon.settings.playerlist; +package com.genyo.addon.systems.settings.playerlist; import com.genyo.addon.GenyoAddon; -import com.genyo.addon.screens.ListGroupScreen; +import com.genyo.addon.systems.screens.ListGroupScreen; import com.genyo.addon.utils.GenyoChatUtils; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; diff --git a/src/main/java/com/genyo/addon/settings/playerlist/ListPlayer.java b/src/main/java/com/genyo/addon/systems/settings/playerlist/ListPlayer.java similarity index 98% rename from src/main/java/com/genyo/addon/settings/playerlist/ListPlayer.java rename to src/main/java/com/genyo/addon/systems/settings/playerlist/ListPlayer.java index 25766a1..69569f2 100644 --- a/src/main/java/com/genyo/addon/settings/playerlist/ListPlayer.java +++ b/src/main/java/com/genyo/addon/systems/settings/playerlist/ListPlayer.java @@ -1,4 +1,4 @@ -package com.genyo.addon.settings.playerlist; +package com.genyo.addon.systems.settings.playerlist; import com.mojang.util.UndashedUuid; import meteordevelopment.meteorclient.utils.misc.ISerializable; diff --git a/src/main/java/com/genyo/addon/settings/playerlist/PLGroup.java b/src/main/java/com/genyo/addon/systems/settings/playerlist/PLGroup.java similarity index 96% rename from src/main/java/com/genyo/addon/settings/playerlist/PLGroup.java rename to src/main/java/com/genyo/addon/systems/settings/playerlist/PLGroup.java index cb57cba..feebb1a 100644 --- a/src/main/java/com/genyo/addon/settings/playerlist/PLGroup.java +++ b/src/main/java/com/genyo/addon/systems/settings/playerlist/PLGroup.java @@ -1,4 +1,4 @@ -package com.genyo.addon.settings.playerlist; +package com.genyo.addon.systems.settings.playerlist; import java.util.List; diff --git a/src/main/java/com/genyo/addon/utils/math/timer/TickTimer.java b/src/main/java/com/genyo/addon/utils/math/timer/TickTimer.java new file mode 100644 index 0000000..0960f9b --- /dev/null +++ b/src/main/java/com/genyo/addon/utils/math/timer/TickTimer.java @@ -0,0 +1,71 @@ +package com.genyo.addon.utils.math.timer; + +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.orbit.EventHandler; + +public class TickTimer implements Timer { + + // + private long ticks; + + /** + * + */ + public TickTimer() + { + ticks = 0; + MeteorClient.EVENT_BUS.subscribe(this); + } + + /** + * @param event + */ + @EventHandler(priority = Integer.MAX_VALUE) + public void onTick(TickEvent.Pre event) + { + ++ticks; + } + + /** + * Returns true if the time since the last reset has exceeded + * the param time. + * + * @param time The param time + * @return true if the time since the last reset has exceeded + * the param time + */ + @Override + public boolean passed(Number time) + { + return ticks >= time.longValue(); + } + + /** + * + */ + @Override + public void reset() + { + setElapsedTime(0); + } + + /** + * @return + */ + @Override + public long getElapsedTime() + { + return ticks; + } + + /** + * @param time + */ + @Override + public void setElapsedTime(Number time) + { + ticks = time.longValue(); + } + +} diff --git a/src/main/resources/assets/genyo/textures/cape.png b/src/main/resources/assets/genyo/textures/cape.png new file mode 100644 index 0000000000000000000000000000000000000000..949a966d5332d42f5388c3c81537d6e9c096b5ad GIT binary patch literal 1398 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3-p)I`?e@QjEnx?oJHr&dI!FU|?nl@Ck7R z3MwipT3A>(yEwbJy12Tzy1Kc!d$@aedU$wwczStx`FMHzdi(hK`1<>L26}o0d3gnU z`-J%ThWZ9a1cyY1ghqvi$Am}5MnuL%MkPc=Cq&04#>6JYCgmn2=Ow4)r=%35q!y&6 z7N(^arKcBXWE5v)mSkp?X5F}PPMmZ(@An0}H(!qyr`WwuW$Vf) ztXw1e*I?0R@#n`P_GBtmy66ZUmDjSlwR-2wgE4DDYuDe(pBwa6dBKTSyak5W`s+$8 z7KCoN>3B5zz*Bba#l5?iB-_X9g`2=h5$|5mu6XS2K7{F20T z?kyL!^&EoKE4VJqvN2k@S&*%`p1bVAqu|XeEghI%Y^h6Jb19PD#OdQZ2H(@!uM)31 zY>yY-vTx4$D7$YD6%U!}uw@9Wi1pQ7F|}(gV~}u?+_D&!*Zqmt#AVKzel6rb@cYO? zmD1arYz{0ep5MRx@WsAo+P#K~4CjKGW<0xpI`Pz8H)DA=lf_48H|hFLZ18;_e842& zr%LhSoV|wUB<&?vPk9yc|JG_1r-##pEl%(z-5%q=sm=-cy#-)ei9C%DWo-gDlu zs{i38_M3W78142l{cZYD>+sS0uk`_c?Z@%2m_OJv>|;I|w|~Ol?T^EN34p=V)z4*} HQ$iB}_n0;u literal 0 HcmV?d00001 diff --git a/src/main/resources/genyo.mixins.json b/src/main/resources/genyo.mixins.json index 77d7ef9..82ee401 100644 --- a/src/main/resources/genyo.mixins.json +++ b/src/main/resources/genyo.mixins.json @@ -15,6 +15,7 @@ "accessor.AccessorClientPlayerInteractionManager", "accessor.AccessorClientWorld", "accessor.AccessorGameOptions", + "entity.player.MixinPlayerListEntry", "network.MixinClientPlayerEntity", "network.MixinClientPlayNetworkHandler", "render.MixinRenderTickCounter", @@ -31,7 +32,6 @@ "entity.IEntity", "entity.MixinEntity", "entity.player.MixinPlayerEntity", - "meteor.MixinSetting", "network.MixinServerPlayerEntity" ] } From 4e24d3d78476af9299e65e73ee041029d5f7fe5a Mon Sep 17 00:00:00 2001 From: wuritz Date: Tue, 5 Aug 2025 21:34:24 +0200 Subject: [PATCH 5/7] elv mukodik a phase --- src/main/java/com/genyo/addon/GenyoAddon.java | 2 + .../events/world/BlockCollisionEvent.java | 33 ++ .../addon/events/world/CollisionEvent.java | 32 -- .../com/genyo/addon/managers/Managers.java | 4 + .../addon/managers/combat/PearlManager.java | 59 +++ .../managers/{ => world}/SocialManager.java | 3 +- .../network/MixinClientPlayerEntity.java | 8 +- .../world/MixinBlockCollisionSpliterator.java | 39 ++ .../systems/modules/movement/GenyoPhase.java | 454 ++++++++++++++++++ .../addon/utils/string/EnumFormatter.java | 33 ++ src/main/resources/genyo.mixins.json | 3 +- 11 files changed, 631 insertions(+), 39 deletions(-) create mode 100644 src/main/java/com/genyo/addon/events/world/BlockCollisionEvent.java delete mode 100644 src/main/java/com/genyo/addon/events/world/CollisionEvent.java create mode 100644 src/main/java/com/genyo/addon/managers/combat/PearlManager.java rename src/main/java/com/genyo/addon/managers/{ => world}/SocialManager.java (79%) create mode 100644 src/main/java/com/genyo/addon/mixin/world/MixinBlockCollisionSpliterator.java create mode 100644 src/main/java/com/genyo/addon/systems/modules/movement/GenyoPhase.java create mode 100644 src/main/java/com/genyo/addon/utils/string/EnumFormatter.java diff --git a/src/main/java/com/genyo/addon/GenyoAddon.java b/src/main/java/com/genyo/addon/GenyoAddon.java index adb5f36..d8a8d27 100644 --- a/src/main/java/com/genyo/addon/GenyoAddon.java +++ b/src/main/java/com/genyo/addon/GenyoAddon.java @@ -3,6 +3,7 @@ import com.genyo.addon.systems.hud.*; import com.genyo.addon.systems.modules.combat.*; import com.genyo.addon.systems.modules.misc.*; +import com.genyo.addon.systems.modules.movement.GenyoPhase; import com.genyo.addon.systems.modules.movement.GenyoVelocity; import com.genyo.addon.systems.modules.visual.AngelSexHulkenberg; import com.genyo.addon.systems.modules.visual.GenyoCapes; @@ -116,6 +117,7 @@ private void initModules(Modules modules) { modules.add(new GenyoAutoArmor()); modules.add(new GenyoAutoTrap()); modules.add(new GenyoCapes()); + modules.add(new GenyoPhase()); } private void initHUD(Hud hud) { diff --git a/src/main/java/com/genyo/addon/events/world/BlockCollisionEvent.java b/src/main/java/com/genyo/addon/events/world/BlockCollisionEvent.java new file mode 100644 index 0000000..71103fb --- /dev/null +++ b/src/main/java/com/genyo/addon/events/world/BlockCollisionEvent.java @@ -0,0 +1,33 @@ +package com.genyo.addon.events.world; + +import meteordevelopment.meteorclient.events.Cancellable; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.shape.VoxelShape; + +public class BlockCollisionEvent extends Cancellable { + + private static final BlockCollisionEvent INSTANCE = new BlockCollisionEvent(); + + public BlockPos pos; + public BlockState state; + public VoxelShape shape; + + public static BlockCollisionEvent get(BlockPos pos, BlockState state, VoxelShape shape) { + INSTANCE.pos = pos; + INSTANCE.state = state; + INSTANCE.shape = shape; + + return INSTANCE; + } + + public Block getBlock() { + return state.getBlock(); + } + + public void setVoxelShape(VoxelShape shape) { + this.shape = shape; + } + +} diff --git a/src/main/java/com/genyo/addon/events/world/CollisionEvent.java b/src/main/java/com/genyo/addon/events/world/CollisionEvent.java deleted file mode 100644 index 87b7ad1..0000000 --- a/src/main/java/com/genyo/addon/events/world/CollisionEvent.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.genyo.addon.events.world; - -import com.mojang.blaze3d.systems.RenderSystem; -import meteordevelopment.meteorclient.events.Cancellable; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.shape.VoxelShape; - -public class CollisionEvent extends Cancellable { - - private static final CollisionEvent INSTANCE = new CollisionEvent(); - - public BlockState state; - public BlockPos pos; - public VoxelShape shape; - - public static CollisionEvent get(BlockState bs, BlockPos bp, VoxelShape vs) { - CollisionEvent event = INSTANCE; - - if (!RenderSystem.isOnRenderThread()) { - event = new CollisionEvent(); - } - - event.setCancelled(false); - event.state = bs; - event.pos = bp; - event.shape = vs; - - return event; - } - -} diff --git a/src/main/java/com/genyo/addon/managers/Managers.java b/src/main/java/com/genyo/addon/managers/Managers.java index c4f3951..9221b3e 100644 --- a/src/main/java/com/genyo/addon/managers/Managers.java +++ b/src/main/java/com/genyo/addon/managers/Managers.java @@ -2,6 +2,7 @@ import com.genyo.addon.managers.anticheat.AntiCheatManager; import com.genyo.addon.managers.combat.CombatManager; +import com.genyo.addon.managers.combat.PearlManager; import com.genyo.addon.managers.combat.TotemManager; import com.genyo.addon.managers.network.GDTogglerManager; import com.genyo.addon.managers.network.NetworkManager; @@ -11,6 +12,7 @@ import com.genyo.addon.managers.player.PositionManager; import com.genyo.addon.managers.player.rotation.RotationManager; import com.genyo.addon.managers.world.BlockManager; +import com.genyo.addon.managers.world.SocialManager; import com.genyo.addon.managers.world.tick.TickManager; import com.genyo.addon.render.Render3DEngine; import meteordevelopment.meteorclient.MeteorClient; @@ -30,6 +32,7 @@ public class Managers { public static final AntiCheatManager ANTICHEAT = new AntiCheatManager(); public static final TickManager TICK = new TickManager(); public static final SocialManager SOCIAL = new SocialManager(); + public static final PearlManager PEARL = new PearlManager(); public static void subscribe() { MeteorClient.EVENT_BUS.subscribe(COMBAT); @@ -45,6 +48,7 @@ public static void subscribe() { MeteorClient.EVENT_BUS.subscribe(POSITION); MeteorClient.EVENT_BUS.subscribe(ANTICHEAT); MeteorClient.EVENT_BUS.subscribe(TICK); + MeteorClient.EVENT_BUS.subscribe(PEARL); } } diff --git a/src/main/java/com/genyo/addon/managers/combat/PearlManager.java b/src/main/java/com/genyo/addon/managers/combat/PearlManager.java new file mode 100644 index 0000000..9dedda2 --- /dev/null +++ b/src/main/java/com/genyo/addon/managers/combat/PearlManager.java @@ -0,0 +1,59 @@ +package com.genyo.addon.managers.combat; + +import com.genyo.addon.systems.modules.movement.GenyoPhase; +import com.genyo.addon.systems.modules.movement.GenyoVelocity; +import com.genyo.addon.utils.player.RaycastUtil; +import meteordevelopment.meteorclient.events.packets.PacketEvent; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; +import net.minecraft.network.packet.c2s.play.TeleportConfirmC2SPacket; +import net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +public class PearlManager { + + private float[] lastThrownAngles; + private Box pearlBB; + + @EventHandler + public void onPacketReceive(PacketEvent.Receive event) + { + if (mc.player == null || !Modules.get().get(GenyoPhase.class).shouldRaytrace()) + { + return; + } + + if (event.packet instanceof PlayerPositionLookS2CPacket packet && lastThrownAngles != null) + { + BlockHitResult hitResult = (BlockHitResult) RaycastUtil.rayCast(3.0, lastThrownAngles); + pearlBB = new Box(hitResult.getPos().subtract(0.4, 0.4, 0.4), + hitResult.getPos().add(0.4, 0.4, 0.4)); + + if (mc.world.getBlockState(hitResult.getBlockPos()).isAir()) + { + return; + } + + Vec3d pos = packet.change().position(); + if (!pearlBB.contains(pos.x, pos.y, pos.z)) + { + event.cancel(); + mc.getNetworkHandler().getConnection().send(new TeleportConfirmC2SPacket(packet.teleportId())); + mc.getNetworkHandler().getConnection().send(new PlayerMoveC2SPacket.Full(mc.player.getX(), mc.player.getY(), + mc.player.getZ(), mc.player.getYaw(), mc.player.getPitch(), false, mc.player.horizontalCollision)); + } + lastThrownAngles = null; + } + } + + public void setLastThrownAngles(float[] lastThrownAngles) + { + this.lastThrownAngles = lastThrownAngles; + } + +} diff --git a/src/main/java/com/genyo/addon/managers/SocialManager.java b/src/main/java/com/genyo/addon/managers/world/SocialManager.java similarity index 79% rename from src/main/java/com/genyo/addon/managers/SocialManager.java rename to src/main/java/com/genyo/addon/managers/world/SocialManager.java index 769a477..b344a3a 100644 --- a/src/main/java/com/genyo/addon/managers/SocialManager.java +++ b/src/main/java/com/genyo/addon/managers/world/SocialManager.java @@ -1,6 +1,5 @@ -package com.genyo.addon.managers; +package com.genyo.addon.managers.world; -import meteordevelopment.meteorclient.systems.friends.Friend; import meteordevelopment.meteorclient.systems.friends.Friends; import net.minecraft.entity.player.PlayerEntity; diff --git a/src/main/java/com/genyo/addon/mixin/network/MixinClientPlayerEntity.java b/src/main/java/com/genyo/addon/mixin/network/MixinClientPlayerEntity.java index 54d6c5c..c70f979 100644 --- a/src/main/java/com/genyo/addon/mixin/network/MixinClientPlayerEntity.java +++ b/src/main/java/com/genyo/addon/mixin/network/MixinClientPlayerEntity.java @@ -108,12 +108,12 @@ private void hookSetCurrentHand(Hand hand, CallbackInfo ci) cancellable = true) private void onPushOutOfBlocks(double x, double z, CallbackInfo ci) { - /*PushOutOfBlocksEvent pushOutOfBlocksEvent = new PushOutOfBlocksEvent(); + PushOutOfBlocksEvent pushOutOfBlocksEvent = new PushOutOfBlocksEvent(); MeteorClient.EVENT_BUS.post(pushOutOfBlocksEvent); - - if (pushOutOfBlocksEvent.isCancelled()) { + if (pushOutOfBlocksEvent.isCancelled()) + { ci.cancel(); - }*/ + } } @Override diff --git a/src/main/java/com/genyo/addon/mixin/world/MixinBlockCollisionSpliterator.java b/src/main/java/com/genyo/addon/mixin/world/MixinBlockCollisionSpliterator.java new file mode 100644 index 0000000..b8a773a --- /dev/null +++ b/src/main/java/com/genyo/addon/mixin/world/MixinBlockCollisionSpliterator.java @@ -0,0 +1,39 @@ +package com.genyo.addon.mixin.world; + +import com.genyo.addon.events.world.BlockCollisionEvent; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import meteordevelopment.meteorclient.MeteorClient; +import net.minecraft.block.BlockState; +import net.minecraft.block.ShapeContext; +import net.minecraft.client.MinecraftClient; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockCollisionSpliterator; +import net.minecraft.world.CollisionView; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(BlockCollisionSpliterator.class) +public abstract class MixinBlockCollisionSpliterator { + + @WrapOperation(method = "computeNext", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/block/ShapeContext;getCollisionShape(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/CollisionView;Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/util/shape/VoxelShape;" + ) + ) + private VoxelShape onComputeNextCollisionBox(ShapeContext instance, BlockState blockState, CollisionView collisionView, BlockPos blockPos, Operation original) { + VoxelShape shape = original.call(instance, blockState, collisionView, blockPos); + + if (collisionView != MinecraftClient.getInstance().world) { + return shape; + } + + BlockCollisionEvent event = BlockCollisionEvent.get(blockPos, blockState, shape); + MeteorClient.EVENT_BUS.post(event); + + return event.isCancelled() ? shape : event.shape; + } + +} diff --git a/src/main/java/com/genyo/addon/systems/modules/movement/GenyoPhase.java b/src/main/java/com/genyo/addon/systems/modules/movement/GenyoPhase.java new file mode 100644 index 0000000..3485ff6 --- /dev/null +++ b/src/main/java/com/genyo/addon/systems/modules/movement/GenyoPhase.java @@ -0,0 +1,454 @@ +package com.genyo.addon.systems.modules.movement; + +import com.genyo.addon.GenyoAddon; +import com.genyo.addon.events.network.PlayerUpdateEvent; +import com.genyo.addon.events.network.PushOutOfBlocksEvent; +import com.genyo.addon.events.world.BlockCollisionEvent; +import com.genyo.addon.managers.Managers; +import com.genyo.addon.systems.modules.GenyoModule; +import com.genyo.addon.systems.modules.PlacerModule; +import com.genyo.addon.systems.settings.FloatSetting; +import com.genyo.addon.utils.player.RaycastUtil; +import com.genyo.addon.utils.player.RotationUtil; +import com.genyo.addon.utils.string.EnumFormatter; +import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.ScaffoldingBlock; +import net.minecraft.entity.Entity; +import net.minecraft.entity.decoration.ItemFrameEntity; +import net.minecraft.item.BlockItem; +import net.minecraft.item.EnderPearlItem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.network.packet.c2s.play.HandSwingC2SPacket; +import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket; +import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket; +import net.minecraft.network.packet.c2s.play.PlayerInteractItemC2SPacket; +import net.minecraft.screen.slot.SlotActionType; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.*; +import net.minecraft.util.shape.VoxelShapes; + +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + +public class GenyoPhase extends PlacerModule { + + public GenyoPhase() { + super(GenyoAddon.GENYO, "genyo-phase", "asd"); + } + + private static final List RESISTANT_BLOCKS = new LinkedList<>() + {{ + add(Blocks.OBSIDIAN); + add(Blocks.CRYING_OBSIDIAN); + add(Blocks.ENDER_CHEST); + }}; + + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgBlocks = settings.createGroup("Blocks"); + + private final Setting modeConfig = sgGeneral.add(new EnumSetting.Builder() + .name("Mode") + .description("The phase mode for clipping into blocks") + .defaultValue(PhaseMode.NORMAL) + .build() + ); + + private final Setting pitchConfig = sgGeneral.add(new IntSetting.Builder() + .name("Pitch") + .description("The pitch to throw pearls") + .min(70) + .defaultValue(85) + .max(90) + .sliderMin(70) + .sliderMax(90) + .sliderRange(70, 90) + .visible(() -> modeConfig.get() == PhaseMode.PEARL) + .build() + ); + + private final Setting swapAltConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Swap Alternative") + .description("Uses inventory swap for swapping to pearls") + .defaultValue(true) + .visible(() -> modeConfig.get() == PhaseMode.PEARL) + .build() + ); + + private final Setting attackConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Attack") + .description("Attacks entities in the way of the pearl phase") + .defaultValue(false) + .visible(() -> modeConfig.get() == PhaseMode.PEARL) + .build() + ); + + private final Setting raytraceConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Raytrace") + .description("Checks the landing position of the pearl") + .defaultValue(false) + .visible(() -> modeConfig.get() == PhaseMode.PEARL) + .build() + ); + + private final Setting swingConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Swing") + .description("Swings the hand when throwing pearls") + .defaultValue(true) + .visible(() -> modeConfig.get() == PhaseMode.PEARL) + .build() + ); + + private final Setting selfFillConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Self Fill") + .description("Automatically fills blocks you are phasing on") + .defaultValue(false) + .visible(() -> modeConfig.get() == PhaseMode.PEARL) + .build() + ); + + // Blocks + + private final Setting blocksConfig = sgBlocks.add(new DoubleSetting.Builder() + .name("Blocks") + .description("The blocks distance to phase clip") + .min(0.001d) + .defaultValue(0.003d) + .max(10.0d) + .visible(() -> modeConfig.get() != PhaseMode.PEARL && modeConfig.get() != PhaseMode.CLIP) + .build() + ); + + private final Setting distanceConfig = sgBlocks.add(new DoubleSetting.Builder() + .name("Distance") + .description("The distance to phase") + .min(0.0f) + .defaultValue(0.2f) + .max(10.0f) + .visible(() -> modeConfig.get() != PhaseMode.PEARL && modeConfig.get() != PhaseMode.CLIP) + .build() + ); + + private final Setting autoClipConfig = sgGeneral.add(new BoolSetting.Builder() + .name("Auto Clip") + .description("Automatically clips into the block") + .defaultValue(true) + .visible(() -> modeConfig.get() != PhaseMode.PEARL && modeConfig.get() != PhaseMode.CLIP) + .build() + ); + + @Override + public String getInfoString() + { + return EnumFormatter.formatEnum(modeConfig.get()); + } + + @Override + public void onActivate() + { + if (mc.player == null) + { + return; + } + + if (modeConfig.get() == PhaseMode.PEARL) + { + int pearlSlot = -1; + for (int i = 0; i < 45; i++) + { + ItemStack stack = mc.player.getInventory().getStack(i); + if (stack.getItem() instanceof EnderPearlItem) + { + pearlSlot = i; + break; + } + } + + if (pearlSlot == -1 || mc.player.getItemCooldownManager().isCoolingDown(Items.ENDER_PEARL.getDefaultStack())) + { + toggle(); + return; + } + + float prevYaw = mc.player.getYaw(); + float prevPitch = mc.player.getPitch(); + final Vec3d pearlTargetVec = new Vec3d(Math.floor(mc.player.getX()) + 0.5, 0.0, Math.floor(mc.player.getZ()) + 0.5); + float[] rotations = RotationUtil.getRotationsTo(mc.player.getEyePos(), pearlTargetVec); + float yaw = rotations[0] + 180.0f; // normalize + + if (attackConfig.get()) + { + BlockHitResult hitResult = (BlockHitResult) RaycastUtil.rayCast(3.0, new float[] { yaw, 60.0f }); + for (Entity entity : mc.world.getOtherEntities(null, new Box(hitResult.getBlockPos()).expand(0.2))) + { + if (entity instanceof ItemFrameEntity itemFrameEntity) + { + if (!itemFrameEntity.getHeldItemStack().isEmpty()) + { + Managers.NETWORK.sendPacket(PlayerInteractEntityC2SPacket.attack(entity, mc.player.isSneaking())); + } + Managers.NETWORK.sendPacket(PlayerInteractEntityC2SPacket.attack(entity, mc.player.isSneaking())); + Managers.NETWORK.sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); + } + } + + BlockState state = mc.world.getBlockState(mc.player.getBlockPos()); + if (state.getBlock() instanceof ScaffoldingBlock) + { + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, mc.player.getBlockPos(), Direction.UP)); + Managers.NETWORK.sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, mc.player.getBlockPos(), Direction.UP)); + } + } + + if (selfFillConfig.get()) + { + float yaw1 = yaw % 360.0f; + if (yaw1 < 0.0f) + { + yaw1 += 360.0f; + } + + BlockPos blockPos = mc.player.getBlockPos(); + if (yaw1 >= 22.5 && yaw1 < 67.5) + { + blockPos = blockPos.south().west(); + } + else if (yaw1 >= 67.5 && yaw1 < 112.5) + { + blockPos = blockPos.west(); + } + else if (yaw1 >= 112.5 && yaw1 < 157.5) + { + blockPos = blockPos.north().west(); + } + else if (yaw1 >= 157.5 && yaw1 < 202.5) + { + blockPos = blockPos.north(); + } + else if (yaw1 >= 202.5 && yaw1 < 247.5) + { + blockPos = blockPos.north().east(); + } + else if (yaw1 >= 247.5 && yaw1 < 292.5) + { + blockPos = blockPos.east(); + } + else if (yaw1 >= 292.5 && yaw1 < 337.5) + { + blockPos = blockPos.south().east(); + } + else + { + blockPos = blockPos.south(); + } + + int slot = getResistantBlockItem(); + if (slot != -1 && blockPos != null && !mc.world.getBlockState(blockPos.down()).isReplaceable()) + { + Managers.INTERACT.placeBlock(blockPos, slot, + strictDirectionConfig.get(), false, true, (state, angles) -> + { + if (state) + { + Managers.ROTATION.setRotationSilent(angles[0], angles[1]); + } + else + { + Managers.ROTATION.setRotationSilentSync(); + } + }); + } + } + + setRotationClient(yaw, pitchConfig.get()); + // mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.LookAndOnGround(rotations[0] + 180.0f, pitchConfig.get(), mc.player.isOnGround())); + if (swapAltConfig.get()) + { + mc.interactionManager.clickSlot(0, pearlSlot < 9 ? pearlSlot + 36 : pearlSlot, 0, SlotActionType.PICKUP, mc.player); + mc.interactionManager.clickSlot(0, mc.player.getInventory().selectedSlot + 36, 0, SlotActionType.PICKUP, mc.player); + mc.interactionManager.clickSlot(0, pearlSlot < 9 ? pearlSlot + 36 : pearlSlot, 0, SlotActionType.PICKUP, mc.player); + } + else if (pearlSlot < 9) + { + Managers.INVENTORY.setSlot(pearlSlot); + } + + setRotationSilent(yaw, pitchConfig.get()); + Managers.NETWORK.sendSequencedPacket(id -> new PlayerInteractItemC2SPacket(Hand.MAIN_HAND, id, yaw, pitchConfig.get())); + Managers.PEARL.setLastThrownAngles(new float[] { yaw, pitchConfig.get() }); + if (swingConfig.get()) + { + mc.player.swingHand(Hand.MAIN_HAND); + } + else + { + Managers.NETWORK.sendPacket(new HandSwingC2SPacket(Hand.MAIN_HAND)); + } + + if (swapAltConfig.get()) + { + mc.interactionManager.clickSlot(0, pearlSlot < 9 ? pearlSlot + 36 : pearlSlot, 0, SlotActionType.PICKUP, mc.player); + mc.interactionManager.clickSlot(0, mc.player.getInventory().selectedSlot + 36, 0, SlotActionType.PICKUP, mc.player); + mc.interactionManager.clickSlot(0, pearlSlot < 9 ? pearlSlot + 36 : pearlSlot, 0, SlotActionType.PICKUP, mc.player); + } + else if (pearlSlot < 9) + { + Managers.INVENTORY.syncToClient(); + } + + Managers.ROTATION.setRotationSilentSync(); + setRotationClient(prevYaw, prevPitch); + toggle(); + } + + else if (autoClipConfig.get()) + { + double cos = Math.cos(Math.toRadians(mc.player.getYaw() + 90.0f)); + double sin = Math.sin(Math.toRadians(mc.player.getYaw() + 90.0f)); + mc.player.setPosition(mc.player.getX() + (1.0 * blocksConfig.get() * cos + 0.0 * blocksConfig.get() * sin), + mc.player.getY(), mc.player.getZ() + (1.0 * blocksConfig.get() * sin - 0.0 * blocksConfig.get() * cos)); + } + } + + @EventHandler + public void onTick(TickEvent.Pre event) + { + if (modeConfig.get() != PhaseMode.CLIP + || !mc.player.isOnGround() || mc.player.isRiding()) + { + return; + } + + // fucks with mc hitbox checks + Vec3d vec3d = mc.player.getBlockPos().toCenterPos(); + boolean flagX = (vec3d.x - mc.player.getX()) > 0; + boolean flagZ = (vec3d.z - mc.player.getZ()) > 0; + double x = vec3d.x + 0.20000000009497754 * (flagX ? -1 : 1); + double z = vec3d.z + 0.2000000000949811 * (flagZ ? -1 : 1); + mc.player.setPosition(x, mc.player.getY(), z); + toggle(); + } + + @EventHandler + public void onBlockCollision(BlockCollisionEvent event) { + if (mc.player == null) + { + return; + } + switch (modeConfig.get()) + { + case NORMAL -> + { + if (event.shape != VoxelShapes.empty() && event.shape.getBoundingBox().maxY > mc.player.getBoundingBox().minY && mc.player.isSneaking()) + { + event.cancel(); + event.setVoxelShape(VoxelShapes.empty()); + } + } + case SAND -> + { + event.cancel(); + event.setVoxelShape(VoxelShapes.empty()); + mc.player.noClip = true; + } + case CLIMB -> + { + if (mc.player.horizontalCollision) + { + event.cancel(); + event.setVoxelShape(VoxelShapes.empty()); + } + if (mc.player.input.playerInput.sneak() || (mc.player.input.playerInput.jump() + && event.pos.getY() > mc.player.getY())) + { + event.cancel(); + } + } + } + } + + @EventHandler + public void onPlayerUpdate(PlayerUpdateEvent event) + { + switch (modeConfig.get()) + { + case NORMAL -> + { + if (mc.player.isSneaking() && isPhasing()) + { + float yaw = mc.player.getYaw(); + mc.player.setBoundingBox(mc.player.getBoundingBox().offset( + distanceConfig.get() * Math.cos(Math.toRadians(yaw + 90.0f)), + 0.0, distanceConfig.get() * Math.sin(Math.toRadians(yaw + 90.0f)))); + } + } + case SAND -> + { + Managers.MOVEMENT.setMotionY(0.0); + if (mc.isWindowFocused()) + { + if (mc.player.input.playerInput.jump()) + { + Managers.MOVEMENT.setMotionY(mc.player.getVelocity().y + 0.3); + } + if (mc.player.input.playerInput.sneak()) + { + Managers.MOVEMENT.setMotionY(mc.player.getVelocity().y - 0.3); + } + } + mc.player.noClip = true; + } + } + } + + @EventHandler + public void onPushOutOfBlocks(PushOutOfBlocksEvent event) + { + event.cancel(); + } + + public boolean isPhasing() + { + Box bb = mc.player.getBoundingBox(); + for (int x = MathHelper.floor(bb.minX); x < MathHelper.floor(bb.maxX) + 1; x++) + { + for (int y = MathHelper.floor(bb.minY); y < MathHelper.floor(bb.maxY) + 1; y++) + { + for (int z = MathHelper.floor(bb.minZ); z < MathHelper.floor(bb.maxZ) + 1; z++) + { + if (mc.world.getBlockState(new BlockPos(x, y, z)).blocksMovement()) + { + if (bb.intersects(new Box(x, y, z, x + 1.0, y + 1.0, z + 1.0))) + { + return true; + } + } + } + } + } + return false; + } + + public boolean shouldRaytrace() + { + return raytraceConfig.get(); + } + + public enum PhaseMode + { + NORMAL, + SAND, + CLIMB, + PEARL, + CLIP + } + +} diff --git a/src/main/java/com/genyo/addon/utils/string/EnumFormatter.java b/src/main/java/com/genyo/addon/utils/string/EnumFormatter.java new file mode 100644 index 0000000..2bfb333 --- /dev/null +++ b/src/main/java/com/genyo/addon/utils/string/EnumFormatter.java @@ -0,0 +1,33 @@ +package com.genyo.addon.utils.string; + +public class EnumFormatter { + + /** + * Formats an enum + * + * @param in The enum to format + * @return The formatted enum + */ + public static String formatEnum(final Enum in) + { + String name = in.name(); + // no capitalization + if (!name.contains("_")) + { + char firstChar = name.charAt(0); + String suffixChars = name.split(String.valueOf(firstChar), 2)[1]; + return String.valueOf(firstChar).toUpperCase() + suffixChars.toLowerCase(); + } + String[] names = name.split("_"); + StringBuilder nameToReturn = new StringBuilder(); + for (String n : names) + { + char firstChar = n.charAt(0); + String suffixChars = n.split(String.valueOf(firstChar), 2)[1]; + nameToReturn.append(String.valueOf(firstChar).toUpperCase()) + .append(suffixChars.toLowerCase()); + } + return nameToReturn.toString(); + } + +} diff --git a/src/main/resources/genyo.mixins.json b/src/main/resources/genyo.mixins.json index 82ee401..824ea6a 100644 --- a/src/main/resources/genyo.mixins.json +++ b/src/main/resources/genyo.mixins.json @@ -32,6 +32,7 @@ "entity.IEntity", "entity.MixinEntity", "entity.player.MixinPlayerEntity", - "network.MixinServerPlayerEntity" + "network.MixinServerPlayerEntity", + "world.MixinBlockCollisionSpliterator" ] } From c8c5b97ed458427366b8cdc1466ac0606428bb0d Mon Sep 17 00:00:00 2001 From: wuritz Date: Wed, 6 Aug 2025 15:17:54 +0200 Subject: [PATCH 6/7] working targethud --- src/main/java/com/genyo/addon/GenyoAddon.java | 18 +- .../addon/managers/combat/CombatManager.java | 14 +- .../systems/hud/BetterPlayerRadarHud.java | 2 +- .../genyo/addon/systems/hud/TargetHud.java | 304 ++++++++++++++++++ .../modules/combat/GenyoAutoArmor.java | 2 +- .../modules/combat/GenyoAutoCrystal.java | 16 +- .../modules/combat/GenyoAutoTotem.java | 2 +- .../systems/modules/combat/GenyoAutoTrap.java | 2 +- .../systems/modules/combat/GenyoAutoXP.java | 2 +- .../modules/combat/GenyoCriticals.java | 2 +- .../modules/combat/GenyoReplenish.java | 2 +- .../systems/modules/combat/KFCSpawnKill.java | 2 +- .../systems/modules/misc/CombatBrainrot.java | 2 +- .../systems/modules/misc/GenyoAutoEZ.java | 4 +- .../systems/modules/misc/GenyoDiscord.java | 2 +- .../systems/modules/misc/GenyoGoodbye.java | 2 +- .../systems/modules/misc/GenyoSkinBlink.java | 2 +- .../systems/modules/misc/GenyoWelcome.java | 2 +- .../systems/modules/misc/PacketDebug.java | 2 +- .../systems/modules/movement/GenyoPhase.java | 2 +- .../modules/movement/GenyoVelocity.java | 2 +- .../modules/visual/AngelSexHulkenberg.java | 2 +- .../systems/modules/visual/GenyoCapes.java | 2 +- .../systems/modules/visual/GenyoPenisESP.java | 2 +- .../systems/modules/world/GenyoAutoMine.java | 2 +- .../systems/modules/world/GenyoAutoTool.java | 2 +- .../modules/world/GenyoGhostBlocks.java | 2 +- .../systems/modules/world/GenyoScaffold.java | 2 +- .../systems/modules/world/GenyoSelfTrap.java | 2 +- .../systems/modules/world/GenyoSpeedmine.java | 2 +- .../systems/modules/world/GenyoSurround.java | 2 +- .../modules/world/GenyoSurroundV2.java | 21 +- .../com/genyo/addon/utils/GenyoChatUtils.java | 8 + src/main/resources/assets/genyo/icon.png | Bin 3351 -> 6070 bytes .../resources/assets/genyo/textures/cape.png | Bin 1398 -> 34648 bytes 35 files changed, 389 insertions(+), 48 deletions(-) create mode 100644 src/main/java/com/genyo/addon/systems/hud/TargetHud.java diff --git a/src/main/java/com/genyo/addon/GenyoAddon.java b/src/main/java/com/genyo/addon/GenyoAddon.java index d8a8d27..52e71c2 100644 --- a/src/main/java/com/genyo/addon/GenyoAddon.java +++ b/src/main/java/com/genyo/addon/GenyoAddon.java @@ -30,10 +30,19 @@ import net.minecraft.item.Items; import org.slf4j.Logger; +import java.lang.annotation.Target; + public class GenyoAddon extends MeteorAddon { public static final Logger LOG = LogUtils.getLogger(); - public static final Category GENYO = new Category("Genyo", Items.MILK_BUCKET.getDefaultStack()); + + // Categories + public static final Category COMBAT = new Category("G-COMBAT", Items.MILK_BUCKET.getDefaultStack()); + public static final Category MISC = new Category("G-MISC", Items.MILK_BUCKET.getDefaultStack()); + public static final Category MOVEMENT = new Category("G-MOVE", Items.MILK_BUCKET.getDefaultStack()); + public static final Category VISUAL = new Category("G-VISUAL", Items.MILK_BUCKET.getDefaultStack()); + public static final Category WORLD = new Category("G-WORLD", Items.MILK_BUCKET.getDefaultStack()); + public static final HudGroup HUD_GROUP = new HudGroup("Genyo"); public static final String MOD_ID = "genyo"; @@ -127,11 +136,16 @@ private void initHUD(Hud hud) { hud.register(PacketsHud.INFO); hud.register(WatermarkHud.INFO); hud.register(BetterPlayerRadarHud.INFO); + hud.register(TargetHud.INFO); } @Override public void onRegisterCategories() { - Modules.registerCategory(GENYO); + Modules.registerCategory(COMBAT); + Modules.registerCategory(MISC); + Modules.registerCategory(MOVEMENT); + Modules.registerCategory(VISUAL); + Modules.registerCategory(WORLD); } @Override diff --git a/src/main/java/com/genyo/addon/managers/combat/CombatManager.java b/src/main/java/com/genyo/addon/managers/combat/CombatManager.java index d726d5d..56d0447 100644 --- a/src/main/java/com/genyo/addon/managers/combat/CombatManager.java +++ b/src/main/java/com/genyo/addon/managers/combat/CombatManager.java @@ -1,15 +1,20 @@ package com.genyo.addon.managers.combat; +import com.genyo.addon.GenyoAddon; import com.genyo.addon.events.TotemPopEvent; import com.genyo.addon.events.UnderCombatEvent; +import com.genyo.addon.utils.GenyoChatUtils; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.entity.player.AttackEntityEvent; import meteordevelopment.meteorclient.events.packets.PacketEvent; +import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityStatuses; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import java.util.HashMap; @@ -48,8 +53,15 @@ public void onPacketReceive(PacketEvent.Receive event) { } MeteorClient.EVENT_BUS.post(TotemPopEvent.get((PlayerEntity) ent, popList.get(entityName))); + } else if (pac.getStatus() == EntityStatuses.PLAY_DEATH_SOUND_OR_ADD_PROJECTILE_HIT_PARTICLES) { + Entity ent = pac.getEntity(mc.world); + if (!(ent instanceof PlayerEntity player)) return; + if (player != mc.player) return; + + GenyoChatUtils.sendMessage(Formatting.GRAY + "You have very dead. Oh no." + + "\n\nReason: " + Formatting.GREEN + "ewrhjfkjerkjfhrejkgkregr" + Formatting.GRAY + + "\nConclusion: " + Formatting.GREEN + "Skill issue. :("); } } } - } diff --git a/src/main/java/com/genyo/addon/systems/hud/BetterPlayerRadarHud.java b/src/main/java/com/genyo/addon/systems/hud/BetterPlayerRadarHud.java index 420712c..3410130 100644 --- a/src/main/java/com/genyo/addon/systems/hud/BetterPlayerRadarHud.java +++ b/src/main/java/com/genyo/addon/systems/hud/BetterPlayerRadarHud.java @@ -21,7 +21,7 @@ public class BetterPlayerRadarHud extends HudElement { - public static final HudElementInfo INFO = new HudElementInfo<>(GenyoAddon.HUD_GROUP, "player-radar", "Displays players in your visual range.", BetterPlayerRadarHud::new); + public static final HudElementInfo INFO = new HudElementInfo<>(GenyoAddon.HUD_GROUP, "better-player-radar", "Displays players in your visual range.", BetterPlayerRadarHud::new); private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgFeatures = settings.createGroup("Features"); diff --git a/src/main/java/com/genyo/addon/systems/hud/TargetHud.java b/src/main/java/com/genyo/addon/systems/hud/TargetHud.java new file mode 100644 index 0000000..4fd6e3b --- /dev/null +++ b/src/main/java/com/genyo/addon/systems/hud/TargetHud.java @@ -0,0 +1,304 @@ +package com.genyo.addon.systems.hud; + +import com.genyo.addon.GenyoAddon; +import com.genyo.addon.managers.Managers; +import com.genyo.addon.systems.modules.combat.GenyoAutoCrystal; +import com.genyo.addon.systems.modules.combat.KFCSpawnKill; +import com.genyo.addon.systems.modules.misc.GenyoAutoEZ; +import meteordevelopment.meteorclient.gui.screens.settings.ColorSettingScreen; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.systems.hud.Hud; +import meteordevelopment.meteorclient.systems.hud.HudElement; +import meteordevelopment.meteorclient.systems.hud.HudElementInfo; +import meteordevelopment.meteorclient.systems.hud.HudRenderer; +import meteordevelopment.meteorclient.systems.hud.elements.InventoryHud; +import meteordevelopment.meteorclient.systems.hud.screens.HudEditorScreen; +import meteordevelopment.meteorclient.systems.hud.screens.HudElementScreen; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.utils.entity.EntityUtils; +import meteordevelopment.meteorclient.utils.render.RenderUtils; +import meteordevelopment.meteorclient.utils.render.color.Color; +import meteordevelopment.meteorclient.utils.render.color.SettingColor; +import net.minecraft.client.gui.PlayerSkinDrawer; +import net.minecraft.client.gui.screen.ChatScreen; +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.component.ComponentMap; +import net.minecraft.component.ComponentType; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ArmorItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; + +import java.util.ArrayList; +import java.util.List; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +public class TargetHud extends HudElement { + + public static final HudElementInfo INFO = new HudElementInfo<>(GenyoAddon.HUD_GROUP, "target-hud", "Genyo genyo genyo", TargetHud::new); + + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgBackground = settings.createGroup("Background"); + private final SettingGroup sgScale = settings.createGroup("Scale"); + + private final Setting shadow = sgGeneral.add(new BoolSetting.Builder() + .name("shadow") + .description("Renders shadow behind text.") + .defaultValue(true) + .build() + ); + + // Scale + + private final Setting customScale = sgScale.add(new BoolSetting.Builder() + .name("custom-scale") + .description("Applies a custom scale to this hud element.") + .defaultValue(false) + .visible(() -> false) + .build() + ); + + private final Setting scale = sgScale.add(new DoubleSetting.Builder() + .name("scale") + .description("Custom scale.") + .visible(customScale::get) + .defaultValue(1) + .min(0.5) + .sliderRange(0.5, 3) + .build() + ); + + // Background + + private final Setting background = sgBackground.add(new BoolSetting.Builder() + .name("background") + .description("Displays background.") + .defaultValue(false) + .build() + ); + + private final Setting backgroundColor = sgBackground.add(new ColorSetting.Builder() + .name("background-color") + .description("Color used for the background.") + .visible(background::get) + .defaultValue(new SettingColor(25, 25, 25, 120)) + .build() + ); + + public TargetHud() { + super(INFO); + } + + private Target currentTarget; + private final List handItems = new ArrayList<>(); + private final List armorItems = new ArrayList<>(); + + private final Color WHITE = new Color(255, 255, 255); + private final Color RED = new Color(255, 25, 25); + private final Color AMBER = new Color(255, 105, 25); + private final Color GREEN = new Color(25, 252, 25); + private final Color GOLD = new Color(232, 185, 35); + + @Override + public void tick(HudRenderer renderer) { + if (mc.player == null || mc.world == null) return; + + getTarget(); + if (currentTarget == null) return; + + armorItems.clear(); + handItems.clear(); + + for (int i = 0; i < 6; i++) { + ItemStack itemStack = getItem(currentTarget.target, i); + + if (itemStack != null) { + if (itemStack.getItem() instanceof ArmorItem) { + String durability = String.format("%.0f%%", ((itemStack.getMaxDamage() - itemStack.getDamage()) * 100f) / (float) itemStack.getMaxDamage()); + armorItems.add(new ArmorRecord((ArmorItem) itemStack.getItem(), durability, (int) (((itemStack.getMaxDamage() - itemStack.getDamage()) * 100f) / (float) itemStack.getMaxDamage()))); + } else { + if (!itemStack.getItem().equals(Items.AIR)) handItems.add(new HandItem(itemStack.getItem(), itemStack.getCount())); + } + } + } + + setSize(400 * getScale(), 200 * getScale()); + } + + @Override + public void render(HudRenderer renderer) { + if (mc.player == null || mc.world == null) return; + if (currentTarget == null) return; + + double spaceWidth = renderer.textWidth(" ", shadow.get(), getScale()); + double rowHeight = (renderer.textHeight() + 2) * getScale(); + double x = this.x; + double y = this.y; + + String targetHudText = "TargetHud"; + targetHudText += String.format(" (%s)", currentTarget.source); + renderer.text(targetHudText, x + widthScale(0.5) - (renderer.textWidth(targetHudText, shadow.get(), getScale()) / 2), y + heightScale(1) - rowHeight, Color.WHITE, shadow.get(), getScale()); + x += widthScale(0.05); + y += heightScale(0.1); + + PlayerListEntry entry = mc.getNetworkHandler().getPlayerListEntry(currentTarget.target.getUuid()); + if (entry != null) { + PlayerSkinDrawer.draw(renderer.drawContext, entry.getSkinTextures(), (int) x, (int) y, 64); + } + + x += widthScale(0.05) + 64; + + renderer.text(currentTarget.target.getName().getString(), x, y, Color.YELLOW, shadow.get(), getScale()); + + y += rowHeight; + // Health + String healthText = null; + Color healthColor = null; + + float absorption = currentTarget.target.getAbsorptionAmount(); + int healthInt = Math.round(currentTarget.target.getHealth() + absorption); + double healthPercentage = healthInt / (currentTarget.target.getMaxHealth() + absorption); + + if (healthPercentage <= 0.333) healthColor = RED; + else if (healthPercentage <= 0.666) healthColor = AMBER; + else healthColor = GREEN; + + healthText = String.format("%s", healthInt); + + renderer.text("HP:", x, y, Color.WHITE, shadow.get(), getScale()); + renderer.text(healthText, x + renderer.textWidth("HP:", shadow.get(), getScale()) + spaceWidth, y, healthColor, shadow.get(), getScale()); + + y += rowHeight; + + // ping + distance + String pingText = null; + String distanceText = null; + int ping = EntityUtils.getPing(currentTarget.target); + pingText = String.format("[%sms]", ping); + distanceText = String.format("%.1fm", mc.getCameraEntity().distanceTo(currentTarget.target)); + + renderer.text(pingText, x, y, new Color(20, 170, 170), shadow.get(), getScale()); + renderer.text("|", x + spaceWidth + renderer.textWidth(pingText, shadow.get(), getScale()), y, Color.WHITE, shadow.get(), getScale()); + renderer.text(distanceText, x + spaceWidth + renderer.textWidth(pingText + "|", shadow.get(), getScale()) + spaceWidth, y, Color.LIGHT_GRAY, shadow.get(), getScale()); + if (background.get()) renderer.quad(this.x, this.y, getWidth(), getHeight(), backgroundColor.get()); + + // Items + if (!handItems.isEmpty()) { + renderer.post(() -> { + double internalX = this.x + widthScale(0.70); + double internalY = this.y + heightScale(0.1); + + for (HandItem handItem : handItems) { + renderer.item(handItem.item.getDefaultStack(), (int) internalX, (int) internalY, (float) getScale() * 2, true, String.valueOf(handItem.count)); + + if (handItems.size() != 1) internalX += widthScale(0.1); + } + }); + } + + // Armor + if (!armorItems.isEmpty()) { + double finalX = x; + double finalY = y; + renderer.post(() -> { + double internalX = finalX - 64 - spaceWidth - widthScale(0.05); + double internalY = finalY + rowHeight + heightScale(0.1); + + for (ArmorRecord armorRecord : armorItems) { + renderer.item(armorRecord.item.getDefaultStack(), (int) internalX, (int) internalY, (float) getScale() * 2, false); + + Color durabilityColor = null; + + if (armorRecord.duraInt >= 66) durabilityColor = GREEN; + else if (armorRecord.duraInt >= 33) durabilityColor = AMBER; + else durabilityColor = RED; + + renderer.text(armorRecord.durability, internalX + widthScale(0.09), internalY + heightScale(0.03), durabilityColor, shadow.get(), getScale()); + if (armorItems.indexOf(armorRecord)-1 % 2 == 0) { + internalY += heightScale(0.2); + internalX -= widthScale(0.25); + } else { + internalX += widthScale(0.25); + } + } + }); + } + + // Pop count + if (Modules.get().get(GenyoAutoEZ.class).taggedPlayers.containsKey(currentTarget.target) + || Managers.COMBAT.popList.containsKey(currentTarget.target.getName().getString())) { + + int pops = 0; + x += widthScale(0.45); + renderer.text("Pops:", x, y, Color.WHITE, shadow.get(), getScale()); + + if (Modules.get().get(GenyoAutoEZ.class).taggedPlayers.containsKey(currentTarget.target)) { + pops = Modules.get().get(GenyoAutoEZ.class).taggedPlayers.get(currentTarget.target); + } else { + pops = Managers.COMBAT.popList.get(currentTarget.target.getName().getString()); + } + + renderer.text(String.valueOf(pops), x + spaceWidth + renderer.textWidth("Pops:", shadow.get(), getScale()), y, Color.YELLOW, shadow.get(), getScale()); + } + + } + + private int widthScale(double scale) { + return (int) (getWidth() * scale); + } + + private int heightScale(double scale) { + return (int) (getHeight() * scale); + } + + private void getTarget() { + if (Modules.get().get(GenyoAutoCrystal.class).targetEntity != null) { + currentTarget = new Target(Modules.get().get(GenyoAutoCrystal.class).targetEntity, Source.AutoCrystal); + } else if (Modules.get().get(KFCSpawnKill.class).getEntityTarget() != null && Modules.get().get(KFCSpawnKill.class).getEntityTarget() instanceof PlayerEntity) { + currentTarget = new Target((PlayerEntity) Modules.get().get(KFCSpawnKill.class).getEntityTarget(), Source.KillAura); + } else if (mc.currentScreen instanceof ChatScreen + || mc.currentScreen instanceof HudEditorScreen + || mc.currentScreen instanceof HudElementScreen + || mc.currentScreen instanceof ColorSettingScreen) { + currentTarget = new Target(mc.player, Source.Brasil); + } else { + currentTarget = null; + } + } + + private ItemStack getItem(PlayerEntity entity, int index) { + if (entity == null) return null; + + return switch (index) { + case 0 -> entity.getMainHandStack(); + case 1 -> entity.getInventory().armor.get(3); + case 2 -> entity.getInventory().armor.get(2); + case 3 -> entity.getInventory().armor.get(1); + case 4 -> entity.getInventory().armor.get(0); + case 5 -> entity.getOffHandStack(); + default -> ItemStack.EMPTY; + }; + } + + private record Target(PlayerEntity target, Source source) { + } + + private record HandItem(Item item, int count) { + } + + private record ArmorRecord(ArmorItem item, String durability, int duraInt) { + } + + private enum Source { + AutoCrystal, + KillAura, + Brasil + } + + private double getScale() { + return customScale.get() ? scale.get() : Hud.get().getTextScale(); + } +} diff --git a/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoArmor.java b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoArmor.java index dabcac9..b092920 100644 --- a/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoArmor.java +++ b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoArmor.java @@ -26,7 +26,7 @@ public class GenyoAutoArmor extends GenyoModule { public GenyoAutoArmor() { - super(GenyoAddon.GENYO, "genyo-auto-armor", "Automatically replaces armor pieces."); + super(GenyoAddon.COMBAT, "genyo-auto-armor", "Automatically replaces armor pieces."); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoCrystal.java b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoCrystal.java index adf7aca..c1b48cf 100644 --- a/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoCrystal.java +++ b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoCrystal.java @@ -69,7 +69,7 @@ public class GenyoAutoCrystal extends PlacerModule { public GenyoAutoCrystal() { - super(GenyoAddon.GENYO, "Genyo AutoCrystal", "asd"); + super(GenyoAddon.COMBAT, "Genyo AutoCrystal", "asd"); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -599,6 +599,7 @@ public GenyoAutoCrystal() { .build() ); + public PlayerEntity targetEntity; // private DamageData attackCrystal; private DamageData placeCrystal; @@ -665,6 +666,7 @@ public void onDeactivate() placeCrystal = null; crystalRotation = null; silentRotations = null; + targetEntity = null; calculatePlaceCrystalTime = 0; stuckCrystals.clear(); attackPackets.clear(); @@ -719,6 +721,9 @@ public void onPlayerUpdate(PlayerTickEvent event) if (place.get()) { placeCrystal = calculatePlaceCrystal(blocks, entities); + if (placeCrystal == null) { + if (targetEntity != null) targetEntity = null; + } } attackCrystal = calculateAttackCrystal(entities); if (attackCrystal == null) @@ -736,6 +741,8 @@ public void onPlayerUpdate(PlayerTickEvent event) placeCrystal.getDamage(), self, crystalEntity.getBlockPos().down(), false); } } + } else { + if (targetEntity != null) targetEntity = null; } calculatePlaceCrystalTime = System.nanoTime() - timePre; } @@ -1082,6 +1089,7 @@ else if (instantCalc.get()) double dist = mc.player.squaredDistanceTo(entity); if (dist > targetRange.get() * targetRange.get()) { + if (targetEntity != null) targetEntity = null; continue; } @@ -1093,6 +1101,7 @@ else if (instantCalc.get()) attackRotate = damage > instantDamage.get() || attackCrystal != null && damage >= attackCrystal.getDamage() && instantMax.get() || entity instanceof LivingEntity entity1 && isCrystalLethalTo(data, entity1); + if (entity instanceof PlayerEntity) targetEntity = (PlayerEntity) entity; if (attackRotate) { final Hand hand = getCrystalHand(); @@ -1470,6 +1479,7 @@ private DamageData calculateAttackCrystal(List entitie double dist = mc.player.squaredDistanceTo(entity); if (dist > targetRange.get() * targetRange.get()) { + if (targetEntity != null) targetEntity = null; continue; } @@ -1517,6 +1527,7 @@ private DamageData calculateAttackCrystal(List entitie if (data == null || damage > data.getDamage()) { data = currentData; + if(entity instanceof PlayerEntity) targetEntity = (PlayerEntity) entity; } } } @@ -1603,6 +1614,7 @@ private DamageData calculatePlaceCrystal(List placeBlocks, L double dist = mc.player.squaredDistanceTo(entity); if (dist > targetRange.get() * targetRange.get()) { + if (targetEntity != null) targetEntity = null; continue; } @@ -1651,6 +1663,7 @@ private DamageData calculatePlaceCrystal(List placeBlocks, L if (data == null || damage > data.getDamage()) { data = currentData; + if(entity instanceof PlayerEntity) targetEntity = (PlayerEntity) entity; } } } @@ -1721,6 +1734,7 @@ public void placeCrystalForTarget(PlayerEntity target, BlockPos blockPos) } float[] rotations = RotationUtil.getRotationsTo(mc.player.getEyePos(), blockPos.toCenterPos()); + targetEntity = target; setRotation(rotations[0], rotations[1]); placeCrystal(blockPos, Hand.MAIN_HAND, false); fadeList.put(blockPos, new Animation(true, fadeTime.get())); diff --git a/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoTotem.java b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoTotem.java index e448f3d..81cfc0a 100644 --- a/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoTotem.java +++ b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoTotem.java @@ -33,7 +33,7 @@ public class GenyoAutoTotem extends GenyoModule { public GenyoAutoTotem() { - super(GenyoAddon.GENYO, "genyo-auto-totem", "Automatically replenishes the totem in your offhand"); + super(GenyoAddon.COMBAT, "genyo-auto-totem", "Automatically replenishes the totem in your offhand"); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoTrap.java b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoTrap.java index d99975f..34b0122 100644 --- a/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoTrap.java +++ b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoTrap.java @@ -40,7 +40,7 @@ public class GenyoAutoTrap extends PlacerModule { public GenyoAutoTrap() { - super(GenyoAddon.GENYO, "genyo-auto-trap", "Fully traps enemies with blocks."); + super(GenyoAddon.COMBAT, "genyo-auto-trap", "Fully traps enemies with blocks."); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoXP.java b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoXP.java index cd3c216..be437be 100644 --- a/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoXP.java +++ b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoXP.java @@ -19,7 +19,7 @@ public class GenyoAutoXP extends GenyoModule { public GenyoAutoXP() { - super(GenyoAddon.GENYO, "Genyo AutoXP", "better than blackout"); + super(GenyoAddon.COMBAT, "Genyo AutoXP", "better than blackout"); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/com/genyo/addon/systems/modules/combat/GenyoCriticals.java b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoCriticals.java index 88fe383..0dcc0e7 100644 --- a/src/main/java/com/genyo/addon/systems/modules/combat/GenyoCriticals.java +++ b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoCriticals.java @@ -34,7 +34,7 @@ public class GenyoCriticals extends GenyoModule { public GenyoCriticals() { - super(GenyoAddon.GENYO, "genyo-criticals", "crrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr"); + super(GenyoAddon.COMBAT, "genyo-criticals", "crrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr"); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/com/genyo/addon/systems/modules/combat/GenyoReplenish.java b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoReplenish.java index 68ae9d3..0138c76 100644 --- a/src/main/java/com/genyo/addon/systems/modules/combat/GenyoReplenish.java +++ b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoReplenish.java @@ -28,7 +28,7 @@ public class GenyoReplenish extends GenyoModule { public GenyoReplenish() { - super(GenyoAddon.GENYO, "genyo-replenish", "fwejhfkljwefklwejfklkwlefjlwefl"); + super(GenyoAddon.COMBAT, "genyo-replenish", "fwejhfkljwefklwejfklkwlefjlwefl"); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/com/genyo/addon/systems/modules/combat/KFCSpawnKill.java b/src/main/java/com/genyo/addon/systems/modules/combat/KFCSpawnKill.java index 5fea2fd..4c2174f 100644 --- a/src/main/java/com/genyo/addon/systems/modules/combat/KFCSpawnKill.java +++ b/src/main/java/com/genyo/addon/systems/modules/combat/KFCSpawnKill.java @@ -55,7 +55,7 @@ public class KFCSpawnKill extends GenyoModule { public KFCSpawnKill() { - super(GenyoAddon.GENYO, "KFC Spawn Kill", "ask about the name, i won't tell you."); + super(GenyoAddon.COMBAT, "KFC Spawn Kill", "ask about the name, i won't tell you."); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/com/genyo/addon/systems/modules/misc/CombatBrainrot.java b/src/main/java/com/genyo/addon/systems/modules/misc/CombatBrainrot.java index cd9cf9e..bacb79d 100644 --- a/src/main/java/com/genyo/addon/systems/modules/misc/CombatBrainrot.java +++ b/src/main/java/com/genyo/addon/systems/modules/misc/CombatBrainrot.java @@ -23,7 +23,7 @@ public class CombatBrainrot extends GenyoModule { public CombatBrainrot() { - super(GenyoAddon.GENYO, "combat-brainrot", "says something sigma when punching a crystal."); + super(GenyoAddon.MISC, "combat-brainrot", "says something sigma when punching a crystal."); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/com/genyo/addon/systems/modules/misc/GenyoAutoEZ.java b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoAutoEZ.java index 8ea06bf..dd7499c 100644 --- a/src/main/java/com/genyo/addon/systems/modules/misc/GenyoAutoEZ.java +++ b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoAutoEZ.java @@ -20,7 +20,7 @@ public class GenyoAutoEZ extends GenyoModule { public GenyoAutoEZ() { - super(GenyoAddon.GENYO, "genyo-auto-ez", "igen igen igen, dikta mamo tyibori.-----------------------------------------------------------------"); + super(GenyoAddon.MISC, "genyo-auto-ez", "igen igen igen, dikta mamo tyibori.-----------------------------------------------------------------"); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -92,7 +92,7 @@ public GenyoAutoEZ() { private final Random r = new Random(); private int lastPop; private final List messageQueue = new LinkedList<>(); - private final HashMap taggedPlayers = new HashMap<>(); + public final HashMap taggedPlayers = new HashMap<>(); private int timer = 0; @Override diff --git a/src/main/java/com/genyo/addon/systems/modules/misc/GenyoDiscord.java b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoDiscord.java index 87eefe5..cea6c64 100644 --- a/src/main/java/com/genyo/addon/systems/modules/misc/GenyoDiscord.java +++ b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoDiscord.java @@ -116,7 +116,7 @@ public enum SelectMode { } public GenyoDiscord() { - super(GenyoAddon.GENYO, "genyo-discord", "this one is superior to the original module because its genyo"); + super(GenyoAddon.MISC, "genyo-discord", "this one is superior to the original module because its genyo"); runInMainMenu = true; } diff --git a/src/main/java/com/genyo/addon/systems/modules/misc/GenyoGoodbye.java b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoGoodbye.java index 01c5a5d..6289a35 100644 --- a/src/main/java/com/genyo/addon/systems/modules/misc/GenyoGoodbye.java +++ b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoGoodbye.java @@ -27,7 +27,7 @@ public class GenyoGoodbye extends GenyoModule { private ArrayList namesList = new ArrayList<>(); public GenyoGoodbye() { - super(GenyoAddon.GENYO, "genyo-goodbye", "i hate kiwi. i hate kiwi. i hate kiwi. i hate kiwi. i hate kiwi. "); + super(GenyoAddon.MISC, "genyo-goodbye", "i hate kiwi. i hate kiwi. i hate kiwi. i hate kiwi. i hate kiwi. "); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/com/genyo/addon/systems/modules/misc/GenyoSkinBlink.java b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoSkinBlink.java index 6faefb8..b68b6e4 100644 --- a/src/main/java/com/genyo/addon/systems/modules/misc/GenyoSkinBlink.java +++ b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoSkinBlink.java @@ -37,7 +37,7 @@ public class GenyoSkinBlink extends GenyoModule { ); public GenyoSkinBlink() { - super(GenyoAddon.GENYO, "genyo-skin-blink", "i love kiwi. i love kiwi. i love kiwi. i love kiwi. "); + super(GenyoAddon.MISC, "genyo-skin-blink", "i love kiwi. i love kiwi. i love kiwi. i love kiwi. "); } private int timer = 0; diff --git a/src/main/java/com/genyo/addon/systems/modules/misc/GenyoWelcome.java b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoWelcome.java index a6500cd..b827708 100644 --- a/src/main/java/com/genyo/addon/systems/modules/misc/GenyoWelcome.java +++ b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoWelcome.java @@ -53,7 +53,7 @@ public void onActivate() { } public GenyoWelcome() { - super(GenyoAddon.GENYO, "genyo-welcome", "i love kiwi. i love kiwi. i love kiwi. i love kiwi. i love kiwi."); + super(GenyoAddon.MISC, "genyo-welcome", "i love kiwi. i love kiwi. i love kiwi. i love kiwi. i love kiwi."); } @EventHandler diff --git a/src/main/java/com/genyo/addon/systems/modules/misc/PacketDebug.java b/src/main/java/com/genyo/addon/systems/modules/misc/PacketDebug.java index 727625d..c48756f 100644 --- a/src/main/java/com/genyo/addon/systems/modules/misc/PacketDebug.java +++ b/src/main/java/com/genyo/addon/systems/modules/misc/PacketDebug.java @@ -15,7 +15,7 @@ public class PacketDebug extends GenyoModule { public PacketDebug() { - super(GenyoAddon.GENYO, "packet-debug", "yweoikfjwekfjhewkfjwehfkjefhwehjkfhwehfkew."); + super(GenyoAddon.MISC, "packet-debug", "yweoikfjwekfjhewkfjwehfkjefhwehjkfhwehfkew."); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/com/genyo/addon/systems/modules/movement/GenyoPhase.java b/src/main/java/com/genyo/addon/systems/modules/movement/GenyoPhase.java index 3485ff6..36a1e23 100644 --- a/src/main/java/com/genyo/addon/systems/modules/movement/GenyoPhase.java +++ b/src/main/java/com/genyo/addon/systems/modules/movement/GenyoPhase.java @@ -42,7 +42,7 @@ public class GenyoPhase extends PlacerModule { public GenyoPhase() { - super(GenyoAddon.GENYO, "genyo-phase", "asd"); + super(GenyoAddon.MOVEMENT, "genyo-phase", "asd"); } private static final List RESISTANT_BLOCKS = new LinkedList<>() diff --git a/src/main/java/com/genyo/addon/systems/modules/movement/GenyoVelocity.java b/src/main/java/com/genyo/addon/systems/modules/movement/GenyoVelocity.java index f647003..256074d 100644 --- a/src/main/java/com/genyo/addon/systems/modules/movement/GenyoVelocity.java +++ b/src/main/java/com/genyo/addon/systems/modules/movement/GenyoVelocity.java @@ -35,7 +35,7 @@ public class GenyoVelocity extends GenyoModule { public GenyoVelocity() { - super(GenyoAddon.GENYO, "genyo-velocity", "efhewhfjkhewfjhkewfh jekw"); + super(GenyoAddon.MOVEMENT, "genyo-velocity", "efhewhfjkhewfjhkewfh jekw"); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/com/genyo/addon/systems/modules/visual/AngelSexHulkenberg.java b/src/main/java/com/genyo/addon/systems/modules/visual/AngelSexHulkenberg.java index 0c950b9..febb2e3 100644 --- a/src/main/java/com/genyo/addon/systems/modules/visual/AngelSexHulkenberg.java +++ b/src/main/java/com/genyo/addon/systems/modules/visual/AngelSexHulkenberg.java @@ -35,7 +35,7 @@ public final class AngelSexHulkenberg extends GenyoModule { public AngelSexHulkenberg() { - super(GenyoAddon.GENYO, "angel-sex-hulkenberg", "jön a verstappen, nekiütközött a verstappen, kiesik a verstappen"); + super(GenyoAddon.VISUAL, "angel-sex-hulkenberg", "jön a verstappen, nekiütközött a verstappen, kiesik a verstappen"); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/com/genyo/addon/systems/modules/visual/GenyoCapes.java b/src/main/java/com/genyo/addon/systems/modules/visual/GenyoCapes.java index 8c9c848..be43334 100644 --- a/src/main/java/com/genyo/addon/systems/modules/visual/GenyoCapes.java +++ b/src/main/java/com/genyo/addon/systems/modules/visual/GenyoCapes.java @@ -9,7 +9,7 @@ public class GenyoCapes extends GenyoModule { private final Identifier capeTexture; public GenyoCapes() { - super(GenyoAddon.GENYO, "genyo-capes", "The thing"); + super(GenyoAddon.VISUAL, "genyo-capes", "The thing"); this.capeTexture = Identifier.of(GenyoAddon.MOD_ID, "textures/cape.png"); } diff --git a/src/main/java/com/genyo/addon/systems/modules/visual/GenyoPenisESP.java b/src/main/java/com/genyo/addon/systems/modules/visual/GenyoPenisESP.java index 3af3237..556c04c 100644 --- a/src/main/java/com/genyo/addon/systems/modules/visual/GenyoPenisESP.java +++ b/src/main/java/com/genyo/addon/systems/modules/visual/GenyoPenisESP.java @@ -21,7 +21,7 @@ public class GenyoPenisESP extends GenyoModule { public GenyoPenisESP() { - super(GenyoAddon.GENYO, "Genyo PenisESP", "faszfasz fasz fasz fasz fasz fsaz fasz"); + super(GenyoAddon.VISUAL, "Genyo PenisESP", "faszfasz fasz fasz fasz fasz fsaz fasz"); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/com/genyo/addon/systems/modules/world/GenyoAutoMine.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoAutoMine.java index 11397b3..1422b8d 100644 --- a/src/main/java/com/genyo/addon/systems/modules/world/GenyoAutoMine.java +++ b/src/main/java/com/genyo/addon/systems/modules/world/GenyoAutoMine.java @@ -47,7 +47,7 @@ public class GenyoAutoMine extends GenyoModule { public GenyoAutoMine() { - super(GenyoAddon.GENYO, "Genyo AutoMine", "fasz"); + super(GenyoAddon.WORLD, "Genyo AutoMine", "fasz"); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/com/genyo/addon/systems/modules/world/GenyoAutoTool.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoAutoTool.java index a22f22c..8c7fc96 100644 --- a/src/main/java/com/genyo/addon/systems/modules/world/GenyoAutoTool.java +++ b/src/main/java/com/genyo/addon/systems/modules/world/GenyoAutoTool.java @@ -15,7 +15,7 @@ public class GenyoAutoTool extends GenyoModule { public GenyoAutoTool() { - super(GenyoAddon.GENYO, "genyo-auto-tool", "Yés"); + super(GenyoAddon.WORLD, "genyo-auto-tool", "Yés"); } @EventHandler diff --git a/src/main/java/com/genyo/addon/systems/modules/world/GenyoGhostBlocks.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoGhostBlocks.java index c6062fe..051d702 100644 --- a/src/main/java/com/genyo/addon/systems/modules/world/GenyoGhostBlocks.java +++ b/src/main/java/com/genyo/addon/systems/modules/world/GenyoGhostBlocks.java @@ -19,7 +19,7 @@ public class GenyoGhostBlocks extends GenyoModule { public GenyoGhostBlocks() { - super(GenyoAddon.GENYO, "genyo-ghost-blocks", "maybe"); + super(GenyoAddon.WORLD, "genyo-ghost-blocks", "maybe"); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/com/genyo/addon/systems/modules/world/GenyoScaffold.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoScaffold.java index db47a4e..b0442a0 100644 --- a/src/main/java/com/genyo/addon/systems/modules/world/GenyoScaffold.java +++ b/src/main/java/com/genyo/addon/systems/modules/world/GenyoScaffold.java @@ -31,7 +31,7 @@ public class GenyoScaffold extends PlacerModule { public GenyoScaffold() { - super(GenyoAddon.GENYO, "genyo-scaffold", "i shit the bed regularly"); + super(GenyoAddon.WORLD, "genyo-scaffold", "i shit the bed regularly"); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/com/genyo/addon/systems/modules/world/GenyoSelfTrap.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoSelfTrap.java index 917e67e..a1095e9 100644 --- a/src/main/java/com/genyo/addon/systems/modules/world/GenyoSelfTrap.java +++ b/src/main/java/com/genyo/addon/systems/modules/world/GenyoSelfTrap.java @@ -46,7 +46,7 @@ public class GenyoSelfTrap extends PlacerModule { public GenyoSelfTrap() { - super(GenyoAddon.GENYO, "Genyo SelfTrap", "a funny one for sure."); + super(GenyoAddon.WORLD, "Genyo SelfTrap", "a funny one for sure."); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/com/genyo/addon/systems/modules/world/GenyoSpeedmine.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoSpeedmine.java index 0f5425c..e5546f7 100644 --- a/src/main/java/com/genyo/addon/systems/modules/world/GenyoSpeedmine.java +++ b/src/main/java/com/genyo/addon/systems/modules/world/GenyoSpeedmine.java @@ -45,7 +45,7 @@ public class GenyoSpeedmine extends GenyoModule { public GenyoSpeedmine() { - super(GenyoAddon.GENYO, "Genyo Speedmine", "fasz fasz fsaz fasz"); + super(GenyoAddon.WORLD, "Genyo Speedmine", "fasz fasz fsaz fasz"); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); diff --git a/src/main/java/com/genyo/addon/systems/modules/world/GenyoSurround.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoSurround.java index 8b34664..e01e460 100644 --- a/src/main/java/com/genyo/addon/systems/modules/world/GenyoSurround.java +++ b/src/main/java/com/genyo/addon/systems/modules/world/GenyoSurround.java @@ -96,7 +96,7 @@ public class GenyoSurround extends GenyoModule { private final Map espBlocks = new ConcurrentHashMap<>(); public GenyoSurround() { - super(GenyoAddon.GENYO, "genyo-surround", "haaaaaaaaaaaaaa"); + super(GenyoAddon.WORLD, "genyo-surround", "haaaaaaaaaaaaaa"); } public void onActivate() { diff --git a/src/main/java/com/genyo/addon/systems/modules/world/GenyoSurroundV2.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoSurroundV2.java index 03aa883..83d25a0 100644 --- a/src/main/java/com/genyo/addon/systems/modules/world/GenyoSurroundV2.java +++ b/src/main/java/com/genyo/addon/systems/modules/world/GenyoSurroundV2.java @@ -46,7 +46,7 @@ public class GenyoSurroundV2 extends PlacerModule { public GenyoSurroundV2() { - super(GenyoAddon.GENYO, "genyo-surround-v2", "ma reggel befostam aztán felkeltem"); + super(GenyoAddon.WORLD, "genyo-surround-v2", "ma reggel befostam aztán felkeltem"); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -352,8 +352,10 @@ private void placeBlock(BlockPos pos, int slot) } }); } else { - if (InvUtils.findInHotbar(Items.OBSIDIAN).slot() == -1) return; + if (slot == -1) return; + if (InvUtils.findInHotbar(Items.OBSIDIAN) == null) return; + Managers.INVENTORY.setSlot(slot); BlockUtils.place(pos, InvUtils.findInHotbar(Items.OBSIDIAN), rotate.get(), 0, true); } packets.put(pos, System.currentTimeMillis()); @@ -494,10 +496,6 @@ public List getPlayerBlocks(PlayerEntity entity) public void onRender3D(Render3DEvent event) { if (mc.world == null && mc.player == null) return; - /*if (SelfTrapModule.getInstance().isEnabled()) - { - return; - }*/ if (render.get()) { for (Map.Entry set : fadeList.entrySet()) @@ -509,7 +507,7 @@ public void onRender3D(Render3DEvent event) { Color boxColor = color.get().a(boxAlpha); Color lineColor = color.get().a(lineAlpha); - event.renderer.box(BlockPos.ofFloored(set.getKey().toCenterPos()), boxColor, lineColor, ShapeMode.Both, 1); + event.renderer.box(set.getKey(), boxColor, lineColor, ShapeMode.Both, 1); } if (placements.isEmpty()) @@ -543,15 +541,6 @@ public enum Timing SEQUENTIAL } - public record BlockSlot(Block block, int slot) - { - @Override - public boolean equals(Object obj) - { - return obj instanceof BlockSlot b && b.block() == block; - } - } - private float square(float value) { return value*value; } diff --git a/src/main/java/com/genyo/addon/utils/GenyoChatUtils.java b/src/main/java/com/genyo/addon/utils/GenyoChatUtils.java index 8459b8d..7db0a85 100644 --- a/src/main/java/com/genyo/addon/utils/GenyoChatUtils.java +++ b/src/main/java/com/genyo/addon/utils/GenyoChatUtils.java @@ -21,6 +21,14 @@ public static void sendInfo(String text) { sendMessage(Text.of(msg), Objects.hash("genyo-info")); } + public static void sendMessage(String text) { + if (mc.world == null) return; + + ChatUtils.forceNextPrefixClass(GenyoChatUtils.class); + String msg = prefix + " " + text; + sendMessage(Text.of(msg), Objects.hash("genyo-msg")); + } + public static void sendError(String text) { if (mc.world == null) return; diff --git a/src/main/resources/assets/genyo/icon.png b/src/main/resources/assets/genyo/icon.png index e5021a2e9f058a227b468ceb267aa16f3bf689ea..8b213d31d77b7a4ed0b11af2f88ad9ced788af45 100644 GIT binary patch literal 6070 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 wTuVXZWKEXWQubv?Su08Q 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 HnCSljuMkd2 diff --git a/src/main/resources/assets/genyo/textures/cape.png b/src/main/resources/assets/genyo/textures/cape.png index 949a966d5332d42f5388c3c81537d6e9c096b5ad..1d9e8b63347a9703797482dcf2bd272facb5ac33 100644 GIT binary patch literal 34648 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 HQ$iB}_n0;u From 13ea89669e3cdb0c24e6806d004b7f1e76627324 Mon Sep 17 00:00:00 2001 From: wuritz Date: Sat, 9 Aug 2025 21:08:51 +0200 Subject: [PATCH 7/7] nemtom --- src/main/java/com/genyo/addon/GenyoAddon.java | 2 +- .../addon/mixin/MixinMinecraftClient.java | 25 -- .../mixin/game/MixinMinecraftClient.java | 61 ++++ .../genyo/addon/systems/hud/TargetHud.java | 304 ------------------ .../systems/modules/misc/GenyoMainMenu.java | 12 + .../addon/systems/screens/MainMenuScreen.java | 105 ++++++ .../com/genyo/addon/utils/math/MathUtil.java | 4 + src/main/resources/assets/genyo/splash.txt | 4 + .../assets/genyo/textures/goodjob.png | Bin 0 -> 42568 bytes src/main/resources/genyo.mixins.json | 2 +- 10 files changed, 188 insertions(+), 331 deletions(-) delete mode 100644 src/main/java/com/genyo/addon/mixin/MixinMinecraftClient.java create mode 100644 src/main/java/com/genyo/addon/mixin/game/MixinMinecraftClient.java delete mode 100644 src/main/java/com/genyo/addon/systems/hud/TargetHud.java create mode 100644 src/main/java/com/genyo/addon/systems/modules/misc/GenyoMainMenu.java create mode 100644 src/main/java/com/genyo/addon/systems/screens/MainMenuScreen.java create mode 100644 src/main/resources/assets/genyo/splash.txt create mode 100644 src/main/resources/assets/genyo/textures/goodjob.png diff --git a/src/main/java/com/genyo/addon/GenyoAddon.java b/src/main/java/com/genyo/addon/GenyoAddon.java index 52e71c2..fb35455 100644 --- a/src/main/java/com/genyo/addon/GenyoAddon.java +++ b/src/main/java/com/genyo/addon/GenyoAddon.java @@ -127,6 +127,7 @@ private void initModules(Modules modules) { modules.add(new GenyoAutoTrap()); modules.add(new GenyoCapes()); modules.add(new GenyoPhase()); + modules.add(new GenyoMainMenu()); } private void initHUD(Hud hud) { @@ -136,7 +137,6 @@ private void initHUD(Hud hud) { hud.register(PacketsHud.INFO); hud.register(WatermarkHud.INFO); hud.register(BetterPlayerRadarHud.INFO); - hud.register(TargetHud.INFO); } @Override diff --git a/src/main/java/com/genyo/addon/mixin/MixinMinecraftClient.java b/src/main/java/com/genyo/addon/mixin/MixinMinecraftClient.java deleted file mode 100644 index eb8e92b..0000000 --- a/src/main/java/com/genyo/addon/mixin/MixinMinecraftClient.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.genyo.addon.mixin; - -import com.genyo.addon.events.RunTickEvent; -import meteordevelopment.meteorclient.MeteorClient; -import net.minecraft.client.MinecraftClient; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(MinecraftClient.class) -public abstract class MixinMinecraftClient { - - /** - * @param ci - */ - @Inject(method = "run", at = @At(value = "INVOKE", target = - "Lnet/minecraft/client/MinecraftClient;render(Z)V", shift = At.Shift.BEFORE)) - private void hookRun(CallbackInfo ci) - { - final RunTickEvent runTickEvent = new RunTickEvent(); - MeteorClient.EVENT_BUS.post(runTickEvent); - } - -} diff --git a/src/main/java/com/genyo/addon/mixin/game/MixinMinecraftClient.java b/src/main/java/com/genyo/addon/mixin/game/MixinMinecraftClient.java new file mode 100644 index 0000000..604b03e --- /dev/null +++ b/src/main/java/com/genyo/addon/mixin/game/MixinMinecraftClient.java @@ -0,0 +1,61 @@ +package com.genyo.addon.mixin.game; + +import com.genyo.addon.events.RunTickEvent; +import com.genyo.addon.systems.modules.misc.GenyoMainMenu; +import com.genyo.addon.systems.screens.MainMenuScreen; +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.systems.modules.Modules; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.DeathScreen; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.TitleScreen; +import net.minecraft.client.network.ClientPlayerEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import javax.annotation.Nullable; + +@Mixin(MinecraftClient.class) +public abstract class MixinMinecraftClient { + + @Unique + @Nullable + public ClientPlayerEntity player; + + @Shadow + public abstract void setScreen(@Nullable Screen screen); + + @Inject(method = "setScreen", at = @At("HEAD"), cancellable = true) + private void setScreen(Screen screen, CallbackInfo info) { + if (screen instanceof DeathScreen && player != null) { + player.requestRespawn(); + info.cancel(); + } + + if (screen instanceof TitleScreen) { + //Sydney.checkForUpdates(); auto updater + + //if (Sydney.MODULE_MANAGER.getModule(MenuModule.class).isToggled() && Sydney.MODULE_MANAGER.getModule(MenuModule.class).mainMenu.getValue()) { + if (Modules.get().isActive(GenyoMainMenu.class)) { + this.setScreen(new MainMenuScreen()); + info.cancel(); + } + } + } + + /** + * @param ci + */ + @Inject(method = "run", at = @At(value = "INVOKE", target = + "Lnet/minecraft/client/MinecraftClient;render(Z)V", shift = At.Shift.BEFORE)) + private void hookRun(CallbackInfo ci) + { + final RunTickEvent runTickEvent = new RunTickEvent(); + MeteorClient.EVENT_BUS.post(runTickEvent); + } + +} diff --git a/src/main/java/com/genyo/addon/systems/hud/TargetHud.java b/src/main/java/com/genyo/addon/systems/hud/TargetHud.java deleted file mode 100644 index 4fd6e3b..0000000 --- a/src/main/java/com/genyo/addon/systems/hud/TargetHud.java +++ /dev/null @@ -1,304 +0,0 @@ -package com.genyo.addon.systems.hud; - -import com.genyo.addon.GenyoAddon; -import com.genyo.addon.managers.Managers; -import com.genyo.addon.systems.modules.combat.GenyoAutoCrystal; -import com.genyo.addon.systems.modules.combat.KFCSpawnKill; -import com.genyo.addon.systems.modules.misc.GenyoAutoEZ; -import meteordevelopment.meteorclient.gui.screens.settings.ColorSettingScreen; -import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.systems.hud.Hud; -import meteordevelopment.meteorclient.systems.hud.HudElement; -import meteordevelopment.meteorclient.systems.hud.HudElementInfo; -import meteordevelopment.meteorclient.systems.hud.HudRenderer; -import meteordevelopment.meteorclient.systems.hud.elements.InventoryHud; -import meteordevelopment.meteorclient.systems.hud.screens.HudEditorScreen; -import meteordevelopment.meteorclient.systems.hud.screens.HudElementScreen; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.utils.entity.EntityUtils; -import meteordevelopment.meteorclient.utils.render.RenderUtils; -import meteordevelopment.meteorclient.utils.render.color.Color; -import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.client.gui.PlayerSkinDrawer; -import net.minecraft.client.gui.screen.ChatScreen; -import net.minecraft.client.network.PlayerListEntry; -import net.minecraft.component.ComponentMap; -import net.minecraft.component.ComponentType; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ArmorItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; - -import java.util.ArrayList; -import java.util.List; - -import static meteordevelopment.meteorclient.MeteorClient.mc; - -public class TargetHud extends HudElement { - - public static final HudElementInfo INFO = new HudElementInfo<>(GenyoAddon.HUD_GROUP, "target-hud", "Genyo genyo genyo", TargetHud::new); - - private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgBackground = settings.createGroup("Background"); - private final SettingGroup sgScale = settings.createGroup("Scale"); - - private final Setting shadow = sgGeneral.add(new BoolSetting.Builder() - .name("shadow") - .description("Renders shadow behind text.") - .defaultValue(true) - .build() - ); - - // Scale - - private final Setting customScale = sgScale.add(new BoolSetting.Builder() - .name("custom-scale") - .description("Applies a custom scale to this hud element.") - .defaultValue(false) - .visible(() -> false) - .build() - ); - - private final Setting scale = sgScale.add(new DoubleSetting.Builder() - .name("scale") - .description("Custom scale.") - .visible(customScale::get) - .defaultValue(1) - .min(0.5) - .sliderRange(0.5, 3) - .build() - ); - - // Background - - private final Setting background = sgBackground.add(new BoolSetting.Builder() - .name("background") - .description("Displays background.") - .defaultValue(false) - .build() - ); - - private final Setting backgroundColor = sgBackground.add(new ColorSetting.Builder() - .name("background-color") - .description("Color used for the background.") - .visible(background::get) - .defaultValue(new SettingColor(25, 25, 25, 120)) - .build() - ); - - public TargetHud() { - super(INFO); - } - - private Target currentTarget; - private final List handItems = new ArrayList<>(); - private final List armorItems = new ArrayList<>(); - - private final Color WHITE = new Color(255, 255, 255); - private final Color RED = new Color(255, 25, 25); - private final Color AMBER = new Color(255, 105, 25); - private final Color GREEN = new Color(25, 252, 25); - private final Color GOLD = new Color(232, 185, 35); - - @Override - public void tick(HudRenderer renderer) { - if (mc.player == null || mc.world == null) return; - - getTarget(); - if (currentTarget == null) return; - - armorItems.clear(); - handItems.clear(); - - for (int i = 0; i < 6; i++) { - ItemStack itemStack = getItem(currentTarget.target, i); - - if (itemStack != null) { - if (itemStack.getItem() instanceof ArmorItem) { - String durability = String.format("%.0f%%", ((itemStack.getMaxDamage() - itemStack.getDamage()) * 100f) / (float) itemStack.getMaxDamage()); - armorItems.add(new ArmorRecord((ArmorItem) itemStack.getItem(), durability, (int) (((itemStack.getMaxDamage() - itemStack.getDamage()) * 100f) / (float) itemStack.getMaxDamage()))); - } else { - if (!itemStack.getItem().equals(Items.AIR)) handItems.add(new HandItem(itemStack.getItem(), itemStack.getCount())); - } - } - } - - setSize(400 * getScale(), 200 * getScale()); - } - - @Override - public void render(HudRenderer renderer) { - if (mc.player == null || mc.world == null) return; - if (currentTarget == null) return; - - double spaceWidth = renderer.textWidth(" ", shadow.get(), getScale()); - double rowHeight = (renderer.textHeight() + 2) * getScale(); - double x = this.x; - double y = this.y; - - String targetHudText = "TargetHud"; - targetHudText += String.format(" (%s)", currentTarget.source); - renderer.text(targetHudText, x + widthScale(0.5) - (renderer.textWidth(targetHudText, shadow.get(), getScale()) / 2), y + heightScale(1) - rowHeight, Color.WHITE, shadow.get(), getScale()); - x += widthScale(0.05); - y += heightScale(0.1); - - PlayerListEntry entry = mc.getNetworkHandler().getPlayerListEntry(currentTarget.target.getUuid()); - if (entry != null) { - PlayerSkinDrawer.draw(renderer.drawContext, entry.getSkinTextures(), (int) x, (int) y, 64); - } - - x += widthScale(0.05) + 64; - - renderer.text(currentTarget.target.getName().getString(), x, y, Color.YELLOW, shadow.get(), getScale()); - - y += rowHeight; - // Health - String healthText = null; - Color healthColor = null; - - float absorption = currentTarget.target.getAbsorptionAmount(); - int healthInt = Math.round(currentTarget.target.getHealth() + absorption); - double healthPercentage = healthInt / (currentTarget.target.getMaxHealth() + absorption); - - if (healthPercentage <= 0.333) healthColor = RED; - else if (healthPercentage <= 0.666) healthColor = AMBER; - else healthColor = GREEN; - - healthText = String.format("%s", healthInt); - - renderer.text("HP:", x, y, Color.WHITE, shadow.get(), getScale()); - renderer.text(healthText, x + renderer.textWidth("HP:", shadow.get(), getScale()) + spaceWidth, y, healthColor, shadow.get(), getScale()); - - y += rowHeight; - - // ping + distance - String pingText = null; - String distanceText = null; - int ping = EntityUtils.getPing(currentTarget.target); - pingText = String.format("[%sms]", ping); - distanceText = String.format("%.1fm", mc.getCameraEntity().distanceTo(currentTarget.target)); - - renderer.text(pingText, x, y, new Color(20, 170, 170), shadow.get(), getScale()); - renderer.text("|", x + spaceWidth + renderer.textWidth(pingText, shadow.get(), getScale()), y, Color.WHITE, shadow.get(), getScale()); - renderer.text(distanceText, x + spaceWidth + renderer.textWidth(pingText + "|", shadow.get(), getScale()) + spaceWidth, y, Color.LIGHT_GRAY, shadow.get(), getScale()); - if (background.get()) renderer.quad(this.x, this.y, getWidth(), getHeight(), backgroundColor.get()); - - // Items - if (!handItems.isEmpty()) { - renderer.post(() -> { - double internalX = this.x + widthScale(0.70); - double internalY = this.y + heightScale(0.1); - - for (HandItem handItem : handItems) { - renderer.item(handItem.item.getDefaultStack(), (int) internalX, (int) internalY, (float) getScale() * 2, true, String.valueOf(handItem.count)); - - if (handItems.size() != 1) internalX += widthScale(0.1); - } - }); - } - - // Armor - if (!armorItems.isEmpty()) { - double finalX = x; - double finalY = y; - renderer.post(() -> { - double internalX = finalX - 64 - spaceWidth - widthScale(0.05); - double internalY = finalY + rowHeight + heightScale(0.1); - - for (ArmorRecord armorRecord : armorItems) { - renderer.item(armorRecord.item.getDefaultStack(), (int) internalX, (int) internalY, (float) getScale() * 2, false); - - Color durabilityColor = null; - - if (armorRecord.duraInt >= 66) durabilityColor = GREEN; - else if (armorRecord.duraInt >= 33) durabilityColor = AMBER; - else durabilityColor = RED; - - renderer.text(armorRecord.durability, internalX + widthScale(0.09), internalY + heightScale(0.03), durabilityColor, shadow.get(), getScale()); - if (armorItems.indexOf(armorRecord)-1 % 2 == 0) { - internalY += heightScale(0.2); - internalX -= widthScale(0.25); - } else { - internalX += widthScale(0.25); - } - } - }); - } - - // Pop count - if (Modules.get().get(GenyoAutoEZ.class).taggedPlayers.containsKey(currentTarget.target) - || Managers.COMBAT.popList.containsKey(currentTarget.target.getName().getString())) { - - int pops = 0; - x += widthScale(0.45); - renderer.text("Pops:", x, y, Color.WHITE, shadow.get(), getScale()); - - if (Modules.get().get(GenyoAutoEZ.class).taggedPlayers.containsKey(currentTarget.target)) { - pops = Modules.get().get(GenyoAutoEZ.class).taggedPlayers.get(currentTarget.target); - } else { - pops = Managers.COMBAT.popList.get(currentTarget.target.getName().getString()); - } - - renderer.text(String.valueOf(pops), x + spaceWidth + renderer.textWidth("Pops:", shadow.get(), getScale()), y, Color.YELLOW, shadow.get(), getScale()); - } - - } - - private int widthScale(double scale) { - return (int) (getWidth() * scale); - } - - private int heightScale(double scale) { - return (int) (getHeight() * scale); - } - - private void getTarget() { - if (Modules.get().get(GenyoAutoCrystal.class).targetEntity != null) { - currentTarget = new Target(Modules.get().get(GenyoAutoCrystal.class).targetEntity, Source.AutoCrystal); - } else if (Modules.get().get(KFCSpawnKill.class).getEntityTarget() != null && Modules.get().get(KFCSpawnKill.class).getEntityTarget() instanceof PlayerEntity) { - currentTarget = new Target((PlayerEntity) Modules.get().get(KFCSpawnKill.class).getEntityTarget(), Source.KillAura); - } else if (mc.currentScreen instanceof ChatScreen - || mc.currentScreen instanceof HudEditorScreen - || mc.currentScreen instanceof HudElementScreen - || mc.currentScreen instanceof ColorSettingScreen) { - currentTarget = new Target(mc.player, Source.Brasil); - } else { - currentTarget = null; - } - } - - private ItemStack getItem(PlayerEntity entity, int index) { - if (entity == null) return null; - - return switch (index) { - case 0 -> entity.getMainHandStack(); - case 1 -> entity.getInventory().armor.get(3); - case 2 -> entity.getInventory().armor.get(2); - case 3 -> entity.getInventory().armor.get(1); - case 4 -> entity.getInventory().armor.get(0); - case 5 -> entity.getOffHandStack(); - default -> ItemStack.EMPTY; - }; - } - - private record Target(PlayerEntity target, Source source) { - } - - private record HandItem(Item item, int count) { - } - - private record ArmorRecord(ArmorItem item, String durability, int duraInt) { - } - - private enum Source { - AutoCrystal, - KillAura, - Brasil - } - - private double getScale() { - return customScale.get() ? scale.get() : Hud.get().getTextScale(); - } -} diff --git a/src/main/java/com/genyo/addon/systems/modules/misc/GenyoMainMenu.java b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoMainMenu.java new file mode 100644 index 0000000..dc64f20 --- /dev/null +++ b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoMainMenu.java @@ -0,0 +1,12 @@ +package com.genyo.addon.systems.modules.misc; + +import com.genyo.addon.GenyoAddon; +import com.genyo.addon.systems.modules.GenyoModule; + +public class GenyoMainMenu extends GenyoModule { + + public GenyoMainMenu() { + super(GenyoAddon.MISC, "genyo-main-menu", "Custom genyo main menu"); + } + +} diff --git a/src/main/java/com/genyo/addon/systems/screens/MainMenuScreen.java b/src/main/java/com/genyo/addon/systems/screens/MainMenuScreen.java new file mode 100644 index 0000000..d250562 --- /dev/null +++ b/src/main/java/com/genyo/addon/systems/screens/MainMenuScreen.java @@ -0,0 +1,105 @@ +package com.genyo.addon.systems.screens; + +import com.genyo.addon.GenyoAddon; +import com.genyo.addon.utils.math.MathUtil; +import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; +import meteordevelopment.meteorclient.renderer.Renderer2D; +import meteordevelopment.meteorclient.renderer.text.TextRenderer; +import meteordevelopment.meteorclient.utils.render.color.Color; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.sound.SoundEngine; +import net.minecraft.client.sound.SoundSystem; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.resource.Resource; +import net.minecraft.text.Text; +import net.minecraft.text.TextReorderingProcessor; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +public class MainMenuScreen extends Screen { + + private static final GuiRenderer RENDERER = new GuiRenderer(); + + private final String splashText = "a"; + private final int buttonWidth = 80, buttonHeight = 16; + + public MainMenuScreen() { + super(Text.literal(GenyoAddon.MOD_ID + "-menu")); + + //splashText = getSplashText(); + } + + @Override + public boolean shouldPause() { + return false; + } + + @Override + public boolean shouldCloseOnEsc() { + return false; + } + + @Override + public void tick() { + super.tick(); + } + + @Override + public void render(@NotNull DrawContext context, int mouseX, int mouseY, float delta) { + /*MatrixStack matrices = new MatrixStack(); + + Renderer2D.COLOR.quad(0, 0, width, height, new Color(25, 25, 25, 255)); + TextRenderer.get().begin(); + TextRenderer.get().render("Fasz", 50, 50, Color.WHITE);*/ + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + /*if(button == 0) { + if(width/2f - Sydney.FONT_MANAGER.getWidth("Sydney") <= mouseX && height/2f - Sydney.FONT_MANAGER.getHeight()*2 - 5 <= mouseY && width/2f + Sydney.FONT_MANAGER.getWidth("Sydney") > mouseX && height/2f - 5 > mouseY) { + try { + Util.getOperatingSystem().open(new URI("https://youtu.be/INE4RacaApQ?si=ShQU8VjfpgdxW8nb")); + } catch (Exception ignored) { } + playClickSound(); + } + if(isHoveringButton(width/2f - buttonWidth - 2, height/2f, mouseX, mouseY)) { + mc.setScreen(new SelectWorldScreen(this)); + playClickSound(); + } + if(isHoveringButton(width/2f, height/2f, mouseX, mouseY)) { + mc.setScreen(new MultiplayerScreen(this)); + playClickSound(); + } + if(isHoveringButton(width/2f + buttonWidth + 2, height/2f, mouseX, mouseY)) { + mc.setScreen(new OptionsScreen(this, mc.options)); + playClickSound(); + } + if(isHoveringButton(width - buttonWidth/2f - 2, height - buttonHeight - 2, mouseX, mouseY)) { + mc.scheduleStop(); + playClickSound(); + } + }*/ + + return super.mouseClicked(mouseX, mouseY, button); + } + + private String getSplashText() { + String splash = ""; + Identifier identifier = Identifier.of(GenyoAddon.MOD_ID, "splash.txt"); + + try { + Resource resource = mc.getResourceManager().getResource(identifier).orElseThrow(); + List messages = resource.getReader().lines().toList(); + splash = messages.get((int) MathUtil.random(messages.size(), 0)); + } catch (Exception ignored) { } + + return splash; + } + +} diff --git a/src/main/java/com/genyo/addon/utils/math/MathUtil.java b/src/main/java/com/genyo/addon/utils/math/MathUtil.java index 1b59db4..fc201cf 100644 --- a/src/main/java/com/genyo/addon/utils/math/MathUtil.java +++ b/src/main/java/com/genyo/addon/utils/math/MathUtil.java @@ -22,6 +22,10 @@ public static int pickRandom(List list) { return num; } + public static double random(double max, double min) { + return Math.random() * (max - min) + min; + } + public static float squared(float value) { return value*value; } diff --git a/src/main/resources/assets/genyo/splash.txt b/src/main/resources/assets/genyo/splash.txt new file mode 100644 index 0000000..4964004 --- /dev/null +++ b/src/main/resources/assets/genyo/splash.txt @@ -0,0 +1,4 @@ +asdsadasdasdsadsad +genyogenyo +Genyo :D:D:D:D:D +Fasz >:( diff --git a/src/main/resources/assets/genyo/textures/goodjob.png b/src/main/resources/assets/genyo/textures/goodjob.png new file mode 100644 index 0000000000000000000000000000000000000000..fe048dab663b930f4892470c98293137581cbe04 GIT binary patch literal 42568 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
  • wXWyEyjecGoH;p6^ z1hr?y$$!rkvFM&jvU$UzWWEqc0E?CobhZEfltgzMRm<+tOgB60O2Sf6RyQ=6I*w0O zQW3LBhzUCEx051-oiABwz!53hj7lI#PMvY7NENjE{tqFP9>{;j)ws3jIQ9ow+8FyE z@PB(}p)9u&LqRjmnEhTj6ZrpsjE+>=xD@6EbvTy{z2jTchIvjQ^lgJfz`q2?x4P{I zxFj+y>$K4lmn^-5XFe|YLGciFQ_9qNj zi3$e&HS(&D%l`g6r){$4cOzq%J-K3ELRVhR4(W#wVvOm+l<1!Uo1VA*br@tvR9g0? zlZD69i&9Et0@2etwDsQ;$j%k(OZ^~@C=J$!Ds6;Xp6<4!E3hWW0Y1)oyo2CZ3 z>93dEEPO9q)&Vbp;-9WWg{JxJJck6n-z2<;QHX#<`-~2CjpRypdqAm=T+ce-+TeLT zz95pQbpCNJn#Lg=h&X;M3D-S24}lg0q$m}Muu)Uw(b31`4tsh9B+^s7oQD#r3phKN zCRlVjQd1lLfGGz2uX&t+)=)abYe{;^it|tuRoe$jQ7{RxOy(B4nxlZqWhaAiZqA$r zOaMENhi2x)0RbwhO%{6$gKaW=u|s@Xg&)oy+a$!nM1#_f8Q(9uWX}-)j#a5@+CGFR zDT+drrcFIVnR2+~%qb#gemNyO?h?W#m(7W@;ENXvfj{SzCe%!+QJLd>J8UB6NXi+8 zL2?daj_Ki!^L;U=L<0n_kK;Iw<2a7vIL^cH0jbXym2(-CX#fBK07*qoM6N<$f}sNr A$^ZZW literal 0 HcmV?d00001 diff --git a/src/main/resources/genyo.mixins.json b/src/main/resources/genyo.mixins.json index 824ea6a..98d375e 100644 --- a/src/main/resources/genyo.mixins.json +++ b/src/main/resources/genyo.mixins.json @@ -9,7 +9,6 @@ "MixinConnectScreen", "MixinItemUsageContext", "MixinKeyboardInput", - "MixinMinecraftClient", "PlayerUtilsMixin", "accessor.AccessorBundlePacket", "accessor.AccessorClientPlayerInteractionManager", @@ -32,6 +31,7 @@ "entity.IEntity", "entity.MixinEntity", "entity.player.MixinPlayerEntity", + "game.MixinMinecraftClient", "network.MixinServerPlayerEntity", "world.MixinBlockCollisionSpliterator" ]