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/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/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/GenyoAddon.java b/src/main/java/com/genyo/addon/GenyoAddon.java index eb17827..fb35455 100644 --- a/src/main/java/com/genyo/addon/GenyoAddon.java +++ b/src/main/java/com/genyo/addon/GenyoAddon.java @@ -1,19 +1,19 @@ package com.genyo.addon; -import com.genyo.addon.hud.ActiveGenyoHud; -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.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; +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; @@ -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"; @@ -96,7 +105,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,17 +120,32 @@ 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()); + modules.add(new GenyoAutoXP()); + modules.add(new GenyoAutoArmor()); + modules.add(new GenyoAutoTrap()); + modules.add(new GenyoCapes()); + modules.add(new GenyoPhase()); + modules.add(new GenyoMainMenu()); } private void initHUD(Hud hud) { hud.register(PvPNeccessaryHud.INFO); hud.register(InCombatHud.INFO); hud.register(ActiveGenyoHud.INFO); + hud.register(PacketsHud.INFO); + hud.register(WatermarkHud.INFO); + hud.register(BetterPlayerRadarHud.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/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/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 d00fd61..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; @@ -29,6 +31,8 @@ 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 final PearlManager PEARL = new PearlManager(); public static void subscribe() { MeteorClient.EVENT_BUS.subscribe(COMBAT); @@ -44,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/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/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/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/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/managers/world/SocialManager.java b/src/main/java/com/genyo/addon/managers/world/SocialManager.java new file mode 100644 index 0000000..b344a3a --- /dev/null +++ b/src/main/java/com/genyo/addon/managers/world/SocialManager.java @@ -0,0 +1,16 @@ +package com.genyo.addon.managers.world; + +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/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/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/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/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/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..c70f979 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) @@ -110,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/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 f855bae..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; @@ -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/systems/hud/BetterPlayerRadarHud.java b/src/main/java/com/genyo/addon/systems/hud/BetterPlayerRadarHud.java new file mode 100644 index 0000000..3410130 --- /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, "better-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/systems/hud/PacketsHud.java b/src/main/java/com/genyo/addon/systems/hud/PacketsHud.java new file mode 100644 index 0000000..4fbea63 --- /dev/null +++ b/src/main/java/com/genyo/addon/systems/hud/PacketsHud.java @@ -0,0 +1,116 @@ +package com.genyo.addon.systems.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) + .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, 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())); + + if (background.get()) { + renderer.quad(this.x, y, getWidth(), getHeight(), backgroundColor.get()); + } + } + +} 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..b092920 --- /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.COMBAT, "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 93% 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 b1f72f3..c1b48cf 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.COMBAT, "Genyo AutoCrystal", "asd"); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -598,6 +599,7 @@ public GenyoAutoCrystal() { .build() ); + public PlayerEntity targetEntity; // private DamageData attackCrystal; private DamageData placeCrystal; @@ -634,17 +636,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 +656,7 @@ public String getModuleData() lastAttackTimer.passed(((20.0f - breakSpeed.get()) * 50.0f) + 2000.0f) ? 0 : getBreakMs(), crystalCounter.getPerSecond()); } - }*/ + } @Override public void onDeactivate() @@ -669,6 +666,7 @@ public void onDeactivate() placeCrystal = null; crystalRotation = null; silentRotations = null; + targetEntity = null; calculatePlaceCrystalTime = 0; stuckCrystals.clear(); attackPackets.clear(); @@ -680,14 +678,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 +699,6 @@ public void onPlayerUpdate(PlayerTickEvent event) return; } - for (AntiStuckData d : stuckCrystals) { double dist = mc.player.squaredDistanceTo(d.pos()); @@ -722,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) @@ -731,8 +733,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)) @@ -741,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; } @@ -776,7 +778,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) @@ -818,7 +820,7 @@ else if (placeCrystal != null) if (isRotationBlocked() || !rotated && rotate.get()) { return; - }*/ + } // if (rotateSilent.get() && silentRotations != null) { // setRotationSilent(silentRotations[0], silentRotations[1]); // } @@ -852,8 +854,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) { @@ -866,9 +870,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; @@ -893,15 +932,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); @@ -913,30 +946,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) { @@ -1015,11 +1031,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; @@ -1060,7 +1077,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; } @@ -1072,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; } @@ -1083,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(); @@ -1102,9 +1121,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(); @@ -1203,14 +1223,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()); @@ -1240,10 +1260,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); } @@ -1255,6 +1275,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) { @@ -1283,16 +1310,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(); } } @@ -1324,8 +1351,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)) { @@ -1441,7 +1467,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; } @@ -1453,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; } @@ -1462,7 +1489,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); } @@ -1500,6 +1527,7 @@ private DamageData calculateAttackCrystal(List entitie if (data == null || damage > data.getDamage()) { data = currentData; + if(entity instanceof PlayerEntity) targetEntity = (PlayerEntity) entity; } } } @@ -1574,7 +1602,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; } @@ -1586,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; } @@ -1595,7 +1624,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); } @@ -1634,6 +1663,7 @@ private DamageData calculatePlaceCrystal(List placeBlocks, L if (data == null || damage > data.getDamage()) { data = currentData; + if(entity instanceof PlayerEntity) targetEntity = (PlayerEntity) entity; } } } @@ -1703,8 +1733,9 @@ 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()); + 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/modules/combat/GenyoAutoTotem.java b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoAutoTotem.java similarity index 96% 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..81cfc0a 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; @@ -35,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(); @@ -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..34b0122 --- /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.COMBAT, "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..be437be --- /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.COMBAT, "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..0dcc0e7 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; @@ -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/modules/combat/GenyoReplenish.java b/src/main/java/com/genyo/addon/systems/modules/combat/GenyoReplenish.java similarity index 97% 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..0138c76 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; @@ -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/modules/combat/KFCSpawnKill.java b/src/main/java/com/genyo/addon/systems/modules/combat/KFCSpawnKill.java similarity index 98% 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..4c2174f 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; @@ -57,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/modules/misc/CombatBrainrot.java b/src/main/java/com/genyo/addon/systems/modules/misc/CombatBrainrot.java similarity index 70% 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 261ddd6..bacb79d 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,19 +1,21 @@ -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; import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.settings.StringListSetting; import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.orbit.EventHandler; +import net.minecraft.entity.Entity; import net.minecraft.entity.decoration.EndCrystalEntity; +import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket; import java.util.ArrayList; import java.util.List; @@ -21,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(); @@ -35,7 +37,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 +80,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/src/main/java/com/genyo/addon/modules/misc/GenyoAutoEZ.java b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoAutoEZ.java similarity index 95% 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..dd7499c 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; @@ -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/modules/misc/GenyoDiscord.java b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoDiscord.java similarity index 97% 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..cea6c64 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; @@ -117,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/modules/misc/GenyoGoodbye.java b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoGoodbye.java similarity index 91% 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..6289a35 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; @@ -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/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/modules/misc/GenyoSkinBlink.java b/src/main/java/com/genyo/addon/systems/modules/misc/GenyoSkinBlink.java similarity index 64% 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..b68b6e4 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,8 +29,15 @@ 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. "); + super(GenyoAddon.MISC, "genyo-skin-blink", "i love kiwi. i love kiwi. i love kiwi. i love kiwi. "); } private int timer = 0; @@ -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 93% 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..b827708 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; @@ -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 new file mode 100644 index 0000000..c48756f --- /dev/null +++ b/src/main/java/com/genyo/addon/systems/modules/misc/PacketDebug.java @@ -0,0 +1,123 @@ +package com.genyo.addon.systems.modules.misc; + +import com.genyo.addon.GenyoAddon; +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.orbit.EventHandler; +import net.minecraft.network.packet.Packet; + +import java.util.HashSet; +import java.util.Set; + +public class PacketDebug extends GenyoModule { + + public PacketDebug() { + super(GenyoAddon.MISC, "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/systems/modules/movement/GenyoPhase.java b/src/main/java/com/genyo/addon/systems/modules/movement/GenyoPhase.java new file mode 100644 index 0000000..36a1e23 --- /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.MOVEMENT, "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/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..256074d 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.*; @@ -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/modules/visual/AngelSexHulkenberg.java b/src/main/java/com/genyo/addon/systems/modules/visual/AngelSexHulkenberg.java similarity index 97% 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..febb2e3 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; @@ -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 new file mode 100644 index 0000000..be43334 --- /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.VISUAL, "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 94% 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..556c04c 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; @@ -25,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/modules/world/GenyoAutoMine.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoAutoMine.java similarity index 75% 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 4bff328..1422b8d 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,14 +1,18 @@ -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.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; +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.WORLD, "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/GenyoAutoTool.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoAutoTool.java similarity index 93% 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..8c7fc96 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; @@ -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/modules/world/GenyoGhostBlocks.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoGhostBlocks.java similarity index 96% 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..051d702 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.*; @@ -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/modules/world/GenyoScaffold.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoScaffold.java similarity index 98% 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..b0442a0 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; @@ -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/modules/world/GenyoSelfTrap.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoSelfTrap.java similarity index 98% 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 ab5a401..a1095e9 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; @@ -46,7 +46,7 @@ public class GenyoSelfTrap extends PlacerModule { public GenyoSelfTrap() { - super(GenyoAddon.GENYO, "Genyo SelfTrap V2", "a funny one for sure."); + super(GenyoAddon.WORLD, "Genyo SelfTrap", "a funny one for sure."); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -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/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..e5546f7 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.WORLD, "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..e01e460 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; @@ -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/modules/world/GenyoSurroundV2.java b/src/main/java/com/genyo/addon/systems/modules/world/GenyoSurroundV2.java similarity index 94% 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 bdd3df3..83d25a0 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; @@ -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(); @@ -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; } @@ -353,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()); @@ -428,7 +429,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; @@ -496,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()) @@ -511,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()) @@ -545,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/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/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/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/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/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/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/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/assets/genyo/icon.png b/src/main/resources/assets/genyo/icon.png index e5021a2..8b213d3 100644 Binary files a/src/main/resources/assets/genyo/icon.png and b/src/main/resources/assets/genyo/icon.png differ 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/cape.png b/src/main/resources/assets/genyo/textures/cape.png new file mode 100644 index 0000000..1d9e8b6 Binary files /dev/null and b/src/main/resources/assets/genyo/textures/cape.png differ 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 0000000..fe048da Binary files /dev/null and b/src/main/resources/assets/genyo/textures/goodjob.png differ diff --git a/src/main/resources/genyo.mixins.json b/src/main/resources/genyo.mixins.json index 77d7ef9..98d375e 100644 --- a/src/main/resources/genyo.mixins.json +++ b/src/main/resources/genyo.mixins.json @@ -9,12 +9,12 @@ "MixinConnectScreen", "MixinItemUsageContext", "MixinKeyboardInput", - "MixinMinecraftClient", "PlayerUtilsMixin", "accessor.AccessorBundlePacket", "accessor.AccessorClientPlayerInteractionManager", "accessor.AccessorClientWorld", "accessor.AccessorGameOptions", + "entity.player.MixinPlayerListEntry", "network.MixinClientPlayerEntity", "network.MixinClientPlayNetworkHandler", "render.MixinRenderTickCounter", @@ -31,7 +31,8 @@ "entity.IEntity", "entity.MixinEntity", "entity.player.MixinPlayerEntity", - "meteor.MixinSetting", - "network.MixinServerPlayerEntity" + "game.MixinMinecraftClient", + "network.MixinServerPlayerEntity", + "world.MixinBlockCollisionSpliterator" ] } 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