diff --git a/README.md b/README.md
index 59fc544..8359a38 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
-# 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,34 +43,22 @@ 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:
- - - 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
diff --git a/src/main/java/com/genyo/Genyo.java b/src/main/java/com/genyo/Genyo.java
index 1ba6859..f711877 100644
--- a/src/main/java/com/genyo/Genyo.java
+++ b/src/main/java/com/genyo/Genyo.java
@@ -168,6 +168,9 @@ private void initModules(Modules modules) {
//modules.add(new AutoOminous());
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/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/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/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/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;
+ }
+
+}
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;
+ }
+
}