From 3359fc671df4ae03d863786160e65631c5175f22 Mon Sep 17 00:00:00 2001 From: wuritz Date: Fri, 7 Nov 2025 18:10:42 +0100 Subject: [PATCH 1/3] auto web --- README.md | 26 +- src/main/java/com/genyo/Genyo.java | 1 + .../genyo/systems/modules/PlacerModule.java | 8 +- .../genyo/systems/modules/combat/AutoWeb.java | 244 ++++++++++++++++++ .../modules/combat/GenyoAutoCrystal.java | 15 -- .../systems/modules/combat/GenyoAutoTrap.java | 6 +- .../systems/modules/misc/AutoOminous.java | 21 +- .../systems/modules/movement/GenyoPhase.java | 2 +- .../systems/modules/world/GenyoScaffold.java | 2 +- .../systems/modules/world/GenyoSelfTrap.java | 4 +- .../modules/world/GenyoSurroundV2.java | 4 +- .../java/com/genyo/utils/math/MathUtil.java | 4 + 12 files changed, 279 insertions(+), 58 deletions(-) create mode 100644 src/main/java/com/genyo/systems/modules/combat/AutoWeb.java diff --git a/README.md b/README.md index 59fc544..0448d43 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@

Genyo Addon

❤꧁ღ⊱♥ I have brain damge ♥⊱ღ꧂❤

-

Shoreline port into Meteor plus other GENYO magic :D

+

Shoreline port into Meteor 1.21.4 plus other GENYO magic :D

