diff --git a/d b/d deleted file mode 100644 index e567fef..0000000 --- a/d +++ /dev/null @@ -1,204 +0,0 @@ -commit 0b86ffab0df3225bd308f400d362b9b68df0ece2 (HEAD -> brasil) -Author: wuritz -Date: Thu Jul 10 08:43:51 2025 +0200 - - mukszik a traj - -commit 1d372e2576bffe9b3f312b62a8eb0388dbbe69e5 -Author: wuritz -Date: Tue Jul 8 10:01:27 2025 +0200 - - hulkenberg megin jobb - -commit 4a872fe9270ad40c89cd046e177036a1799aa489 (origin/brasil) -Merge: 317d537 2562cca -Author: wuritz -Date: Mon Jul 7 23:25:40 2025 +0200 - - Merge remote-tracking branch 'origin/brasil' into brasil - -commit 317d537222c3ad745e5712daddb0a85fbed3065f -Author: wuritz -Date: Mon Jul 7 23:24:19 2025 +0200 - - igen - -commit 2562ccaa0fc3630216d0144b4b13a9619176adbe -Author: wuritz -Date: Mon Jul 7 23:24:19 2025 +0200 - - igen - -commit 86890891ccacb94852b744c9ad6edcf388232e31 -Author: wuritz -Date: Mon Jul 7 23:08:09 2025 +0200 - - eltunik yooooo - -commit 7bb49127b383d418f6cbe7a77ff3ffb2b5800312 -Author: wuritz -Date: Sun Jul 6 22:08:25 2025 +0200 - - rossz wolt az accesswidener - -commit 995c1ffb840e8a0479accf95768206f63abdce69 -Author: wuritz -Date: Sun Jul 6 22:04:26 2025 +0200 - - angel hulkenberg - -commit 23c39a8ed8f0a6c5208d67391c34fa54d7feea17 -Author: wuritz -Date: Sun Jul 6 22:01:26 2025 +0200 - - angel hulkenberg - -commit df318ca9711c31389c38699bbcf473d69feea97d -Author: wuritz -Date: Sun Jun 29 11:59:01 2025 +0200 - - meg mielott elbasznam - -commit 4ea49baeb95b592d23945b11cb41050b61975587 -Author: wuritz -Date: Sun Jun 22 23:29:50 2025 +0200 - - enemies - -commit 6a30b7b503cf8d9d0f119cb4201ba21cf1da5c84 -Author: wuritz -Date: Sun Jun 22 13:25:02 2025 +0200 - - auto ez? - -commit 0dc1bf617d431bace2c47f2575f4ebd7dda7307e -Author: wuritz -Date: Sun Jun 22 12:18:42 2025 +0200 - - auto ez - -commit 85360639a1a1dcf341b09f1641fea9241f24089d -Author: wuritz -Date: Sun Jun 22 11:17:31 2025 +0200 - - fasz genyo fasz - -commit d48c94bb0ee3b401bc5b5e010871b9e271ee0304 -Author: wuritz -Date: Sun Jun 22 00:41:24 2025 +0200 - - ffffa - -commit 7f1a37ef88f596fa3fd6a40cc4807f0c896d4bd7 -Author: wuritz -Date: Sat Jun 21 12:42:02 2025 +0200 - - fass - -commit f1dc1d886e8fd37dc5f3c1a734a4cd5527572150 -Author: wuritz -Date: Sat Jun 21 12:40:38 2025 +0200 - - mixin - -commit b4451d7b8b2fc6854e7bc6e0e5fc90e94a228a1d -Author: wuritz -Date: Sat Jun 21 12:25:55 2025 +0200 - - genyo jobb - -commit 05aff3e3d7f3b0483466ee5fdad4a2de7c394668 -Author: wuritz -Date: Sat Jun 21 12:23:36 2025 +0200 - - genyo genyo mostmar jobb - -commit fe5dde06cfb19008ecb50d6b5b22fa7cd4b1da46 (tag: Genyo) -Author: wuritz -Date: Sat Jun 21 00:32:47 2025 +0200 - - genyo - -commit 35369cd1008714863ea7590ab07bc264d58aed24 -Author: wuritz -Date: Sat Jun 21 00:15:46 2025 +0200 - - genyo - -commit ab2baad46f6f690e349d16d0582ace26e64b6d66 -Author: Ritz Richárd <38112734+wuritz@users.noreply.github.com> -Date: Sat Jun 21 00:22:12 2025 +0200 - - Delete gradle directory - -commit de406708b999be0647fa935127478a0272918013 -Author: Ritz Richárd <38112734+wuritz@users.noreply.github.com> -Date: Sat Jun 21 00:22:07 2025 +0200 - - Delete src directory - -commit 98edadca233013c294cd39d0713f403e8255c588 -Author: Ritz Richárd <38112734+wuritz@users.noreply.github.com> -Date: Sat Jun 21 00:22:01 2025 +0200 - - Delete .editorconfig - -commit a8c35152f0e7f6332e124f763cf9a8c142c2bcc2 -Author: Ritz Richárd <38112734+wuritz@users.noreply.github.com> -Date: Sat Jun 21 00:21:53 2025 +0200 - - Delete .gitignore - -commit 58dc8f4c2321916ef72ac45ab81a893f2d950649 -Author: Ritz Richárd <38112734+wuritz@users.noreply.github.com> -Date: Sat Jun 21 00:21:48 2025 +0200 - - Delete LICENSE - -commit 785b4b5df405b753d2a148c1a30fa3bae3e2c631 -Author: Ritz Richárd <38112734+wuritz@users.noreply.github.com> -Date: Sat Jun 21 00:21:43 2025 +0200 - - Delete gradle.properties - -commit c817557346c4c12497d65091d86481ce9de28f51 -Author: Ritz Richárd <38112734+wuritz@users.noreply.github.com> -Date: Sat Jun 21 00:21:37 2025 +0200 - - Delete README.md - -commit f0a7e33dfa3a03163d322bae3d17ce772e78bff7 -Author: Ritz Richárd <38112734+wuritz@users.noreply.github.com> -Date: Sat Jun 21 00:21:28 2025 +0200 - - Delete gradlew - -commit 7e7f590e3cf157f693911e0a48e2399d496d3d0d -Author: Ritz Richárd <38112734+wuritz@users.noreply.github.com> -Date: Sat Jun 21 00:21:23 2025 +0200 - - Delete gradlew.bat - -commit 18e4ecb04105053425646330d501653bb9bc6d8e -Author: Ritz Richárd <38112734+wuritz@users.noreply.github.com> -Date: Sat Jun 21 00:21:18 2025 +0200 - - Delete settings.gradle.kts - -commit 01afc005e32fac81c1935fe6c974a7b09c890f32 -Author: Ritz Richárd <38112734+wuritz@users.noreply.github.com> -Date: Sat Jun 21 00:21:09 2025 +0200 - - Delete build.gradle.kts - -commit 77e40d543a743324c8a4e0d0cf56c98dd141a5cf -Author: Ritz Richárd <38112734+wuritz@users.noreply.github.com> -Date: Sat Jun 21 00:20:46 2025 +0200 - - Delete .github/workflows directory - -commit edb5a105974719a364cd2f9fc651ffff88b2792e -Author: Ritz Richárd <38112734+wuritz@users.noreply.github.com> -Date: Fri Jun 20 21:05:32 2025 +0200 - - Initial commit diff --git a/src/main/java/com/genyo/addon/GenyoAddon.java b/src/main/java/com/genyo/addon/GenyoAddon.java index 638b93a..64994ec 100644 --- a/src/main/java/com/genyo/addon/GenyoAddon.java +++ b/src/main/java/com/genyo/addon/GenyoAddon.java @@ -1,13 +1,15 @@ package com.genyo.addon; -import com.genyo.addon.gui.EnemiesTab; -import com.genyo.addon.hud.PvPNeccessaryHud; -import com.genyo.addon.managers.Managers; -import com.genyo.addon.managers.ModulesManager; import com.genyo.addon.modules.AngelSexHulkenberg; import com.genyo.addon.modules.GenyoAutoEZ; -import com.genyo.addon.modules.TescoCrystal; +import com.genyo.addon.modules.GenyoSurround; +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.mojang.logging.LogUtils; import meteordevelopment.meteorclient.addons.GithubRepo; import meteordevelopment.meteorclient.addons.MeteorAddon; @@ -17,27 +19,53 @@ import meteordevelopment.meteorclient.systems.hud.HudGroup; import meteordevelopment.meteorclient.systems.modules.Category; import meteordevelopment.meteorclient.systems.modules.Modules; +import net.minecraft.item.Items; import org.slf4j.Logger; public class GenyoAddon extends MeteorAddon { + public static final Logger LOG = LogUtils.getLogger(); - public static final Category GENYO = new Category("Genyo"); + public static final Category GENYO = new Category("Genyo", Items.MILK_BUCKET.getDefaultStack()); public static final HudGroup HUD_GROUP = new HudGroup("Genyo"); @Override public void onInitialize() { LOG.info("Genyo fasz indul genyo"); - Tabs.add(new EnemiesTab()); - Systems.add(new Enemies()); + // Tabs + initTabs(); - // Managers mert ez menőn néz ki + // Systems + initSystems(); - ModulesManager.initModules(); + initModules(Modules.get()); + + // Managers mert ez menőn néz ki Managers.subscribe(); // HUD - Hud.get().register(PvPNeccessaryHud.INFO); + initHUD(Hud.get()); + } + + private void initTabs() { + Tabs.add(new EnemiesTab()); + Tabs.add(new InCombatTab()); + } + + private void initSystems() { + Systems.add(new Enemies()); + Systems.add(new InCombatSystem()); + } + + private void initModules(Modules modules) { + modules.add(new GenyoAutoEZ()); + modules.add(new AngelSexHulkenberg()); + modules.add(new GenyoSurround()); + } + + private void initHUD(Hud hud) { + hud.register(PvPNeccessaryHud.INFO); + hud.register(InCombatHud.INFO); } @Override diff --git a/src/main/java/com/genyo/addon/events/UnderCombatEvent.java b/src/main/java/com/genyo/addon/events/UnderCombatEvent.java new file mode 100644 index 0000000..d47ed3c --- /dev/null +++ b/src/main/java/com/genyo/addon/events/UnderCombatEvent.java @@ -0,0 +1,17 @@ +package com.genyo.addon.events; + +import net.minecraft.entity.player.PlayerEntity; + +public class UnderCombatEvent { + + private static final UnderCombatEvent INSTANCE = new UnderCombatEvent(); + + public PlayerEntity entity; + + public static UnderCombatEvent get(PlayerEntity entity) { + INSTANCE.entity = entity; + + return INSTANCE; + } + +} diff --git a/src/main/java/com/genyo/addon/hud/InCombatHud.java b/src/main/java/com/genyo/addon/hud/InCombatHud.java new file mode 100644 index 0000000..7c2a3fc --- /dev/null +++ b/src/main/java/com/genyo/addon/hud/InCombatHud.java @@ -0,0 +1,178 @@ +package com.genyo.addon.hud; + +import com.genyo.addon.GenyoAddon; +import com.genyo.addon.systems.incombat.CombatPerson; +import com.genyo.addon.systems.incombat.InCombatSystem; +import meteordevelopment.meteorclient.settings.*; +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; + +public class InCombatHud extends HudElement { + + public static final HudElementInfo INFO = new HudElementInfo<>(GenyoAddon.HUD_GROUP, "combat-stats", "Fasz fasz fasz fasz fasz fasz.", InCombatHud::new); + + private static final InCombatSystem inCombatSystem = InCombatSystem.get(); + + Color white = new Color(255, 255, 255, 255); + String outOfCombat = "Out of combat!"; + String combatDisabled = "Combat is disabled"; + + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgBackground = settings.createGroup("Background"); + private final SettingGroup sgScale = settings.createGroup("Scale"); + + private final Setting personColor = sgGeneral.add(new ColorSetting.Builder() + .name("person-color") + .description("jjjjjjjjjjjjjjjjjjjjjjjjjj") + .defaultValue(new SettingColor()) + .build() + ); + + private final Setting textShadow = sgGeneral.add(new BoolSetting.Builder() + .name("text-shadow") + .description("asdasdasdsad fogyaték") + .defaultValue(true) + .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() + ); + + // 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 + + public final Setting background = sgBackground.add(new BoolSetting.Builder() + .name("background") + .description("Displays background.") + .defaultValue(false) + .build() + ); + + public 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 InCombatHud() { + 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) { + if (!inCombatSystem.isEnabled()) { + setSize(renderer.textWidth(combatDisabled, textShadow.get(), getScale()), renderer.textHeight(textShadow.get(), getScale())); + return; + } + + if (inCombatSystem.empty()) { + setSize(renderer.textWidth(outOfCombat, textShadow.get(), getScale()), renderer.textHeight(textShadow.get(), getScale())); + return; + } + + String remaining = String.format("(%ss)", inCombatSystem.getRemainingCooldown()); + double width = renderer.textWidth("In Combat: " + remaining, textShadow.get(), getScale()); + double height = renderer.textHeight(textShadow.get(), getScale()); + + if (mc.world == null) { + setSize(width, height); + return; + } + + for (CombatPerson person : inCombatSystem.getInCombat()) { + String text = person.getName(); + + width = Math.max(width, renderer.textWidth(text, textShadow.get(), getScale())); + height += renderer.textHeight(textShadow.get(), getScale()) + 2; + } + + setSize(width, height); + } + + @Override + public void render(HudRenderer renderer) { + if (mc.world == null) return; + double y = this.y + border.get(); + + if (!inCombatSystem.isEnabled()) { + renderer.text(combatDisabled, x, y, white, textShadow.get(), getScale()); + return; + } + + if (inCombatSystem.empty()) { + renderer.text(outOfCombat, x, y, white, textShadow.get(), getScale()); + return; + } + + String cooldownText = String.format("(%ss)", inCombatSystem.getRemainingCooldown()); + double alap = renderer.textWidth("In Combat: " + cooldownText, textShadow.get(), getScale()); + double permX = x + border.get() + alignX(alap, alignment.get()); + renderer.text("In Combat: ", permX, y, white, textShadow.get(), getScale()); + + renderer.text(cooldownText, permX + renderer.textWidth("In Combat: ", textShadow.get(), getScale()), y, personColor.get(), textShadow.get(), getScale()); + + for (CombatPerson person : inCombatSystem.getInCombat()) { + String text = person.getName(); + + double width = renderer.textWidth(text, textShadow.get(), getScale()); + double x = this.x + border.get() + alignX(width, alignment.get()); + + y += renderer.textHeight(textShadow.get(), getScale()) + 2; + renderer.text(text, x, y, personColor.get(), textShadow.get(), getScale()); + } + + if (background.get()) renderer.quad(this.x, this.y, getWidth(), getHeight(), backgroundColor.get()); + } + + private double getScale() { + return customScale.get() ? scale.get() : Hud.get().getTextScale(); + } + + + +} diff --git a/src/main/java/com/genyo/addon/managers/CombatManager.java b/src/main/java/com/genyo/addon/managers/CombatManager.java index 09292cd..e358051 100644 --- a/src/main/java/com/genyo/addon/managers/CombatManager.java +++ b/src/main/java/com/genyo/addon/managers/CombatManager.java @@ -1,11 +1,14 @@ package com.genyo.addon.managers; import com.genyo.addon.events.TotemPopEvent; +import com.genyo.addon.events.UnderCombatEvent; import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.events.entity.player.AttackEntityEvent; import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.orbit.EventHandler; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityStatuses; +import net.minecraft.entity.decoration.EndCrystalEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket; @@ -17,22 +20,35 @@ public class CombatManager { public HashMap popList = new HashMap<>(); + @EventHandler + private void onAttackEntity(AttackEntityEvent event) { + if (mc.player == null && mc.world == null) return; + + if (event.entity instanceof PlayerEntity target) { + MeteorClient.EVENT_BUS.post(UnderCombatEvent.get(target)); + } + } + @EventHandler public void onPacketReceive(PacketEvent.Receive event) { + if (mc.player == null && mc.world == null) return; if (event.packet instanceof EntityStatusS2CPacket pac) { if (pac.getStatus() == EntityStatuses.USE_TOTEM_OF_UNDYING) { Entity ent = pac.getEntity(mc.world); if (!(ent instanceof PlayerEntity)) return; - if (popList == null) { - popList = new HashMap<>(); - } - if (popList.get(ent.getName().getString()) == null) { - popList.put(ent.getName().getString(), 1); - } else if (popList.get(ent.getName().getString()) != null) { - popList.put(ent.getName().getString(), popList.get(ent.getName().getString()) + 1); + + if (popList == null) popList = new HashMap<>(); + + String entityName = ent.getName().getString(); + + if (popList.get(entityName) == null) { + popList.put(entityName, Integer.valueOf(1)); + } else { + popList.put(entityName, Integer.valueOf(popList.get(entityName) + 1)); } - MeteorClient.EVENT_BUS.post(TotemPopEvent.get((PlayerEntity) ent, popList.get(ent.getName().getString()))); + + MeteorClient.EVENT_BUS.post(TotemPopEvent.get((PlayerEntity) ent, popList.get(entityName))); } } } diff --git a/src/main/java/com/genyo/addon/managers/ModulesManager.java b/src/main/java/com/genyo/addon/managers/ModulesManager.java deleted file mode 100644 index 704f8ea..0000000 --- a/src/main/java/com/genyo/addon/managers/ModulesManager.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.genyo.addon.managers; - -import com.genyo.addon.modules.AngelSexHulkenberg; -import com.genyo.addon.modules.GenyoAutoEZ; -import com.genyo.addon.modules.TescoCrystal; -import com.genyo.addon.modules.TescoTrajectories; -import meteordevelopment.meteorclient.systems.modules.Modules; - -public class ModulesManager { - - private static Modules modules = Modules.get(); - - public static void initModules() { - modules.add(new GenyoAutoEZ()); - modules.add(new TescoCrystal()); - modules.add(new AngelSexHulkenberg()); - modules.add(new TescoTrajectories()); - } - -} diff --git a/src/main/java/com/genyo/addon/mixin/PlayerUtilsMixin.java b/src/main/java/com/genyo/addon/mixin/PlayerUtilsMixin.java index 176915f..136780b 100644 --- a/src/main/java/com/genyo/addon/mixin/PlayerUtilsMixin.java +++ b/src/main/java/com/genyo/addon/mixin/PlayerUtilsMixin.java @@ -18,5 +18,5 @@ private static void injectGetPlayerColor(PlayerEntity entity, Color defaultColor cir.setReturnValue(Enemies.get().getEnemyColor()); } } - + } diff --git a/src/main/java/com/genyo/addon/modules/AngelSexHulkenberg.java b/src/main/java/com/genyo/addon/modules/AngelSexHulkenberg.java index bc3e1c4..ff7c216 100644 --- a/src/main/java/com/genyo/addon/modules/AngelSexHulkenberg.java +++ b/src/main/java/com/genyo/addon/modules/AngelSexHulkenberg.java @@ -38,7 +38,7 @@ import java.util.concurrent.CopyOnWriteArrayList; -public final class AngelSexHulkenberg extends Module { +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"); @@ -144,8 +144,8 @@ public void onRender(Render3DEvent event) { @EventHandler @SuppressWarnings("unused") private void onTotemPop(@NotNull TotemPopEvent e) { - //if (e.entity.equals(mc.player) || mc.world == null) return; - if (mc.world == null) return; //-------- for testing + if (e.entity.equals(mc.player) || mc.world == null) return; + //if (mc.world == null) return; //-------- for testing if (mc.getServer() == null) return; if (focusEnemy.get()) if (!(Enemies.get().isEnemy(e.entity))) return; @@ -165,7 +165,6 @@ private void onTotemPop(@NotNull TotemPopEvent e) { entity.limbAnimator.pos = e.entity.limbAnimator.getPos(); Identifier skin = ((AbstractClientPlayerEntity) e.entity).getSkinTextures().texture(); - //Identifier skin = Identifier.of("genyo", "epic_skin.png"); popList.add(new Person(entity, skin, mc.getServer().getWorld(entity.getWorld().getRegistryKey()))); } @@ -174,8 +173,6 @@ private void renderEntity(@NotNull MatrixStack matrices, @NotNull LivingEntity e PlayerEntityRenderer entityRenderer = (PlayerEntityRenderer) mc.getEntityRenderDispatcher().getRenderer((AbstractClientPlayerEntity) entity); PlayerEntityRenderState renderState = entityRenderer.createRenderState(); - MeteorClient.LOG.info("asd"); - renderState.leftPantsLegVisible = secondLayer.get(); renderState.rightPantsLegVisible = secondLayer.get(); renderState.leftSleeveVisible = secondLayer.get(); diff --git a/src/main/java/com/genyo/addon/modules/GenyoAutoEZ.java b/src/main/java/com/genyo/addon/modules/GenyoAutoEZ.java index 70d59ce..0a7fa9f 100644 --- a/src/main/java/com/genyo/addon/modules/GenyoAutoEZ.java +++ b/src/main/java/com/genyo/addon/modules/GenyoAutoEZ.java @@ -1,6 +1,9 @@ package com.genyo.addon.modules; import com.genyo.addon.GenyoAddon; +import com.genyo.addon.systems.incombat.CombatPerson; +import com.genyo.addon.systems.incombat.InCombatSystem; +import com.genyo.addon.utils.MathUtil; import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; @@ -14,13 +17,14 @@ import java.util.*; -public class GenyoAutoEZ extends Module { +public class GenyoAutoEZ extends GenyoModule { public GenyoAutoEZ() { - super(GenyoAddon.GENYO, "genyo-auto-ez", "igen igen igen, dikta mamo tyibori."); + super(GenyoAddon.GENYO, "genyo-auto-ez", "igen igen igen, dikta mamo tyibori.-----------------------------------------------------------------"); } private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgDeath = settings.createGroup("Death"); //--------------------General--------------------// private final Setting range = sgGeneral.add(new DoubleSetting.Builder() @@ -31,22 +35,16 @@ public GenyoAutoEZ() { .sliderRange(0, 50) .build() ); + private final Setting tickDelay = sgGeneral.add(new IntSetting.Builder() .name("Delay") .description("How many ticks to wait between sending messages.") - .defaultValue(50) + .defaultValue(10) .min(0) .sliderRange(0, 100) .build() ); - private final Setting pop = sgGeneral.add(new BoolSetting.Builder() - .name("Pop") - .description("nyugi ez nem csinál semmit, csak dísznek van XD") - .defaultValue(true) - .build() - ); - private final Setting trackPlayers = sgGeneral.add(new BoolSetting.Builder() .name("Track Players") .description("követi, hogy kit öltél meg ewkgnwekjghhewjkfhew") @@ -54,13 +52,43 @@ public GenyoAutoEZ() { .build() ); + private final Setting combatFocus = sgGeneral.add(new BoolSetting.Builder() + .name("Combat Focus") + .description("csak akivel combatban vagy (elvileg)") + .defaultValue(false) + .build() + ); + private final Setting> popMessages = sgGeneral.add(new StringListSetting.Builder() .name("Pop Messages") - .description("Messages to send when popping an enemy") + .description("van egy ped0fil a szobában") .defaultValue(List.of("ez pop ", "pop ", "i love kiwi pop ")) .build() ); + private final Setting enableDeath = sgDeath.add(new BoolSetting.Builder() + .name("Message on Death") + .description("hihihi hahaha huhuhu") + .defaultValue(true) + .build() + ); + + private final Setting keepPops = sgDeath.add(new BoolSetting.Builder() + .name("Keep Pops") + .description("rlkjg krehg kjhre gjk hrej ghjkreh gjkh rekjg hre ") + .defaultValue(true) + .visible(enableDeath::get) + .build() + ); + + private final Setting> deathMessages = sgDeath.add(new StringListSetting.Builder() + .name("Death Messages") + .description("itt is van") + .visible(enableDeath::get) + .defaultValue(List.of(" needed Hulkenberg's nut only times to get Hulkenberg'd", "nemtom ")) + .build() + ); + private final Random r = new Random(); private int lastPop; private final List messageQueue = new LinkedList<>(); @@ -69,42 +97,60 @@ public GenyoAutoEZ() { @Override public void onActivate() { - super.onActivate(); taggedPlayers.clear(); } @EventHandler(priority = EventPriority.HIGHEST) private void onTick(TickEvent.Pre event) { + if (mc.player == null && mc.world == null) return; timer++; - if (mc.player != null && mc.world != null) { - if (timer >= tickDelay.get() && !messageQueue.isEmpty()) { - Message msg = messageQueue.get(0); - ChatUtils.sendPlayerMsg(msg.message); - timer = 0; - - if (msg.kill) messageQueue.clear(); - else messageQueue.removeFirst(); - } + + if (timer >= tickDelay.get() && !messageQueue.isEmpty()) { + Message msg = messageQueue.get(0); + ChatUtils.sendPlayerMsg(msg.message); + timer = 0; + + if (msg.kill) messageQueue.clear(); + else messageQueue.removeFirst(); } } @EventHandler private void onReceive(PacketEvent.Receive event) { if (event.packet instanceof EntityStatusS2CPacket packet) { - // Pop - if (packet.getStatus() == 35) { + if (packet.getStatus() == 35) { //----Pop----// Entity entity = packet.getEntity(mc.world); if (mc.player != null && mc.world != null && entity instanceof PlayerEntity playerEntity) { if (entity != mc.player && mc.player.getPos().distanceTo(entity.getPos()) <= range.get()) { - if (trackPlayers.get() && taggedPlayers.containsKey(playerEntity)) { - int count = taggedPlayers.get(playerEntity) + 1; + // Combat Focus + if (combatFocus.get()) { + if (!InCombatSystem.get().contains(new CombatPerson(playerEntity))) return; + } + + if (trackPlayers.get()) { + if (taggedPlayers.containsKey(playerEntity)) { + int count = taggedPlayers.get(playerEntity) + 1; - taggedPlayers.replace(playerEntity, count); - sendPopMessage(playerEntity.getName().getString(), count); + taggedPlayers.replace(playerEntity, count); + sendPopMessage(playerEntity.getName().getString(), count); + } else { + taggedPlayers.put(playerEntity, 1); + sendPopMessage(playerEntity.getName().getString(), 1); + } } else { sendPopMessage(playerEntity.getName().getString(), 0); - taggedPlayers.put(playerEntity, 1); + } + } + } + } else if (packet.getStatus() == 3 && enableDeath.get()) { //----Death----// + Entity entity = packet.getEntity(mc.world); + if (mc.player != null && mc.world != null && entity instanceof PlayerEntity playerEntity) { + if (entity != mc.player && checkPersonValidity(playerEntity)) { + if (taggedPlayers.containsKey(playerEntity)) { + if (!keepPops.get()) taggedPlayers.replace(playerEntity, 0); + + sendDeathMessage(playerEntity.getName().getString(), taggedPlayers.get(playerEntity)); } } } @@ -112,27 +158,48 @@ private void onReceive(PacketEvent.Receive event) { } } + private boolean checkPersonValidity(PlayerEntity player) { + if (InCombatSystem.get().isEnabled() && combatFocus.get()) + if (!InCombatSystem.get().contains(player)) return false; // kell? + + if (taggedPlayers.containsKey(player)) { + return true; + } + + //TODO: if we want to display this for everyone, then implement something here + + return false; + } + + private void sendPopMessage(String name, int count) { - if (!popMessages.get().isEmpty()) { - int num = r.nextInt(0, popMessages.get().size()); - if (num == lastPop) { - num = num < popMessages.get().size() - 1 ? num + 1 : 0; - } - lastPop = num; - String messageString = popMessages.get().get(num).replace("", name); - String countString = String.valueOf(count); - - if (count > 0) { - messageString = messageString.replace("", "+" + countString); - } else { - messageString = messageString.replace("", "+1"); - } + if (popMessages.get().isEmpty()) return; + + String messageString = popMessages.get().get(MathUtil.pickRandom(popMessages.get())).replace("", name); + String countString = String.valueOf(count); - Message message = new Message(messageString, false); - messageQueue.add(message); + if (count > 0) { + messageString = messageString.replace("", "+" + countString); + } else { + messageString = messageString.replace("", "+1"); } + + Message message = new Message(messageString, false); + messageQueue.add(message); } + private void sendDeathMessage(String name, int pops) { + if (deathMessages.get().isEmpty()) return; + + String msgString = deathMessages.get().get(MathUtil.pickRandom(deathMessages.get())); // pont leszarom hogyha ugyan azt az üzenetet húzza + msgString = msgString.replace("", String.valueOf(pops)); + msgString = msgString.replace("", name); + + Message message = new Message(msgString, false); + messageQueue.add(message); + } + + private record Message(String message, boolean kill) { } } diff --git a/src/main/java/com/genyo/addon/modules/GenyoModule.java b/src/main/java/com/genyo/addon/modules/GenyoModule.java new file mode 100644 index 0000000..a1453a7 --- /dev/null +++ b/src/main/java/com/genyo/addon/modules/GenyoModule.java @@ -0,0 +1,161 @@ +package com.genyo.addon.modules; + +import meteordevelopment.meteorclient.mixininterface.IChatHud; +import meteordevelopment.meteorclient.settings.BoolSetting; +import meteordevelopment.meteorclient.settings.Setting; +import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.meteorclient.systems.config.Config; +import meteordevelopment.meteorclient.systems.modules.Category; +import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.player.Rotation; +import meteordevelopment.meteorclient.utils.player.ChatUtils; +import net.minecraft.client.network.PendingUpdateManager; +import net.minecraft.client.network.SequencedPacketCreator; +import net.minecraft.network.packet.Packet; +import net.minecraft.network.packet.c2s.play.PlayerInteractBlockC2SPacket; +import net.minecraft.network.packet.c2s.play.PlayerInteractItemC2SPacket; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; + +import java.util.Objects; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +public class GenyoModule extends Module { + + private final String prefix = Formatting.GOLD + "" + Formatting.BOLD + "[Genyo]"; + + public GenyoModule(Category category, String name, String description) { + super(category, name, description); + } + + // Messages + public void sendToggledMsg() { + if (!Config.get().chatFeedback.get() && !chatFeedback && mc.world == null) return; + + ChatUtils.forceNextPrefixClass(getClass()); + String msg = prefix + " " + Formatting.WHITE + title + (isActive() ? Formatting.GREEN + " ON" : Formatting.RED + " OFF"); + sendMessage(Text.of(msg), hashCode()); + } + + public void sendToggledMsg(String message) { + if (!Config.get().chatFeedback.get() && !chatFeedback && mc.world == null) return; + + ChatUtils.forceNextPrefixClass(getClass()); + String msg = prefix + " " + Formatting.WHITE + title + (isActive() ? Formatting.GREEN + " ON " : Formatting.RED + " OFF ") + Formatting.GRAY + message; + sendMessage(Text.of(msg), hashCode()); + } + + public void sendDisableMsg(String text) { + if (mc.world == null) return; + + ChatUtils.forceNextPrefixClass(getClass()); + String msg = prefix + " " + Formatting.WHITE + title + Formatting.RED + " OFF " + Formatting.GRAY + text; + sendMessage(Text.of(msg), hashCode()); + } + + public void sendBOInfo(String text) { + if (mc.world == null) return; + + ChatUtils.forceNextPrefixClass(getClass()); + String msg = prefix + " " + Formatting.WHITE + title + " - " + Formatting.GRAY + text; + sendMessage(Text.of(msg), Objects.hash(name + "-info")); + } + + public void sendError(String text) { + if (mc.world == null) return; + + ChatUtils.forceNextPrefixClass(getClass()); + String msg = prefix + " " + Formatting.RED + title + " - " + text; + sendMessage(Text.of(msg), hashCode()); + } + + public void debug(String text) { + if (mc.world == null) return; + + ChatUtils.forceNextPrefixClass(getClass()); + String msg = prefix + " " + Formatting.WHITE + name + " " + Formatting.AQUA + text; + sendMessage(Text.of(msg), 0); + } + + public void sendMessage(Text text, int id) { + ((IChatHud) mc.inGameHud.getChatHud()).meteor$add(text, id); + } + + public void sendPacket(Packet packet) { + if (mc.getNetworkHandler() == null) return; + mc.getNetworkHandler().sendPacket(packet); + } + + public void sendSequenced(SequencedPacketCreator packetCreator) { + if (mc.interactionManager == null || mc.world == null || mc.getNetworkHandler() == null) return; + + PendingUpdateManager sequence = mc.world.getPendingUpdateManager().incrementSequence(); + Packet packet = packetCreator.predict(sequence.getSequence()); + + mc.getNetworkHandler().sendPacket(packet); + + sequence.close(); + } + + /*public void placeBlock(Hand hand, Vec3d blockHitVec, Direction blockDirection, BlockPos pos) { + Vec3d eyes = mc.player.getEyePos(); + boolean inside = + eyes.x > pos.getX() && eyes.x < pos.getX() + 1 && + eyes.y > pos.getY() && eyes.y < pos.getY() + 1 && + eyes.z > pos.getZ() && eyes.z < pos.getZ() + 1; + + //SettingUtils.swing(SwingState.Pre, SwingType.Placing, hand); + mc.player.swingHand(hand); + sendSequenced(s -> new PlayerInteractBlockC2SPacket(hand, new BlockHitResult(blockHitVec, blockDirection, pos, inside), s)); + //SettingUtils.swing(SwingState.Post, SwingType.Placing, hand); + } + + public void interactBlock(Hand hand, Vec3d blockHitVec, Direction blockDirection, BlockPos pos) { + Vec3d eyes = mc.player.getEyePos(); + boolean inside = + eyes.x > pos.getX() && eyes.x < pos.getX() + 1 && + eyes.y > pos.getY() && eyes.y < pos.getY() + 1 && + eyes.z > pos.getZ() && eyes.z < pos.getZ() + 1; + + //SettingUtils.swing(SwingState.Pre, SwingType.Interact, hand); + mc.player.swingHand(hand); + sendSequenced(s -> new PlayerInteractBlockC2SPacket(hand, new BlockHitResult(blockHitVec, blockDirection, pos, inside), s)); + //SettingUtils.swing(SwingState.Post, SwingType.Interact, hand); + } + + public void useItem(Hand hand) { + //SettingUtils.swing(SwingState.Pre, SwingType.Using, hand); + mc.player.swingHand(hand); + float tickDelta = mc.getRenderTickCounter().getTickDelta(true); + sendSequenced(s -> new PlayerInteractItemC2SPacket(hand, s, mc.player.getYaw(tickDelta), mc.player.getPitch(tickDelta))); + //SettingUtils.swing(SwingState.Post, SwingType.Using, hand); + } + + public void clientSwing(SwingHand swingHand, Hand realHand) { + Hand hand = switch (swingHand) { + case MainHand -> Hand.MAIN_HAND; + case OffHand -> Hand.OFF_HAND; + case RealHand -> realHand; + }; + + mc.player.swingHand(hand, true); + Modules.get().get(SwingModifier.class).startSwing(hand); + }*/ + + public Setting addPauseEat(SettingGroup group) { + return group.add(new BoolSetting.Builder() + .name("Pause Eat") + .description("Pauses when eating") + .defaultValue(false) + .build() + ); + } +} diff --git a/src/main/java/com/genyo/addon/modules/GenyoSurround.java b/src/main/java/com/genyo/addon/modules/GenyoSurround.java new file mode 100644 index 0000000..09d7272 --- /dev/null +++ b/src/main/java/com/genyo/addon/modules/GenyoSurround.java @@ -0,0 +1,209 @@ +package com.genyo.addon.modules; + +import com.genyo.addon.GenyoAddon; +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.Module; +import meteordevelopment.meteorclient.utils.player.FindItemResult; +import meteordevelopment.meteorclient.utils.player.InvUtils; +import meteordevelopment.meteorclient.utils.render.color.Color; +import meteordevelopment.meteorclient.utils.render.color.SettingColor; +import meteordevelopment.meteorclient.utils.world.BlockUtils; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.block.Blocks; +import net.minecraft.item.Items; +import net.minecraft.util.math.BlockPos; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +public class GenyoSurround extends GenyoModule { + + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgRender = settings.createGroup("Render"); + + private final Setting disableOnJump = sgGeneral.add(new BoolSetting.Builder() + .name("disable-on-jump") + .description("auto disable on jump waoooo") + .defaultValue(true) + .build() + ); + + private final Setting placeDelay = sgGeneral.add(new IntSetting.Builder() + .name("place-delay") + .description("tick delay between placements") + .defaultValue(1) + .sliderRange(0, 20) + .build() + ); + + private final Setting blocksPerTick = sgGeneral.add(new IntSetting.Builder() + .name("blocks-per-tick") + .description("how many blocks to place per tick") + .defaultValue(1) + .sliderRange(1, 4) + .build() + ); + + private final Setting renderEsp = sgRender.add(new BoolSetting.Builder() + .name("render-box") + .description("render a box around the placed blocks") + .defaultValue(true) + .build() + ); + + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + .name("line-color") + .description("waooooooooooooo") + .visible(renderEsp::get) + .defaultValue(new Color(255, 0, 0, 150)) + .build() + ); + + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + .name("side-color") + .description("ewfkjmhewhfhewfjhewkjfhewfewhfjkewhfkew") + .visible(renderEsp::get) + .defaultValue(new Color(255, 0, 0, 50)) + .build() + ); + + private final Setting espDisplayTime = sgRender.add(new IntSetting.Builder() + .name("esp-display-time") + .description("render delay (in ticks) after placement") + .defaultValue(40) + .visible(renderEsp::get) + .sliderRange(0, 200) + .build() + ); + + private final Setting espFadeTime = sgRender.add(new IntSetting.Builder() + .name("esp-fade-time") + .description("esp fade time in ticks") + .defaultValue(20) + .sliderRange(0, espDisplayTime.get()) + .visible(renderEsp::get) + .build() + ); + + private int delayTicks = 0; + private List targetPositions = new ArrayList<>(); + private final Map espBlocks = new ConcurrentHashMap<>(); + + public GenyoSurround() { + super(GenyoAddon.GENYO, "genyo-surround", "haaaaaaaaaaaaaa"); + } + + public void onActivate() { + super.onActivate(); + delayTicks = 0; + espBlocks.clear(); + if (mc.player != null && mc.world != null) { + BlockPos playerPos = mc.player.getBlockPos(); + List initialTargetPositions = Arrays.asList(playerPos.north(), playerPos.south(), playerPos.east(), playerPos.west()); + + for (BlockPos pos : initialTargetPositions) { + if (mc.world.getBlockState(pos).getBlock() == Blocks.OBSIDIAN) { + espBlocks.put(pos, System.currentTimeMillis() + (long) espDisplayTime.get() * 50L); + } + } + } + + } + + public void onDeactivate() { + super.onDeactivate(); + espBlocks.clear(); + } + + @EventHandler + private void onTick(TickEvent.Pre event) { + if (mc.player == null && mc.world == null) return; + if (mc.interactionManager == null) return; + + BlockPos playerPos = mc.player.getBlockPos(); + targetPositions = Arrays.asList(playerPos.north(), playerPos.south(), playerPos.east(), playerPos.west()); + + for (BlockPos pos : targetPositions) { + if (mc.world.getBlockState(pos).getBlock() == Blocks.OBSIDIAN) { + espBlocks.put(pos, System.currentTimeMillis() + (long) espDisplayTime.get() * 50L); + } else { + espBlocks.remove(pos); + } + } + + ++delayTicks; + if (delayTicks >= placeDelay.get()) { + delayTicks = 0; + if (disableOnJump.get() && mc.options.jumpKey.isPressed() && mc.player.isOnGround()) { + sendBOInfo("Player jumped, disabling."); + toggle(); + } else { + FindItemResult obsidian = InvUtils.findInHotbar(Items.OBSIDIAN); + + if (!obsidian.found()) { + sendError("Obsidian not found in hotbar! Disabling."); + toggle(); + } else { + int placedCount = 0; + for (BlockPos placePos : targetPositions) { + if (placedCount >= blocksPerTick.get()) break; + + if (canPlaceAt(placePos) && BlockUtils.place(placePos, obsidian, true, 0, true)) { + ++placedCount; + espBlocks.put(placePos, System.currentTimeMillis() + (long) espDisplayTime.get() * 50L); + } + } + } + } + } + } + + @EventHandler + private void onRender3D(Render3DEvent event) { + if (mc.player == null && mc.world == null) return; + if (!renderEsp.get()) return; + + List toRemove = new ArrayList<>(); + + for (Map.Entry entry : espBlocks.entrySet()) { + BlockPos pos = entry.getKey(); + + long expirationTime = entry.getValue(); + long currentTime = System.currentTimeMillis(); + long timeLeftMs = expirationTime - currentTime; + + if (timeLeftMs <= 0L) { + toRemove.add(pos); + } else { + int originalLineAlpha = lineColor.get().a; + int originalSideAlpha = sideColor.get().a; + double fadeDurationMs = (double) ((long) espFadeTime.get() * 50L); + double displayDurationMs = (double) ((long) espDisplayTime.get() * 50L); + double progress = 1.0D; + if ((double) timeLeftMs <= fadeDurationMs) { + progress = (double) timeLeftMs / fadeDurationMs; + } + + progress = Math.max(0.0D, Math.min(1.0D, progress)); + Color currentLineColor = lineColor.get().copy(); + Color currentSideColor = sideColor.get().copy(); + currentLineColor.a = (int) ((double) originalLineAlpha * progress); + currentSideColor.a = (int) ((double) originalSideAlpha * progress); + event.renderer.box(pos, currentSideColor, currentLineColor, ShapeMode.Sides, 1); + event.renderer.box(pos, currentSideColor, currentLineColor, ShapeMode.Lines, 1); + } + } + + for (BlockPos pos : toRemove) { + espBlocks.remove(pos); + } + } + + private boolean canPlaceAt(BlockPos pos) { + return mc.world.getBlockState(pos).getBlock() == Blocks.AIR; + } + +} diff --git a/src/main/java/com/genyo/addon/modules/TescoCrystal.java b/src/main/java/com/genyo/addon/modules/TescoCrystal.java deleted file mode 100644 index 36cec8d..0000000 --- a/src/main/java/com/genyo/addon/modules/TescoCrystal.java +++ /dev/null @@ -1,983 +0,0 @@ -package com.genyo.addon.modules; - -import com.genyo.addon.GenyoAddon; -import com.google.common.util.concurrent.AtomicDouble; -import it.unimi.dsi.fastutil.ints.*; -import meteordevelopment.meteorclient.events.entity.EntityAddedEvent; -import meteordevelopment.meteorclient.events.entity.EntityRemovedEvent; -import meteordevelopment.meteorclient.events.packets.PacketEvent; -import meteordevelopment.meteorclient.events.render.Render2DEvent; -import meteordevelopment.meteorclient.events.render.Render3DEvent; -import meteordevelopment.meteorclient.events.world.TickEvent; -import meteordevelopment.meteorclient.mixininterface.IBox; -import meteordevelopment.meteorclient.mixininterface.IRaycastContext; -import meteordevelopment.meteorclient.mixininterface.IVec3d; -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.Categories; -import meteordevelopment.meteorclient.systems.modules.Module; -import meteordevelopment.meteorclient.systems.modules.combat.BedAura; -import meteordevelopment.meteorclient.utils.entity.DamageUtils; -import meteordevelopment.meteorclient.utils.entity.EntityUtils; -import meteordevelopment.meteorclient.utils.entity.Target; -import meteordevelopment.meteorclient.utils.misc.Keybind; -import meteordevelopment.meteorclient.utils.player.FindItemResult; -import meteordevelopment.meteorclient.utils.player.InvUtils; -import meteordevelopment.meteorclient.utils.player.PlayerUtils; -import meteordevelopment.meteorclient.utils.player.Rotations; -import meteordevelopment.meteorclient.utils.render.NametagUtils; -import meteordevelopment.meteorclient.utils.render.RenderUtils; -import meteordevelopment.meteorclient.utils.render.color.Color; -import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import meteordevelopment.meteorclient.utils.world.BlockIterator; -import meteordevelopment.meteorclient.utils.world.BlockUtils; -import meteordevelopment.meteorclient.utils.world.TickRate; -import meteordevelopment.orbit.EventHandler; -import meteordevelopment.orbit.EventPriority; -import net.minecraft.block.Blocks; -import net.minecraft.component.type.AttributeModifierSlot; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.decoration.EndCrystalEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.network.packet.c2s.play.*; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.*; -import net.minecraft.world.RaycastContext; -import org.joml.Vector3d; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; - -public class TescoCrystal extends Module { - private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final SettingGroup sgSwitch = settings.createGroup("Switch"); - private final SettingGroup sgPlace = settings.createGroup("Place"); - private final SettingGroup sgFacePlace = settings.createGroup("Face Place"); - private final SettingGroup sgBreak = settings.createGroup("Break"); - private final SettingGroup sgPause = settings.createGroup("Pause"); - private final SettingGroup sgRender = settings.createGroup("Render"); - - // General - - private final Setting targetRange = sgGeneral.add(new DoubleSetting.Builder().name("target-range").description("Range in which to target players.").defaultValue(10).min(0).sliderMax(16).build()); - private final Setting predictMovement = sgGeneral.add(new BoolSetting.Builder().name("predict-movement").description("Predicts target movement.").defaultValue(false).build()); - private final Setting minDamage = sgGeneral.add(new DoubleSetting.Builder().name("min-damage").description("Minimum damage the crystal needs to deal to your target.").defaultValue(6).min(0).build()); - private final Setting maxDamage = sgGeneral.add(new DoubleSetting.Builder().name("max-damage").description("Maximum damage crystals can deal to yourself.").defaultValue(6).range(0, 36).sliderMax(36).build()); - private final Setting antiSuicide = sgGeneral.add(new BoolSetting.Builder().name("anti-suicide").description("Will not place and break crystals if they will kill you.").defaultValue(true).build()); - private final Setting ignoreNakeds = sgGeneral.add(new BoolSetting.Builder().name("ignore-nakeds").description("Ignore players with no items.").defaultValue(false).build()); - private final Setting rotate = sgGeneral.add(new BoolSetting.Builder().name("rotate").description("Rotates server-side towards the crystals being hit/placed.").defaultValue(true).build()); - private final Setting yawStepMode = sgGeneral.add(new EnumSetting.Builder().name("yaw-steps-mode").description("When to run the yaw steps check.").defaultValue(YawStepMode.Break).visible(rotate::get).build()); - private final Setting yawSteps = sgGeneral.add(new DoubleSetting.Builder().name("yaw-steps").description("Maximum number of degrees its allowed to rotate in one tick.").defaultValue(180).range(1, 180).visible(rotate::get).build()); - private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder().name("entities").description("Entities to attack.").onlyAttackable().defaultValue(EntityType.PLAYER, EntityType.WARDEN, EntityType.WITHER).build()); - - // Switch - private final Setting autoSwitch = sgSwitch.add(new EnumSetting.Builder().name("auto-switch").description("Switches to crystals in your hotbar once a target is found.").defaultValue(AutoSwitchMode.Normal).build()); - private final Setting switchDelay = sgSwitch.add(new IntSetting.Builder().name("switch-delay").description("The delay in ticks to wait to break a crystal after switching hotbar slot.").defaultValue(0).min(0).build()); - private final Setting noGapSwitch = sgSwitch.add(new BoolSetting.Builder().name("no-gap-switch").description("Won't auto switch if you're holding a gapple.").defaultValue(true).visible(() -> autoSwitch.get() == AutoSwitchMode.Normal).build()); - private final Setting noBowSwitch = sgSwitch.add(new BoolSetting.Builder().name("no-bow-switch").description("Won't auto switch if you're holding a bow.").defaultValue(true).build()); - private final Setting antiWeakness = sgSwitch.add(new BoolSetting.Builder().name("anti-weakness").description("Switches to tools with so you can break crystals with the weakness effect.").defaultValue(true).build()); - - // Place - private final Setting doPlace = sgPlace.add(new BoolSetting.Builder().name("place").description("If the CA should place crystals.").defaultValue(true).build()); - public final Setting placeDelay = sgPlace.add(new IntSetting.Builder().name("place-delay").description("The delay in ticks to wait to place a crystal after it's exploded.").defaultValue(0).min(0).sliderMax(20).build()); - private final Setting placeRange = sgPlace.add(new DoubleSetting.Builder().name("place-range").description("Range in which to place crystals.").defaultValue(4.5).min(0).sliderMax(6).build()); - private final Setting placeWallsRange = sgPlace.add(new DoubleSetting.Builder().name("walls-range").description("Range in which to place crystals when behind blocks.").defaultValue(4.5).min(0).sliderMax(6).build()); - private final Setting placement112 = sgPlace.add(new BoolSetting.Builder().name("1.12-placement").description("Uses 1.12 crystal placement.").defaultValue(false).build()); - private final Setting support = sgPlace.add(new EnumSetting.Builder().name("support").description("Places a support block in air if no other position have been found.").defaultValue(SupportMode.Disabled).build()); - private final Setting supportDelay = sgPlace.add(new IntSetting.Builder().name("support-delay").description("Delay in ticks after placing support block.").defaultValue(1).min(0).visible(() -> support.get() != SupportMode.Disabled).build()); - - // Face place - private final Setting facePlace = sgFacePlace.add(new BoolSetting.Builder().name("face-place").description("Will face-place when target is below a certain health or armor durability threshold.").defaultValue(true).build()); - private final Setting facePlaceHealth = sgFacePlace.add(new DoubleSetting.Builder().name("face-place-health").description("The health the target has to be at to start face placing.").defaultValue(8).min(1).sliderMin(1).sliderMax(36).visible(facePlace::get).build()); - private final Setting facePlaceDurability = sgFacePlace.add(new DoubleSetting.Builder().name("face-place-durability").description("The durability threshold percentage to be able to face-place.").defaultValue(2).min(1).sliderMin(1).sliderMax(100).visible(facePlace::get).build()); - private final Setting facePlaceArmor = sgFacePlace.add(new BoolSetting.Builder().name("face-place-missing-armor").description("Automatically starts face placing when a target misses a piece of armor.").defaultValue(false).visible(facePlace::get).build()); - private final Setting forceFacePlace = sgFacePlace.add(new KeybindSetting.Builder().name("force-face-place").description("Starts face place when this button is pressed.").defaultValue(Keybind.none()).build()); - - // Break - - private final Setting doBreak = sgBreak.add(new BoolSetting.Builder().name("break").description("If the CA should break crystals.").defaultValue(true).build()); - private final Setting breakDelay = sgBreak.add(new IntSetting.Builder().name("break-delay").description("The delay in ticks to wait to break a crystal after it's placed.").defaultValue(0).min(0).sliderMax(20).build()); - private final Setting smartDelay = sgBreak.add(new BoolSetting.Builder().name("smart-delay").description("Only breaks crystals when the target can receive damage.").defaultValue(false).build()); - private final Setting breakRange = sgBreak.add(new DoubleSetting.Builder().name("break-range").description("Range in which to break crystals.").defaultValue(4.5).min(0).sliderMax(6).build()); - private final Setting breakWallsRange = sgBreak.add(new DoubleSetting.Builder().name("walls-range").description("Range in which to break crystals when behind blocks.").defaultValue(4.5).min(0).sliderMax(6).build()); - private final Setting onlyBreakOwn = sgBreak.add(new BoolSetting.Builder().name("only-own").description("Only breaks own crystals.").defaultValue(false).build()); - private final Setting breakAttempts = sgBreak.add(new IntSetting.Builder().name("break-attempts").description("How many times to hit a crystal before stopping to target it.").defaultValue(2).sliderMin(1).sliderMax(5).build()); - private final Setting ticksExisted = sgBreak.add(new IntSetting.Builder().name("ticks-existed").description("Amount of ticks a crystal needs to have lived for it to be attacked by CrystalAura.").defaultValue(0).min(0).build()); - private final Setting attackFrequency = sgBreak.add(new IntSetting.Builder().name("attack-frequency").description("Maximum hits to do per second.").defaultValue(25).min(1).sliderRange(1, 30).build()); - private final Setting fastBreak = sgBreak.add(new BoolSetting.Builder().name("fast-break").description("Ignores break delay and tries to break the crystal as soon as it's spawned in the world.").defaultValue(true).build()); - - // Pause - public final Setting pauseOnUse = sgPause.add(new EnumSetting.Builder().name("pause-on-use").description("Which processes should be paused while using an item.").defaultValue(PauseMode.Place).build()); - public final Setting pauseOnMine = sgPause.add(new EnumSetting.Builder().name("pause-on-mine").description("Which processes should be paused while mining a block.").defaultValue(PauseMode.None).build()); - private final Setting pauseOnLag = sgPause.add(new BoolSetting.Builder().name("pause-on-lag").description("Whether to pause if the server is not responding.").defaultValue(true).build()); - public final Setting> pauseModules = sgPause.add(new ModuleListSetting.Builder().name("pause-modules").description("Pauses while any of the selected modules are active.").defaultValue(BedAura.class).build()); - public final Setting pauseHealth = sgPause.add(new DoubleSetting.Builder().name("pause-health").description("Pauses when you go below a certain health.").defaultValue(5).range(0,36).sliderRange(0,36).build()); - - // Render - public final Setting swingMode = sgRender.add(new EnumSetting.Builder().name("swing-mode").description("How to swing when placing.").defaultValue(SwingMode.Both).build()); - private final Setting renderMode = sgRender.add(new EnumSetting.Builder().name("render-mode").description("The mode to render in.").defaultValue(RenderMode.Normal).build()); - private final Setting renderPlace = sgRender.add(new BoolSetting.Builder().name("render-place").description("Renders a block overlay over the block the crystals are being placed on.").defaultValue(true).visible(() -> renderMode.get() == RenderMode.Normal).build()); - private final Setting placeRenderTime = sgRender.add(new IntSetting.Builder().name("place-time").description("How long to render placements.").defaultValue(10).min(0).sliderMax(20).visible(() -> renderMode.get() == RenderMode.Normal && renderPlace.get()).build()); - private final Setting renderBreak = sgRender.add(new BoolSetting.Builder().name("render-break").description("Renders a block overlay over the block the crystals are broken on.").defaultValue(false).visible(() -> renderMode.get() == RenderMode.Normal).build()); - private final Setting breakRenderTime = sgRender.add(new IntSetting.Builder().name("break-time").description("How long to render breaking for.").defaultValue(13).min(0).sliderMax(20).visible(() -> renderMode.get() == RenderMode.Normal && renderBreak.get()).build()); - private final Setting smoothness = sgRender.add(new IntSetting.Builder().name("smoothness").description("How smoothly the render should move around.").defaultValue(10).min(0).sliderMax(20).visible(() -> renderMode.get() == RenderMode.Smooth).build()); - private final Setting height = sgRender.add(new DoubleSetting.Builder().name("height").description("How tall the gradient should be.").defaultValue(0.7).min(0).sliderMax(1).visible(() -> renderMode.get() == RenderMode.Gradient).build()); - private final Setting renderTime = sgRender.add(new IntSetting.Builder().name("render-time").description("How long to render placements.").defaultValue(10).min(0).sliderMax(20).visible(() -> renderMode.get() == RenderMode.Smooth || renderMode.get() == RenderMode.Fading).build()); - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder().name("shape-mode").description("How the shapes are rendered.").defaultValue(ShapeMode.Both).visible(() -> renderMode.get() != RenderMode.None).build()); - private final Setting sideColor = sgRender.add(new ColorSetting.Builder().name("side-color").description("The side color of the block overlay.").defaultValue(new SettingColor(255, 255, 255, 45)).visible(() -> shapeMode.get().sides() && renderMode.get() != RenderMode.None).build()); - private final Setting lineColor = sgRender.add(new ColorSetting.Builder().name("line-color").description("The line color of the block overlay.").defaultValue(new SettingColor(255, 255, 255)).visible(() -> shapeMode.get().lines() && renderMode.get() != RenderMode.None).build()); - private final Setting renderDamageText = sgRender.add(new BoolSetting.Builder().name("damage").description("Renders crystal damage text in the block overlay.").defaultValue(true).visible(() -> renderMode.get() != RenderMode.None).build()); - private final Setting damageColor = sgRender.add(new ColorSetting.Builder().name("damage-color").description("The color of the damage text.").defaultValue(new SettingColor(255, 255, 255)).visible(() -> renderMode.get() != RenderMode.None && renderDamageText.get()).build()); - private final Setting damageTextScale = sgRender.add(new DoubleSetting.Builder().name("damage-scale").description("How big the damage text should be.").defaultValue(1.25).min(1).sliderMax(4).visible(() -> renderMode.get() != RenderMode.None && renderDamageText.get()).build()); - - // Fields - - private Item mainItem, offItem; - - private int breakTimer, placeTimer, switchTimer, ticksPassed; - private final List targets = new ArrayList<>(); - - private final Vec3d vec3d = new Vec3d(0, 0, 0); - private final Vec3d playerEyePos = new Vec3d(0, 0, 0); - private final Vector3d vec3 = new Vector3d(); - private final BlockPos.Mutable blockPos = new BlockPos.Mutable(); - private final Box box = new Box(0, 0, 0, 0, 0, 0); - - private final Vec3d vec3dRayTraceEnd = new Vec3d(0, 0, 0); - private RaycastContext raycastContext; - - private final IntSet placedCrystals = new IntOpenHashSet(); - private boolean placing; - private int placingTimer; - public int kaTimer; - private final BlockPos.Mutable placingCrystalBlockPos = new BlockPos.Mutable(); - - private final IntSet removed = new IntOpenHashSet(); - private final Int2IntMap attemptedBreaks = new Int2IntOpenHashMap(); - private final Int2IntMap waitingToExplode = new Int2IntOpenHashMap(); - private int attacks; - - private double serverYaw; - - private LivingEntity bestTarget; - private double bestTargetDamage; - private int bestTargetTimer; - - private boolean didRotateThisTick; - private boolean isLastRotationPos; - private final Vec3d lastRotationPos = new Vec3d(0, 0 ,0); - private double lastYaw, lastPitch; - private int lastRotationTimer; - - private int placeRenderTimer, breakRenderTimer; - private final BlockPos.Mutable placeRenderPos = new BlockPos.Mutable(); - private final BlockPos.Mutable breakRenderPos = new BlockPos.Mutable(); - private Box renderBoxOne, renderBoxTwo; - - private double renderDamage; - - public TescoCrystal() { - super(GenyoAddon.GENYO, "tesco-crystal", "adasasdasdasdsadsadasdasdsadsad"); - } - - @Override - public void onActivate() { - breakTimer = 0; - placeTimer = 0; - ticksPassed = 0; - - raycastContext = new RaycastContext(new Vec3d(0, 0, 0), new Vec3d(0, 0, 0), RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.NONE, mc.player); - - placing = false; - placingTimer = 0; - kaTimer = 0; - - attacks = 0; - - serverYaw = mc.player.getYaw(); - - bestTargetDamage = 0; - bestTargetTimer = 0; - - lastRotationTimer = getLastRotationStopDelay(); - - placeRenderTimer = 0; - breakRenderTimer = 0; - } - - @Override - public void onDeactivate() { - targets.clear(); - - placedCrystals.clear(); - - attemptedBreaks.clear(); - waitingToExplode.clear(); - - removed.clear(); - - bestTarget = null; - } - - private int getLastRotationStopDelay() { - return Math.max(10, placeDelay.get() / 2 + breakDelay.get() / 2 + 10); - } - - @EventHandler(priority = EventPriority.HIGH) - private void onPreTick(TickEvent.Pre event) { - // Update last rotation - didRotateThisTick = false; - lastRotationTimer++; - - // Decrement placing timer - if (placing) { - if (placingTimer > 0) placingTimer--; - else placing = false; - } - - if (kaTimer > 0) kaTimer--; - - if (ticksPassed < 20) ticksPassed++; - else { - ticksPassed = 0; - attacks = 0; - } - - // Decrement best target timer - if (bestTargetTimer > 0) bestTargetTimer--; - bestTargetDamage = 0; - - // Decrement break, place and switch timers - if (breakTimer > 0) breakTimer--; - if (placeTimer > 0) placeTimer--; - if (switchTimer > 0) switchTimer--; - - // Decrement render timers - if (placeRenderTimer > 0) placeRenderTimer--; - if (breakRenderTimer > 0) breakRenderTimer--; - - mainItem = mc.player.getMainHandStack().getItem(); - offItem = mc.player.getOffHandStack().getItem(); - - // Update waiting to explode crystals and mark them as existing if reached threshold - for (IntIterator it = waitingToExplode.keySet().iterator(); it.hasNext();) { - int id = it.nextInt(); - int ticks = waitingToExplode.get(id); - - if (ticks > 3) { - it.remove(); - removed.remove(id); - } - else { - waitingToExplode.put(id, ticks + 1); - } - } - - // Set player eye pos - ((IVec3d) playerEyePos).meteor$set(mc.player.getPos().x, mc.player.getPos().y + mc.player.getEyeHeight(mc.player.getPose()), mc.player.getPos().z); - - // Find targets, break and place - findTargets(); - - if (!targets.isEmpty()) { - if (!didRotateThisTick) doBreak(); - if (!didRotateThisTick) doPlace(); - } - } - - @EventHandler(priority = EventPriority.LOWEST - 666) - private void onPreTickLast(TickEvent.Pre event) { - // Rotate to last rotation - if (rotate.get() && lastRotationTimer < getLastRotationStopDelay() && !didRotateThisTick) { - Rotations.rotate(isLastRotationPos ? Rotations.getYaw(lastRotationPos) : lastYaw, isLastRotationPos ? Rotations.getPitch(lastRotationPos) : lastPitch, -100, null); - } - } - - @EventHandler - private void onEntityAdded(EntityAddedEvent event) { - if (!(event.entity instanceof EndCrystalEntity)) return; - - if (placing && event.entity.getBlockPos().equals(placingCrystalBlockPos)) { - placing = false; - placingTimer = 0; - placedCrystals.add(event.entity.getId()); - } - - if (fastBreak.get() && !didRotateThisTick && attacks < attackFrequency.get()) { - float damage = getBreakDamage(event.entity, true); - if (damage > minDamage.get()) doBreak(event.entity); - } - } - - @EventHandler - private void onEntityRemoved(EntityRemovedEvent event) { - if (event.entity instanceof EndCrystalEntity) { - placedCrystals.remove(event.entity.getId()); - removed.remove(event.entity.getId()); - waitingToExplode.remove(event.entity.getId()); - } - } - - private void setRotation(boolean isPos, Vec3d pos, double yaw, double pitch) { - didRotateThisTick = true; - isLastRotationPos = isPos; - - if (isPos) ((IVec3d) lastRotationPos).meteor$set(pos.x, pos.y, pos.z); - else { - lastYaw = yaw; - lastPitch = pitch; - } - - lastRotationTimer = 0; - } - - // Break - - private void doBreak() { - if (!doBreak.get() || breakTimer > 0 || switchTimer > 0 || attacks >= attackFrequency.get()) return; - if (shouldPause(PauseMode.Break)) return; - - float bestDamage = 0; - Entity crystal = null; - - // Find best crystal to break - for (Entity entity : mc.world.getEntities()) { - float damage = getBreakDamage(entity, true); - - if (damage > bestDamage) { - bestDamage = damage; - crystal = entity; - } - } - - // Break the crystal - if (crystal != null) doBreak(crystal); - } - - private float getBreakDamage(Entity entity, boolean checkCrystalAge) { - if (!(entity instanceof EndCrystalEntity)) return 0; - - // Check only break own - if (onlyBreakOwn.get() && !placedCrystals.contains(entity.getId())) return 0; - - // Check if it should already be removed - if (removed.contains(entity.getId())) return 0; - - // Check attempted breaks - if (attemptedBreaks.get(entity.getId()) > breakAttempts.get()) return 0; - - // Check crystal age - if (checkCrystalAge && entity.age < ticksExisted.get()) return 0; - - // Check range - if (isOutOfRange(entity.getPos(), entity.getBlockPos(), false)) return 0; - - // Check damage to self and anti suicide - blockPos.set(entity.getBlockPos()).move(0, -1, 0); - float selfDamage = DamageUtils.crystalDamage(mc.player, entity.getPos(), predictMovement.get(), blockPos); - if (selfDamage > maxDamage.get() || (antiSuicide.get() && selfDamage >= EntityUtils.getTotalHealth(mc.player))) return 0; - - // Check damage to targets and face place - float damage = getDamageToTargets(entity.getPos(), blockPos, true, false); - double minimumDamage = minDamage.get(); - - if (damage < minimumDamage) return 0f; - - return damage; - } - - private void doBreak(Entity crystal) { - // Anti weakness - if (antiWeakness.get()) { - StatusEffectInstance weakness = mc.player.getStatusEffect(StatusEffects.WEAKNESS); - StatusEffectInstance strength = mc.player.getStatusEffect(StatusEffects.STRENGTH); - - // Check for strength - if (weakness != null && (strength == null || strength.getAmplifier() <= weakness.getAmplifier())) { - // Check if the item in your hand is already valid - if (!isValidWeaknessItem(mc.player.getMainHandStack(), crystal)) { - // Find valid item to break with - if (!InvUtils.swap(InvUtils.findInHotbar(stack -> isValidWeaknessItem(stack, crystal)).slot(), false)) return; - - switchTimer = 1; - return; - } - } - } - - // Rotate and attack - boolean attacked = true; - - if (rotate.get()) { - double yaw = Rotations.getYaw(crystal); - double pitch = Rotations.getPitch(crystal, Target.Feet); - - if (doYawSteps(yaw, pitch)) { - setRotation(true, crystal.getPos(), 0, 0); - Rotations.rotate(yaw, pitch, 50, () -> attackCrystal(crystal)); - - breakTimer = breakDelay.get(); - } - else { - attacked = false; - } - } - else { - attackCrystal(crystal); - breakTimer = breakDelay.get(); - } - - if (attacked) { - // Update state - removed.add(crystal.getId()); - attemptedBreaks.put(crystal.getId(), attemptedBreaks.get(crystal.getId()) + 1); - waitingToExplode.put(crystal.getId(), 0); - - // Break render - breakRenderPos.set(crystal.getBlockPos().down()); - breakRenderTimer = breakRenderTime.get(); - } - } - - private boolean isValidWeaknessItem(ItemStack itemStack, Entity crystal) { - return DamageUtils.getAttackDamage((LivingEntity) mc.player, (LivingEntity) crystal, itemStack) > 0; - } - - private void attackCrystal(Entity entity) { - // Attack - mc.player.networkHandler.sendPacket(PlayerInteractEntityC2SPacket.attack(entity, mc.player.isSneaking())); - - Hand hand = InvUtils.findInHotbar(Items.END_CRYSTAL).getHand(); - if (hand == null) hand = Hand.MAIN_HAND; - - if (swingMode.get().client()) mc.player.swingHand(hand); - if (swingMode.get().packet()) mc.getNetworkHandler().sendPacket(new HandSwingC2SPacket(hand)); - - attacks++; - } - - @EventHandler - private void onPacketSend(PacketEvent.Send event) { - if (event.packet instanceof UpdateSelectedSlotC2SPacket) { - switchTimer = switchDelay.get(); - } - } - - // Place - - private void doPlace() { - if (!doPlace.get() || placeTimer > 0) return; - if (shouldPause(PauseMode.Place)) return; - - // Return if there are no crystals in hotbar or offhand - if (!InvUtils.testInHotbar(Items.END_CRYSTAL)) return; - - // Return if there are no crystals in either hand and auto switch mode is none - if (autoSwitch.get() != AutoSwitchMode.None) { - if (noGapSwitch.get() && autoSwitch.get() == AutoSwitchMode.Normal && offItem != Items.END_CRYSTAL) { - if (mainItem == Items.ENCHANTED_GOLDEN_APPLE - || offItem == Items.ENCHANTED_GOLDEN_APPLE - || mainItem == Items.GOLDEN_APPLE - || offItem == Items.GOLDEN_APPLE) return; - } - if (noBowSwitch.get() && (mainItem == Items.BOW || offItem == Items.BOW)) return; - } else if (mainItem != Items.END_CRYSTAL && offItem != Items.END_CRYSTAL) return; - - // Check for multiplace - for (Entity entity : mc.world.getEntities()) { - if (getBreakDamage(entity, false) > 0) return; - } - - // Setup variables - AtomicDouble bestDamage = new AtomicDouble(0); - AtomicReference bestBlockPos = new AtomicReference<>(new BlockPos.Mutable()); - AtomicBoolean isSupport = new AtomicBoolean(support.get() != SupportMode.Disabled); - - // Find best position to place the crystal on - BlockIterator.register((int) Math.ceil(placeRange.get()), (int) Math.ceil(placeRange.get()), (bp, blockState) -> { - // Check if its bedrock or obsidian and return if isSupport is false - boolean hasBlock = blockState.isOf(Blocks.BEDROCK) || blockState.isOf(Blocks.OBSIDIAN); - if (!hasBlock && (!isSupport.get() || !blockState.isReplaceable())) return; - - // Check if there is air on top - blockPos.set(bp.getX(), bp.getY() + 1, bp.getZ()); - if (!mc.world.getBlockState(blockPos).isAir()) return; - - if (placement112.get()) { - blockPos.move(0, 1, 0); - if (!mc.world.getBlockState(blockPos).isAir()) return; - } - - // Check range - ((IVec3d) vec3d).meteor$set(bp.getX() + 0.5, bp.getY() + 1, bp.getZ() + 0.5); - blockPos.set(bp).move(0, 1, 0); - if (isOutOfRange(vec3d, blockPos, true)) return; - - // Check damage to self and anti suicide - float selfDamage = DamageUtils.crystalDamage(mc.player, vec3d, predictMovement.get(), bp); - if (selfDamage > maxDamage.get() || (antiSuicide.get() && selfDamage >= EntityUtils.getTotalHealth(mc.player))) return; - - // Check damage to targets and face place - float damage = getDamageToTargets(vec3d, bp, false, !hasBlock && support.get() == SupportMode.Fast); - - double minimumDamage = Math.min(minDamage.get(), minDamage.get()); - - if (damage < minimumDamage) return; - - // Check if it can be placed - double x = bp.getX(); - double y = bp.getY() + 1; - double z = bp.getZ(); - ((IBox) box).meteor$set(x, y, z, x + 1, y + (placement112.get() ? 1 : 2), z + 1); - - if (intersectsWithEntities(box)) return; - - // Compare damage - if (damage > bestDamage.get() || (isSupport.get() && hasBlock)) { - bestDamage.set(damage); - bestBlockPos.get().set(bp); - } - - if (hasBlock) isSupport.set(false); - }); - - // Place the crystal - BlockIterator.after(() -> { - if (bestDamage.get() == 0) return; - - BlockHitResult result = getPlaceInfo(bestBlockPos.get()); - - ((IVec3d) vec3d).meteor$set( - result.getBlockPos().getX() + 0.5 + result.getSide().getVector().getX() * 1.0 / 2.0, - result.getBlockPos().getY() + 0.5 + result.getSide().getVector().getY() * 1.0 / 2.0, - result.getBlockPos().getZ() + 0.5 + result.getSide().getVector().getZ() * 1.0 / 2.0 - ); - - if (rotate.get()) { - double yaw = Rotations.getYaw(vec3d); - double pitch = Rotations.getPitch(vec3d); - - if (yawStepMode.get() == YawStepMode.Break || doYawSteps(yaw, pitch)) { - setRotation(true, vec3d, 0, 0); - Rotations.rotate(yaw, pitch, 50, () -> placeCrystal(result, bestDamage.get(), isSupport.get() ? bestBlockPos.get() : null)); - - placeTimer += placeDelay.get(); - } - } - else { - placeCrystal(result, bestDamage.get(), isSupport.get() ? bestBlockPos.get() : null); - placeTimer += placeDelay.get(); - } - }); - } - - private BlockHitResult getPlaceInfo(BlockPos blockPos) { - ((IVec3d) vec3d).meteor$set(mc.player.getX(), mc.player.getY() + mc.player.getEyeHeight(mc.player.getPose()), mc.player.getZ()); - - for (Direction side : Direction.values()) { - ((IVec3d) vec3dRayTraceEnd).meteor$set( - blockPos.getX() + 0.5 + side.getVector().getX() * 0.5, - blockPos.getY() + 0.5 + side.getVector().getY() * 0.5, - blockPos.getZ() + 0.5 + side.getVector().getZ() * 0.5 - ); - - ((IRaycastContext) raycastContext).meteor$set(vec3d, vec3dRayTraceEnd, RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.NONE, mc.player); - BlockHitResult result = mc.world.raycast(raycastContext); - - if (result != null && result.getType() == HitResult.Type.BLOCK && result.getBlockPos().equals(blockPos)) { - return result; - } - } - - Direction side = blockPos.getY() > vec3d.y ? Direction.DOWN : Direction.UP; - return new BlockHitResult(vec3d, side, blockPos, false); - } - - private void placeCrystal(BlockHitResult result, double damage, BlockPos supportBlock) { - // Switch - Item targetItem = supportBlock == null ? Items.END_CRYSTAL : Items.OBSIDIAN; - - FindItemResult item = InvUtils.findInHotbar(targetItem); - if (!item.found()) return; - - int prevSlot = mc.player.getInventory().selectedSlot; - - if (autoSwitch.get() != AutoSwitchMode.None && !item.isOffhand()) InvUtils.swap(item.slot(), false); - - Hand hand = item.getHand(); - if (hand == null) return; - - // Place - if (supportBlock == null) { - // Place crystal - mc.player.networkHandler.sendPacket(new PlayerInteractBlockC2SPacket(hand, result, 0)); - - if (swingMode.get().client()) mc.player.swingHand(hand); - if (swingMode.get().packet()) mc.getNetworkHandler().sendPacket(new HandSwingC2SPacket(hand)); - - placing = true; - placingTimer = 4; - kaTimer = 8; - placingCrystalBlockPos.set(result.getBlockPos()).move(0, 1, 0); - - placeRenderPos.set(result.getBlockPos()); - renderDamage = damage; - - if (renderMode.get() == RenderMode.Normal) { - placeRenderTimer = placeRenderTime.get(); - } else { - placeRenderTimer = renderTime.get(); - if (renderMode.get() == RenderMode.Fading) { - RenderUtils.renderTickingBlock( - placeRenderPos, sideColor.get(), - lineColor.get(), shapeMode.get(), - 0, renderTime.get(), true, - false - ); - } - } - } - else { - // Place support block - BlockUtils.place(supportBlock, item, false, 0, swingMode.get().client(), true, false); - placeTimer += supportDelay.get(); - - if (supportDelay.get() == 0) placeCrystal(result, damage, null); - } - - // Switch back - if (autoSwitch.get() == AutoSwitchMode.Silent) InvUtils.swap(prevSlot, false); - } - - // Yaw steps - - @EventHandler - private void onPacketSent(PacketEvent.Sent event) { - if (event.packet instanceof PlayerMoveC2SPacket) { - serverYaw = ((PlayerMoveC2SPacket) event.packet).getYaw((float) serverYaw); - } - } - - public boolean doYawSteps(double targetYaw, double targetPitch) { - targetYaw = MathHelper.wrapDegrees(targetYaw) + 180; - double serverYaw = MathHelper.wrapDegrees(this.serverYaw) + 180; - - if (distanceBetweenAngles(serverYaw, targetYaw) <= yawSteps.get()) return true; - - double delta = Math.abs(targetYaw - serverYaw); - double yaw = this.serverYaw; - - if (serverYaw < targetYaw) { - if (delta < 180) yaw += yawSteps.get(); - else yaw -= yawSteps.get(); - } - else { - if (delta < 180) yaw -= yawSteps.get(); - else yaw += yawSteps.get(); - } - - setRotation(false, null, yaw, targetPitch); - Rotations.rotate(yaw, targetPitch, -100, null); // Priority -100 so it sends the packet as the last one, im pretty sure it doesn't matte but idc - return false; - } - - private static double distanceBetweenAngles(double alpha, double beta) { - double phi = Math.abs(beta - alpha) % 360; - return phi > 180 ? 360 - phi : phi; - } - - // Face place - - /*private boolean shouldFacePlace() { - if (!facePlace.get()) return false; - - if (forceFacePlace.get().isPressed()) return true; - - // Checks if the provided crystal position should face place to any target - for (LivingEntity target : targets) { - if (EntityUtils.getTotalHealth(target) <= facePlaceHealth.get()) return true; - - for (EquipmentSlot slot : AttributeModifierSlot.ARMOR) { - ItemStack itemStack = target.getEquippedStack(slot); - - if (itemStack == null || itemStack.isEmpty()) { - if (facePlaceArmor.get()) return true; - } - else { - if ((double) (itemStack.getMaxDamage() - itemStack.getDamage()) / itemStack.getMaxDamage() * 100 <= facePlaceDurability.get()) return true; - } - } - } - - return false; - }*/ - - // Others - - private boolean shouldPause(PauseMode process) { - if (mc.player.isUsingItem() || mc.options.useKey.isPressed()) { - if (pauseOnUse.get().equals(process)) return true; - } - - if (pauseOnLag.get() && TickRate.INSTANCE.getTimeSinceLastTick() >= 1.0f) return true; - for (Module module : pauseModules.get()) if (module.isActive()) return true; - if (pauseOnMine.get().equals(process) && mc.interactionManager.isBreakingBlock()) return true; - return (EntityUtils.getTotalHealth(mc.player) <= pauseHealth.get()); - } - - private boolean isOutOfRange(Vec3d vec3d, BlockPos blockPos, boolean place) { - ((IRaycastContext) raycastContext).meteor$set(playerEyePos, vec3d, RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.NONE, mc.player); - - BlockHitResult result = mc.world.raycast(raycastContext); - - if (result == null || !result.getBlockPos().equals(blockPos)) // Is behind wall - return !PlayerUtils.isWithin(vec3d, (place ? placeWallsRange : breakWallsRange).get()); - return !PlayerUtils.isWithin(vec3d, (place ? placeRange : breakRange).get()); - } - - private LivingEntity getNearestTarget() { - LivingEntity nearestTarget = null; - double nearestDistance = Double.MAX_VALUE; - - for (LivingEntity target : targets) { - double distance = PlayerUtils.squaredDistanceTo(target); - - if (distance < nearestDistance) { - nearestTarget = target; - nearestDistance = distance; - } - } - - return nearestTarget; - } - - private float getDamageToTargets(Vec3d vec3d, BlockPos obsidianPos, boolean breaking, boolean fast) { - float damage = 0; - - if (fast) { - LivingEntity target = getNearestTarget(); - if (!(smartDelay.get() && breaking && target.hurtTime > 0)) damage = DamageUtils.crystalDamage(target, vec3d, predictMovement.get(), obsidianPos); - } - else { - for (LivingEntity target : targets) { - if (smartDelay.get() && breaking && target.hurtTime > 0) continue; - - float dmg = DamageUtils.crystalDamage(target, vec3d, predictMovement.get(), obsidianPos); - - // Update best target - if (dmg > bestTargetDamage) { - bestTarget = target; - bestTargetDamage = dmg; - bestTargetTimer = 10; - } - - damage += dmg; - } - } - - return damage; - } - - @Override - public String getInfoString() { - return bestTarget != null && bestTargetTimer > 0 ? EntityUtils.getName(bestTarget) : null; - } - - private void findTargets() { - targets.clear(); - - // Living Entities - for (Entity entity : mc.world.getEntities()) { - // Ignore non-living - if (!(entity instanceof LivingEntity livingEntity)) continue; - - // Player - if (livingEntity instanceof PlayerEntity player) { - if (player.getAbilities().creativeMode || livingEntity == mc.player) continue; - if (!player.isAlive() || !Friends.get().shouldAttack(player)) continue; - - if (ignoreNakeds.get()) { - if (player.getOffHandStack().isEmpty() - && player.getMainHandStack().isEmpty() - && player.getEquippedStack(EquipmentSlot.FEET).isEmpty() - && player.getEquippedStack(EquipmentSlot.LEGS).isEmpty() - && player.getEquippedStack(EquipmentSlot.CHEST).isEmpty() - && player.getEquippedStack(EquipmentSlot.HEAD).isEmpty() - ) continue; - } - } - - // Animals, water animals, monsters, bats, misc - if (!(entities.get().contains(livingEntity.getType()))) continue; - - // Close enough to damage - if (livingEntity.squaredDistanceTo(mc.player) > targetRange.get() * targetRange.get()) continue; - - targets.add(livingEntity); - } - } - - private boolean intersectsWithEntities(Box box) { - return EntityUtils.intersectsWithEntity(box, entity -> !entity.isSpectator() && !removed.contains(entity.getId())); - } - - // Rendering - - @EventHandler - private void onRender(Render3DEvent event) { - if (renderMode.get() == RenderMode.None) return; - - switch (renderMode.get()) { - case Normal -> { - if (renderPlace.get() && placeRenderTimer > 0) { - event.renderer.box(placeRenderPos, sideColor.get(), lineColor.get(), shapeMode.get(), 0); - } - if (renderBreak.get() && breakRenderTimer > 0) { - event.renderer.box(breakRenderPos, sideColor.get(), lineColor.get(), shapeMode.get(), 0); - } - } - - case Smooth -> { - if (placeRenderTimer <= 0) return; - - if (renderBoxOne == null) renderBoxOne = new Box(placeRenderPos); - if (renderBoxTwo == null) renderBoxTwo = new Box(placeRenderPos); - else ((IBox) renderBoxTwo).meteor$set(placeRenderPos); - - double offsetX = (renderBoxTwo.minX - renderBoxOne.minX) / smoothness.get(); - double offsetY = (renderBoxTwo.minY - renderBoxOne.minY) / smoothness.get(); - double offsetZ = (renderBoxTwo.minZ - renderBoxOne.minZ) / smoothness.get(); - - ((IBox) renderBoxOne).meteor$set( - renderBoxOne.minX + offsetX, - renderBoxOne.minY + offsetY, - renderBoxOne.minZ + offsetZ, - renderBoxOne.maxX + offsetX, - renderBoxOne.maxY + offsetY, - renderBoxOne.maxZ + offsetZ - ); - - event.renderer.box(renderBoxOne, sideColor.get(), lineColor.get(), shapeMode.get(), 0); - } - - case Gradient -> { - if (placeRenderTimer <= 0) return; - - Color bottom = new Color(0, 0, 0, 0); - - int x = placeRenderPos.getX(); - int y = placeRenderPos.getY() + 1; - int z = placeRenderPos.getZ(); - - if (shapeMode.get().sides()) { - event.renderer.quadHorizontal(x, y, z, x + 1, z + 1, sideColor.get()); - event.renderer.gradientQuadVertical(x, y, z, x + 1, y - height.get(), z, bottom, sideColor.get()); - event.renderer.gradientQuadVertical(x, y, z, x, y - height.get(), z + 1, bottom, sideColor.get()); - event.renderer.gradientQuadVertical(x + 1, y, z, x + 1, y - height.get(), z + 1, bottom, sideColor.get()); - event.renderer.gradientQuadVertical(x, y, z + 1, x + 1, y - height.get(), z + 1, bottom, sideColor.get()); - } - - if (shapeMode.get().lines()) { - event.renderer.line(x, y, z, x + 1, y, z, lineColor.get()); - event.renderer.line(x, y, z, x, y, z + 1, lineColor.get()); - event.renderer.line(x + 1, y, z, x + 1, y, z + 1, lineColor.get()); - event.renderer.line(x, y, z + 1, x + 1, y, z + 1, lineColor.get()); - - event.renderer.line(x, y, z, x, y - height.get(), z, lineColor.get(), bottom); - event.renderer.line(x + 1, y, z, x + 1, y - height.get(), z, lineColor.get(), bottom); - event.renderer.line(x, y, z + 1, x, y - height.get(), z + 1, lineColor.get(), bottom); - event.renderer.line(x + 1, y, z + 1, x + 1, y - height.get(), z + 1, lineColor.get(), bottom); - } - } - } - } - - @EventHandler - private void onRender2D(Render2DEvent event) { - if (renderMode.get() == RenderMode.None || !renderDamageText.get()) return; - if (placeRenderTimer <= 0 && breakRenderTimer <= 0) return; - - if (renderMode.get() == RenderMode.Smooth) { - if (renderBoxOne == null) return; - vec3.set(renderBoxOne.minX + 0.5, renderBoxOne.minY + 0.5, renderBoxOne.minZ + 0.5); - } else 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, damageColor.get(), true); - - TextRenderer.get().end(); - NametagUtils.end(); - } - } - - public enum YawStepMode { - Break, - All, - } - - public enum AutoSwitchMode { - Normal, - Silent, - None - } - - public enum SupportMode { - Disabled, - Accurate, - Fast - } - - public enum PauseMode { - Both, - Place, - Break, - None; - - public boolean equals(PauseMode process) { - return this == process || this == PauseMode.Both; - } - } - - public enum SwingMode { - Both, - Packet, - Client, - None; - - public boolean packet() { - return this == Packet || this == Both; - } - - public boolean client() { - return this == Client || this == Both; - } - } - - public enum RenderMode { - Normal, - Smooth, - Fading, - Gradient, - None - } -} diff --git a/src/main/java/com/genyo/addon/modules/TescoTrajectories.java b/src/main/java/com/genyo/addon/modules/TescoTrajectories.java deleted file mode 100644 index ef2313b..0000000 --- a/src/main/java/com/genyo/addon/modules/TescoTrajectories.java +++ /dev/null @@ -1,237 +0,0 @@ -package com.genyo.addon.modules; - -import com.genyo.addon.GenyoAddon; -import com.genyo.addon.render.Render2DEngine; -import com.genyo.addon.render.Render3DEngine; -import com.mojang.blaze3d.systems.RenderSystem; -import meteordevelopment.meteorclient.events.render.Render3DEvent; -import meteordevelopment.meteorclient.renderer.GL; -import meteordevelopment.meteorclient.renderer.Renderer3D; -import meteordevelopment.meteorclient.renderer.ShapeMode; -import meteordevelopment.meteorclient.settings.*; -import meteordevelopment.meteorclient.systems.modules.Module; -import meteordevelopment.meteorclient.utils.Utils; -import meteordevelopment.meteorclient.utils.render.color.Color; -import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import meteordevelopment.orbit.EventHandler; -import net.minecraft.block.Blocks; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.Entity; -import net.minecraft.entity.projectile.ArrowEntity; -import net.minecraft.item.*; -import net.minecraft.registry.Registries; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.RaycastContext; - -import java.util.ArrayList; -import java.util.List; - -public class TescoTrajectories extends Module { - - public TescoTrajectories() { - super(GenyoAddon.GENYO, "tesco-trajectories", "a thunderhackből mert az talán yobb yo yo yo yo yo-yo yoyo genyo"); - } - - private final SettingGroup sgGeneral = settings.getDefaultGroup(); - - private final Setting> items = sgGeneral.add(new ItemListSetting.Builder() - .name("Items") - .description("miknek írja a cuccli mucclikat wao wao wao") - .defaultValue(getDefaultItems()) - .filter(this::itemFilter) - .build() - ); - - private final Setting renderColor = sgGeneral.add(new ColorSetting.Builder() - .name("Render Color") - .description("egyszer volt hol nem volt egy veréb geci") - .defaultValue(new Color(80, 180, 180, 255)) - .build() - ); - - private final Setting syncColors = sgGeneral.add(new BoolSetting.Builder() - .name("Don't sync Landed with Render") - .description("a cucc kettő részének a színe más legyen vagy nooooooooo la policiaaa") - .defaultValue(true) - .build() - ); - - private final Setting landedColor = sgGeneral.add(new ColorSetting.Builder() - .name("Landed Color") - .description("második színcápa színcápa mondj egy színt te gecis cápa") - .defaultValue(renderColor.get()) - .visible(syncColors::get) - .build() - ); - - private boolean itemFilter(Item item) { - return item instanceof EnderPearlItem || item instanceof TridentItem || item instanceof ExperienceBottleItem || item instanceof SnowballItem || item instanceof EggItem || item instanceof SplashPotionItem || item instanceof LingeringPotionItem; - } - - private List getDefaultItems() { - List items = new ArrayList<>(); - - for (Item item : Registries.ITEM) { - if (itemFilter(item)) items.add(item); - } - - return items; - } - - // genyók - - private float getDistance(Item item) { - return item instanceof BowItem ? 1.0f : 0.4f; - } - - private float getThrowVelocity(Item item) { - if (item instanceof SplashPotionItem || item instanceof LingeringPotionItem) return 0.5f; - if (item instanceof ExperienceBottleItem) return 0.59f; - if (item instanceof TridentItem) return 2f; - return 1.5f; - } - - private int getThrowPitch(Item item) { - if (item instanceof SplashPotionItem || item instanceof LingeringPotionItem || item instanceof ExperienceBottleItem) - return 20; - return 0; - } - - @EventHandler - public void onRender(Render3DEvent event) { - if (mc.options.hudHidden) return; // mi afasz - if (mc.player == null || mc.world == null || !mc.options.getPerspective().isFirstPerson()) return; - - // ez kurva jó cucc - - ItemStack itemStack = mc.player.getMainHandStack(); - if (!items.get().contains(itemStack.getItem())) { - itemStack = mc.player.getOffHandStack(); - if (!items.get().contains(itemStack.getItem())) return; - } - - boolean prev_bob = mc.options.getBobView().getValue(); - mc.options.getBobView().setValue(false); - - final float playerYaw = mc.player.getYaw(); - if (itemStack.getItem() instanceof CrossbowItem && Utils.hasEnchantment(itemStack, Enchantments.MULTISHOT)) { - calcTrajectory(itemStack.getItem(), playerYaw - 10, event.renderer); - calcTrajectory(itemStack.getItem(), playerYaw, event.renderer); - calcTrajectory(itemStack.getItem(), playerYaw + 10, event.renderer); - } else { - calcTrajectory(itemStack.getItem(), playerYaw, event.renderer); - } - - mc.options.getBobView().setValue(prev_bob); - } - - private void calcTrajectory(Item item, float yaw, Renderer3D renderer) { - double x = Render2DEngine.interpolate(mc.player.prevX, mc.player.getX(), Render3DEngine.getTickDelta()); - double y = Render2DEngine.interpolate(mc.player.prevY, mc.player.getY(), Render3DEngine.getTickDelta()); - double z = Render2DEngine.interpolate(mc.player.prevZ, mc.player.getZ(), Render3DEngine.getTickDelta()); - - // Offset business - final float pi_genyo = 3.1415927f; - - y = y + mc.player.getEyeHeight(mc.player.getPose()) - 0.1000000014901161; // mivan - if (item == mc.player.getMainHandStack().getItem()) { - x = x - MathHelper.cos(yaw / 180.0f * pi_genyo) * 0.16f; - z = z - MathHelper.sin(yaw / 180.0f * pi_genyo) * 0.16f; - } else { - x = x + MathHelper.cos(yaw / 180.0f * pi_genyo) * 0.16f; - z = z + MathHelper.sin(yaw / 180.0f * pi_genyo) * 0.16f; - } - - float maxDist = getDistance(item); - - double motionX = -MathHelper.sin(yaw / 180.0f * pi_genyo) * MathHelper.cos(mc.player.getPitch() / 180.0f * pi_genyo) * maxDist; - double motionY = -MathHelper.sin((mc.player.getPitch() - getThrowPitch(item)) / 180.0f * 3.141593f) * maxDist; - double motionZ = MathHelper.cos(yaw / 180.0f * pi_genyo) * MathHelper.cos(mc.player.getPitch() / 180.0f * pi_genyo) * maxDist; - - float power = mc.player.getItemUseTime() / 20.0f; - power = (power * power + power * 2.0f) / 3.0f; - - if (power > 1.0f || power == 0) { - power = 1.0f; - } - - final float distance = MathHelper.sqrt((float) (motionX * motionX + motionY * motionY + motionZ * motionZ)); - motionX /= distance; - motionY /= distance; - motionZ /= distance; - - final float pow = (item instanceof BowItem ? (power * 2.0f) : item instanceof CrossbowItem ? (2.2f) : 1.0f) * getThrowVelocity(item); - - motionX *= pow; - motionY *= pow; - motionZ *= pow; - if (!mc.player.isOnGround()) - motionY += mc.player.getVelocity().getY(); - - Vec3d lastPos; - for (int i = 0; i < 300; i++) { - lastPos = new Vec3d(x, y, z); - x += motionX; - y += motionY; - z += motionZ; - if (mc.world.getBlockState(new BlockPos((int) x, (int) y, (int) z)).getBlock() == Blocks.WATER) { - motionX *= 0.8; - motionY *= 0.8; - motionZ *= 0.8; - } else { - motionX *= 0.99; - motionY *= 0.99; - motionZ *= 0.99; - } - - if (item instanceof BowItem) motionY -= 0.05000000074505806; - else if (mc.player.getMainHandStack().getItem() instanceof CrossbowItem) motionY -= 0.05000000074505806; - else motionY -= 0.03f; - - Vec3d pos = new Vec3d(x, y, z); - - for (Entity ent : mc.world.getEntities()) { - if (ent instanceof ArrowEntity || ent.equals(mc.player)) continue; - if (ent.getBoundingBox().intersects(new Box(x - 0.3, y - 0.3, z - 0.3, x + 0.3, y + 0.3, z + 0.3))) { - Render3DEngine.OUTLINE_QUEUE.add(new Render3DEngine.OutlineAction( - ent.getBoundingBox(), - getLandedColor(), - 2f)); - Render3DEngine.FILLED_QUEUE.add(new Render3DEngine.FillAction( - ent.getBoundingBox(), getLandedColor() - )); - break; - } - } - - Color white = new Color(255, 255, 255, 255); - BlockHitResult bhr = mc.world.raycast(new RaycastContext(lastPos, pos, RaycastContext.ShapeType.OUTLINE, RaycastContext.FluidHandling.NONE, mc.player)); - if (bhr != null && bhr.getType() == HitResult.Type.BLOCK) { - Render3DEngine.OUTLINE_SIDE_QUEUE.add(new Render3DEngine.OutlineSideAction( - new Box(bhr.getBlockPos()), getLandedColor(), 2f, bhr.getSide() - )); - Render3DEngine.FILLED_SIDE_QUEUE.add(new Render3DEngine.FillSideAction( - new Box(bhr.getBlockPos()), getLandedColor(), bhr.getSide() - )); - renderer.box(new Box(bhr.getBlockPos()), white, white, ShapeMode.Lines, 0); - break; - } - - if (y <= -65) break; - if (motionX == 0 && motionY == 0 && motionZ == 0) continue; - - renderer.line(lastPos.x, lastPos.y, lastPos.z, pos.x, pos.y, pos.z, renderColor.get()); - } - - } - - private Color getLandedColor() { - return !(syncColors.get()) ? renderColor.get() : landedColor.get(); - } - -} diff --git a/src/main/java/com/genyo/addon/render/Render2DEngine.java b/src/main/java/com/genyo/addon/render/Render2DEngine.java index 86d9f85..4216967 100644 --- a/src/main/java/com/genyo/addon/render/Render2DEngine.java +++ b/src/main/java/com/genyo/addon/render/Render2DEngine.java @@ -1,10 +1,8 @@ package com.genyo.addon.render; -import meteordevelopment.meteorclient.utils.render.color.Color; import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.BufferRenderer; import net.minecraft.client.render.BuiltBuffer; -import net.minecraft.util.math.MathHelper; public class Render2DEngine { diff --git a/src/main/java/com/genyo/addon/render/Render3DEngine.java b/src/main/java/com/genyo/addon/render/Render3DEngine.java index 6901a0f..5978d3d 100644 --- a/src/main/java/com/genyo/addon/render/Render3DEngine.java +++ b/src/main/java/com/genyo/addon/render/Render3DEngine.java @@ -1,11 +1,7 @@ package com.genyo.addon.render; -import com.genyo.addon.modules.TescoTrajectories; import com.mojang.blaze3d.systems.RenderSystem; import meteordevelopment.meteorclient.events.render.Render3DEvent; -import meteordevelopment.meteorclient.renderer.Renderer2D; -import meteordevelopment.meteorclient.renderer.Renderer3D; -import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.gl.ShaderProgramKeys; diff --git a/src/main/java/com/genyo/addon/systems/enemies/Enemies.java b/src/main/java/com/genyo/addon/systems/enemies/Enemies.java index 3bff3e4..363f939 100644 --- a/src/main/java/com/genyo/addon/systems/enemies/Enemies.java +++ b/src/main/java/com/genyo/addon/systems/enemies/Enemies.java @@ -155,15 +155,13 @@ public boolean isEmpty() { public NbtCompound toTag() { NbtCompound tag = new NbtCompound(); - tag.put("friends", NbtUtils.listToTag(enemies)); + tag.put("enemies", NbtUtils.listToTag(enemies)); tag.put("settings", settings.toTag()); return tag; } private void genyo() { - GenyoAddon.LOG.info("fa"); - if (mc.targetedEntity == null) return; if (!(mc.targetedEntity instanceof PlayerEntity player)) return; diff --git a/src/main/java/com/genyo/addon/gui/EnemiesTab.java b/src/main/java/com/genyo/addon/systems/enemies/EnemiesTab.java similarity index 96% rename from src/main/java/com/genyo/addon/gui/EnemiesTab.java rename to src/main/java/com/genyo/addon/systems/enemies/EnemiesTab.java index 6b87a7b..c694bc2 100644 --- a/src/main/java/com/genyo/addon/gui/EnemiesTab.java +++ b/src/main/java/com/genyo/addon/systems/enemies/EnemiesTab.java @@ -1,7 +1,5 @@ -package com.genyo.addon.gui; +package com.genyo.addon.systems.enemies; -import com.genyo.addon.systems.enemies.Enemies; -import com.genyo.addon.systems.enemies.Enemy; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.tabs.Tab; import meteordevelopment.meteorclient.gui.tabs.TabScreen; diff --git a/src/main/java/com/genyo/addon/systems/incombat/CombatPerson.java b/src/main/java/com/genyo/addon/systems/incombat/CombatPerson.java new file mode 100644 index 0000000..869d063 --- /dev/null +++ b/src/main/java/com/genyo/addon/systems/incombat/CombatPerson.java @@ -0,0 +1,39 @@ +package com.genyo.addon.systems.incombat; + +import meteordevelopment.meteorclient.systems.friends.Friend; +import meteordevelopment.meteorclient.systems.friends.Friends; +import net.minecraft.entity.player.PlayerEntity; + +public class CombatPerson { + + private volatile PlayerEntity player; + private volatile String name; + private volatile boolean wasFriend; + private volatile Friend friend; + + public CombatPerson(PlayerEntity player) { + this.player = player; + name = player.getName().getString(); + friend = null; + wasFriend = Friends.get().isFriend(player); + + if (wasFriend) this.friend = Friends.get().get(player); + } + + public PlayerEntity getPlayer() { + return player; + } + + public String getName() { + return name; + } + + public boolean wasFriendB() { + return wasFriend; + } + + public Friend getFriend() { + return friend; + } + +} diff --git a/src/main/java/com/genyo/addon/systems/incombat/InCombatSystem.java b/src/main/java/com/genyo/addon/systems/incombat/InCombatSystem.java new file mode 100644 index 0000000..9147ab4 --- /dev/null +++ b/src/main/java/com/genyo/addon/systems/incombat/InCombatSystem.java @@ -0,0 +1,173 @@ +package com.genyo.addon.systems.incombat; + +import com.genyo.addon.events.UnderCombatEvent; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.systems.System; +import meteordevelopment.meteorclient.systems.friends.Friends; +import meteordevelopment.meteorclient.utils.network.MeteorExecutor; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.entity.player.PlayerEntity; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +public class InCombatSystem extends System implements Iterable { + + private static final InCombatSystem INSTANCE = new InCombatSystem(); + private final List inCombat = new ArrayList<>(); + private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + private static final Object lock = new Object(); + + public final Settings settings = new Settings(); + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + + private final Setting enabled = sgGeneral.add(new BoolSetting.Builder() + .name("Enabled") + .description("tyu") + .defaultValue(false) + .build() + ); + + private final Setting combatCooldown = sgGeneral.add(new IntSetting.Builder() + .name("Cooldown") + .description("mikor resetelje") + .defaultValue(30) + .sliderRange(15, 60) + .visible(enabled::get) + .build() + ); + + private final Setting autoUnfriend = sgGeneral.add(new BoolSetting.Builder() + .name("Auto Unfriend") + .description("utána visszaaddolja") + .defaultValue(true) + .visible(enabled::get) + .build() + ); + + private int cooldown = 0; + + private void countdown() { + scheduler.scheduleAtFixedRate(() -> { + synchronized (lock) { + if (cooldown > 0) { + cooldown--; + } else { + clear(); + } + } + }, 0, 1, TimeUnit.SECONDS); + } + + public InCombatSystem() { + super("incombat"); + } + + @Override + public void init() { + clear(); + } + + @Override + public @NotNull Iterator iterator() { + return inCombat.iterator(); + } + + public boolean add(CombatPerson person) { + if (!inCombat.contains(person)) { + inCombat.add(person); + + if (autoUnfriend.get()) Friends.get().remove(Friends.get().get(person.getPlayer())); + + resetCooldown(); + save(); + return true; + } + + return false; + } + + public int getRemainingCooldown() { + return cooldown; + } + + public boolean isEnabled() { + return enabled.get(); + } + + public boolean contains(CombatPerson person) { + return get(person.getName()) != null; + } + + public boolean contains(PlayerEntity entity) { + return get(entity.getName().getString()) != null; + } + + public CombatPerson get(String name) { + for (CombatPerson person : inCombat) { + if (person.getName().equals(name)) { + return person; + } + } + + return null; + } + + public void resetCooldown() { + synchronized (lock) { + if (cooldown == 0) { + cooldown = combatCooldown.get(); + countdown(); + } else { + cooldown = combatCooldown.get(); + } + } + } + + public boolean empty() { + return inCombat.isEmpty(); + } + + public List getInCombat() { + return inCombat; + } + + public int size() { + return inCombat.size(); + } + + public void clear() { + MeteorExecutor.execute(() -> inCombat.forEach(person -> { + if (autoUnfriend.get()) { + if (person.wasFriendB()) Friends.get().add(person.getFriend()); + } + })); + + get().getInCombat().clear(); + save(); + } + + public static InCombatSystem get() { + return INSTANCE; + } + + @EventHandler + private void onUnderAttack(UnderCombatEvent event) { + if (mc.world == null) return; + + CombatPerson person = new CombatPerson(event.entity); + if (!InCombatSystem.get().contains(person)) { + InCombatSystem.get().add(person); + } + + if (!empty()) resetCooldown(); + } + +} diff --git a/src/main/java/com/genyo/addon/systems/incombat/InCombatTab.java b/src/main/java/com/genyo/addon/systems/incombat/InCombatTab.java new file mode 100644 index 0000000..da2d033 --- /dev/null +++ b/src/main/java/com/genyo/addon/systems/incombat/InCombatTab.java @@ -0,0 +1,50 @@ +package com.genyo.addon.systems.incombat; + +import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.tabs.Tab; +import meteordevelopment.meteorclient.gui.tabs.TabScreen; +import meteordevelopment.meteorclient.gui.tabs.WindowTabScreen; +import meteordevelopment.meteorclient.settings.Settings; +import net.minecraft.client.gui.screen.Screen; + +public class InCombatTab extends Tab { + + public InCombatTab() { + super("InCombat"); + } + + @Override + public TabScreen createScreen(GuiTheme theme) { + return new InCombatTab.InCombatScreen(theme, this); + } + + @Override + public boolean isScreen(Screen screen) { + return screen instanceof InCombatTab.InCombatScreen; + } + + private static class InCombatScreen extends WindowTabScreen { + private final Settings settings; + + public InCombatScreen(GuiTheme theme, Tab tab) { + super(theme, tab); + + settings = InCombatSystem.get().settings; + } + + @Override + public void initWidgets() { + add(theme.settings(settings)).expandX(); + } + + @Override + public void tick() { + super.tick(); + + settings.tick(window, theme); + } + } + + + +} diff --git a/src/main/java/com/genyo/addon/utils/MathUtil.java b/src/main/java/com/genyo/addon/utils/MathUtil.java index 3267b61..9e7d136 100644 --- a/src/main/java/com/genyo/addon/utils/MathUtil.java +++ b/src/main/java/com/genyo/addon/utils/MathUtil.java @@ -1,7 +1,14 @@ package com.genyo.addon.utils; +import com.genyo.addon.GenyoAddon; + +import java.util.List; +import java.util.Random; + public class MathUtil { + private static final Random r = new Random(); + public static int clamp(int num, int min, int max) { return num < min ? min : Math.min(num, max); } @@ -10,4 +17,11 @@ public static float rad(float angle) { return (float) (angle * Math.PI / 180); } + public static int pickRandom(List list) { + if (list.size() == 1) return 0; + + int num = r.nextInt(0, list.size()); + return num-1; + } + }