@@ -25,7 +25,7 @@
-# Best addon ever +## Best addon ever You don't need anything more, we have everything you've ever wanted. Also things you've never wanted.
[Check out the website.](https://genyo.dev) @@ -33,7 +33,7 @@ You don't need anything more, we have everything you've ever wanted. Also things International version: **Genyo Addon**
*written for **Meteor 1.21.4*** -# Features ✨ +## Features ✨ 📋 Check out the [full list of features](https://genyo.dev/features) on our website. 📋 @@ -43,29 +43,17 @@ Five categories of modules: - Movement - Visual - World - -## How to use ❓ -- Yes -- Also -- Hulkenberg. - -# Problem? ⛔ +## Problem? [Join Discord](https://discord.gg/dwuAuXKQ) for support.
- - - - *⚠️ keep in mind that we aren't developing this thing 24/7 ⚠️* -### License - -**YOLO License** 🥝🐦 +## License -I love kiwi. ── ⋆˚୨🥝୧⋆。˚ !! +[YOLO License](https://github.com/wuritz/genyo-addon/blob/master/LICENSE) - i guess -### Credits +## Credits
Thanks to:
diff --git a/src/main/java/com/genyo/Genyo.java b/src/main/java/com/genyo/Genyo.java index ad51df2..08366d9 100644 --- a/src/main/java/com/genyo/Genyo.java +++ b/src/main/java/com/genyo/Genyo.java @@ -152,6 +152,7 @@ private void initModules(Modules modules) { //modules.add(new AutoOminous()); modules.add(new FastLatency()); modules.add(new FastPlace()); + modules.add(new AutoWeb()); } private void initHUD(Hud hud) { diff --git a/src/main/java/com/genyo/systems/modules/PlacerModule.java b/src/main/java/com/genyo/systems/modules/PlacerModule.java index e2969db..a953721 100644 --- a/src/main/java/com/genyo/systems/modules/PlacerModule.java +++ b/src/main/java/com/genyo/systems/modules/PlacerModule.java @@ -30,15 +30,15 @@ public class PlacerModule extends GenyoModule { add(Blocks.ENDER_CHEST); }}; - protected final Setting multitaskConfig = settings.getDefaultGroup().add(new BoolSetting.Builder() - .name("Multitask") + protected final Setting multitask = settings.getDefaultGroup().add(new BoolSetting.Builder() + .name("multitask") .description("Allows mining while using items") .defaultValue(false) .build() ); - protected final Setting strictDirectionConfig = settings.getDefaultGroup().add(new BoolSetting.Builder() - .name("Strict Direction") + protected final Setting strictDirection = settings.getDefaultGroup().add(new BoolSetting.Builder() + .name("strict-direction") .description("Places on visible sides only") .defaultValue(false) .build() diff --git a/src/main/java/com/genyo/systems/modules/combat/AutoWeb.java b/src/main/java/com/genyo/systems/modules/combat/AutoWeb.java new file mode 100644 index 0000000..a35862e --- /dev/null +++ b/src/main/java/com/genyo/systems/modules/combat/AutoWeb.java @@ -0,0 +1,244 @@ +package com.genyo.systems.modules.combat; + +import com.genyo.Genyo; +import com.genyo.events.network.DisconnectEvent; +import com.genyo.events.network.PlayerTickEvent; +import com.genyo.managers.Managers; +import com.genyo.render.animation.Animation; +import com.genyo.systems.modules.PlacerModule; +import com.genyo.systems.settings.FloatSetting; +import com.genyo.utils.math.MathUtil; +import meteordevelopment.meteorclient.events.render.Render3DEvent; +import meteordevelopment.meteorclient.renderer.ShapeMode; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.systems.friends.Friends; +import meteordevelopment.meteorclient.utils.render.color.SettingColor; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.block.Blocks; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.util.math.BlockPos; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class AutoWeb extends PlacerModule { + + public AutoWeb() { + super(Genyo.COMBAT, "auto-web", "Automatically traps nearby entities in webs"); + } + + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgRender = settings.createGroup("Render"); + + private final Setting range = sgGeneral.add(new FloatSetting.Builder() + .name("place-range") + .description("The range to fill nearby holes") + .min(0.1f).defaultValue(4.0f).max(6.0f) + .sliderRange(0.1f, 6.0f) + .build() + ); + + private final Setting enemyRange = sgGeneral.add(new FloatSetting.Builder() + .name("enemy-range") + .description("The maximum range of targets") + .min(0.1f).defaultValue(10.0f).max(15.0f) + .sliderRange(0.1f, 15.0f) + .build() + ); + + private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() + .name("rotate") + .description("Rotates to block before placing") + .defaultValue(false) + .build() + ); + + private final Setting coverHead = sgGeneral.add(new BoolSetting.Builder() + .name("cover-head") + .description("Places webs on the targets head") + .defaultValue(false) + .build() + ); + + private final Setting shiftTicks = sgGeneral.add(new IntSetting.Builder() + .name("shift-ticks") + .description("The number of blocks to place per tick") + .min(1).defaultValue(2).max(5) + .sliderRange(1, 5) + .build() + ); + + private final Setting shiftDelay = sgGeneral.add(new IntSetting.Builder() + .name("shift-delay") + .description("The delay between each block placement interval") + .min(0).defaultValue(1).max(5) + .sliderRange(0, 5) + .build() + ); + + // Render + + private final Setting render = sgRender.add(new BoolSetting.Builder() + .name("render") + .description("Renders web placements") + .defaultValue(true) + .build() + ); + + private final Setting renderColor = sgRender.add(new ColorSetting.Builder() + .name("render-color") + .description("The render color") + .defaultValue(new SettingColor(0, 255, 0, 255)) + .visible(render::get) + .build() + ); + + private final Setting fadeTime = sgRender.add(new IntSetting.Builder() + .name("fade-time") + .description("Time to fade") + .min(0).defaultValue(250).max(1000) + .sliderRange(0, 1000) + .visible(render::get) + .build() + ); + + private int shiftDelayInt; + private List webs = new ArrayList<>(); + private final Map fadeList = new HashMap<>(); + + @Override + public void onDeactivate() + { + fadeList.clear(); + webs.clear(); + } + + @EventHandler + public void onDisconnect(DisconnectEvent event) + { + toggle(); + } + + @EventHandler + public void onPlayerTick(PlayerTickEvent event) + { + if (!multitask.get() && checkMultitask()) + { + webs.clear(); + return; + } + + int blocksPlaced = 0; + int slot = getBlockItemSlot(Blocks.COBWEB); + if (slot == -1) + { + webs.clear(); + return; + } + + if (shiftDelayInt < shiftDelay.get()) + { + shiftDelayInt++; + return; + } + List webPlacements = new ArrayList<>(); + for (PlayerEntity entity : mc.world.getPlayers()) + { + if (entity == mc.player || Friends.get().isFriend(entity)) + { + continue; + } + double d = mc.player.distanceTo(entity); + if (d > enemyRange.get()) + { + continue; + } + BlockPos feetPos = entity.getBlockPos(); + double dist = mc.player.getEyePos().squaredDistanceTo(feetPos.toCenterPos()); + if (mc.world.getBlockState(feetPos).isAir() && dist <= MathUtil.squared(range.get())) + { + webPlacements.add(feetPos); + } + if (coverHead.get()) + { + BlockPos headPos = feetPos.up(); + double dist2 = mc.player.getEyePos().squaredDistanceTo(headPos.toCenterPos()); + if (mc.world.getBlockState(headPos).isAir() && dist2 <= MathUtil.squared(range.get())) + { + webPlacements.add(headPos); + } + } + } + webs = webPlacements; + if (webs.isEmpty()) + { + return; + } + while (blocksPlaced < shiftTicks.get()) + { + if (blocksPlaced >= webs.size()) + { + break; + } + BlockPos targetPos = webs.get(blocksPlaced); + blocksPlaced++; + shiftDelayInt = 0; + // All rotations for shift ticks must send extra packet + // This may not work on all servers + placeWeb(targetPos, slot); + } + + if (rotate.get()) + { + Managers.ROTATION.setRotationSilentSync(); + } + } + + @EventHandler + public void onRender3D(Render3DEvent event) + { + if (render.get()) + { + for (Map.Entry set : fadeList.entrySet()) + { + set.getValue().setState(false); + int lineAlpha = (int) (120 * set.getValue().getFactor()); + BlockPos blockPos = set.getKey(); + event.renderer.box(blockPos, renderColor.get().a(lineAlpha), renderColor.get().a(lineAlpha), ShapeMode.Both, 1); + } + + if (webs.isEmpty()) + { + return; + } + + for (BlockPos pos : webs) + { + Animation animation = new Animation(true, fadeTime.get()); + fadeList.put(pos, animation); + } + } + + fadeList.entrySet().removeIf(e -> + e.getValue().getFactor() == 0.0); + } + + private void placeWeb(BlockPos pos, int slot) + { + Managers.INTERACT.placeBlock(pos, slot, strictDirection.get(), false, (state, angles) -> + { + if (rotate.get() && state) + { + Managers.ROTATION.setRotationSilent(angles[0], angles[1]); + } + }); + } + + public boolean isPlacing() + { + return !webs.isEmpty(); + } + +} diff --git a/src/main/java/com/genyo/systems/modules/combat/GenyoAutoCrystal.java b/src/main/java/com/genyo/systems/modules/combat/GenyoAutoCrystal.java index 12a5275..b16da12 100644 --- a/src/main/java/com/genyo/systems/modules/combat/GenyoAutoCrystal.java +++ b/src/main/java/com/genyo/systems/modules/combat/GenyoAutoCrystal.java @@ -80,13 +80,6 @@ public GenyoAutoCrystal() { private final SettingGroup sgDamage = settings.createGroup("Damage"); 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) - .build() - ); - private final Setting whileMining = sgGeneral.add(new BoolSetting.Builder() .name("While Mining") .description("Allows attacking while mining blocks") @@ -430,14 +423,6 @@ public GenyoAutoCrystal() { .build() ); - private final Setting strictDirection = sgPlace.add(new BoolSetting.Builder() - .name("Strict Direction") - .description("Interacts with only visible directions when placing crystals") - .defaultValue(false) - .visible(place::get) - .build() - ); - private final Setting placements = sgPlace.add(new EnumSetting.Builder() .name("Placements") .description("Version standard for placing end crystals") diff --git a/src/main/java/com/genyo/systems/modules/combat/GenyoAutoTrap.java b/src/main/java/com/genyo/systems/modules/combat/GenyoAutoTrap.java index ee886de..73c10ae 100644 --- a/src/main/java/com/genyo/systems/modules/combat/GenyoAutoTrap.java +++ b/src/main/java/com/genyo/systems/modules/combat/GenyoAutoTrap.java @@ -168,7 +168,7 @@ public void onPlayerTick(PlayerTickEvent event) { blocksPlaced = 0; - if (!multitaskConfig.get() && mc.player.isUsingItem()) + if (!multitask.get() && mc.player.isUsingItem()) { surround.clear(); placements.clear(); @@ -218,7 +218,7 @@ public void onPlayerTick(PlayerTickEvent event) { continue; } - Direction direction = Managers.INTERACT.getInteractDirectionInternal(block, strictDirectionConfig.get()); + Direction direction = Managers.INTERACT.getInteractDirectionInternal(block, strictDirection.get()); if (direction == null) { placements.add(block.down()); @@ -292,7 +292,7 @@ else if (BlastResistantBlocks.isBlastResistant(blockState)) private void placeBlock(BlockPos pos, int slot) { - Managers.INTERACT.placeBlock(pos, slot, strictDirectionConfig.get(), false, true, (state, angles) -> + Managers.INTERACT.placeBlock(pos, slot, strictDirection.get(), false, true, (state, angles) -> { if (rotateConfig.get() && state) { diff --git a/src/main/java/com/genyo/systems/modules/misc/AutoOminous.java b/src/main/java/com/genyo/systems/modules/misc/AutoOminous.java index 947f5cb..ef07efb 100644 --- a/src/main/java/com/genyo/systems/modules/misc/AutoOminous.java +++ b/src/main/java/com/genyo/systems/modules/misc/AutoOminous.java @@ -11,7 +11,6 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.item.Items; -import net.minecraft.server.world.ServerWorld; import net.minecraft.village.raid.Raid; import net.minecraft.village.raid.RaidManager; @@ -30,24 +29,24 @@ public AutoOminous() { public void onTick(TickEvent.Pre event) { if (mc.player == null || mc.world == null || mc.interactionManager == null || mc.getServer() == null) return; - /*RaidManager raidManager = mc.getServer().getWorld(mc.player.getWorld().getRegistryKey()).getRaidManager(); + RaidManager raidManager = mc.getServer().getWorld(mc.player.getWorld().getRegistryKey()).getRaidManager(); if (raidManager == null) return; Raid raid = raidManager.getRaidAt(mc.player.getBlockPos(), 50); if (raid == null) return; - if (raid.hasWon()) {*/ - if (mc.player.getActiveStatusEffects().containsKey(StatusEffects.HERO_OF_THE_VILLAGE)) { - if (!mc.player.getActiveStatusEffects().containsKey(StatusEffects.BAD_OMEN)) { - if (!drinking) { - drinkPotion(); - lookForEffect = true; + if (raid.hasWon()) { + if (mc.player.getActiveStatusEffects().containsKey(StatusEffects.HERO_OF_THE_VILLAGE)) { + if (!mc.player.getActiveStatusEffects().containsKey(StatusEffects.BAD_OMEN)) { + if (!drinking) { + drinkPotion(); + lookForEffect = true; + } + } else if (lookForEffect) { + stopDrinking(); } - } else if (lookForEffect) { - stopDrinking(); } } - /*}*/ } private void drinkPotion() { diff --git a/src/main/java/com/genyo/systems/modules/movement/GenyoPhase.java b/src/main/java/com/genyo/systems/modules/movement/GenyoPhase.java index ef12edf..7d337fd 100644 --- a/src/main/java/com/genyo/systems/modules/movement/GenyoPhase.java +++ b/src/main/java/com/genyo/systems/modules/movement/GenyoPhase.java @@ -249,7 +249,7 @@ else if (yaw1 >= 292.5 && yaw1 < 337.5) if (slot != -1 && blockPos != null && !mc.world.getBlockState(blockPos.down()).isReplaceable()) { Managers.INTERACT.placeBlock(blockPos, slot, - strictDirectionConfig.get(), false, true, (state, angles) -> + strictDirection.get(), false, true, (state, angles) -> { if (state) { diff --git a/src/main/java/com/genyo/systems/modules/world/GenyoScaffold.java b/src/main/java/com/genyo/systems/modules/world/GenyoScaffold.java index 608d008..229ee5e 100644 --- a/src/main/java/com/genyo/systems/modules/world/GenyoScaffold.java +++ b/src/main/java/com/genyo/systems/modules/world/GenyoScaffold.java @@ -160,7 +160,7 @@ public void onDeactivate() { public void onPlayerTick(PlayerTickEvent event) { - if (!multitaskConfig.get() && checkMultitask()) + if (!multitask.get() && checkMultitask()) { blockData = null; renderData = null; diff --git a/src/main/java/com/genyo/systems/modules/world/GenyoSelfTrap.java b/src/main/java/com/genyo/systems/modules/world/GenyoSelfTrap.java index 3f83f11..5e1e615 100644 --- a/src/main/java/com/genyo/systems/modules/world/GenyoSelfTrap.java +++ b/src/main/java/com/genyo/systems/modules/world/GenyoSelfTrap.java @@ -216,7 +216,7 @@ public void onTick(TickEvent.Pre event) { return; } - if (!multitaskConfig.get() && checkMultitask()) { + if (!multitask.get() && checkMultitask()) { trap.clear(); placements.clear(); return; @@ -347,7 +347,7 @@ else if (BlastResistantBlocks.isBlastResistant(blockState)) private void placeBlock(BlockPos pos, int slot) { if (!buggy.get()) { - Managers.INTERACT.placeBlock(pos, slot, strictDirectionConfig.get(), false, true, (state, angles) -> + Managers.INTERACT.placeBlock(pos, slot, strictDirection.get(), false, true, (state, angles) -> { if (rotate.get() && state) { Managers.ROTATION.setRotationSilent(angles[0], angles[1]); diff --git a/src/main/java/com/genyo/systems/modules/world/GenyoSurroundV2.java b/src/main/java/com/genyo/systems/modules/world/GenyoSurroundV2.java index 787e6fe..a1df57f 100644 --- a/src/main/java/com/genyo/systems/modules/world/GenyoSurroundV2.java +++ b/src/main/java/com/genyo/systems/modules/world/GenyoSurroundV2.java @@ -213,7 +213,7 @@ public void onTick(TickEvent.Pre event) { return; } - if (!multitaskConfig.get() && checkMultitask()) { + if (!multitask.get() && checkMultitask()) { surround.clear(); placements.clear(); return; @@ -344,7 +344,7 @@ else if (BlastResistantBlocks.isBlastResistant(blockState)) private void placeBlock(BlockPos pos, int slot) { if (!buggy.get()) { - Managers.INTERACT.placeBlock(pos, slot, strictDirectionConfig.get(), false, true, (state, angles) -> + Managers.INTERACT.placeBlock(pos, slot, strictDirection.get(), false, true, (state, angles) -> { if (rotate.get() && state) { Managers.ROTATION.setRotationSilent(angles[0], angles[1]); diff --git a/src/main/java/com/genyo/utils/math/MathUtil.java b/src/main/java/com/genyo/utils/math/MathUtil.java index b6c035a..7d46272 100644 --- a/src/main/java/com/genyo/utils/math/MathUtil.java +++ b/src/main/java/com/genyo/utils/math/MathUtil.java @@ -30,4 +30,8 @@ public static float squared(float value) { return value*value; } + public static int squared(int value) { + return value*value; + } + } From cf212d2e2d504b090def9a1e44519e90c64afbf8 Mon Sep 17 00:00:00 2001 From: wuritz Date: Sun, 16 Nov 2025 08:43:18 +0100 Subject: [PATCH 2/3] baseplace + autocrawltrap --- src/main/java/com/genyo/Genyo.java | 2 + .../systems/modules/combat/AutoCrawlTrap.java | 387 ++++++++++++++++++ .../systems/modules/combat/BasePlace.java | 275 +++++++++++++ 3 files changed, 664 insertions(+) create mode 100644 src/main/java/com/genyo/systems/modules/combat/AutoCrawlTrap.java create mode 100644 src/main/java/com/genyo/systems/modules/combat/BasePlace.java diff --git a/src/main/java/com/genyo/Genyo.java b/src/main/java/com/genyo/Genyo.java index 08366d9..c3b9fec 100644 --- a/src/main/java/com/genyo/Genyo.java +++ b/src/main/java/com/genyo/Genyo.java @@ -153,6 +153,8 @@ private void initModules(Modules modules) { modules.add(new FastLatency()); modules.add(new FastPlace()); modules.add(new AutoWeb()); + modules.add(new AutoCrawlTrap()); + modules.add(new BasePlace()); } private void initHUD(Hud hud) { diff --git a/src/main/java/com/genyo/systems/modules/combat/AutoCrawlTrap.java b/src/main/java/com/genyo/systems/modules/combat/AutoCrawlTrap.java new file mode 100644 index 0000000..8c0abae --- /dev/null +++ b/src/main/java/com/genyo/systems/modules/combat/AutoCrawlTrap.java @@ -0,0 +1,387 @@ +package com.genyo.systems.modules.combat; + +import com.genyo.Genyo; +import com.genyo.events.network.PlayerTickEvent; +import com.genyo.managers.Managers; +import com.genyo.render.animation.Animation; +import com.genyo.systems.modules.PlacerModule; +import com.genyo.systems.settings.FloatSetting; +import com.genyo.utils.GEntityUtils; +import com.genyo.utils.entity.EntityUtil; +import com.genyo.utils.math.MathUtil; +import com.genyo.utils.world.BlastResistantBlocks; +import meteordevelopment.meteorclient.events.packets.PacketEvent; +import meteordevelopment.meteorclient.events.render.Render3DEvent; +import meteordevelopment.meteorclient.renderer.ShapeMode; +import meteordevelopment.meteorclient.settings.*; +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.ExperienceOrbEntity; +import net.minecraft.entity.ItemEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.projectile.ArrowEntity; +import net.minecraft.network.packet.Packet; +import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket; +import net.minecraft.network.packet.s2c.play.BundleS2CPacket; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3i; + +import java.util.*; + +public class AutoCrawlTrap extends PlacerModule { + + public AutoCrawlTrap() { + super(Genyo.COMBAT, "auto-crawl-trap", "Places blocks to keep enemies in crawl"); + } + + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgTicks = settings.createGroup("Ticks"); + private final SettingGroup sgRender = settings.createGroup("Render"); + + private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() + .name("rotate") + .description("Rotates to block before placing") + .defaultValue(false) + .build() + ); + + private final Setting range = sgGeneral.add(new FloatSetting.Builder() + .name("place-range") + .description("The range to trap enemies") + .min(0.1f).defaultValue(4.0f).max(6.0f) + .sliderRange(0.1f, 6.0f) + .build() + ); + + private final Setting enemyRange = sgGeneral.add(new FloatSetting.Builder() + .name("enemy-range") + .description("The maximum range of targets") + .min(0.1f).defaultValue(10f).max(15f) + .sliderRange(0.1f, 15f) + .build() + ); + + private final Setting down = sgGeneral.add(new BoolSetting.Builder() + .name("prevent-downwards") + .description("Prevents diggin downwards") + .defaultValue(true) + .build() + ); + + private final Setting serverHitbox = sgGeneral.add(new BoolSetting.Builder() + .name("hitbox-sync") + .description("Places on server-side crawling hithoxes") + .defaultValue(false) + .build() + ); + + private final Setting mineIgnore = sgGeneral.add(new BoolSetting.Builder() + .name("prevent-mine") + .description("Prevents enemies from mining the trap") + .defaultValue(false) + .build() + ); + + // Ticks + + private final Setting shiftTicks = sgTicks.add(new IntSetting.Builder() + .name("shift-ticks") + .description("The number of blocks to place per tick") + .min(1).defaultValue(2).max(10) + .sliderRange(1, 10) + .build() + ); + + private final Setting shiftDelay = sgTicks.add(new FloatSetting.Builder() + .name("shift-delay") + .description("The delay between each block placement interval") + .min(0f).defaultValue(1f).max(5f) + .sliderRange(0f, 5f) + .build() + ); + + private final Setting extrapolateTicks = sgTicks.add(new IntSetting.Builder() + .name("extrapolation-ticks") + .description("Accounts for motion when calculating enemy positions, not fully accurate") + .min(0).defaultValue(0).max(10) + .sliderRange(0, 10) + .build() + ); + + // Render + + private final Setting render = sgRender.add(new BoolSetting.Builder() + .name("render") + .description("Renders web placements") + .defaultValue(true) + .build() + ); + + private final Setting renderColor = sgRender.add(new ColorSetting.Builder() + .name("render-color") + .description("The render color") + .defaultValue(new SettingColor(0, 255, 0, 255)) + .visible(render::get) + .build() + ); + + private final Setting fadeTime = sgRender.add(new IntSetting.Builder() + .name("fade-time") + .description("Time to fade") + .min(0).defaultValue(250).max(1000) + .sliderRange(0, 1000) + .visible(render::get) + .build() + ); + + private List surround = new ArrayList<>(); + private List placements = new ArrayList<>(); + private final Map packets = new HashMap<>(); + private final Map fadeList = new HashMap<>(); + private PlayerEntity target; + private int blocksPlaced; + + @Override + public void onDeactivate() + { + surround.clear(); + placements.clear(); + fadeList.clear(); + target = null; + } + + @EventHandler + public void onPlayerTick(PlayerTickEvent event) + { + blocksPlaced = 0; + + if (!multitask.get() && checkMultitask()) + { + surround.clear(); + placements.clear(); + return; + } + + final int slot = getResistantBlockItem(); + if (slot == -1) + { + surround.clear(); + placements.clear(); + return; + } + target = getClosestPlayer(enemyRange.get()); + if (target == null) + { + surround.clear(); + placements.clear(); + return; + } + + BlockPos targetPos = GEntityUtils.getRoundedBlockPos(target); + surround = getCrawlTrap(target, targetPos); + if (!canCrawlTrap(target, targetPos) || surround.isEmpty()) + { + return; + } + + placements = getPlacementsFromTrap(surround); + if (placements.isEmpty()) + { + return; + } + placements.sort(Comparator.comparingInt(Vec3i::getY)); + while (blocksPlaced < shiftTicks.get()) + { + if (blocksPlaced >= placements.size()) + { + break; + } + BlockPos targetPlacePos = placements.get(blocksPlaced); + // All rotations for shift ticks must send extra packet + // This may not work on all servers + placeBlock(targetPlacePos, slot); + } + + if (rotate.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, strictDirection.get(), false, true, (state, angles) -> + { + if (rotate.get() && state) + { + Managers.ROTATION.setRotationSilent(angles[0], angles[1]); + } + }); + packets.put(pos, System.currentTimeMillis()); + blocksPlaced++; + } + + public List getPlacementsFromTrap(List surround) + { + List placements = new ArrayList<>(); + for (BlockPos surroundPos : surround) + { + Long placed = packets.get(surroundPos); + if (shiftDelay.get() > 0.0f && placed != null && System.currentTimeMillis() - placed < shiftDelay.get() * 50.0f) + { + continue; + } + + final Box surroundBox = new Box(surroundPos); + List invalid = mc.world.getOtherEntities(null, surroundBox).stream().filter(e -> invalidEntity(e)).toList(); + + if (!mc.world.getBlockState(surroundPos).isReplaceable() + && !(Managers.BLOCK.isPassed(surroundPos, 0.7f) && mineIgnore.get())) + { + continue; + } + double dist = mc.player.squaredDistanceTo(surroundPos.toCenterPos()); + if (dist > MathUtil.squared(range.get())) + { + continue; + } + + if (mc.world.canPlace(DEFAULT_OBSIDIAN_STATE, surroundPos, ShapeContext.absent())) + { + placements.add(surroundPos); + } + } + + return placements; + } + + public List getCrawlTrap(PlayerEntity entity, BlockPos playerPos) + { + final List crawlTrap = new ArrayList<>(); + crawlTrap.add(playerPos.up()); + if (down.get()) + { + crawlTrap.add(playerPos.down()); + } + + double x = entity.getX(); + double y = entity.getY(); + double z = entity.getZ(); + + int ticks = 0; + while (ticks <= extrapolateTicks.get()) + { + double ox = (x - entity.prevX) * ticks; + double oz = (z - entity.prevZ) * ticks; + BlockPos blockPos = BlockPos.ofFloored(x + ox, y, z + oz); + if (!crawlTrap.contains(blockPos.up())) + { + crawlTrap.add(blockPos.up()); + } + if (down.get() && !crawlTrap.contains(blockPos.down())) + { + crawlTrap.add(blockPos.down()); + } + ticks++; + } + return crawlTrap; + } + + public boolean invalidEntity(Entity entity) + { + return !(entity instanceof ItemEntity) && !(entity instanceof ExperienceOrbEntity) && !(entity instanceof ArrowEntity); + } + + @EventHandler + public void onRender3D(Render3DEvent event) { + fullNullCheck(); + + if (render.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 = renderColor.get().a(boxAlpha); + Color lineColor = renderColor.get().a(lineAlpha); + event.renderer.box(set.getKey(), boxColor, lineColor, ShapeMode.Both, -1); + } + + if (placements.isEmpty()) + { + return; + } + + for (BlockPos pos : placements) + { + Animation animation = new Animation(true, fadeTime.get()); + fadeList.put(pos, animation); + } + } + + fadeList.entrySet().removeIf(e -> + e.getValue().getFactor() == 0.0); + } + + private boolean canCrawlTrap(PlayerEntity player, BlockPos playerPos) + { + return player.isOnGround() || !mc.world.getBlockState(playerPos.up()).isReplaceable() || !mc.world.getBlockState(playerPos.up(2)).isReplaceable(); + } + + public boolean isPlacing() + { + return !placements.isEmpty(); + } + +} diff --git a/src/main/java/com/genyo/systems/modules/combat/BasePlace.java b/src/main/java/com/genyo/systems/modules/combat/BasePlace.java new file mode 100644 index 0000000..496aa11 --- /dev/null +++ b/src/main/java/com/genyo/systems/modules/combat/BasePlace.java @@ -0,0 +1,275 @@ +package com.genyo.systems.modules.combat; + +import com.genyo.Genyo; +import com.genyo.events.network.PlayerTickEvent; +import com.genyo.managers.Managers; +import com.genyo.render.animation.Animation; +import com.genyo.systems.modules.PlacerModule; +import com.genyo.systems.settings.FloatSetting; +import com.genyo.utils.GEntityUtils; +import com.genyo.utils.math.MathUtil; +import com.genyo.utils.world.ExplosionUtil; +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.combat.CrystalAura; +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.player.PlayerEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class BasePlace extends PlacerModule { + + public BasePlace() { + super(Genyo.COMBAT, "base-place", "Places obsidian for crystal placements"); + } + + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgRender = settings.createGroup("Render"); + + private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() + .name("rotate") + .description("Rotates to block before placing") + .defaultValue(false) + .build() + ); + + private final Setting placeRange = sgGeneral.add(new FloatSetting.Builder() + .name("place-range") + .description("The placement range for bases") + .min(0f).defaultValue(4f).max(6f) + .sliderRange(0f, 6f) + .build() + ); + + private final Setting enemyRange = sgGeneral.add(new FloatSetting.Builder() + .name("enemy-range") + .description("The maximum range of targets") + .min(0.1f).defaultValue(10f).max(15f) + .sliderRange(0.1f, 15f) + .build() + ); + + private final Setting shiftDelay = sgGeneral.add(new FloatSetting.Builder() + .name("shift-delay") + .description("The delay between each block placement interval") + .min(0f).defaultValue(1f).max(5f) + .sliderRange(0f, 5f) + .build() + ); + + private final Setting minDamage = sgGeneral.add(new FloatSetting.Builder() + .name("min-damage") + .description("Minimum damage required to place base") + .min(1f).defaultValue(4f).max(10f) + .sliderRange(1f, 10f) + .build() + ); + + private final Setting assumeArmor = sgGeneral.add(new BoolSetting.Builder() + .name("assume-best-armor") + .description("Assumes Prot 0 armor is max armor") + .defaultValue(false) + .build() + ); + + // Render + + private final Setting render = sgRender.add(new BoolSetting.Builder() + .name("render") + .description("Renders web placements") + .defaultValue(true) + .build() + ); + + private final Setting renderColor = sgRender.add(new ColorSetting.Builder() + .name("render-color") + .description("The render color") + .defaultValue(new SettingColor(0, 255, 0, 255)) + .visible(render::get) + .build() + ); + + private final Setting fadeTime = sgRender.add(new IntSetting.Builder() + .name("fade-time") + .description("Time to fade") + .min(0).defaultValue(250).max(1000) + .sliderRange(0, 1000) + .visible(render::get) + .build() + ); + + private BlockPos crystalBase; + private final Map packets = new HashMap<>(); + private final Map fadeList = new HashMap<>(); + + @Override + public void onDeactivate() { + crystalBase = null; + packets.clear(); + fadeList.clear(); + } + + @EventHandler + public void onTick(PlayerTickEvent event) + { + if (!Modules.get().isActive(GenyoAutoCrystal.class) || !Modules.get().isActive(CrystalAura.class) || Modules.get().get(GenyoAutoCrystal.class).isPlacing()) + { + return; + } + + PlayerEntity target = getClosestPlayer(enemyRange.get()); + if (target == null) + { + return; + } + + crystalBase = getCrystalBase(target); + if (crystalBase == null) + { + return; + } + + BlockState state = mc.world.getBlockState(crystalBase); + int slot = getResistantBlockItem(); + if (slot == -1 || !state.isReplaceable()) + { + return; + } + + placeBlock(crystalBase, slot); + } + + @EventHandler + public void onRender3D(Render3DEvent event) { + if (render.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 = renderColor.get().a(boxAlpha); + Color lineColor = renderColor.get().a(lineAlpha); + event.renderer.box(set.getKey(), boxColor, lineColor, ShapeMode.Both, 1); + } + + if (crystalBase != null && mc.world.isAir(crystalBase)) + { + Animation animation = new Animation(true, fadeTime.get()); + fadeList.put(crystalBase, animation); + } + } + + fadeList.entrySet().removeIf(e -> + e.getValue().getFactor() == 0.0); + } + + private void placeBlock(BlockPos pos, int slot) + { + Managers.INTERACT.placeBlock(pos, slot, strictDirection.get(), false, true, (state, angles) -> + { + if (rotate.get()) + { + if (state) + { + Managers.ROTATION.setRotationSilent(angles[0], angles[1]); + } + else + { + Managers.ROTATION.setRotationSilentSync(); + } + } + }); + packets.put(pos, System.currentTimeMillis()); + } + + private BlockPos getCrystalBase(PlayerEntity player) + { + List targetBlocks = getSphere(placeRange.get(), mc.player.getEyePos()); + double damage = 0.0f; + BlockPos crystalBase = null; + for (BlockPos pos : targetBlocks) + { + final BlockPos basePos = pos.down(); + if (basePos.getY() >= GEntityUtils.getRoundedBlockPos(player).getY()) + { + continue; + } + + Long placed = packets.get(basePos); + if (shiftDelay.get() > 0.0f && placed != null && System.currentTimeMillis() - placed < shiftDelay.get() * 50.0f) + { + continue; + } + + if (!Modules.get().get(GenyoAutoCrystal.class).isCrystalHitboxClear(pos)) + { + continue; + } + + double dist = mc.player.squaredDistanceTo(basePos.toCenterPos()); + if (dist > MathUtil.squared(placeRange.get())) + { + continue; + } + + double dmg1 = ExplosionUtil.getDamageTo(player, pos.toCenterPos(), assumeArmor.get()); + if (dmg1 < minDamage.get()) + { + continue; + } + + if (!Modules.get().isActive(AirPlace.class) + && Managers.INTERACT.getInteractDirectionInternal(basePos, strictDirection.get()) == null) + { + continue; + } + + if (!mc.world.canPlace(DEFAULT_OBSIDIAN_STATE, basePos, ShapeContext.absent())) + { + continue; + } + + if (dmg1 > damage) + { + crystalBase = basePos; + damage = dmg1; + } + } + + return crystalBase; + } + + private List getSphere(double rad, Vec3d origin) + { + List sphere = new ArrayList<>(); + for (double x = -rad; x <= rad; ++x) + { + for (double y = -rad; y <= rad; ++y) + { + for (double z = -rad; z <= rad; ++z) + { + Vec3i pos = new Vec3i((int) (origin.getX() + x), + (int) (origin.getY() + y), (int) (origin.getZ() + z)); + final BlockPos p = new BlockPos(pos); + sphere.add(p); + } + } + } + return sphere; + } + +} From e553e294c9f6ce2c495ec691916ad94e73d175f2 Mon Sep 17 00:00:00 2001 From: wuritz Date: Sun, 23 Nov 2025 20:05:09 +0100 Subject: [PATCH 3/3] genyo --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0448d43..8359a38 100644 --- a/README.md +++ b/README.md @@ -57,8 +57,8 @@ Five categories of modules:
Thanks to:
-
- meteor for being awesome
-
- Credit to "John Genyo", the founder of Genyo Corporations
-
- also Shoreline for being shorelineistic
-
- and other clients lol
+
- meteor for being awesome
+
- Credit to "John Genyo", the founder of Genyo Corporations
+
- also Shoreline for being shorelineistic
+
- and other clients lol