diff --git a/LICENSE b/LICENSE index 0e259d4..e69de29 100644 --- a/LICENSE +++ b/LICENSE @@ -1,121 +0,0 @@ -Creative Commons Legal Code - -CC0 1.0 Universal - - CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE - LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN - ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS - INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES - REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS - PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM - THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED - HEREUNDER. - -Statement of Purpose - -The laws of most jurisdictions throughout the world automatically confer -exclusive Copyright and Related Rights (defined below) upon the creator -and subsequent owner(s) (each and all, an "owner") of an original work of -authorship and/or a database (each, a "Work"). - -Certain owners wish to permanently relinquish those rights to a Work for -the purpose of contributing to a commons of creative, cultural and -scientific works ("Commons") that the public can reliably and without fear -of later claims of infringement build upon, modify, incorporate in other -works, reuse and redistribute as freely as possible in any form whatsoever -and for any purposes, including without limitation commercial purposes. -These owners may contribute to the Commons to promote the ideal of a free -culture and the further production of creative, cultural and scientific -works, or to gain reputation or greater distribution for their Work in -part through the use and efforts of others. - -For these and/or other purposes and motivations, and without any -expectation of additional consideration or compensation, the person -associating CC0 with a Work (the "Affirmer"), to the extent that he or she -is an owner of Copyright and Related Rights in the Work, voluntarily -elects to apply CC0 to the Work and publicly distribute the Work under its -terms, with knowledge of his or her Copyright and Related Rights in the -Work and the meaning and intended legal effect of CC0 on those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be -protected by copyright and related or neighboring rights ("Copyright and -Related Rights"). Copyright and Related Rights include, but are not -limited to, the following: - - i. the right to reproduce, adapt, distribute, perform, display, - communicate, and translate a Work; - ii. moral rights retained by the original author(s) and/or performer(s); -iii. publicity and privacy rights pertaining to a person's image or - likeness depicted in a Work; - iv. rights protecting against unfair competition in regards to a Work, - subject to the limitations in paragraph 4(a), below; - v. rights protecting the extraction, dissemination, use and reuse of data - in a Work; - vi. database rights (such as those arising under Directive 96/9/EC of the - European Parliament and of the Council of 11 March 1996 on the legal - protection of databases, and under any national implementation - thereof, including any amended or successor version of such - directive); and -vii. other similar, equivalent or corresponding rights throughout the - world based on applicable law or treaty, and any national - implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention -of, applicable law, Affirmer hereby overtly, fully, permanently, -irrevocably and unconditionally waives, abandons, and surrenders all of -Affirmer's Copyright and Related Rights and associated claims and causes -of action, whether now known or unknown (including existing as well as -future claims and causes of action), in the Work (i) in all territories -worldwide, (ii) for the maximum duration provided by applicable law or -treaty (including future time extensions), (iii) in any current or future -medium and for any number of copies, and (iv) for any purpose whatsoever, -including without limitation commercial, advertising or promotional -purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each -member of the public at large and to the detriment of Affirmer's heirs and -successors, fully intending that such Waiver shall not be subject to -revocation, rescission, cancellation, termination, or any other legal or -equitable action to disrupt the quiet enjoyment of the Work by the public -as contemplated by Affirmer's express Statement of Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason -be judged legally invalid or ineffective under applicable law, then the -Waiver shall be preserved to the maximum extent permitted taking into -account Affirmer's express Statement of Purpose. In addition, to the -extent the Waiver is so judged Affirmer hereby grants to each affected -person a royalty-free, non transferable, non sublicensable, non exclusive, -irrevocable and unconditional license to exercise Affirmer's Copyright and -Related Rights in the Work (i) in all territories worldwide, (ii) for the -maximum duration provided by applicable law or treaty (including future -time extensions), (iii) in any current or future medium and for any number -of copies, and (iv) for any purpose whatsoever, including without -limitation commercial, advertising or promotional purposes (the -"License"). The License shall be deemed effective as of the date CC0 was -applied by Affirmer to the Work. Should any part of the License for any -reason be judged legally invalid or ineffective under applicable law, such -partial invalidity or ineffectiveness shall not invalidate the remainder -of the License, and in such case Affirmer hereby affirms that he or she -will not (i) exercise any of his or her remaining Copyright and Related -Rights in the Work or (ii) assert any associated claims and causes of -action with respect to the Work, in either case contrary to Affirmer's -express Statement of Purpose. - -4. Limitations and Disclaimers. - - a. No trademark or patent rights held by Affirmer are waived, abandoned, - surrendered, licensed or otherwise affected by this document. - b. Affirmer offers the Work as-is and makes no representations or - warranties of any kind concerning the Work, express, implied, - statutory or otherwise, including without limitation warranties of - title, merchantability, fitness for a particular purpose, non - infringement, or the absence of latent or other defects, accuracy, or - the present or absence of errors, whether or not discoverable, all to - the greatest extent permissible under applicable law. - c. Affirmer disclaims responsibility for clearing rights of other persons - that may apply to the Work or any use thereof, including without - limitation any person's Copyright and Related Rights in the Work. - Further, Affirmer disclaims responsibility for obtaining any necessary - consents, permissions or other rights required for any use of the - Work. - d. Affirmer understands and acknowledges that Creative Commons is not a - party to this document and has no duty or obligation with respect to - this CC0 or use of the Work. diff --git a/README.md b/README.md index fd96346..4c9f812 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,9 @@ -# Fabric Example Mod +# CwHack + +## Introduction + +CwHack is a client-side mod that provides various cheats to the game. +It was originally made for ProtonBlitz. ## Setup @@ -6,4 +11,4 @@ For setup instructions please see the [fabric wiki page](https://fabricmc.net/wi ## License -This template is available under the CC0 license. Feel free to learn from it and incorporate it in your own projects. +Unauthorized copying or distribution of the source code via any medium is prohibited. diff --git a/gradle.properties b/gradle.properties index 10ac261..1092710 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,14 +3,14 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/versions.html - minecraft_version=1.17.1 - yarn_mappings=1.17.1+build.63 + minecraft_version=1.18.1 + yarn_mappings=1.18.1+build.17 loader_version=0.12.12 +#Fabric api + fabric_version=0.45.1+1.18 + # Mod Properties - mod_version = a0.2.0 + mod_version = a0.5.0 maven_group = net.cwhack - archives_base_name = cwhack - -# Dependencies - fabric_version=0.42.1+1.17 + archives_base_name = cwhack \ No newline at end of file diff --git a/src/main/java/net/cwhack/RotationFaker.java b/src/main/java/net/cwhack/RotationFaker.java index d41a542..6c6ef26 100644 --- a/src/main/java/net/cwhack/RotationFaker.java +++ b/src/main/java/net/cwhack/RotationFaker.java @@ -2,24 +2,32 @@ import net.cwhack.events.PostMotionListener; import net.cwhack.events.PreMotionListener; +import net.cwhack.events.UpdateListener; import net.cwhack.utils.RotationUtils; import net.cwhack.utils.RotationUtils.Rotation; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.util.math.Vec3d; -public class RotationFaker implements PreMotionListener, PostMotionListener +import static net.cwhack.CwHack.CWHACK; +import static net.cwhack.CwHack.MC; + +public class RotationFaker implements PreMotionListener, PostMotionListener, UpdateListener { private float realYaw; private float realPitch; private float serverYaw; private float serverPitch; + private float lastYaw; + private float lastPitch; private boolean faking = false; + private boolean wasFaking = false; public RotationFaker() { - CwHack.CWHACK.getEventManager().add(PreMotionListener.class, this); - CwHack.CWHACK.getEventManager().add(PostMotionListener.class, this, Integer.MAX_VALUE); + CWHACK.getEventManager().add(PreMotionListener.class, this, Integer.MAX_VALUE); + CWHACK.getEventManager().add(PostMotionListener.class, this, Integer.MAX_VALUE); + CWHACK.getEventManager().add(UpdateListener.class, this, Integer.MAX_VALUE); } public boolean isFaking() @@ -27,12 +35,17 @@ public boolean isFaking() return faking; } + public boolean wasFakingLastTick() + { + return wasFaking; + } + @Override public void onPreMotion() { if (!faking) return; - ClientPlayerEntity player = CwHack.MC.player; + ClientPlayerEntity player = MC.player; realYaw = player.getYaw(); realPitch = player.getPitch(); player.setYaw(serverYaw); @@ -44,12 +57,21 @@ public void onPostMotion() { if (!faking) return; - ClientPlayerEntity player = CwHack.MC.player; + ClientPlayerEntity player = MC.player; player.setYaw(realYaw); player.setPitch(realPitch); faking = false; } + @Override + public void onUpdate() + { + if (faking != wasFaking) + wasFaking = faking; + lastYaw = serverYaw; + lastPitch = serverPitch; + } + public void setServerLookPos(Vec3d pos) { Rotation neededRotation = RotationUtils.getNeededRotations(pos); @@ -61,6 +83,7 @@ public void setServerLookAngle(float yaw, float pitch) serverYaw = yaw; serverPitch = pitch; faking = true; + wasFaking = true; } public void setClientLookPos(Vec3d pos) @@ -71,21 +94,41 @@ public void setClientLookPos(Vec3d pos) public void setClientLookAngle(float yaw, float pitch) { - CwHack.MC.player.setYaw(yaw); - CwHack.MC.player.setPitch(pitch); + MC.player.setYaw(yaw); + MC.player.setPitch(pitch); } public float getServerYaw() { if (faking) return serverYaw; - return CwHack.MC.player.getYaw(); + return MC.player.getYaw(); } public float getServerPitch() { if (faking) return serverPitch; - return CwHack.MC.player.getPitch(); + return MC.player.getPitch(); + } + + public float getFakedYaw() + { + return serverYaw; + } + + public float getFakedPitch() + { + return serverPitch; + } + + public float getLastFakedYaw() + { + return lastYaw; + } + + public float getLastFakedPitch() + { + return lastPitch; } } diff --git a/src/main/java/net/cwhack/events/AttackEntityListener.java b/src/main/java/net/cwhack/events/AttackEntityListener.java new file mode 100644 index 0000000..f8c6330 --- /dev/null +++ b/src/main/java/net/cwhack/events/AttackEntityListener.java @@ -0,0 +1,52 @@ +package net.cwhack.events; + +import net.cwhack.event.CancellableEvent; +import net.cwhack.event.Listener; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; + +import java.util.ArrayList; + +public interface AttackEntityListener extends Listener +{ + void onAttackEntity(AttackEntityEvent event); + + class AttackEntityEvent extends CancellableEvent + { + + private PlayerEntity player; + private Entity target; + + public AttackEntityEvent(PlayerEntity player, Entity target) + { + // player should always be a ClientPlayerEntity + this.player = player; + this.target = target; + } + + public PlayerEntity getPlayer() + { + return player; + } + + public Entity getTarget() + { + return target; + } + + @Override + public void fire(ArrayList listeners) + { + for (AttackEntityListener listener : listeners) + { + listener.onAttackEntity(this); + } + } + + @Override + public Class getListenerType() + { + return AttackEntityListener.class; + } + } +} diff --git a/src/main/java/net/cwhack/events/FrameBeginListener.java b/src/main/java/net/cwhack/events/FrameBeginListener.java new file mode 100644 index 0000000..d6a14bd --- /dev/null +++ b/src/main/java/net/cwhack/events/FrameBeginListener.java @@ -0,0 +1,31 @@ +package net.cwhack.events; + +import net.cwhack.event.Event; +import net.cwhack.event.Listener; + +import java.util.ArrayList; + +public interface FrameBeginListener extends Listener +{ + + void onFrameBegin(); + + class FrameBeginEvent extends Event + { + + @Override + public void fire(ArrayList listeners) + { + for (FrameBeginListener listener : listeners) + { + listener.onFrameBegin(); + } + } + + @Override + public Class getListenerType() + { + return FrameBeginListener.class; + } + } +} diff --git a/src/main/java/net/cwhack/events/GetOutlineShapeListener.java b/src/main/java/net/cwhack/events/GetOutlineShapeListener.java new file mode 100644 index 0000000..8be7ebf --- /dev/null +++ b/src/main/java/net/cwhack/events/GetOutlineShapeListener.java @@ -0,0 +1,73 @@ +package net.cwhack.events; + +import net.cwhack.event.Event; +import net.cwhack.event.Listener; +import net.minecraft.block.ShapeContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockView; + +import java.util.ArrayList; + +public interface GetOutlineShapeListener extends Listener +{ + + void onGetOutlineShape(GetOutlineShapeEvent event); + + class GetOutlineShapeEvent extends Event + { + + private BlockView view; + private BlockPos pos; + private ShapeContext context; + private VoxelShape returnValue; + + public GetOutlineShapeEvent(BlockView view, BlockPos pos, ShapeContext context) + { + this.view = view; + this.pos = pos; + this.context = context; + } + + public BlockView getView() + { + return view; + } + + public BlockPos getPos() + { + return pos; + } + + public ShapeContext getContext() + { + return context; + } + + public VoxelShape getReturnValue() + { + return returnValue; + } + + public void setReturnValue(VoxelShape returnValue) + { + this.returnValue = returnValue; + } + + @Override + public void fire(ArrayList listeners) + { + for (GetOutlineShapeListener listener : listeners) + { + listener.onGetOutlineShape(this); + } + } + + @Override + public Class getListenerType() + { + return GetOutlineShapeListener.class; + } + } + +} diff --git a/src/main/java/net/cwhack/events/IsFullCubeListener.java b/src/main/java/net/cwhack/events/IsFullCubeListener.java deleted file mode 100644 index 961fd93..0000000 --- a/src/main/java/net/cwhack/events/IsFullCubeListener.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.cwhack.events; - -import net.cwhack.event.CancellableEvent; -import net.cwhack.event.Listener; - -import java.util.ArrayList; - -public interface IsFullCubeListener extends Listener -{ - void onIsFullCube(IsFullCubeEvent event); - - class IsFullCubeEvent extends CancellableEvent - { - - @Override - public void fire(ArrayList listeners) - { - for (IsFullCubeListener listener : listeners) - { - listener.onIsFullCube(this); - if (isCancelled()) - return; - } - } - - @Override - public Class getListenerType() - { - return IsFullCubeListener.class; - } - } -} diff --git a/src/main/java/net/cwhack/events/KeyPressListener.java b/src/main/java/net/cwhack/events/KeyPressListener.java index e24944c..a46aa69 100644 --- a/src/main/java/net/cwhack/events/KeyPressListener.java +++ b/src/main/java/net/cwhack/events/KeyPressListener.java @@ -1,6 +1,6 @@ package net.cwhack.events; -import net.cwhack.event.Event; +import net.cwhack.event.CancellableEvent; import net.cwhack.event.Listener; import java.util.ArrayList; @@ -9,7 +9,7 @@ public interface KeyPressListener extends Listener { void onKeyPress(KeyPressEvent event); - class KeyPressEvent extends Event + class KeyPressEvent extends CancellableEvent { private int keyCode, scanCode, action, modifiers; diff --git a/src/main/java/net/cwhack/events/PostActionListener.java b/src/main/java/net/cwhack/events/PostActionListener.java new file mode 100644 index 0000000..3622ed3 --- /dev/null +++ b/src/main/java/net/cwhack/events/PostActionListener.java @@ -0,0 +1,30 @@ +package net.cwhack.events; + +import net.cwhack.event.Event; +import net.cwhack.event.Listener; + +import java.util.ArrayList; + +public interface PostActionListener extends Listener +{ + void onPostAction(); + + class PostActionEvent extends Event + { + + @Override + public void fire(ArrayList listeners) + { + for (PostActionListener listener : listeners) + { + listener.onPostAction(); + } + } + + @Override + public Class getListenerType() + { + return PostActionListener.class; + } + } +} diff --git a/src/main/java/net/cwhack/events/PreActionListener.java b/src/main/java/net/cwhack/events/PreActionListener.java new file mode 100644 index 0000000..9d65be9 --- /dev/null +++ b/src/main/java/net/cwhack/events/PreActionListener.java @@ -0,0 +1,30 @@ +package net.cwhack.events; + +import net.cwhack.event.Event; +import net.cwhack.event.Listener; + +import java.util.ArrayList; + +public interface PreActionListener extends Listener +{ + void onPreAction(); + + class PreActionEvent extends Event + { + + @Override + public void fire(ArrayList listeners) + { + for (PreActionListener listener : listeners) + { + listener.onPreAction(); + } + } + + @Override + public Class getListenerType() + { + return PreActionListener.class; + } + } +} diff --git a/src/main/java/net/cwhack/feature/Feature.java b/src/main/java/net/cwhack/feature/Feature.java index 84d016e..2844220 100644 --- a/src/main/java/net/cwhack/feature/Feature.java +++ b/src/main/java/net/cwhack/feature/Feature.java @@ -19,7 +19,7 @@ public abstract class Feature private boolean enabled = false; protected EventManager eventManager = CwHack.CWHACK.getEventManager(); - private HashMap settings; + private final HashMap> settings; public Feature(String name, String description) { @@ -62,7 +62,7 @@ public String getDescription() return description; } - public Setting getSetting(String name) + public Setting getSetting(String name) { return settings.get(name); } @@ -72,7 +72,7 @@ public Set getSettingNames() return settings.keySet(); } - public Collection getSettings() + public Collection> getSettings() { return settings.values(); } @@ -87,7 +87,7 @@ public FeatureSettingScreen getSettingScreen() return new FeatureSettingScreen(MC.currentScreen, this); } - protected void addSetting(Setting setting) + public void addSetting(Setting setting) { settings.put(setting.getName().toLowerCase(), setting); } @@ -96,8 +96,14 @@ protected void onEnable() { } + protected void onDisable() { } + + public void onChangeSetting(Setting setting) + { + + } } diff --git a/src/main/java/net/cwhack/feature/FeatureList.java b/src/main/java/net/cwhack/feature/FeatureList.java index 4c2a933..05f5d27 100644 --- a/src/main/java/net/cwhack/feature/FeatureList.java +++ b/src/main/java/net/cwhack/feature/FeatureList.java @@ -27,12 +27,15 @@ public class FeatureList public final ArmorHudFeature armorHudFeature = new ArmorHudFeature(); public final AutoAnchorFeature autoAnchorFeature = new AutoAnchorFeature(); public final AutoCityFeature autoCityFeature = new AutoCityFeature(); + public final AutoClickerFeature autoClickerFeature = new AutoClickerFeature(); public final AutoCopeFeature autoCopeFeature = new AutoCopeFeature(); public final AutoCrystalFeature autoCrystalFeature = new AutoCrystalFeature(); public final AutoEzFeature autoEzFeature = new AutoEzFeature(); + public final AutoHeadBobFeature autoHeadBobFeature = new AutoHeadBobFeature(); public final AutoPearlFeature autoPearlFeature = new AutoPearlFeature(); public final AutoSurroundFeature autoSurroundFeature = new AutoSurroundFeature(); public final AutoTotemFeature autoTotemFeature = new AutoTotemFeature(); + public final AutoWTapFeature autoWTapFeature = new AutoWTapFeature(); public final BlinkFeature blinkFeature = new BlinkFeature(); public final Bow32kFeature bow32kFeature = new Bow32kFeature(); public final CameraNoClipFeature cameraNoClipFeature = new CameraNoClipFeature(); @@ -44,12 +47,16 @@ public class FeatureList public final CwHackPostfixFeature cwHackPostfixFeature = new CwHackPostfixFeature(); public final DerpFeature derpFeature = new DerpFeature(); public final ElytraBoostFeature elytraBoostFeature = new ElytraBoostFeature(); + public final EntityEspFeature entityEspFeature = new EntityEspFeature(); + public final FakePlayerFeature fakePlayerFeature = new FakePlayerFeature(); public final FastBreakFeature fastBreakFeature = new FastBreakFeature(); public final FeatureListFeature featureListFeature = new FeatureListFeature(); public final FlightFeature flightFeature = new FlightFeature(); public final FreecamFeature freecamFeature = new FreecamFeature(); + public final GhostHandFeature ghostHandFeature = new GhostHandFeature(); public final HoleEspFeature holeEspFeature = new HoleEspFeature(); public final KillAuraFeature killAuraFeature = new KillAuraFeature(); + public final MarlowAnchorFeature marlowAnchorFeature = new MarlowAnchorFeature(); public final NameTagFeature nameTagFeature = new NameTagFeature(); public final NoFallFeature noFallFeature = new NoFallFeature(); public final NoOverlayFeature noOverlayFeature = new NoOverlayFeature(); @@ -62,6 +69,7 @@ public class FeatureList public final StasisExploitFeature stasisExploitFeature = new StasisExploitFeature(); public final StepFeature stepFeature = new StepFeature(); public final StrafeFeature strafeFeature = new StrafeFeature(); + public final StorageEspFeature storageEspFeature = new StorageEspFeature(); public final SurroundFeature surroundFeature = new SurroundFeature(); public final TriggerBotFeature triggerBotFeature = new TriggerBotFeature(); public final VelocityFeature velocityFeature = new VelocityFeature(); diff --git a/src/main/java/net/cwhack/features/AimAssistFeature.java b/src/main/java/net/cwhack/features/AimAssistFeature.java index b3045b4..897eab2 100644 --- a/src/main/java/net/cwhack/features/AimAssistFeature.java +++ b/src/main/java/net/cwhack/features/AimAssistFeature.java @@ -19,16 +19,14 @@ public class AimAssistFeature extends Feature implements UpdateListener, RenderListener { - private DecimalSetting range = new DecimalSetting("range", "the range the aimbot will work", 4); - private DecimalSetting speed = new DecimalSetting("speed", "the speed your head will turn", 1); + private final DecimalSetting range = new DecimalSetting("range", "the range the aimbot will work", 4, this); + private final DecimalSetting speed = new DecimalSetting("speed", "the speed your head will turn", 1, this); private Entity target; public AimAssistFeature() { super("AimAssist", "automatically aims for you"); - addSetting(range); - addSetting(speed); } @Override diff --git a/src/main/java/net/cwhack/features/AnchorAuraFeature.java b/src/main/java/net/cwhack/features/AnchorAuraFeature.java index 90ebe8c..10dc86e 100644 --- a/src/main/java/net/cwhack/features/AnchorAuraFeature.java +++ b/src/main/java/net/cwhack/features/AnchorAuraFeature.java @@ -35,9 +35,9 @@ public class AnchorAuraFeature extends Feature implements UpdateListener, RenderListener { - private final DecimalSetting range = new DecimalSetting("range", "range", 4.5); - private final DecimalSetting maxSelfDamage = new DecimalSetting("maxSelfDamage", "the maximum self damage you will take from it", 8.0); - private final IntegerSetting cooldown = new IntegerSetting("cooldown", "cooldown", 10); + private final DecimalSetting range = new DecimalSetting("range", "range", 4.5, this); + private final DecimalSetting maxSelfDamage = new DecimalSetting("maxSelfDamage", "the maximum self damage you will take from it", 8.0, this); + private final IntegerSetting cooldown = new IntegerSetting("cooldown", "cooldown", 10, this); private Entity target; private boolean overridingTarget = false; @@ -47,9 +47,6 @@ public class AnchorAuraFeature extends Feature implements UpdateListener, Render public AnchorAuraFeature() { super("AnchorAura", "anchor anchor meow meow meow"); - addSetting(range); - addSetting(maxSelfDamage); - addSetting(cooldown); } @Override diff --git a/src/main/java/net/cwhack/features/AntiDoubleTapFeature.java b/src/main/java/net/cwhack/features/AntiDoubleTapFeature.java index 215f196..8c25d13 100644 --- a/src/main/java/net/cwhack/features/AntiDoubleTapFeature.java +++ b/src/main/java/net/cwhack/features/AntiDoubleTapFeature.java @@ -2,27 +2,37 @@ import net.cwhack.events.UpdateListener; import net.cwhack.feature.Feature; +import net.cwhack.setting.BooleanSetting; import net.cwhack.setting.DecimalSetting; -import net.cwhack.utils.DamageUtils; -import net.cwhack.utils.InventoryUtils; +import net.cwhack.utils.*; +import net.minecraft.block.Blocks; import net.minecraft.entity.decoration.EndCrystalEntity; import net.minecraft.item.Items; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.math.Vec3d; +import net.minecraft.world.RaycastContext; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Stream; import static net.cwhack.CwHack.MC; public class AntiDoubleTapFeature extends Feature implements UpdateListener { - private final DecimalSetting range = new DecimalSetting("range", "how far does the enemy have to be in order to trigger it", 4.0); + private final DecimalSetting range = new DecimalSetting("range", "how far does the enemy have to be in order to trigger it", 6.0, this); + private final BooleanSetting stopOnUsingItem = new BooleanSetting("stopOnUsingItem", "whether or not to stop while eating or using item", false, this); + private final DecimalSetting activatesAbove = new DecimalSetting("activatesAbove", "how much you need to leave the ground before activating it," + + " set it to non-zero if it stops you from comboing in holes", 0.0, this); + private final BooleanSetting predictCrystals = new BooleanSetting("predictCrystals", "whether or not to predict crystal placements", false, this); + private final BooleanSetting checkEnemiesAim = new BooleanSetting("checkEnemiesAim", "whether or not to check your enemies' look angle when predicting", true, this); public AntiDoubleTapFeature() { super("AntiDoubleTap", "Automatically switch to totem when in danger"); - addSetting(range); } @Override @@ -46,13 +56,41 @@ private List getNearByCrystals() @Override public void onUpdate() { - if (MC.world.getPlayers().parallelStream().noneMatch(player -> MC.player.squaredDistanceTo(player) <= range.getValue() * range.getValue())) + if (MC.world.getPlayers().parallelStream() + .filter(e -> e != MC.player) + .noneMatch(player -> MC.player.squaredDistanceTo(player) <= range.getValue() * range.getValue())) return; + + if (stopOnUsingItem.getValue() && MC.player.isUsingItem()) + return; + + double activatesAboveV = activatesAbove.getValue(); + int f = (int) Math.floor(activatesAboveV); + for (int i = 1; i <= f; i++) + if (BlockUtils.hasBlock(MC.player.getBlockPos().add(0, -i, 0))) + return; + if (BlockUtils.hasBlock(new BlockPos(MC.player.getPos().add(0, -activatesAboveV, 0)))) + return; + List crystals = getNearByCrystals(); - for (EndCrystalEntity crystal : crystals) + ArrayList crystalsPos = new ArrayList<>(); + crystals.forEach(e -> crystalsPos.add(e.getPos())); + + if (predictCrystals.getValue()) + { + Stream stream = + BlockUtils.getAllInBoxStream(MC.player.getBlockPos().add(-6, -8, -6), MC.player.getBlockPos().add(6, 2, 6)) + .filter(e -> BlockUtils.isBlock(Blocks.OBSIDIAN, e) || BlockUtils.isBlock(Blocks.BEDROCK, e)) + .filter(CrystalUtils::canPlaceCrystalClient); + if (checkEnemiesAim.getValue()) + stream = stream.filter(this::arePeopleAimingAtBlock); + stream.forEachOrdered(e -> crystalsPos.add(Vec3d.ofBottomCenter(e).add(0, 1, 0))); + } + + for (Vec3d pos : crystalsPos) { double damage = - DamageUtils.crystalDamage(MC.player, crystal.getPos(), true, null, false); + DamageUtils.crystalDamage(MC.player, pos, true, null, false); if (damage >= MC.player.getHealth() + MC.player.getAbsorptionAmount()) { InventoryUtils.selectItemFromHotbar(Items.TOTEM_OF_UNDYING); @@ -60,4 +98,16 @@ public void onUpdate() } } } + + private boolean arePeopleAimingAtBlock(BlockPos block) + { + return MC.world.getPlayers().parallelStream() + .filter(e -> e != MC.player) + .anyMatch(e -> + { + Vec3d eyesPos = RotationUtils.getEyesPos(e); + BlockHitResult hitResult = MC.world.raycast(new RaycastContext(eyesPos, eyesPos.add(RotationUtils.getPlayerLookVec(e).multiply(4.5)), RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.NONE, e)); + return hitResult != null && hitResult.getBlockPos().equals(block); + }); + } } diff --git a/src/main/java/net/cwhack/features/AutoCityFeature.java b/src/main/java/net/cwhack/features/AutoCityFeature.java index e137256..2255b5f 100644 --- a/src/main/java/net/cwhack/features/AutoCityFeature.java +++ b/src/main/java/net/cwhack/features/AutoCityFeature.java @@ -8,10 +8,7 @@ import net.cwhack.feature.Feature; import net.cwhack.mixinterface.IClientPlayerInteractionManager; import net.cwhack.setting.DecimalSetting; -import net.cwhack.utils.BlockUtils; -import net.cwhack.utils.DamageUtils; -import net.cwhack.utils.InventoryUtils; -import net.cwhack.utils.RenderUtils; +import net.cwhack.utils.*; import net.minecraft.block.AnvilBlock; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -37,7 +34,7 @@ public class AutoCityFeature extends Feature implements UpdateListener, RenderListener { - private final DecimalSetting range = new DecimalSetting("range", "the range it will city", 4.5); + private final DecimalSetting range = new DecimalSetting("range", "the range it will city", 4.5, this); private Entity target; private BlockPos city; @@ -47,7 +44,6 @@ public class AutoCityFeature extends Feature implements UpdateListener, RenderLi public AutoCityFeature() { super("AutoCity", "Automatically break blocks around someone"); - addSetting(range); } @Override @@ -98,7 +94,7 @@ public void onUpdate() return; } - if (!shouldKeepCity()) + if (!shouldKeepCity(city)) { city = null; return; @@ -180,9 +176,9 @@ private boolean shouldCity() { if (BlockUtils.hasBlock(target.getBlockPos())) return true; - if (CWHACK.getFeatures().holeEspFeature.isFullySurrounded(target.getBlockPos())) + if (HoleUtils.isFullySurrounded(target.getBlockPos())) return false; - return CWHACK.getFeatures().holeEspFeature.isSurrounded(target.getBlockPos()); + return HoleUtils.isSurrounded(target.getBlockPos()); } private Entity findTarget() @@ -207,12 +203,13 @@ private BlockPos findCity() .filter(pos -> !BlockUtils.isBlock(Blocks.BEDROCK, pos)) .filter(pos -> BlockUtils.isBlockReachable(pos, range.getValue())) .filter(pos -> !BlockUtils.hasBlock(pos.add(targetPos.subtract(pos)))) + .filter(this::shouldKeepCity) // idk why but we need this .min(Comparator.comparingDouble(pos -> Vec3d.of(pos).squaredDistanceTo(Vec3d.of(target.getBlockPos())))).orElse(null); } - private boolean shouldKeepCity() + private boolean shouldKeepCity(BlockPos pos) { - return BlockUtils.hasBlock(city) && target.squaredDistanceTo(Vec3d.of(city)) <= 4.0f && BlockUtils.isBlockReachable(city, range.getValue()); + return BlockUtils.hasBlock(pos) && target.squaredDistanceTo(Vec3d.of(pos)) <= 4.0f && BlockUtils.isBlockReachable(pos, range.getValue()); } @Override diff --git a/src/main/java/net/cwhack/features/AutoClickerFeature.java b/src/main/java/net/cwhack/features/AutoClickerFeature.java new file mode 100644 index 0000000..f1e3080 --- /dev/null +++ b/src/main/java/net/cwhack/features/AutoClickerFeature.java @@ -0,0 +1,76 @@ +package net.cwhack.features; + +import net.cwhack.feature.Feature; +import net.cwhack.mixinterface.IMouse; +import net.cwhack.setting.BooleanSetting; +import net.cwhack.setting.IntegerSetting; +import net.cwhack.setting.Setting; +import org.lwjgl.glfw.GLFW; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; + +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static net.cwhack.CwHack.MC; + +public class AutoClickerFeature extends Feature +{ + + private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + private ScheduledFuture clickerHandle; + + private final IntegerSetting interval = new IntegerSetting("interval", "the interval of the auto clicker (in milliseconds)", 1000, this); + private final BooleanSetting pauseInGui = new BooleanSetting("pauseInGui", "whether or not the auto clicker should pause in gui", true, this); + + public AutoClickerFeature() + { + super("AutoClicker", "a built-in left click auto clicker"); + addSetting(interval); + addSetting(pauseInGui); + } + + @Override + protected void onEnable() + { + clickerHandle = scheduler.scheduleAtFixedRate(new Clicker(pauseInGui.getValue()), 0, interval.getValue(), MILLISECONDS); + } + + @Override + protected void onDisable() + { + clickerHandle.cancel(false); + } + + @Override + public void onChangeSetting(Setting setting) + { + if (setting == interval && isEnabled()) + { + onDisable(); + onEnable(); + } + } + + private record Clicker(boolean pauseInGui) implements Runnable + { + + @Override + public void run() + { + click(); + } + + private void click() + { + MC.execute(() -> + { + if (MC.currentScreen != null && pauseInGui) + return; + IMouse mouse = (IMouse) MC.mouse; + mouse.cwOnMouseButton(MC.getWindow().getHandle(), GLFW.GLFW_MOUSE_BUTTON_1, GLFW.GLFW_PRESS, 0); + mouse.cwOnMouseButton(MC.getWindow().getHandle(), GLFW.GLFW_MOUSE_BUTTON_1, GLFW.GLFW_RELEASE, 0); + }); + } + } +} diff --git a/src/main/java/net/cwhack/features/AutoCopeFeature.java b/src/main/java/net/cwhack/features/AutoCopeFeature.java index 0d2ca20..5b895ba 100644 --- a/src/main/java/net/cwhack/features/AutoCopeFeature.java +++ b/src/main/java/net/cwhack/features/AutoCopeFeature.java @@ -8,11 +8,10 @@ public class AutoCopeFeature extends Feature implements PacketInputListener { - private TextSetting cope = new TextSetting("copeText", "This will be sent in chat when you die", "faggot kys"); + private TextSetting cope = new TextSetting("copeText", "This will be sent in chat when you die", "faggot kys", this); public AutoCopeFeature() { super("AutoCope", "Automatically sends an excuse in game chat when you die"); - addSetting(cope); } @Override diff --git a/src/main/java/net/cwhack/features/AutoCrystalFeature.java b/src/main/java/net/cwhack/features/AutoCrystalFeature.java index 483ef34..ced9811 100644 --- a/src/main/java/net/cwhack/features/AutoCrystalFeature.java +++ b/src/main/java/net/cwhack/features/AutoCrystalFeature.java @@ -5,6 +5,7 @@ import net.cwhack.feature.Feature; import net.cwhack.setting.IntegerSetting; import net.cwhack.utils.BlockUtils; +import net.cwhack.utils.HoleUtils; import net.cwhack.utils.InventoryUtils; import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; @@ -27,13 +28,13 @@ public class AutoCrystalFeature extends Feature implements UpdateListener, KeyPr private KillAuraFeature killAura; private AnchorAuraFeature anchorAura; - private final IntegerSetting killAuraHotkey = new IntegerSetting("killauraHotkey", "killaura hotkey", -1); + private final IntegerSetting killAuraHotkey = new IntegerSetting("killauraHotkey", "killaura hotkey", -1, this); private boolean usingKillaura = false; - private final IntegerSetting gapHotkey = new IntegerSetting("gapHotkey", "gap hotkey", -1); + private final IntegerSetting gapHotkey = new IntegerSetting("gapHotkey", "gap hotkey", -1, this); private boolean gapping = false; - private final IntegerSetting chorusHotkey = new IntegerSetting("chorusHotkey", "chorus hotkey", -1); + private final IntegerSetting chorusHotkey = new IntegerSetting("chorusHotkey", "chorus hotkey", -1, this); private boolean usingChorusFruit = false; private AutoCrystalState state = AutoCrystalState.CRYSTALLING; @@ -41,9 +42,6 @@ public class AutoCrystalFeature extends Feature implements UpdateListener, KeyPr public AutoCrystalFeature() { super("AutoCrystal", "hvh bot"); - addSetting(killAuraHotkey); - addSetting(gapHotkey); - addSetting(chorusHotkey); } @Override @@ -172,7 +170,7 @@ else if (usingKillaura) if (fastBreak.isMining()) fastBreak.cancelMining(); } - else if (!MC.world.getDimension().isRespawnAnchorWorking() && CWHACK.getFeatures().holeEspFeature.isSurrounded(target.getBlockPos()) && (!BlockUtils.hasBlock(target.getBlockPos().up(2)) || BlockUtils.isBlock(Blocks.RESPAWN_ANCHOR, target.getBlockPos().up(2)))) + else if (!MC.world.getDimension().isRespawnAnchorWorking() && HoleUtils.isSurrounded(target.getBlockPos()) && (!BlockUtils.hasBlock(target.getBlockPos().up(2)) || BlockUtils.isBlock(Blocks.RESPAWN_ANCHOR, target.getBlockPos().up(2))) && InventoryUtils.hasItemInHotbar(item -> item == Items.RESPAWN_ANCHOR) && InventoryUtils.hasItemInHotbar(item -> item == Items.GLOWSTONE)) { killAura.setEnabled(false); crystalAura.setEnabled(false); diff --git a/src/main/java/net/cwhack/features/AutoEzFeature.java b/src/main/java/net/cwhack/features/AutoEzFeature.java index 965bfb4..13b17dc 100644 --- a/src/main/java/net/cwhack/features/AutoEzFeature.java +++ b/src/main/java/net/cwhack/features/AutoEzFeature.java @@ -10,14 +10,12 @@ public class AutoEzFeature extends Feature implements PacketInputListener { - private final TextSetting ezpop = new TextSetting("ezpopText", "This will be sent in chat when someone pops a totem", "ez pop"); - private final TextSetting ggez = new TextSetting("ggezText", "This will be sent in chat when someone dies", "gg ez no re"); + private final TextSetting ezpop = new TextSetting("ezpopText", "This will be sent in chat when someone pops a totem", "ez pop", this); + private final TextSetting ggez = new TextSetting("ggezText", "This will be sent in chat when someone dies", "gg ez no re", this); public AutoEzFeature() { super("AutoEz", "Automatically put a specific line of text in chat after someone pops or dies"); - addSetting(ezpop); - addSetting(ggez); } @Override diff --git a/src/main/java/net/cwhack/features/AutoHeadBobFeature.java b/src/main/java/net/cwhack/features/AutoHeadBobFeature.java new file mode 100644 index 0000000..acd04c3 --- /dev/null +++ b/src/main/java/net/cwhack/features/AutoHeadBobFeature.java @@ -0,0 +1,85 @@ +package net.cwhack.features; + +import net.cwhack.events.FrameBeginListener; +import net.cwhack.feature.Feature; +import net.cwhack.setting.BooleanSetting; +import net.cwhack.setting.DecimalSetting; +import net.minecraft.item.Items; +import net.minecraft.util.Util; + +import java.util.Random; + +import static net.cwhack.CwHack.MC; + +public class AutoHeadBobFeature extends Feature implements FrameBeginListener +{ + + private final DecimalSetting amplitude = new DecimalSetting("amplitude", "how much you want to bob your head", 0.25, this); + private final DecimalSetting frequency = new DecimalSetting("frequency", "how fast you want to bob your head", 5.0, this); + private final BooleanSetting verticalRandomness = new BooleanSetting("verticalRandomness", "whether or not to add random vertical offset", false, this); + private final BooleanSetting horizontalRandomness = new BooleanSetting("horizontalRandomness", "whether or not to add random horizontal offset", false, this); + private final DecimalSetting randomness = new DecimalSetting("randomness", "how random", 0.2, this); + + private final Random rng = new Random(); + + public AutoHeadBobFeature() + { + super("AutoHeadBob", "bob your head like ceeew when crystalling, useful on high ping"); + } + + private long startTime = 0; + private long lastFrame = 0; + + @Override + public void onEnable() + { + startTime = Util.getMeasuringTimeMs(); + lastFrame = startTime; + eventManager.add(FrameBeginListener.class, this); + } + + @Override + public void onDisable() + { + eventManager.remove(FrameBeginListener.class, this); + } + + @Override + public void onFrameBegin() + { + if (MC.player == null) + return; + if (!MC.player.getMainHandStack().isOf(Items.END_CRYSTAL)) + return; + + float tickDelta = MC.getTickDelta(); + long currentTime = Util.getMeasuringTimeMs(); + long delta = currentTime - lastFrame; + lastFrame = currentTime; + + // I want the offset from the starting point of the head bob to be a sin wave, + // so in the beginning of every frame I will calculate the derivative of the wave and add that to the pitch + long timePast = currentTime - startTime; + double f = timePast / 1000.0 * 2.0 * Math.PI * frequency.getValue(); + double g = -Math.cos(f) * amplitude.getValue(); // derivative of sin is cosine + double h = 0.0; + + // random offsets + double random = rng.nextDouble(); + // mapping [0, 1] to [-randomness, randomness] + double randomnessV = randomness.getValue(); + random = random * 2 * randomnessV - randomnessV; + + if (verticalRandomness.getValue()) + g += random; + if (horizontalRandomness.getValue()) + h += random; + + MC.player.changeLookDirection(h, g); + +// float pitch = MC.player.getPitch(); +// float yaw = MC.player.getYaw(); +// MC.player.setPitch(pitch + (float) g); +// MC.player.setYaw(yaw + (float) h); + } +} diff --git a/src/main/java/net/cwhack/features/AutoSurroundFeature.java b/src/main/java/net/cwhack/features/AutoSurroundFeature.java index ee84fc1..06bd66b 100644 --- a/src/main/java/net/cwhack/features/AutoSurroundFeature.java +++ b/src/main/java/net/cwhack/features/AutoSurroundFeature.java @@ -6,6 +6,7 @@ import net.cwhack.utils.BlockUtils; import net.cwhack.utils.ChatUtils; import net.cwhack.utils.InventoryUtils; +import net.minecraft.block.Blocks; import net.minecraft.item.Items; import net.minecraft.util.math.BlockPos; @@ -41,7 +42,9 @@ protected void onDisable() @Override public void onUpdate() { - if (MC.player.isUsingItem() || MC.player.isDead()) + if (MC.player.isUsingItem() || MC.player.isDead() || + !BlockUtils.isBlock(Blocks.OBSIDIAN, MC.player.getBlockPos().down()) + && !BlockUtils.isBlock(Blocks.BEDROCK, MC.player.getBlockPos().down())) return; int has = (int) surround.stream().filter(e -> BlockUtils.hasBlock(MC.player.getBlockPos().add(e))).count(); diff --git a/src/main/java/net/cwhack/features/AutoTotemFeature.java b/src/main/java/net/cwhack/features/AutoTotemFeature.java index af331c7..0b2defd 100644 --- a/src/main/java/net/cwhack/features/AutoTotemFeature.java +++ b/src/main/java/net/cwhack/features/AutoTotemFeature.java @@ -19,8 +19,8 @@ public class AutoTotemFeature extends Feature implements UpdateListener { - private IntegerSetting mode = new IntegerSetting("mode", "mode 0: fast totem, mode 1: inv swap, mode 2: hotbar swap", 0); - private IntegerSetting delay = new IntegerSetting("delay", "the delay for inv swap or hotbar swap", 0); + private final IntegerSetting mode = new IntegerSetting("mode", "mode 0: fast totem, mode 1: inv swap, mode 2: hotbar swap", 0, this); + private final IntegerSetting delay = new IntegerSetting("delay", "the delay for inv swap or hotbar swap", 0, this); private int nextTickSlot; private int totems; @@ -32,8 +32,6 @@ public class AutoTotemFeature extends Feature implements UpdateListener public AutoTotemFeature() { super("AutoTotem", "automatically put a totem on your offhand if there isn't already one"); - addSetting(mode); - addSetting(delay); } @Override diff --git a/src/main/java/net/cwhack/features/AutoWTapFeature.java b/src/main/java/net/cwhack/features/AutoWTapFeature.java new file mode 100644 index 0000000..a4fee6e --- /dev/null +++ b/src/main/java/net/cwhack/features/AutoWTapFeature.java @@ -0,0 +1,86 @@ +package net.cwhack.features; + +import net.cwhack.events.AttackEntityListener; +import net.cwhack.events.PostActionListener; +import net.cwhack.events.PreActionListener; +import net.cwhack.feature.Feature; +import net.cwhack.setting.EnumSetting; +import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket; + +import static net.cwhack.CwHack.MC; + +public class AutoWTapFeature extends Feature implements AttackEntityListener, PreActionListener, PostActionListener +{ + + + private final EnumSetting mode = new EnumSetting<>("mode", "the mode it uses", Mode.values(), Mode.NORMAL, this); + + public AutoWTapFeature() + { + super("AutoWTap", "Automatically sprint reset after each hit"); + } + + @Override + protected void onEnable() + { + eventManager.add(AttackEntityListener.class, this); + eventManager.add(PreActionListener.class, this); + eventManager.add(PostActionListener.class, this); + } + + @Override + protected void onDisable() + { + eventManager.remove(AttackEntityListener.class, this); + eventManager.remove(PreActionListener.class, this); + eventManager.remove(PostActionListener.class, this); + } + + private boolean attacked; + private boolean sprinting; + + @Override + public void onAttackEntity(AttackEntityEvent event) + { + if (mode.getValue() == Mode.PACKET) + { + if (MC.player.isSprinting()) + { + MC.getNetworkHandler().sendPacket(new ClientCommandC2SPacket(MC.player, ClientCommandC2SPacket.Mode.STOP_SPRINTING)); + MC.getNetworkHandler().sendPacket(new ClientCommandC2SPacket(MC.player, ClientCommandC2SPacket.Mode.START_SPRINTING)); + } + return; + } + attacked = true; + sprinting = MC.player.isSprinting(); + } + + @Override + public void onPreAction() + { + if (mode.getValue() == Mode.PACKET) + return; + if (attacked && sprinting) + { + MC.player.setSprinting(false); + } + } + + @Override + public void onPostAction() + { + if (mode.getValue() == Mode.PACKET) + return; + if (attacked && sprinting) + { + MC.player.setSprinting(true); + } + attacked = false; + } + + private enum Mode + { + NORMAL, + PACKET + } +} diff --git a/src/main/java/net/cwhack/features/BlinkFeature.java b/src/main/java/net/cwhack/features/BlinkFeature.java index c286dea..991687a 100644 --- a/src/main/java/net/cwhack/features/BlinkFeature.java +++ b/src/main/java/net/cwhack/features/BlinkFeature.java @@ -10,7 +10,7 @@ public class BlinkFeature extends Feature implements PacketOutputListener { - private ArrayDeque throttledPackets = new ArrayDeque<>(); + private final ArrayDeque throttledPackets = new ArrayDeque<>(); public BlinkFeature() { diff --git a/src/main/java/net/cwhack/features/Bow32kFeature.java b/src/main/java/net/cwhack/features/Bow32kFeature.java index 1d50228..40d0eb5 100644 --- a/src/main/java/net/cwhack/features/Bow32kFeature.java +++ b/src/main/java/net/cwhack/features/Bow32kFeature.java @@ -1,19 +1,18 @@ package net.cwhack.features; +import net.cwhack.events.SendMovementPacketsListener; import net.cwhack.events.StopUsingItemListener; -import net.cwhack.events.UpdateListener; import net.cwhack.feature.Feature; -import net.cwhack.utils.ChatUtils; +import net.cwhack.setting.IntegerSetting; import net.minecraft.item.Items; import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; import static net.cwhack.CwHack.MC; -public class Bow32kFeature extends Feature implements StopUsingItemListener, UpdateListener +public class Bow32kFeature extends Feature implements StopUsingItemListener, SendMovementPacketsListener { - // testing - private boolean activated = false; - private boolean letgo = false; + + private final IntegerSetting power = new IntegerSetting("power", "the power of the hack", 50, this); public Bow32kFeature() { @@ -24,37 +23,34 @@ public Bow32kFeature() protected void onEnable() { eventManager.add(StopUsingItemListener.class, this); - eventManager.add(UpdateListener.class, this); + eventManager.add(SendMovementPacketsListener.class, this); } @Override protected void onDisable() { eventManager.remove(StopUsingItemListener.class, this); - eventManager.remove(UpdateListener.class, this); + eventManager.remove(SendMovementPacketsListener.class, this); } @Override public void onStopUsingItem(StopUsingItemEvent event) { - if (letgo) - return; - if (!MC.player.isHolding(Items.BOW)) + if (!MC.player.getActiveItem().isOf(Items.BOW)) return; - activated = true; - ChatUtils.info("pu"); - - MC.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(MC.player.getX(), MC.player.getY() + 1.0, MC.player.getZ(), MC.player.isOnGround())); + int powerI = power.getValue(); + for (int i = 0; i < powerI; i++) + { + MC.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(MC.player.getX(), MC.player.getY(), MC.player.getZ(), true)); + MC.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(MC.player.getX(), MC.player.getY() + 0.01, MC.player.getZ(), false)); + } } @Override - public void onUpdate() + public void onSendMovementPackets(SendMovementPacketsEvent event) { - if (!activated) + if (!MC.player.getActiveItem().isOf(Items.BOW)) return; - activated = false; - letgo = true; - MC.interactionManager.stopUsingItem(MC.player); - letgo = false; + MC.player.setSprinting(true); } } diff --git a/src/main/java/net/cwhack/features/CrystalAuraFeature.java b/src/main/java/net/cwhack/features/CrystalAuraFeature.java index 2d4a1db..e68979b 100644 --- a/src/main/java/net/cwhack/features/CrystalAuraFeature.java +++ b/src/main/java/net/cwhack/features/CrystalAuraFeature.java @@ -36,22 +36,24 @@ public class CrystalAuraFeature extends Feature implements UpdateListener, KeyPressListener, PostMotionListener, RenderListener { - private final IntegerSetting crystalBreakDelay = new IntegerSetting("crystalBreakDelay", "delay attacking the crystal after it is spawned", 0); - private final IntegerSetting crystalBreakInterval = new IntegerSetting("crystalBreakInterval", "the speed of attacking the crystal", 0); - private final IntegerSetting unmarkBrokenCrystalDelay = new IntegerSetting("unmarkBrokenCrystalDelay", "after a crystal is attacked, the crystalAttacked flag will be turned off again after this delay. Set to 0 to turn off.", 5); - private final IntegerSetting crystalPlaceInterval = new IntegerSetting("crystalPlaceInterval", "the speed of placing the crystals", 0); - private final DecimalSetting placeRange = new DecimalSetting("placeRange", "the attack and place range", 4.5); - private final DecimalSetting breakRange = new DecimalSetting("breakRange", "the attack and place range", 3); - private final DecimalSetting maxSelfDamage = new DecimalSetting("maxSelfDamage", "the maximum damage allowed to deal to yourself", 8); - private final DecimalSetting minDamage = new DecimalSetting("minDamage", "the minimum damage allowed to deal to your enemy", 8); - private final IntegerSetting allowSuicide = new IntegerSetting("allowSuicide", "allow the crystal to pop yourself or kys", 0); - private final IntegerSetting facePlaceHotkey = new IntegerSetting("facePlaceHotkey", "when this key is down face place will be enabled, set to -1 to ignore this option", -1); + private final IntegerSetting crystalBreakDelay = new IntegerSetting("crystalBreakDelay", "delay attacking the crystal after it is spawned", 0, this); + private final IntegerSetting crystalBreakInterval = new IntegerSetting("crystalBreakInterval", "the speed of attacking the crystal", 0, this); + private final IntegerSetting unmarkBrokenCrystalDelay = new IntegerSetting("unmarkBrokenCrystalDelay", "after a crystal is attacked, the crystalAttacked flag will be turned off again after this delay. Set to 0 to turn off.", 5, this); + private final IntegerSetting crystalPlaceInterval = new IntegerSetting("crystalPlaceInterval", "the speed of placing the crystals", 0, this); + private final DecimalSetting placeRange = new DecimalSetting("placeRange", "the attack and place range", 4.5, this); + private final DecimalSetting breakRange = new DecimalSetting("breakRange", "the attack and place range", 4, this); + private final DecimalSetting maxSelfDamage = new DecimalSetting("maxSelfDamage", "the maximum damage allowed to deal to yourself", 8, this); + private final DecimalSetting minDamage = new DecimalSetting("minDamage", "the minimum damage allowed to deal to your enemy", 8, this); + private final IntegerSetting allowSuicide = new IntegerSetting("allowSuicide", "allow the crystal to pop yourself or kys", 0, this); + private final IntegerSetting facePlaceHotkey = new IntegerSetting("facePlaceHotkey", "when this key is down face place will be enabled, set to -1 to ignore this option", -1, this); private boolean isFacePlacing = false; - private boolean attackCrystal = false; + private boolean attackingCrystal = false; private Entity crystalToAttack = null; - private BlockPos placingOn = null; + private BlockHitResult placingOn = null; + + private boolean placingCrystal = false; private int crystalBreakClock; private int crystalPlaceClock; @@ -62,22 +64,12 @@ public class CrystalAuraFeature extends Feature implements UpdateListener, KeyPr public CrystalAuraFeature() { super("CrystalAura", "Automatically place and break crystal around your enemy"); - addSetting(crystalBreakDelay); - addSetting(crystalBreakInterval); - addSetting(unmarkBrokenCrystalDelay); - addSetting(crystalPlaceInterval); - addSetting(placeRange); - addSetting(breakRange); - addSetting(maxSelfDamage); - addSetting(minDamage); - addSetting(allowSuicide); - addSetting(facePlaceHotkey); - eventManager.add(UpdateListener.class, this, 100); } @Override protected void onEnable() { + eventManager.add(UpdateListener.class, this, 100); eventManager.add(KeyPressListener.class, this); eventManager.add(PostMotionListener.class, this); eventManager.add(RenderListener.class, this); @@ -88,6 +80,7 @@ protected void onEnable() @Override protected void onDisable() { + eventManager.remove(UpdateListener.class, this); eventManager.remove(KeyPressListener.class, this);; eventManager.remove(PostMotionListener.class, this); eventManager.remove(RenderListener.class, this); @@ -102,11 +95,6 @@ public void overrideTarget(Entity target) @Override public void onUpdate() { - placingOn = null; - - if (!isEnabled()) - return; - if (!overridingTarget) target = findTarget(); if (target == null) @@ -250,8 +238,7 @@ private boolean doFacePlace() .max(Comparator.comparingDouble(block -> { Vec3d crystalPos = Vec3d.ofBottomCenter(block).add(0, 1, 0); - double targetDamage = DamageUtils.crystalDamage((PlayerEntity) target, crystalPos, true, null, false); - return targetDamage; + return DamageUtils.crystalDamage((PlayerEntity) target, crystalPos, true, null, false); })).orElse(null); if (blockToPlace != null) { @@ -266,7 +253,8 @@ private void attackCrystal(Entity crystal) Vec3d center = crystal.getBoundingBox().getCenter().add(0, -1, 0); CWHACK.getRotationFaker().setServerLookPos(center); crystalToAttack = crystal; - attackCrystal = true; + attackingCrystal = true; + CWHACK.getCrystalDataTracker().recordAttack(crystalToAttack); } public boolean placeCrystal(BlockPos block) @@ -274,32 +262,18 @@ public boolean placeCrystal(BlockPos block) Vec3d eyesPos = RotationUtils.getEyesPos(); Vec3d posVec = Vec3d.ofCenter(block); double distanceSqPosVec = eyesPos.squaredDistanceTo(posVec); - - placingOn = block; - for(Direction side : Direction.values()) { Vec3d hitVec = posVec.add(Vec3d.of(side.getVector()).multiply(0.5)); double distanceSqHitVec = eyesPos.squaredDistanceTo(hitVec); - // check if side is facing towards player if(distanceSqHitVec >= distanceSqPosVec) continue; - CWHACK.getRotationFaker().setServerLookPos(hitVec); - - int slot = MC.player.getInventory().selectedSlot; - if (!InventoryUtils.selectItemFromHotbar(item -> item == Items.END_CRYSTAL)) return false; - - ActionResult result = MC.interactionManager.interactBlock(MC.player, MC.world, Hand.MAIN_HAND, new BlockHitResult(hitVec, side, block, false)); - - if (result.isAccepted()) - MC.player.swingHand(Hand.MAIN_HAND); - - //MC.player.getInventory().selectedSlot = slot; - + placingCrystal = true; + placingOn = new BlockHitResult(hitVec, side, block, false); return true; } @@ -309,13 +283,19 @@ public boolean placeCrystal(BlockPos block) @Override public void onPostMotion() { - if (!attackCrystal) - return; - - MC.interactionManager.attackEntity(MC.player, crystalToAttack); - MC.player.swingHand(Hand.MAIN_HAND); - CWHACK.getCrystalDataTracker().recordAttack(crystalToAttack); - attackCrystal = false; + if (attackingCrystal) + { + MC.interactionManager.attackEntity(MC.player, crystalToAttack); + MC.player.swingHand(Hand.MAIN_HAND); + attackingCrystal = false; + } + if (placingCrystal) + { + ActionResult result = MC.interactionManager.interactBlock(MC.player, MC.world, Hand.MAIN_HAND, placingOn); + if (result.isAccepted()) + MC.player.swingHand(Hand.MAIN_HAND); + placingCrystal = false; + } } @Override @@ -336,10 +316,11 @@ public void onRender(RenderEvent event) RenderSystem.setShader(GameRenderer::getPositionShader); - if (placingOn != null) + if (placingOn != null && placingCrystal) { + BlockPos placingOnBlock = placingOn.getBlockPos(); matrixStack.push(); - matrixStack.translate(placingOn.getX() - regionX, placingOn.getY(), placingOn.getZ() - regionZ); + matrixStack.translate(placingOnBlock.getX() - regionX, placingOnBlock.getY(), placingOnBlock.getZ() - regionZ); RenderSystem.setShaderColor(0.4f, 1.0f, 0.4f, 0.4f); RenderUtils.drawSolidBox(new Box(BlockPos.ORIGIN), matrixStack); diff --git a/src/main/java/net/cwhack/features/CustomItemFeature.java b/src/main/java/net/cwhack/features/CustomItemFeature.java index fd7ebb4..e0fdeef 100644 --- a/src/main/java/net/cwhack/features/CustomItemFeature.java +++ b/src/main/java/net/cwhack/features/CustomItemFeature.java @@ -16,16 +16,13 @@ public class CustomItemFeature extends Feature implements UpdateListener { - private final TextSetting itemName = new TextSetting("itemName", "the item name", ""); - private final TextSetting nbt = new TextSetting("nbt", "the nbt", ""); - private final IntegerSetting count = new IntegerSetting("count", "the number of the item stack", 1); + private final TextSetting itemName = new TextSetting("itemName", "the item name", "", this); + private final TextSetting nbt = new TextSetting("nbt", "the nbt", "", this); + private final IntegerSetting count = new IntegerSetting("count", "the number of the item stack", 1, this); public CustomItemFeature() { super("CustomItem", "uses custom NBT to create item under creative mode"); - addSetting(itemName); - addSetting(nbt); - addSetting(count); } @Override diff --git a/src/main/java/net/cwhack/features/CwCrystalFeature.java b/src/main/java/net/cwhack/features/CwCrystalFeature.java index 16b1671..cf819c0 100644 --- a/src/main/java/net/cwhack/features/CwCrystalFeature.java +++ b/src/main/java/net/cwhack/features/CwCrystalFeature.java @@ -33,10 +33,10 @@ public class CwCrystalFeature extends Feature implements UpdateListener, PostMotionListener { - private final DecimalSetting range = new DecimalSetting("range", "the maximum distance you will attack a crystal", 4); - private final DecimalSetting maxAngle = new DecimalSetting("maxAngle", "the maximum angle you can flick on a crystal", 60); - private final IntegerSetting cooldown = new IntegerSetting("cooldown", "cooldown between each attack", 0); - private final IntegerSetting placeDelay = new IntegerSetting("placeDelay", "place cooldown after attacking the crystal", 0); + private final DecimalSetting range = new DecimalSetting("range", "the maximum distance you will attack a crystal", 4, this); + private final DecimalSetting maxAngle = new DecimalSetting("maxAngle", "the maximum angle you can flick on a crystal", 60, this); + private final IntegerSetting cooldown = new IntegerSetting("cooldown", "cooldown between each attack", 0, this); + private final IntegerSetting placeDelay = new IntegerSetting("placeDelay", "place cooldown after attacking the crystal", 0, this); private Random rand = new Random(); @@ -49,10 +49,6 @@ public class CwCrystalFeature extends Feature implements UpdateListener, PostMot public CwCrystalFeature() { super("CwCrystal", "Automatically place and break nearby crystals"); - addSetting(range); - addSetting(maxAngle); - addSetting(cooldown); - addSetting(placeDelay); } @Override diff --git a/src/main/java/net/cwhack/features/CwCrystalRewriteFeature.java b/src/main/java/net/cwhack/features/CwCrystalRewriteFeature.java index b176fbf..cc355ba 100644 --- a/src/main/java/net/cwhack/features/CwCrystalRewriteFeature.java +++ b/src/main/java/net/cwhack/features/CwCrystalRewriteFeature.java @@ -4,6 +4,7 @@ import net.cwhack.feature.Feature; import net.cwhack.setting.IntegerSetting; import net.cwhack.utils.CrystalUtils; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.decoration.EndCrystalEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -19,19 +20,21 @@ public class CwCrystalRewriteFeature extends Feature implements UpdateListener { - private final IntegerSetting crystalBreakInterval = new IntegerSetting("crystalBreakInterval", "the speed of attacking the crystal", 0); + private final IntegerSetting crystalPlaceInterval = new IntegerSetting("crystalPlaceInterval", "the speed of placing the crystal", 0, this); + private final IntegerSetting crystalBreakInterval = new IntegerSetting("crystalBreakInterval", "the speed of attacking the crystal", 0, this); + private int crystalPlaceClock = 0; private int crystalBreakClock = 0; public CwCrystalRewriteFeature() { super("CwCrystalRewrite", "rewriting for vulcan bypass"); - addSetting(crystalBreakInterval); } @Override public void onEnable() { + crystalPlaceClock = 0; crystalBreakClock = 0; eventManager.add(UpdateListener.class, this); } @@ -47,49 +50,43 @@ private boolean isDeadBodyNearby() return MC.world.getPlayers().parallelStream() .filter(e -> MC.player != e) .filter(e -> e.squaredDistanceTo(MC.player) < 36) - .anyMatch(e -> e.isDead()); + .anyMatch(LivingEntity::isDead); } @Override public void onUpdate() { + boolean dontPlaceCrystal = crystalPlaceClock != 0; boolean dontBreakCrystal = crystalBreakClock != 0; + if (dontPlaceCrystal) + crystalPlaceClock--; if (dontBreakCrystal) crystalBreakClock--; - CrystalAuraFeature ca = CWHACK.getFeatures().crystalAuraFeature; - if (!MC.player.isHolding(Items.END_CRYSTAL)) + ItemStack mainHandStack = MC.player.getMainHandStack(); + if (!mainHandStack.isOf(Items.END_CRYSTAL)) return; if (isDeadBodyNearby()) return; + if (MC.crosshairTarget instanceof BlockHitResult hit) { BlockPos block = hit.getBlockPos(); - if (CrystalUtils.canPlaceCrystalServer(block)) + if (!dontPlaceCrystal && CrystalUtils.canPlaceCrystalServer(block)) { - ItemStack mainHandStack = MC.player.getMainHandStack(); - boolean isMainHand = mainHandStack.isOf(Items.END_CRYSTAL); - if (isMainHand || mainHandStack.isEmpty()) - { - Hand hand = isMainHand ? Hand.MAIN_HAND : Hand.OFF_HAND; - ActionResult result = MC.interactionManager.interactBlock(MC.player, MC.world, hand, hit); - MC.interactionManager.interactItem(MC.player, MC.world, hand); - - if (result == ActionResult.SUCCESS) - MC.player.swingHand(hand); - } + crystalPlaceClock = crystalPlaceInterval.getValue(); + ActionResult result = MC.interactionManager.interactBlock(MC.player, MC.world, Hand.MAIN_HAND, hit); + if (result == ActionResult.SUCCESS) + MC.player.swingHand(Hand.MAIN_HAND); } } if (MC.crosshairTarget instanceof EntityHitResult hit) { - if (hit.getEntity() instanceof EndCrystalEntity crystal) + if (!dontBreakCrystal && hit.getEntity() instanceof EndCrystalEntity crystal) { - if (!dontBreakCrystal) - { - crystalBreakClock = crystalBreakInterval.getValue(); - MC.interactionManager.attackEntity(MC.player, crystal); - MC.player.swingHand(Hand.MAIN_HAND); - CWHACK.getCrystalDataTracker().recordAttack(crystal); - } + crystalBreakClock = crystalBreakInterval.getValue(); + MC.interactionManager.attackEntity(MC.player, crystal); + MC.player.swingHand(Hand.MAIN_HAND); + CWHACK.getCrystalDataTracker().recordAttack(crystal); } } } diff --git a/src/main/java/net/cwhack/features/DerpFeature.java b/src/main/java/net/cwhack/features/DerpFeature.java index 59edb74..66b6921 100644 --- a/src/main/java/net/cwhack/features/DerpFeature.java +++ b/src/main/java/net/cwhack/features/DerpFeature.java @@ -1,16 +1,17 @@ package net.cwhack.features; -import net.cwhack.CwHack; import net.cwhack.events.UpdateListener; import net.cwhack.feature.Feature; -import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; import java.util.Random; +import static net.cwhack.CwHack.CWHACK; +import static net.cwhack.CwHack.MC; + public class DerpFeature extends Feature implements UpdateListener { - private Random random; + private final Random random; public DerpFeature() { @@ -33,8 +34,8 @@ public void onDisable() @Override public void onUpdate() { - float yaw = CwHack.MC.player.getYaw() + random.nextFloat() * 180.0f - 90.0f; + float yaw = MC.player.getYaw() + random.nextFloat() * 180.0f - 90.0f; float pitch = random.nextFloat() * 180.0f - 90.0f; - CwHack.MC.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.LookAndOnGround(yaw, pitch, CwHack.MC.player.isOnGround())); + CWHACK.getRotationFaker().setServerLookAngle(yaw, pitch); } } diff --git a/src/main/java/net/cwhack/features/ElytraBoostFeature.java b/src/main/java/net/cwhack/features/ElytraBoostFeature.java index f2ac68f..47591e7 100644 --- a/src/main/java/net/cwhack/features/ElytraBoostFeature.java +++ b/src/main/java/net/cwhack/features/ElytraBoostFeature.java @@ -14,12 +14,11 @@ public class ElytraBoostFeature extends Feature implements UpdateListener { - private final DecimalSetting speed = new DecimalSetting("speed", "speed", 1.0); + private final DecimalSetting speed = new DecimalSetting("speed", "speed", 1.0, this); public ElytraBoostFeature() { super("ElytraBoost", "fly me to the moon"); - addSetting(speed); } @Override diff --git a/src/main/java/net/cwhack/features/EntityEspFeature.java b/src/main/java/net/cwhack/features/EntityEspFeature.java new file mode 100644 index 0000000..0f39cbf --- /dev/null +++ b/src/main/java/net/cwhack/features/EntityEspFeature.java @@ -0,0 +1,141 @@ +package net.cwhack.features; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.cwhack.events.RenderListener; +import net.cwhack.events.UpdateListener; +import net.cwhack.feature.Feature; +import net.cwhack.utils.RenderUtils; +import net.minecraft.client.render.*; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.util.math.*; +import org.lwjgl.opengl.GL11; + +import java.util.ArrayList; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +import static net.cwhack.CwHack.MC; + +public class EntityEspFeature extends Feature implements UpdateListener, RenderListener +{ + private ArrayList entities; + + public EntityEspFeature() + { + super("EntityESP", "render a tracer and a box at each entities"); + } + + @Override + protected void onEnable() + { + eventManager.add(UpdateListener.class, this); + eventManager.add(RenderListener.class, this); + } + + @Override + protected void onDisable() + { + eventManager.remove(UpdateListener.class, this); + eventManager.remove(RenderListener.class, this); + } + + @Override + public void onRender(RenderEvent event) + { + if (entities == null) + return; + + MatrixStack matrixStack = event.getMatrixStack(); + double partialTicks = event.getPartialTicks(); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glEnable(GL11.GL_LINE_SMOOTH); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + matrixStack.push(); + RenderUtils.applyRegionalRenderOffset(matrixStack); + + BlockPos camPos = RenderUtils.getCameraBlockPos(); + int regionX = (camPos.getX() >> 9) * 512; + int regionZ = (camPos.getZ() >> 9) * 512; + + for (Entity e : entities) + { + float f = 4.0f / MC.player.distanceTo(e); + + Vec3d red = new Vec3d(1.0, 0.0, 0.0); + Vec3d blue = new Vec3d(0.4, 0.4, 1.0); + + Vec3d color = red.multiply(f).add(blue.multiply(1.0 - f)); + + RenderSystem.setShaderColor((float) color.x, (float) color.y, (float) color.z, 0.5f); + + matrixStack.push(); + matrixStack.translate( + MathHelper.lerp(partialTicks, e.prevX, e.getX()) - regionX, + MathHelper.lerp(partialTicks, e.prevY, e.getY()), + MathHelper.lerp(partialTicks, e.prevZ, e.getZ()) - regionZ); + + matrixStack.scale(e.getWidth(), e.getHeight(), e.getWidth()); + + Box bb = new Box(-0.5, 0, -0.5, 0.5, 1, 0.5); + RenderUtils.drawOutlinedBox(bb, matrixStack); + + matrixStack.pop(); + } + + BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer(); + + for (Entity e : entities) + { + Vec3d translation = e.getBoundingBox().getCenter() + .subtract(new Vec3d(e.getX(), e.getY(), e.getZ()) + .subtract(e.prevX, e.prevY, e.prevZ) + .multiply(1 - partialTicks)); + Vec3d start = RenderUtils.getRenderLookVec(partialTicks).subtract(translation).add(RenderUtils.getCameraPos()); + Vec3d end = Vec3d.ZERO; + + float f = 4.0f / MC.player.distanceTo(e); + + Vec3d red = new Vec3d(1.0, 0.0, 0.0); + Vec3d blue = new Vec3d(0.4, 0.4, 1.0); + + Vec3d color = red.multiply(f).add(blue.multiply(1.0 - f)); + + RenderSystem.setShaderColor((float) color.x, (float) color.y, (float) color.z, 0.5f); + bufferBuilder.begin(VertexFormat.DrawMode.DEBUG_LINES, VertexFormats.POSITION); + + matrixStack.push(); + matrixStack.translate(translation.getX() - regionX, translation.getY(), translation.getZ() - regionZ); + Matrix4f matrix = matrixStack.peek().getPositionMatrix(); + bufferBuilder.vertex(matrix, (float) start.x, (float) start.y, (float) start.z).next(); + bufferBuilder.vertex(matrix, (float) end.x, (float) end.y, (float) end.z).next(); + matrixStack.pop(); + + bufferBuilder.end(); + BufferRenderer.draw(bufferBuilder); + } + + matrixStack.pop(); + RenderSystem.setShaderColor(1, 1, 1, 1); + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glDisable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_LINE_SMOOTH); + } + + @Override + public void onUpdate() + { + entities = StreamSupport.stream(MC.world.getEntities().spliterator(), true) + .filter(e -> !(e instanceof PlayerEntity)) + .filter(e -> !e.isRemoved()) + .filter(e -> !(e instanceof LivingEntity) || !((LivingEntity) e).isDead()) + //.filter(e -> !(e instanceof ItemEntity)) + .collect(Collectors.toCollection(ArrayList::new)); + } + +} diff --git a/src/main/java/net/cwhack/features/FakePlayerFeature.java b/src/main/java/net/cwhack/features/FakePlayerFeature.java new file mode 100644 index 0000000..0bc24de --- /dev/null +++ b/src/main/java/net/cwhack/features/FakePlayerFeature.java @@ -0,0 +1,38 @@ +package net.cwhack.features; + +import com.mojang.authlib.GameProfile; +import net.cwhack.feature.Feature; +import net.minecraft.client.network.OtherClientPlayerEntity; +import net.minecraft.entity.Entity; +import net.minecraft.util.math.Vec3d; + +import static net.cwhack.CwHack.MC; + +public class FakePlayerFeature extends Feature +{ + + public FakePlayerFeature() + { + super("FakePlayer", "spawn a fake player for testing purposes"); + } + + int id; + + @Override + protected void onEnable() + { + OtherClientPlayerEntity player = new OtherClientPlayerEntity(MC.world, new GameProfile(null, "fit")); + Vec3d pos = MC.player.getPos(); + player.updateTrackedPosition(pos); + player.updatePositionAndAngles(pos.x, pos.y, pos.z, MC.player.getYaw(), MC.player.getPitch()); + player.resetPosition(); + MC.world.addPlayer(player.getId(), player); + id = player.getId(); + } + + @Override + protected void onDisable() + { + MC.world.removeEntity(id, Entity.RemovalReason.DISCARDED); + } +} diff --git a/src/main/java/net/cwhack/features/FastBreakFeature.java b/src/main/java/net/cwhack/features/FastBreakFeature.java index ca8132f..f0a21a8 100644 --- a/src/main/java/net/cwhack/features/FastBreakFeature.java +++ b/src/main/java/net/cwhack/features/FastBreakFeature.java @@ -20,8 +20,8 @@ public class FastBreakFeature extends Feature implements PacketOutputListener, UpdateListener { - private DecimalSetting range = new DecimalSetting("range", "how far can you reach the block", 4.5); - private IntegerSetting delay = new IntegerSetting("delay", "the delay for it to send stop digging packet", 0); + private final DecimalSetting range = new DecimalSetting("range", "how far can you reach the block", 4.5, this); + private final IntegerSetting delay = new IntegerSetting("delay", "the delay for it to send stop digging packet", 0, this); private int delayClock = 0; private boolean letgo = false; @@ -33,8 +33,6 @@ public class FastBreakFeature extends Feature implements PacketOutputListener, U public FastBreakFeature() { super("FastBreak", "break fast"); - addSetting(range); - addSetting(delay); } @Override diff --git a/src/main/java/net/cwhack/features/FeatureListFeature.java b/src/main/java/net/cwhack/features/FeatureListFeature.java index 4f78ac0..ac3e21e 100644 --- a/src/main/java/net/cwhack/features/FeatureListFeature.java +++ b/src/main/java/net/cwhack/features/FeatureListFeature.java @@ -10,7 +10,7 @@ public class FeatureListFeature extends Feature implements GUIRenderListener { - private DecimalSetting scale = new DecimalSetting("scale", "scale of the text", 2.0); + private final DecimalSetting scale = new DecimalSetting("scale", "scale of the text", 2.0, this); private int textColor = 0x049933ff; private int posY; @@ -18,7 +18,6 @@ public class FeatureListFeature extends Feature implements GUIRenderListener public FeatureListFeature() { super("FeatureList", "display a list of enabled feature on the screen"); - addSetting(scale); } @Override diff --git a/src/main/java/net/cwhack/features/FlightFeature.java b/src/main/java/net/cwhack/features/FlightFeature.java index 5ee1871..a1b8b67 100644 --- a/src/main/java/net/cwhack/features/FlightFeature.java +++ b/src/main/java/net/cwhack/features/FlightFeature.java @@ -16,8 +16,8 @@ public class FlightFeature extends Feature implements UpdateListener, SendMovementPacketsListener, PreMotionListener, PostMotionListener { - private final DecimalSetting speed = new DecimalSetting("speed", "the speed of flying", 0.5); - private final EnumSetting bypass = new EnumSetting<>("bypass", "the bypass method this module will use", BypassSetting.values(), BypassSetting.NONE); + private final DecimalSetting speed = new DecimalSetting("speed", "the speed of flying", 0.5, this); + private final EnumSetting bypass = new EnumSetting<>("bypass", "the bypass method this module will use", BypassSetting.values(), BypassSetting.NONE, this); enum BypassSetting { @@ -28,8 +28,6 @@ enum BypassSetting public FlightFeature() { super("Flight", "reeee"); - addSetting(speed); - addSetting(bypass); } @Override @@ -56,7 +54,7 @@ public void onUpdate() { ClientPlayerEntity player = MC.player; - player.flyingSpeed = speed.getValueF(); + player.airStrafingSpeed = speed.getValueF(); player.setVelocity(0, 0, 0); Vec3d velocity = player.getVelocity(); diff --git a/src/main/java/net/cwhack/features/FreecamFeature.java b/src/main/java/net/cwhack/features/FreecamFeature.java index d12dc5a..a223028 100644 --- a/src/main/java/net/cwhack/features/FreecamFeature.java +++ b/src/main/java/net/cwhack/features/FreecamFeature.java @@ -12,10 +12,10 @@ import static net.cwhack.CwHack.MC; -public class FreecamFeature extends Feature implements UpdateListener, PlayerTickMovementListener, PacketOutputListener, PacketInputListener, IsPlayerTouchingWaterListener, IsPlayerInLavaListener, SetOpaqueCubeListener, IsFullCubeListener, GameLeaveListener +public class FreecamFeature extends Feature implements UpdateListener, PlayerTickMovementListener, PacketOutputListener, PacketInputListener, IsPlayerTouchingWaterListener, IsPlayerInLavaListener, SetOpaqueCubeListener, GameLeaveListener { - private final DecimalSetting speed = new DecimalSetting("speed", "speed", 1.0); + private final DecimalSetting speed = new DecimalSetting("speed", "speed", 1.0, this); private Vec3d oldPos; private float oldYaw; @@ -36,7 +36,6 @@ protected void onEnable() eventManager.add(IsPlayerTouchingWaterListener.class, this); eventManager.add(IsPlayerInLavaListener.class, this); eventManager.add(SetOpaqueCubeListener.class, this); - eventManager.add(IsFullCubeListener.class, this); eventManager.add(GameLeaveListener.class, this); if (MC.player == null) return; @@ -55,7 +54,6 @@ protected void onDisable() eventManager.remove(IsPlayerTouchingWaterListener.class, this); eventManager.remove(IsPlayerInLavaListener.class, this); eventManager.remove(SetOpaqueCubeListener.class, this); - eventManager.remove(IsFullCubeListener.class, this); eventManager.remove(GameLeaveListener.class, this); if (MC.player == null) return; @@ -76,7 +74,7 @@ public void onUpdate() player.setPose(EntityPose.STANDING); player.setOnGround(false); - player.flyingSpeed = speed.getValueF(); + player.airStrafingSpeed = speed.getValueF(); Vec3d velocity = player.getVelocity(); if(MC.options.keyJump.isPressed()) @@ -130,12 +128,6 @@ public void onSetOpaqueCube(SetOpaqueCubeEvent event) event.cancel(); } - @Override - public void onIsFullCube(IsFullCubeEvent event) - { - event.cancel(); - } - @Override public void onGameLeave() { diff --git a/src/main/java/net/cwhack/features/GhostHandFeature.java b/src/main/java/net/cwhack/features/GhostHandFeature.java new file mode 100644 index 0000000..1cffe17 --- /dev/null +++ b/src/main/java/net/cwhack/features/GhostHandFeature.java @@ -0,0 +1,96 @@ +package net.cwhack.features; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.cwhack.events.GetOutlineShapeListener; +import net.cwhack.events.RenderListener; +import net.cwhack.feature.Feature; +import net.cwhack.utils.BlockUtils; +import net.cwhack.utils.RenderUtils; +import net.minecraft.block.Blocks; +import net.minecraft.block.ChestBlock; +import net.minecraft.block.ShapeContext; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.hit.HitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.shape.VoxelShapes; +import org.lwjgl.opengl.GL11; + +import static net.cwhack.CwHack.MC; + +public class GhostHandFeature extends Feature implements GetOutlineShapeListener, RenderListener +{ + + public GhostHandFeature() + { + super("GhostHand", "loot jewer Lolllll"); + } + + @Override + protected void onEnable() + { + eventManager.add(GetOutlineShapeListener.class, this); + eventManager.add(RenderListener.class, this); + } + + @Override + protected void onDisable() + { + eventManager.remove(GetOutlineShapeListener.class, this); + eventManager.remove(RenderListener.class, this); + } + + @Override + public void onGetOutlineShape(GetOutlineShapeEvent event) + { + if (event.getContext() != ShapeContext.absent() && event.getView() == MC.world && !BlockUtils.isContainer(event.getPos())) + event.setReturnValue(VoxelShapes.empty()); + } + + @Override + public void onRender(RenderEvent event) + { + if (MC.crosshairTarget == null) + return; + if (MC.crosshairTarget.getType() != HitResult.Type.BLOCK) + return; + BlockPos block = ((BlockHitResult) MC.crosshairTarget).getBlockPos(); + + RenderSystem.setShaderColor(0.4f, 0.4f, 1, 1.0f); + + if (BlockUtils.isBlock(Blocks.CHEST, block) || BlockUtils.isBlock(Blocks.TRAPPED_CHEST, block)) + { + if (ChestBlock.isChestBlocked(MC.world, block)) + RenderSystem.setShaderColor(1, 0.4f, 0.4f, 1.0f); + } + + MatrixStack matrixStack = event.getMatrixStack(); + double partialTicks = event.getPartialTicks(); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glEnable(GL11.GL_LINE_SMOOTH); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + matrixStack.push(); + RenderUtils.applyRegionalRenderOffset(matrixStack); + + BlockPos camPos = RenderUtils.getCameraBlockPos(); + int regionX = (camPos.getX() >> 9) * 512; + int regionZ = (camPos.getZ() >> 9) * 512; + + matrixStack.push(); + matrixStack.translate( + block.getX() - regionX, + block.getY(), + block.getZ() - regionZ); + RenderUtils.drawSolidBox(BlockUtils.getBlockState(block).getOutlineShape(MC.world, block).getBoundingBox(), matrixStack); + matrixStack.pop(); + + matrixStack.pop(); + RenderSystem.setShaderColor(1, 1, 1, 1); + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glDisable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_LINE_SMOOTH); + } +} diff --git a/src/main/java/net/cwhack/features/HoleEspFeature.java b/src/main/java/net/cwhack/features/HoleEspFeature.java index cc2aacb..a52f7af 100644 --- a/src/main/java/net/cwhack/features/HoleEspFeature.java +++ b/src/main/java/net/cwhack/features/HoleEspFeature.java @@ -5,15 +5,14 @@ import net.cwhack.events.UpdateListener; import net.cwhack.feature.Feature; import net.cwhack.utils.BlockUtils; +import net.cwhack.utils.HoleUtils; import net.cwhack.utils.RenderUtils; import net.cwhack.utils.RotationUtils; -import net.minecraft.block.Blocks; import net.minecraft.client.render.GameRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.math.Vec3f; -import net.minecraft.util.math.Vec3i; import org.lwjgl.opengl.GL11; import java.util.ArrayList; @@ -48,10 +47,10 @@ protected void onDisable() @Override public void onUpdate() { - deepHoles = getPossibleHoles().filter(this::isFullySurrounded) + deepHoles = getPossibleHoles().filter(HoleUtils::isFullySurrounded) .collect(Collectors.toCollection(ArrayList::new)); - shallowHoles = getPossibleHoles().filter(pos -> isSurrounded(pos) && !isFullySurrounded(pos)) + shallowHoles = getPossibleHoles().filter(pos -> HoleUtils.isSurrounded(pos) && HoleUtils.isFullySurrounded(pos)) .collect(Collectors.toCollection(ArrayList::new)); } @@ -72,26 +71,6 @@ private Stream getPossibleHoles() .filter(pos -> !BlockUtils.hasBlock(pos)); } - public boolean isFullySurrounded(BlockPos pos) - { - return BlockUtils.isBlock(Blocks.BEDROCK, pos.add(new Vec3i(1, 0, 0))) - && BlockUtils.isBlock(Blocks.BEDROCK, pos.add(new Vec3i(0, 0, 1))) - && BlockUtils.isBlock(Blocks.BEDROCK, pos.add(new Vec3i(-1, 0, 0))) - && BlockUtils.isBlock(Blocks.BEDROCK, pos.add(new Vec3i(0, 0, -1))) - && BlockUtils.isBlock(Blocks.BEDROCK, pos.add(new Vec3i(0, -1, 0))) - && !BlockUtils.hasBlock(pos.add(0, 1, 0)); - } - - public boolean isSurrounded(BlockPos pos) - { - return (BlockUtils.isBlock(Blocks.BEDROCK, pos.add(new Vec3i(1, 0, 0))) || BlockUtils.isBlock(Blocks.OBSIDIAN, pos.add(new Vec3i(1, 0, 0)))) - && (BlockUtils.isBlock(Blocks.BEDROCK, pos.add(new Vec3i(0, 0, 1))) || BlockUtils.isBlock(Blocks.OBSIDIAN, pos.add(new Vec3i(0, 0, 1)))) - && (BlockUtils.isBlock(Blocks.BEDROCK, pos.add(new Vec3i(-1, 0, 0))) || BlockUtils.isBlock(Blocks.OBSIDIAN, pos.add(new Vec3i(-1, 0, 0)))) - && (BlockUtils.isBlock(Blocks.BEDROCK, pos.add(new Vec3i(0, 0, -1))) || BlockUtils.isBlock(Blocks.OBSIDIAN, pos.add(new Vec3i(0, 0, -1)))) - && (BlockUtils.isBlock(Blocks.BEDROCK, pos.add(new Vec3i(0, -1, 0))) || BlockUtils.isBlock(Blocks.OBSIDIAN, pos.add(new Vec3i(0, -1, 0)))) - && !BlockUtils.hasBlock(pos.add(0, 1, 0)); - } - private void drawHole(MatrixStack matrixStack, BlockPos pos, Vec3f color) { GL11.glEnable(GL11.GL_BLEND); diff --git a/src/main/java/net/cwhack/features/KillAuraFeature.java b/src/main/java/net/cwhack/features/KillAuraFeature.java index 3123962..55b2d4d 100644 --- a/src/main/java/net/cwhack/features/KillAuraFeature.java +++ b/src/main/java/net/cwhack/features/KillAuraFeature.java @@ -13,6 +13,7 @@ import net.minecraft.util.math.Vec3d; import java.util.Comparator; +import java.util.stream.StreamSupport; import static net.cwhack.CwHack.CWHACK; import static net.cwhack.CwHack.MC; @@ -20,9 +21,9 @@ public class KillAuraFeature extends Feature implements UpdateListener, PostMotionListener { - private final DecimalSetting range = new DecimalSetting("range", "the range you will attack the player", 3.0); - private final IntegerSetting critical = new IntegerSetting("critical", "whether or not to use critical hits", 1); - private final DecimalSetting cooldown = new DecimalSetting("cooldown", "the required cooldown progress for the next attack", 1.0); + private final DecimalSetting range = new DecimalSetting("range", "the range you will attack the player", 3.0, this); + private final IntegerSetting critical = new IntegerSetting("critical", "whether or not to use critical hits", 1, this); + private final DecimalSetting cooldown = new DecimalSetting("cooldown", "the required cooldown progress for the next attack", 1.0, this); private Entity target; private boolean overridingTarget = false; @@ -32,9 +33,6 @@ public class KillAuraFeature extends Feature implements UpdateListener, PostMoti public KillAuraFeature() { super("KillAura", "killaura"); - addSetting(range); - addSetting(critical); - addSetting(cooldown); } @Override @@ -54,10 +52,11 @@ protected void onDisable() private Entity findTarget() { - return MC.world.getPlayers().stream() + return StreamSupport.stream(MC.world.getEntities().spliterator(), true) .filter(e -> e != MC.player) - .filter(LivingEntity::isAlive) - .filter(e -> e.getHealth() > 0.0f) + .filter(e -> e instanceof LivingEntity) + .filter(e -> ((LivingEntity) e).getHealth() > 0.0f) + .filter(e -> e.squaredDistanceTo(MC.player) <= range.getValue() * range.getValue()) .min(Comparator.comparingDouble(e -> RotationUtils.getAngleToLookVec(e.getBoundingBox().getCenter()))).orElse(null); } diff --git a/src/main/java/net/cwhack/features/LocalOreGenFeature.java b/src/main/java/net/cwhack/features/LocalOreGenFeature.java index f487d0d..ed5348a 100644 --- a/src/main/java/net/cwhack/features/LocalOreGenFeature.java +++ b/src/main/java/net/cwhack/features/LocalOreGenFeature.java @@ -7,7 +7,7 @@ public class LocalOreGenFeature extends Feature implements RenderListener { - private final TextSetting seed = new TextSetting("seed", "the seed used for ore generation", ""); + private final TextSetting seed = new TextSetting("seed", "the seed used for ore generation", "", this); public LocalOreGenFeature() { diff --git a/src/main/java/net/cwhack/features/MarlowAnchorFeature.java b/src/main/java/net/cwhack/features/MarlowAnchorFeature.java new file mode 100644 index 0000000..06818ae --- /dev/null +++ b/src/main/java/net/cwhack/features/MarlowAnchorFeature.java @@ -0,0 +1,50 @@ +package net.cwhack.features; + +import net.cwhack.events.UpdateListener; +import net.cwhack.feature.Feature; +import net.cwhack.utils.BlockUtils; +import net.minecraft.item.Items; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; + +import static net.cwhack.CwHack.MC; + +public class MarlowAnchorFeature extends Feature implements UpdateListener +{ + public MarlowAnchorFeature() + { + super("MarlowAnchor", "lalalalalalalalala alalala"); + } + + @Override + protected void onEnable() + { + eventManager.add(UpdateListener.class, this); + } + + @Override + protected void onDisable() + { + eventManager.remove(UpdateListener.class, this); + } + + @Override + public void onUpdate() + { + if (MC.crosshairTarget instanceof BlockHitResult hit) + { + BlockPos pos = hit.getBlockPos(); + if (BlockUtils.isAnchorCharged(pos)) + { + if (!MC.player.isHolding(Items.GLOWSTONE)) + { + ActionResult actionResult = MC.interactionManager.interactBlock(MC.player, MC.world, Hand.MAIN_HAND, hit); + if (actionResult.isAccepted() && actionResult.shouldSwingHand()) + MC.player.swingHand(Hand.MAIN_HAND); + } + } + } + } +} diff --git a/src/main/java/net/cwhack/features/NameTagFeature.java b/src/main/java/net/cwhack/features/NameTagFeature.java index 831c7ec..dc8e102 100644 --- a/src/main/java/net/cwhack/features/NameTagFeature.java +++ b/src/main/java/net/cwhack/features/NameTagFeature.java @@ -23,14 +23,13 @@ public class NameTagFeature extends Feature implements RenderListener, GUIRenderListener, RenderNameTagListener, UpdateListener { - private DecimalSetting scale = new DecimalSetting("scale", "scale of the nametags", 1.0); + private final DecimalSetting scale = new DecimalSetting("scale", "scale of the nametags", 1.0, this); private ArrayList players = new ArrayList<>(); public NameTagFeature() { super("NameTag", "display armor and holding item of players"); - addSetting(scale); } @Override diff --git a/src/main/java/net/cwhack/features/PearlPhaseFeature.java b/src/main/java/net/cwhack/features/PearlPhaseFeature.java index 913a1c2..19562e1 100644 --- a/src/main/java/net/cwhack/features/PearlPhaseFeature.java +++ b/src/main/java/net/cwhack/features/PearlPhaseFeature.java @@ -1,6 +1,6 @@ package net.cwhack.features; -import net.cwhack.events.IsFullCubeListener; +import net.cwhack.events.PlayerJumpListener; import net.cwhack.events.PlayerTickMovementListener; import net.cwhack.events.SetOpaqueCubeListener; import net.cwhack.events.UpdateListener; @@ -11,7 +11,7 @@ import static net.cwhack.CwHack.MC; -public class PearlPhaseFeature extends Feature implements UpdateListener, PlayerTickMovementListener, IsFullCubeListener, SetOpaqueCubeListener +public class PearlPhaseFeature extends Feature implements UpdateListener, PlayerTickMovementListener, SetOpaqueCubeListener, PlayerJumpListener { public PearlPhaseFeature() @@ -24,8 +24,8 @@ protected void onEnable() { eventManager.add(UpdateListener.class, this); eventManager.add(PlayerTickMovementListener.class, this); - eventManager.add(IsFullCubeListener.class, this); eventManager.add(SetOpaqueCubeListener.class, this); + eventManager.add(PlayerJumpListener.class, this); } @Override @@ -33,17 +33,11 @@ protected void onDisable() { eventManager.remove(UpdateListener.class, this); eventManager.remove(PlayerTickMovementListener.class, this); - eventManager.remove(IsFullCubeListener.class, this); eventManager.remove(SetOpaqueCubeListener.class, this); + eventManager.remove(PlayerJumpListener.class, this); MC.player.noClip = false; } - @Override - public void onIsFullCube(IsFullCubeEvent event) - { - event.cancel(); - } - @Override public void onPlayerTickMovement(PlayerTickMovementEvent event) { @@ -75,7 +69,7 @@ public void onUpdate() player.setVelocity(0, 0, 0); float speed = 0.02F; - player.flyingSpeed = speed; + player.airStrafingSpeed = speed; if (MC.options.keyJump.isPressed()) { @@ -87,6 +81,14 @@ public void onUpdate() } } + @Override + public void onPlayerJump(PlayerJumpEvent event) + { + if (!collidingBlocks()) + return; + event.cancel(); + } + private boolean collidingBlocks() { ClientPlayerEntity player = MC.player; @@ -101,6 +103,6 @@ private boolean wouldCollideAt(BlockPos pos) { Box box = MC.player.getBoundingBox(); Box box2 = (new Box(pos.getX(), box.minY, pos.getZ(), (double)pos.getX() + 1.0D, box.maxY, (double)pos.getZ() + 1.0D)).contract(1.0E-7D); - return MC.world.hasBlockCollision(MC.player, box2, (state, posx) -> state.shouldSuffocate(MC.world, posx)); + return MC.world.canCollide(MC.player, box2); } } diff --git a/src/main/java/net/cwhack/features/PingSpoofFeature.java b/src/main/java/net/cwhack/features/PingSpoofFeature.java index f099af5..c37ec9c 100644 --- a/src/main/java/net/cwhack/features/PingSpoofFeature.java +++ b/src/main/java/net/cwhack/features/PingSpoofFeature.java @@ -15,14 +15,13 @@ public class PingSpoofFeature extends Feature implements PacketOutputListener, PacketInputListener { - private IntegerSetting ping = new IntegerSetting("ping", "the ping that will be added onto your current ping", 0); + private final IntegerSetting ping = new IntegerSetting("ping", "the ping that will be added onto your current ping", 0, this); - private ScheduledExecutorService scheduler = new ScheduledThreadPoolExecutor(1000); + private final ScheduledExecutorService scheduler = new ScheduledThreadPoolExecutor(1000); public PingSpoofFeature() { - super("PingSpoof", "delay all of your outgoing and incoming packets"); - addSetting(ping); + super("PingSpoof", "delay all of your outgoing"); } @Override diff --git a/src/main/java/net/cwhack/features/PlayerEspFeature.java b/src/main/java/net/cwhack/features/PlayerEspFeature.java index daecaba..4f7ae9b 100644 --- a/src/main/java/net/cwhack/features/PlayerEspFeature.java +++ b/src/main/java/net/cwhack/features/PlayerEspFeature.java @@ -64,6 +64,15 @@ public void onRender(RenderEvent event) for (PlayerEntity e : players) { + float f = 4.0f / MC.player.distanceTo(e); + + Vec3d red = new Vec3d(1.0, 0.0, 0.0); + Vec3d blue = new Vec3d(0.4, 0.4, 1.0); + + Vec3d color = red.multiply(f).add(blue.multiply(1.0 - f)); + + RenderSystem.setShaderColor((float) color.x, (float) color.y, (float) color.z, 0.5f); + matrixStack.push(); matrixStack.translate( MathHelper.lerp(partialTicks, e.prevX, e.getX()) - regionX, @@ -72,7 +81,6 @@ public void onRender(RenderEvent event) matrixStack.scale(e.getWidth(), e.getHeight(), e.getWidth()); - RenderSystem.setShaderColor(0.4f, 0.4f, 1, 0.5f); if (CWHACK.getFriendList().isFriend(e)) RenderSystem.setShaderColor(0.4f, 1.0f, 0.4f, 0.5f); @@ -82,17 +90,16 @@ public void onRender(RenderEvent event) matrixStack.pop(); } - Vec3d start = RenderUtils.getRenderLookVec(partialTicks).add(RenderUtils.getCameraPos()); - - Matrix4f matrix = matrixStack.peek().getModel(); BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer(); for (PlayerEntity e : players) { - Vec3d end = e.getBoundingBox().getCenter() + Vec3d translation = e.getBoundingBox().getCenter() .subtract(new Vec3d(e.getX(), e.getY(), e.getZ()) .subtract(e.prevX, e.prevY, e.prevZ) .multiply(1 - partialTicks)); + Vec3d start = RenderUtils.getRenderLookVec(partialTicks).subtract(translation).add(RenderUtils.getCameraPos()); + Vec3d end = Vec3d.ZERO; float f = 4.0f / MC.player.distanceTo(e); @@ -107,10 +114,12 @@ public void onRender(RenderEvent event) bufferBuilder.begin(VertexFormat.DrawMode.DEBUG_LINES, VertexFormats.POSITION); - bufferBuilder.vertex(matrix, (float)start.x - regionX, - (float)start.y, (float)start.z - regionZ).next(); - bufferBuilder.vertex(matrix, (float)end.x - regionX, (float)end.y, - (float)end.z - regionZ).next(); + matrixStack.push(); + matrixStack.translate(translation.getX() - regionX, translation.getY(), translation.getZ() - regionZ); + Matrix4f matrix = matrixStack.peek().getPositionMatrix(); + bufferBuilder.vertex(matrix, (float) start.x, (float) start.y, (float) start.z).next(); + bufferBuilder.vertex(matrix, (float) end.x, (float) end.y, (float) end.z).next(); + matrixStack.pop(); bufferBuilder.end(); BufferRenderer.draw(bufferBuilder); @@ -129,7 +138,7 @@ public void onUpdate() players = MC.world.getPlayers().parallelStream() .filter(e -> e != MC.player) .filter(e -> !e.isRemoved()) - .filter(e -> e.getHealth() > 0) + .filter(e -> !e.isDead()) .collect(Collectors.toCollection(ArrayList::new)); } } diff --git a/src/main/java/net/cwhack/features/StasisExploitFeature.java b/src/main/java/net/cwhack/features/StasisExploitFeature.java index b25f859..352615e 100644 --- a/src/main/java/net/cwhack/features/StasisExploitFeature.java +++ b/src/main/java/net/cwhack/features/StasisExploitFeature.java @@ -13,12 +13,11 @@ public class StasisExploitFeature extends Feature implements PacketInputListener { - private final DecimalSetting distance = new DecimalSetting("distance", "the distance that will trigger it", 128.0); + private final DecimalSetting distance = new DecimalSetting("distance", "the distance that will trigger it", 128.0, this); public StasisExploitFeature() { super("StasisExploit", "print any player's coords when they teleport really far away using pearls"); - addSetting(distance); } @Override diff --git a/src/main/java/net/cwhack/features/StorageEspFeature.java b/src/main/java/net/cwhack/features/StorageEspFeature.java new file mode 100644 index 0000000..f8e3807 --- /dev/null +++ b/src/main/java/net/cwhack/features/StorageEspFeature.java @@ -0,0 +1,119 @@ +package net.cwhack.features; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.cwhack.events.RenderListener; +import net.cwhack.feature.Feature; +import net.cwhack.mixinterface.IWorld; +import net.cwhack.utils.RenderUtils; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.LockableContainerBlockEntity; +import net.minecraft.client.render.*; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Matrix4f; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.chunk.BlockEntityTickInvoker; +import org.lwjgl.opengl.GL11; + +import static net.cwhack.CwHack.MC; + +public class StorageEspFeature extends Feature implements RenderListener +{ + + public StorageEspFeature() + { + super("StorageESP", "esp for containers"); + } + + @Override + protected void onEnable() + { + eventManager.add(RenderListener.class, this); + } + + @Override + protected void onDisable() + { + eventManager.remove(RenderListener.class, this); + } + + @Override + public void onRender(RenderEvent event) + { + MatrixStack matrixStack = event.getMatrixStack(); + double partialTicks = event.getPartialTicks(); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glEnable(GL11.GL_LINE_SMOOTH); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + matrixStack.push(); + RenderUtils.applyRegionalRenderOffset(matrixStack); + + BlockPos camPos = RenderUtils.getCameraBlockPos(); + int regionX = (camPos.getX() >> 9) * 512; + int regionZ = (camPos.getZ() >> 9) * 512; + + BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer(); + bufferBuilder.begin(VertexFormat.DrawMode.QUADS, + VertexFormats.POSITION); + RenderSystem.setShader(GameRenderer::getPositionShader); + RenderSystem.setShaderColor(0.4f, 0.4f, 1, 0.5f); + for (BlockEntityTickInvoker blockEntityTicker : ((IWorld) MC.world).getBlockEntityTickers()) + { + BlockPos pos = blockEntityTicker.getPos(); + BlockEntity blockEntity = MC.world.getBlockEntity(pos); + if (blockEntity instanceof LockableContainerBlockEntity) + { + Box bb = blockEntity.getCachedState().getOutlineShape(MC.world, pos).getBoundingBox(); + + matrixStack.push(); + matrixStack.translate( + pos.getX() - regionX, + pos.getY(), + pos.getZ() - regionZ); + + RenderUtils.fillBox(bufferBuilder, bb, matrixStack); + + matrixStack.pop(); + } + } + + bufferBuilder.end(); + BufferRenderer.draw(bufferBuilder); + + bufferBuilder.begin(VertexFormat.DrawMode.DEBUG_LINES, VertexFormats.POSITION); + for (BlockEntityTickInvoker blockEntityTicker : ((IWorld) MC.world).getBlockEntityTickers()) + { + BlockPos pos = blockEntityTicker.getPos(); + BlockEntity blockEntity = MC.world.getBlockEntity(pos); + if (blockEntity instanceof LockableContainerBlockEntity) + { + Box bb = blockEntity.getCachedState().getOutlineShape(MC.world, pos).getBoundingBox(); + + matrixStack.push(); + matrixStack.translate(pos.getX() - regionX, pos.getY(), pos.getZ() - regionZ); + Matrix4f matrix1 = matrixStack.peek().getPositionMatrix(); + + Vec3d end = bb.getCenter(); + + Vec3d start = RenderUtils.getRenderLookVec(partialTicks).subtract(Vec3d.of(pos)).add(RenderUtils.getCameraPos()); + bufferBuilder.vertex(matrix1, (float) start.x, (float) start.y, (float) start.z).next(); + bufferBuilder.vertex(matrix1, (float) end.x, (float) end.y, (float) end.z).next(); + + matrixStack.pop(); + } + } + + bufferBuilder.end(); + BufferRenderer.draw(bufferBuilder); + + matrixStack.pop(); + RenderSystem.setShaderColor(1, 1, 1, 1); + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glDisable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_LINE_SMOOTH); + } +} diff --git a/src/main/java/net/cwhack/features/StrafeFeature.java b/src/main/java/net/cwhack/features/StrafeFeature.java index 3c70ca3..2900b71 100644 --- a/src/main/java/net/cwhack/features/StrafeFeature.java +++ b/src/main/java/net/cwhack/features/StrafeFeature.java @@ -14,34 +14,20 @@ public class StrafeFeature extends Feature implements UpdateListener, PlayerJumpListener { - private final DecimalSetting ncpSpeed = new DecimalSetting("speed", "speed of strafing", 0.25); - private final IntegerSetting disableAfter = new IntegerSetting("disableAfter", "disable after certain amount of time", 0); + private final DecimalSetting ncpSpeed = new DecimalSetting("speed", "speed of strafing", 0.25, this); + private final IntegerSetting disableAfter = new IntegerSetting("disableAfter", "disable after certain amount of time", 0, this); private int clock = 0; - private double distance = 0; - private double speed = 0; - private int state = 0; - public StrafeFeature() { super("Strafe", "strafe"); - addSetting(ncpSpeed); - addSetting(disableAfter); - } - - private void reset() - { - state = 0; - distance = 0; - speed = 0.2873; } @Override protected void onEnable() { clock = 0; - reset(); eventManager.add(UpdateListener.class, this); eventManager.add(PlayerJumpListener.class, this); } diff --git a/src/main/java/net/cwhack/features/TriggerBotFeature.java b/src/main/java/net/cwhack/features/TriggerBotFeature.java index fcc8682..31d2aff 100644 --- a/src/main/java/net/cwhack/features/TriggerBotFeature.java +++ b/src/main/java/net/cwhack/features/TriggerBotFeature.java @@ -16,10 +16,10 @@ public class TriggerBotFeature extends Feature implements UpdateListener { - private DecimalSetting cooldown = new DecimalSetting("cooldown", "the required cooldown progress for the next attack", 1); + private final DecimalSetting cooldown = new DecimalSetting("cooldown", "the required cooldown progress for the next attack", 1, this); - private BooleanSetting attackInAir = new BooleanSetting("attackInAir", "whether or not to attack target when they are in mid air", true); - private BooleanSetting attackOnJump = new BooleanSetting("attackOnJump", "whether or not to attack when you are jumping", true); + private final BooleanSetting attackInAir = new BooleanSetting("attackInAir", "whether or not to attack target when they are in mid air", true, this); + private final BooleanSetting attackOnJump = new BooleanSetting("attackOnJump", "whether or not to attack when you are jumping", true, this); public TriggerBotFeature() { diff --git a/src/main/java/net/cwhack/gui/screen/GuiScreen.java b/src/main/java/net/cwhack/gui/screen/GuiScreen.java index aefee3a..c769961 100644 --- a/src/main/java/net/cwhack/gui/screen/GuiScreen.java +++ b/src/main/java/net/cwhack/gui/screen/GuiScreen.java @@ -32,13 +32,13 @@ public GuiScreen() @Override public void init() { - searchText = new TextFieldWidget(MC.textRenderer, 200, 50, 400, 20, new LiteralText("")); + searchText = new TextFieldWidget(MC.textRenderer, width / 2 - 75, 25, 150, 20, new LiteralText("")); addSelectableChild(searchText); setInitialFocus(searchText); searchText.setTextFieldFocused(true); - ButtonWidget configButton = new ButtonWidget(width / 3 * 2, 50, 200, 20, new LiteralText("Configs..."), b -> MC.setScreen(new ConfigScreen(this))); + ButtonWidget configButton = new ButtonWidget(50, 25, 100, 20, new LiteralText("Configs..."), b -> MC.setScreen(new ConfigScreen(this))); addDrawableChild(configButton); - ButtonWidget keybindButton = new ButtonWidget(width / 3 * 2, 80, 200, 20, new LiteralText("Keybinds..."), b -> MC.setScreen(new KeybindScreen(this))); + ButtonWidget keybindButton = new ButtonWidget(width - 150, 25, 100, 20, new LiteralText("Keybinds..."), b -> MC.setScreen(new KeybindScreen(this))); addDrawableChild(keybindButton); } @@ -58,19 +58,21 @@ public void tick() }); foundFeatureNames.sort(Comparator.naturalOrder()); foundFeatureNames.forEach(e -> foundFeatures.add(features.getFeature(e))); + final int endY = 8; var ref = new Object() { - int x = 200; - int y = 100; + int x; + int y = 75; }; + ref.x = width / 2 - 50 - foundFeatures.size() / ((height - ref.y + endY) / 16) * 50; foundFeatures.forEach(e -> { feature2pos.put(e, new int[]{ref.x, ref.y}); ref.y += 16; - if (ref.y + 8 >= height) + if (ref.y + endY > height) { ref.x += 100; - ref.y = 100; + ref.y = 75; } }); } @@ -107,8 +109,7 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { switch (button) { - case 0: - { + case 0 -> { var ref = new Object() { Feature isOnFeature = null; @@ -122,10 +123,9 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) }); if (ref.isOnFeature != null) MC.setScreen(ref.isOnFeature.getSettingScreen()); - break; + return true; } - case 1: - { + case 1 -> { var ref = new Object() { Feature isOnFeature = null; @@ -139,12 +139,12 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) }); if (ref.isOnFeature != null) ref.isOnFeature.toggle(); - break; + return true; + } + default -> { + return super.mouseReleased(mouseX, mouseY, button); } - default: - break; } - return super.mouseReleased(mouseX, mouseY, button); } @Override @@ -173,11 +173,11 @@ public boolean keyReleased(int keyCode, int scanCode, int modifiers) private boolean isHoveringOver(int mouseX, int mouseY, int x1, int y1, int x2, int y2) { - return mouseX >= Math.min(x1, x2) && mouseX <= Math.max(x1, x2) && mouseY >= Math.min(y1, y2) && mouseY <= Math.max(y1, y2); + return mouseX > Math.min(x1, x2) && mouseX < Math.max(x1, x2) && mouseY > Math.min(y1, y2) && mouseY < Math.max(y1, y2); } @Override - public boolean isPauseScreen() + public boolean shouldPause() { return false; } diff --git a/src/main/java/net/cwhack/keybind/KeybindManager.java b/src/main/java/net/cwhack/keybind/KeybindManager.java index 539329e..a0d337d 100644 --- a/src/main/java/net/cwhack/keybind/KeybindManager.java +++ b/src/main/java/net/cwhack/keybind/KeybindManager.java @@ -69,6 +69,7 @@ public void onKeyPress(KeyPressEvent event) if (keybind.shouldActiveOnRelease() && event.getAction() == GLFW.GLFW_RELEASE) keybind.execute(); } + //event.cancel(); } private void addDefaultKeybinds() diff --git a/src/main/java/net/cwhack/mixin/AbstractBlockStateMixin.java b/src/main/java/net/cwhack/mixin/AbstractBlockStateMixin.java index 5614ef9..fafdd95 100644 --- a/src/main/java/net/cwhack/mixin/AbstractBlockStateMixin.java +++ b/src/main/java/net/cwhack/mixin/AbstractBlockStateMixin.java @@ -1,9 +1,11 @@ package net.cwhack.mixin; import net.cwhack.event.EventManager; -import net.cwhack.events.IsFullCubeListener.IsFullCubeEvent; +import net.cwhack.events.GetOutlineShapeListener.GetOutlineShapeEvent; import net.minecraft.block.AbstractBlock; +import net.minecraft.block.ShapeContext; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -13,16 +15,12 @@ @Mixin(AbstractBlock.AbstractBlockState.class) public class AbstractBlockStateMixin { - @Inject(at = {@At("TAIL")}, - method = { - "isFullCube(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;)Z"}, - cancellable = true) - private void onIsFullCube(BlockView world, BlockPos pos, - CallbackInfoReturnable cir) + @Inject(at = {@At("HEAD")}, method = {"getOutlineShape(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/ShapeContext;)Lnet/minecraft/util/shape/VoxelShape;"}, cancellable = true) + private void onGetOutlineShape(BlockView view, BlockPos pos, ShapeContext context, CallbackInfoReturnable cir) { - IsFullCubeEvent event = new IsFullCubeEvent(); + GetOutlineShapeEvent event = new GetOutlineShapeEvent(view, pos, context); EventManager.fire(event); - - cir.setReturnValue(cir.getReturnValue() && !event.isCancelled()); + if (event.getReturnValue() != null) + cir.setReturnValue(event.getReturnValue()); } } \ No newline at end of file diff --git a/src/main/java/net/cwhack/mixin/ClientPlayerEntityMixin.java b/src/main/java/net/cwhack/mixin/ClientPlayerEntityMixin.java index 8bc2cac..23cb4b1 100644 --- a/src/main/java/net/cwhack/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/net/cwhack/mixin/ClientPlayerEntityMixin.java @@ -8,11 +8,14 @@ import net.cwhack.events.PlayerJumpListener.PlayerJumpEvent; import net.cwhack.events.PlayerMoveListener.PlayerMoveEvent; import net.cwhack.events.PlayerTickMovementListener.PlayerTickMovementEvent; +import net.cwhack.events.PostActionListener.PostActionEvent; import net.cwhack.events.PostMotionListener.PostMotionEvent; import net.cwhack.events.PostUpdateListener.PostUpdateEvent; +import net.cwhack.events.PreActionListener.PreActionEvent; import net.cwhack.events.PreMotionListener.PreMotionEvent; import net.cwhack.events.SendMovementPacketsListener.SendMovementPacketsEvent; import net.cwhack.events.UpdateListener.UpdateEvent; +import net.cwhack.utils.MixinUtils; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.network.ClientPlayerEntity; @@ -123,13 +126,18 @@ private void onSendMovementPackets(CallbackInfo ci) SendMovementPacketsEvent event = new SendMovementPacketsEvent(); EventManager.fire(event); if (event.isCancelled()) + { ci.cancel(); + return; + } + MixinUtils.fireEvent(new PreActionEvent()); } @Inject(at = {@At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isCamera()Z", shift = At.Shift.BEFORE)}, method = {"sendMovementPackets()V"}) private void onSendMovementPacketsHEAD(CallbackInfo ci) { - EventManager.fire(new PreMotionEvent()); + MixinUtils.fireEvent(new PostActionEvent()); + MixinUtils.fireEvent(new PreMotionEvent()); } @Inject(at = {@At("TAIL")}, method = {"sendMovementPackets()V"}) @@ -146,10 +154,10 @@ private void onTick(CallbackInfo ci) EventManager.fire(new UpdateEvent()); } - @Inject(at = @At(value = "HEAD"), method = "tick()V") + @Inject(at = @At(value = "TAIL"), method = "tick()V") private void onPostTick(CallbackInfo ci) { - EventManager.fire(new PostUpdateEvent()); + EventManager.fire(new PostUpdateEvent()); // doesn't need to check if pos is loaded cuz on client side it always returns true } @Redirect(at = @At(value = "INVOKE", diff --git a/src/main/java/net/cwhack/mixin/ClientPlayerInteractionManagerMixin.java b/src/main/java/net/cwhack/mixin/ClientPlayerInteractionManagerMixin.java index 6f3501b..04908e5 100644 --- a/src/main/java/net/cwhack/mixin/ClientPlayerInteractionManagerMixin.java +++ b/src/main/java/net/cwhack/mixin/ClientPlayerInteractionManagerMixin.java @@ -1,9 +1,12 @@ package net.cwhack.mixin; -import net.cwhack.event.EventManager; +import net.cwhack.events.AttackEntityListener.AttackEntityEvent; import net.cwhack.events.StopUsingItemListener.StopUsingItemEvent; import net.cwhack.mixinterface.IClientPlayerInteractionManager; +import net.cwhack.utils.MixinUtils; import net.minecraft.client.network.ClientPlayerInteractionManager; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.BlockPos; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -48,9 +51,12 @@ private void syncSelectedSlot() @Inject(method = "stopUsingItem(Lnet/minecraft/entity/player/PlayerEntity;)V", at = @At("HEAD"), cancellable = true) private void onStopUsingItem(CallbackInfo ci) { - StopUsingItemEvent event = new StopUsingItemEvent(); - EventManager.fire(event); - if (event.isCancelled()) - ci.cancel(); + MixinUtils.fireCancellableEvent(new StopUsingItemEvent(), ci); + } + + @Inject(method = "attackEntity(Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/entity/Entity;)V", at = @At("HEAD"), cancellable = true) + private void onAttackEntity(PlayerEntity player, Entity target, CallbackInfo ci) + { + MixinUtils.fireCancellableEvent(new AttackEntityEvent(player, target), ci); } } diff --git a/src/main/java/net/cwhack/mixin/ClientWorldMixin.java b/src/main/java/net/cwhack/mixin/ClientWorldMixin.java index 1d899cd..b23fb01 100644 --- a/src/main/java/net/cwhack/mixin/ClientWorldMixin.java +++ b/src/main/java/net/cwhack/mixin/ClientWorldMixin.java @@ -15,6 +15,7 @@ @Mixin(ClientWorld.class) public class ClientWorldMixin { + @Inject(method = "addEntityPrivate", at = @At("TAIL")) private void onAddEntityPrivate(int id, Entity entity, CallbackInfo info) { if (entity != null) @@ -27,4 +28,5 @@ private void onFinishRemovingEntity(int entityId, Entity.RemovalReason removalRe if (entity != null) EventManager.fire(new EntityDespawnEvent(entity)); } + } diff --git a/src/main/java/net/cwhack/mixin/KeyboardMixin.java b/src/main/java/net/cwhack/mixin/KeyboardMixin.java index 4ff1d03..9584e7d 100644 --- a/src/main/java/net/cwhack/mixin/KeyboardMixin.java +++ b/src/main/java/net/cwhack/mixin/KeyboardMixin.java @@ -13,13 +13,14 @@ @Mixin(Keyboard.class) public abstract class KeyboardMixin implements IKeyboard { - @Inject(at = @At("HEAD"), method = "onKey(JIIII)V") + @Inject(at = @At("HEAD"), method = "onKey(JIIII)V", cancellable = true) private void onOnKey(long windowHandle, int keyCode, int scanCode, int action, int modifiers, CallbackInfo ci) { KeyPressEvent event = new KeyPressEvent(keyCode, scanCode, action, modifiers); - EventManager.fire(event); + if (event.isCancelled()) + ci.cancel(); } @Shadow diff --git a/src/main/java/net/cwhack/mixin/LivingEntityRendererMixin.java b/src/main/java/net/cwhack/mixin/LivingEntityRendererMixin.java index d4fc848..d7bc58c 100644 --- a/src/main/java/net/cwhack/mixin/LivingEntityRendererMixin.java +++ b/src/main/java/net/cwhack/mixin/LivingEntityRendererMixin.java @@ -1,5 +1,6 @@ package net.cwhack.mixin; +import net.cwhack.RotationFaker; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.LivingEntityRenderer; import net.minecraft.client.render.entity.model.EntityModel; @@ -12,12 +13,44 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import static net.cwhack.CwHack.CWHACK; +import static net.cwhack.CwHack.MC; @Mixin(LivingEntityRenderer.class) public abstract class LivingEntityRendererMixin> { + private float origYaw; + private float origPitch; + private float origPrevYaw; + private float origPrevPitch; + private boolean wasLastTimeFaked = false; + @Inject(method = "render", at = @At("HEAD"), cancellable = true) private void renderHead(T livingEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, CallbackInfo ci) { + RotationFaker rotationFaker = CWHACK.getRotationFaker(); + if (livingEntity == MC.player && rotationFaker.wasFakingLastTick()) + { + origPitch = MC.player.getPitch(); + origYaw = MC.player.headYaw; + origPrevYaw = MC.player.prevYaw; + origPrevPitch = MC.player.prevPitch; + MC.player.headYaw = rotationFaker.getFakedYaw(); + MC.player.setPitch(rotationFaker.getFakedPitch()); + if (wasLastTimeFaked) + { + MC.player.prevHeadYaw = rotationFaker.getLastFakedYaw(); + MC.player.prevPitch = rotationFaker.getLastFakedPitch(); + } + wasLastTimeFaked = true; + } + else + { + if (wasLastTimeFaked) + { + MC.player.prevHeadYaw = rotationFaker.getLastFakedYaw(); + MC.player.prevPitch = rotationFaker.getLastFakedPitch(); + } + wasLastTimeFaked = false; + } if (CWHACK.getFeatures().chamsFeature.isEnabled()) { GL11.glEnable(GL11.GL_POLYGON_OFFSET_FILL); @@ -27,6 +60,13 @@ private void renderHead(T livingEntity, float f, float g, MatrixStack matrixStac @Inject(method = "render", at = @At("TAIL")) private void renderTail(T livingEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, CallbackInfo ci) { + if (livingEntity == MC.player && CWHACK.getRotationFaker().wasFakingLastTick()) + { + MC.player.headYaw = origYaw; + MC.player.setPitch(origPitch); + MC.player.prevHeadYaw = origPrevYaw; + MC.player.prevPitch = origPrevPitch; + } if (CWHACK.getFeatures().chamsFeature.isEnabled()) { GL11.glPolygonOffset(1.0f, 1100000.0f); diff --git a/src/main/java/net/cwhack/mixin/MinecraftClientMixin.java b/src/main/java/net/cwhack/mixin/MinecraftClientMixin.java index c0c095d..edd9a36 100644 --- a/src/main/java/net/cwhack/mixin/MinecraftClientMixin.java +++ b/src/main/java/net/cwhack/mixin/MinecraftClientMixin.java @@ -1,6 +1,7 @@ package net.cwhack.mixin; import net.cwhack.event.EventManager; +import net.cwhack.events.FrameBeginListener.FrameBeginEvent; import net.cwhack.events.GameLeaveListener.GameLeaveEvent; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; @@ -23,4 +24,10 @@ private void onDisconnect(Screen screen, CallbackInfo info) { EventManager.fire(new GameLeaveEvent()); } } + + @Inject(method = "render(Z)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Mouse;updateMouse()V", shift = At.Shift.AFTER)) + private void onRender(boolean tick, CallbackInfo info) + { + EventManager.fire(new FrameBeginEvent()); + } } diff --git a/src/main/java/net/cwhack/mixin/MouseMixin.java b/src/main/java/net/cwhack/mixin/MouseMixin.java index 834f6e7..02654af 100644 --- a/src/main/java/net/cwhack/mixin/MouseMixin.java +++ b/src/main/java/net/cwhack/mixin/MouseMixin.java @@ -14,12 +14,13 @@ @Mixin(Mouse.class) public abstract class MouseMixin implements IMouse { - @Inject(at = @At("HEAD"), method = "onMouseButton") + @Inject(at = @At("HEAD"), method = "onMouseButton", cancellable = true) private void onOnMouseButton(long window, int button, int action, int mods, CallbackInfo ci) { KeyPressEvent event = new KeyPressEvent(button + GLFW.GLFW_KEY_LAST + 1, 0, action, mods); - EventManager.fire(event); + if (event.isCancelled()) + ci.cancel(); } @Shadow diff --git a/src/main/java/net/cwhack/mixin/WorldMixin.java b/src/main/java/net/cwhack/mixin/WorldMixin.java new file mode 100644 index 0000000..b0d079b --- /dev/null +++ b/src/main/java/net/cwhack/mixin/WorldMixin.java @@ -0,0 +1,24 @@ +package net.cwhack.mixin; + +import net.cwhack.mixinterface.IWorld; +import net.minecraft.world.World; +import net.minecraft.world.chunk.BlockEntityTickInvoker; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.List; + +@Mixin(World.class) +public class WorldMixin implements IWorld +{ + @Shadow + @Final + protected List blockEntityTickers; + + @Override + public List getBlockEntityTickers() + { + return blockEntityTickers; + } +} diff --git a/src/main/java/net/cwhack/mixinterface/IWorld.java b/src/main/java/net/cwhack/mixinterface/IWorld.java new file mode 100644 index 0000000..de9d5f2 --- /dev/null +++ b/src/main/java/net/cwhack/mixinterface/IWorld.java @@ -0,0 +1,10 @@ +package net.cwhack.mixinterface; + +import net.minecraft.world.chunk.BlockEntityTickInvoker; + +import java.util.List; + +public interface IWorld +{ + public List getBlockEntityTickers(); +} diff --git a/src/main/java/net/cwhack/setting/BooleanSetting.java b/src/main/java/net/cwhack/setting/BooleanSetting.java index 7fae6e9..36a10e1 100644 --- a/src/main/java/net/cwhack/setting/BooleanSetting.java +++ b/src/main/java/net/cwhack/setting/BooleanSetting.java @@ -1,12 +1,14 @@ package net.cwhack.setting; +import net.cwhack.feature.Feature; + public class BooleanSetting extends Setting { private boolean value; - public BooleanSetting(String name, String description, boolean value) + public BooleanSetting(String name, String description, boolean value, Feature feature) { - super(name, description); + super(name, description, feature); this.value = value; } @@ -17,7 +19,7 @@ public Boolean getValue() } @Override - public void loadFromString(String string) + public void loadFromStringInternal(String string) { value = Boolean.parseBoolean(string); } diff --git a/src/main/java/net/cwhack/setting/DecimalSetting.java b/src/main/java/net/cwhack/setting/DecimalSetting.java index 2c89ca5..c653d6b 100644 --- a/src/main/java/net/cwhack/setting/DecimalSetting.java +++ b/src/main/java/net/cwhack/setting/DecimalSetting.java @@ -1,17 +1,19 @@ package net.cwhack.setting; +import net.cwhack.feature.Feature; + public class DecimalSetting extends Setting { private double value; - public DecimalSetting(String name, String description, double defaultValue) + public DecimalSetting(String name, String description, double defaultValue, Feature feature) { - super(name, description); + super(name, description, feature); this.value = defaultValue; } @Override - public void loadFromString(String string) + public void loadFromStringInternal(String string) { value = Double.parseDouble(string); } diff --git a/src/main/java/net/cwhack/setting/EnumSetting.java b/src/main/java/net/cwhack/setting/EnumSetting.java index e129912..158b564 100644 --- a/src/main/java/net/cwhack/setting/EnumSetting.java +++ b/src/main/java/net/cwhack/setting/EnumSetting.java @@ -1,5 +1,7 @@ package net.cwhack.setting; +import net.cwhack.feature.Feature; + import java.util.Arrays; import java.util.Optional; @@ -9,9 +11,9 @@ public class EnumSetting> extends Setting private final T[] values; private T value; - public EnumSetting(String name, String description, T[] values, T value) + public EnumSetting(String name, String description, T[] values, T value, Feature feature) { - super(name, description); + super(name, description, feature); this.values = values; this.value = value; } @@ -23,7 +25,7 @@ public T getValue() } @Override - public void loadFromString(String string) + public void loadFromStringInternal(String string) { Optional v = Arrays.stream(values) .filter(e -> e.toString().equalsIgnoreCase(string)) diff --git a/src/main/java/net/cwhack/setting/IntegerSetting.java b/src/main/java/net/cwhack/setting/IntegerSetting.java index 8b99c8c..2cc6577 100644 --- a/src/main/java/net/cwhack/setting/IntegerSetting.java +++ b/src/main/java/net/cwhack/setting/IntegerSetting.java @@ -1,18 +1,20 @@ package net.cwhack.setting; +import net.cwhack.feature.Feature; + public class IntegerSetting extends Setting { private int value; - public IntegerSetting(String name, String description, int value) + public IntegerSetting(String name, String description, int value, Feature feature) { - super(name, description); + super(name, description, feature); this.value = value; } @Override - public void loadFromString(String string) + public void loadFromStringInternal(String string) { value = Integer.parseInt(string); } diff --git a/src/main/java/net/cwhack/setting/Setting.java b/src/main/java/net/cwhack/setting/Setting.java index 95c1633..bf73aac 100644 --- a/src/main/java/net/cwhack/setting/Setting.java +++ b/src/main/java/net/cwhack/setting/Setting.java @@ -1,14 +1,19 @@ package net.cwhack.setting; +import net.cwhack.feature.Feature; + public abstract class Setting { private final String name; private final String description; + private final Feature feature; - public Setting(String name, String description) + public Setting(String name, String description, Feature feature) { this.name = name; this.description = description; + this.feature = feature; + feature.addSetting(this); } public String getName() @@ -23,7 +28,13 @@ public String getDescription() public abstract T getValue(); - public abstract void loadFromString(String string); + public void loadFromString(String string) + { + loadFromStringInternal(string); + feature.onChangeSetting(this); + } + + protected abstract void loadFromStringInternal(String string); public abstract String storeAsString(); } diff --git a/src/main/java/net/cwhack/setting/TextSetting.java b/src/main/java/net/cwhack/setting/TextSetting.java index af73b71..889108a 100644 --- a/src/main/java/net/cwhack/setting/TextSetting.java +++ b/src/main/java/net/cwhack/setting/TextSetting.java @@ -1,13 +1,15 @@ package net.cwhack.setting; +import net.cwhack.feature.Feature; + public class TextSetting extends Setting { private String value; - public TextSetting(String name, String description, String value) + public TextSetting(String name, String description, String value, Feature feature) { - super(name, description); + super(name, description, feature); this.value = value; } @@ -23,7 +25,7 @@ public String getValue() } @Override - public void loadFromString(String string) + public void loadFromStringInternal(String string) { value = string; } diff --git a/src/main/java/net/cwhack/utils/BlockUtils.java b/src/main/java/net/cwhack/utils/BlockUtils.java index f6779da..615808c 100644 --- a/src/main/java/net/cwhack/utils/BlockUtils.java +++ b/src/main/java/net/cwhack/utils/BlockUtils.java @@ -1,8 +1,6 @@ package net.cwhack.utils; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; +import net.minecraft.block.*; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; @@ -23,6 +21,20 @@ public enum BlockUtils { ; + public static boolean isAnchorCharged(BlockPos anchor) + { + if (!isBlock(Blocks.RESPAWN_ANCHOR, anchor)) + return false; + try + { + return BlockUtils.getBlockState(anchor).get(RespawnAnchorBlock.CHARGES) != 0; + } + catch (IllegalArgumentException e) + { + return false; + } + } + public static boolean canPlace(BlockState state, BlockPos pos) { return MC.world.canPlace(state, pos, null); @@ -196,4 +208,10 @@ public static boolean rightClickBlock(BlockPos pos) MC.player.swingHand(Hand.MAIN_HAND); return bl; } + + public static boolean isContainer(BlockPos pos) + { + Block block = getBlock(pos); + return block == Blocks.CHEST || block == Blocks.TRAPPED_CHEST || block == Blocks.BARREL || block instanceof ShulkerBoxBlock; + } } diff --git a/src/main/java/net/cwhack/utils/HoleUtils.java b/src/main/java/net/cwhack/utils/HoleUtils.java new file mode 100644 index 0000000..a5393ed --- /dev/null +++ b/src/main/java/net/cwhack/utils/HoleUtils.java @@ -0,0 +1,52 @@ +package net.cwhack.utils; + +import net.minecraft.block.Blocks; +import net.minecraft.util.math.BlockPos; + +public class HoleUtils +{ + ; + private static BlockPos[] surroundings = new BlockPos[] + { + new BlockPos(1, 0, 0), + new BlockPos(0, 0, 1), + new BlockPos(-1, 0, 0), + new BlockPos(0, 0, -1) + }; + + public static boolean isFullySurrounded(BlockPos pos) + { + for (BlockPos surrounding : surroundings) + { + if (!BlockUtils.isBlock(Blocks.BEDROCK, pos.add(surrounding))) + return false; + } + return true; + } + + public static boolean isSurrounded(BlockPos pos) + { + for (BlockPos surrounding : surroundings) + { + if (!isSurroundingBlock(pos.add(surrounding))) + return false; + } + return true; + } + + private static boolean isSurroundingBlock(BlockPos pos) + { + return BlockUtils.isBlock(Blocks.BEDROCK, pos) || BlockUtils.isBlock(Blocks.OBSIDIAN, pos); + } + + public static boolean wouldMakeAHole(BlockPos pos, BlockPos block) + { + for (BlockPos surrounding : surroundings) + { + BlockPos a = pos.add(surrounding); + if (!isSurroundingBlock(a) && !a.equals(block)) + return false; + } + return true; + } +} diff --git a/src/main/java/net/cwhack/utils/MixinUtils.java b/src/main/java/net/cwhack/utils/MixinUtils.java new file mode 100644 index 0000000..b25db7d --- /dev/null +++ b/src/main/java/net/cwhack/utils/MixinUtils.java @@ -0,0 +1,23 @@ +package net.cwhack.utils; + +import net.cwhack.event.CancellableEvent; +import net.cwhack.event.Event; +import net.cwhack.event.EventManager; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +public enum MixinUtils +{ + ; + public static void fireEvent(Event event) + { + EventManager.fire(event); + } + + public static void fireCancellableEvent(CancellableEvent event, CallbackInfo ci) + { + EventManager.fire(event); + if (event.isCancelled()) + ci.cancel(); + } + +} diff --git a/src/main/java/net/cwhack/utils/NameTagUtils.java b/src/main/java/net/cwhack/utils/NameTagUtils.java index 5d45b01..19f7b05 100644 --- a/src/main/java/net/cwhack/utils/NameTagUtils.java +++ b/src/main/java/net/cwhack/utils/NameTagUtils.java @@ -22,7 +22,7 @@ public enum NameTagUtils public static void onRender(MatrixStack matrices, Matrix4f projection) { - model = matrices.peek().getModel().copy(); + model = matrices.peek().getPositionMatrix().copy(); NameTagUtils.projection = projection; camera = MC.gameRenderer.getCamera().getPos(); cameraNegated = camera.multiply(new Vec3d(-1, -1, -1)); diff --git a/src/main/java/net/cwhack/utils/RenderUtils.java b/src/main/java/net/cwhack/utils/RenderUtils.java index e7c32d0..1522644 100644 --- a/src/main/java/net/cwhack/utils/RenderUtils.java +++ b/src/main/java/net/cwhack/utils/RenderUtils.java @@ -18,7 +18,7 @@ public static void drawString(String string, int x, int y, int color, float scal matrixStack.translate(0.0D, 0.0D, 0.0D); matrixStack.scale(scale, scale, 1); VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(Tessellator.getInstance().getBuffer()); - MC.textRenderer.draw(string, (float) x / scale, (float) y / scale, color, true, matrixStack.peek().getModel(), immediate, false, 0, 0xF000F0); + MC.textRenderer.draw(string, (float) x / scale, (float) y / scale, color, true, matrixStack.peek().getPositionMatrix(), immediate, false, 0, 0xF000F0); immediate.draw(); } @@ -45,16 +45,16 @@ public static Vec3d getCameraPos() public static Vec3d getRenderLookVec(double partialTicks) { - float f = 0.017453292F; - float pi = (float)Math.PI; + double f = 0.017453292; + double pi = Math.PI; - float yaw = MathHelper.lerp((float) partialTicks, MC.player.prevYaw, MC.player.getYaw()); - float pitch = MathHelper.lerp((float) partialTicks, MC.player.prevPitch, MC.player.getPitch()); + double yaw = MathHelper.lerp(partialTicks, MC.player.prevYaw, MC.player.getYaw()); + double pitch = MathHelper.lerp(partialTicks, MC.player.prevPitch, MC.player.getPitch()); - float f1 = MathHelper.cos(-yaw * f - pi); - float f2 = MathHelper.sin(-yaw * f - pi); - float f3 = -MathHelper.cos(-pitch * f); - float f4 = MathHelper.sin(-pitch * f); + double f1 = Math.cos(-yaw * f - pi); + double f2 = Math.sin(-yaw * f - pi); + double f3 = -Math.cos(-pitch * f); + double f4 = Math.sin(-pitch * f); return new Vec3d(f2 * f3, f4, f1 * f3).normalize(); } @@ -77,7 +77,7 @@ public static void applyRegionalRenderOffset(MatrixStack matrixStack) public static void fillBox(BufferBuilder bufferBuilder, Box bb, MatrixStack matrixStack) { - Matrix4f matrix = matrixStack.peek().getModel(); + Matrix4f matrix = matrixStack.peek().getPositionMatrix(); bufferBuilder .vertex(matrix, (float)bb.minX, (float)bb.minY, (float)bb.minZ) .next(); @@ -171,7 +171,7 @@ public static void drawSolidBox(Box bb, MatrixStack matrixStack) public static void fillOutlinedBox(BufferBuilder bufferBuilder, Box bb, MatrixStack matrixStack) { - Matrix4f matrix = matrixStack.peek().getModel(); + Matrix4f matrix = matrixStack.peek().getPositionMatrix(); bufferBuilder .vertex(matrix, (float)bb.minX, (float)bb.minY, (float)bb.minZ) .next(); @@ -275,7 +275,7 @@ public static void drawQuad(float x1, float y1, float x2, float y2, MatrixStack float maxX = Math.max(x1, x2); float minY = Math.min(y1, y2); float maxY = Math.max(y1, y2); - Matrix4f matrix = matrixStack.peek().getModel(); + Matrix4f matrix = matrixStack.peek().getPositionMatrix(); BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer(); RenderSystem.setShader(GameRenderer::getPositionShader); bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION); diff --git a/src/main/java/net/cwhack/utils/RotationUtils.java b/src/main/java/net/cwhack/utils/RotationUtils.java index bf08d5f..30e43fb 100644 --- a/src/main/java/net/cwhack/utils/RotationUtils.java +++ b/src/main/java/net/cwhack/utils/RotationUtils.java @@ -2,11 +2,13 @@ import net.cwhack.CwHack; import net.cwhack.RotationFaker; -import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; +import static net.cwhack.CwHack.MC; + // copied from wurst public enum RotationUtils @@ -15,8 +17,11 @@ public enum RotationUtils public static Vec3d getEyesPos() { - ClientPlayerEntity player = CwHack.MC.player; + return getEyesPos(MC.player); + } + public static Vec3d getEyesPos(PlayerEntity player) + { return new Vec3d(player.getX(), player.getY() + player.getEyeHeight(player.getPose()), player.getZ()); @@ -27,9 +32,8 @@ public static BlockPos getEyesBlockPos() return new BlockPos(getEyesPos()); } - public static Vec3d getClientLookVec() + public static Vec3d getPlayerLookVec(PlayerEntity player) { - ClientPlayerEntity player = CwHack.MC.player; float f = 0.017453292F; float pi = (float)Math.PI; @@ -41,6 +45,11 @@ public static Vec3d getClientLookVec() return new Vec3d(f2 * f3, f4, f1 * f3).normalize(); } + public static Vec3d getClientLookVec() + { + return getPlayerLookVec(MC.player); + } + public static Vec3d getServerLookVec() { RotationFaker rotationFaker = CwHack.CWHACK.getRotationFaker(); @@ -87,10 +96,14 @@ public static Rotation getNeededRotations(Vec3d vec) } public static double getAngleToLookVec(Vec3d vec) + { + return getAngleToLookVec(MC.player, vec); + } + + public static double getAngleToLookVec(PlayerEntity player, Vec3d vec) { Rotation needed = getNeededRotations(vec); - ClientPlayerEntity player = CwHack.MC.player; float currentYaw = MathHelper.wrapDegrees(player.getYaw()); float currentPitch = MathHelper.wrapDegrees(player.getPitch()); diff --git a/src/main/java/net/cwhack/utils/TargetUtils.java b/src/main/java/net/cwhack/utils/TargetUtils.java new file mode 100644 index 0000000..68cda6a --- /dev/null +++ b/src/main/java/net/cwhack/utils/TargetUtils.java @@ -0,0 +1,72 @@ +package net.cwhack.utils; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.decoration.EndCrystalEntity; +import net.minecraft.entity.mob.Monster; +import net.minecraft.entity.passive.*; +import net.minecraft.entity.player.PlayerEntity; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.stream.StreamSupport; + +import static net.cwhack.CwHack.MC; + +public enum TargetUtils +{ + ; + public static Entity getTarget(TargetFilterConfiguration config) + { + return StreamSupport.stream(MC.world.getEntities().spliterator(), true) + .filter(e -> e != MC.player) + .filter(e -> !e.isRemoved()) + .filter(e -> e instanceof LivingEntity && !((LivingEntity) e).isDead() || e instanceof EndCrystalEntity) + .filter(e -> !(config.filterPlayer && !(e instanceof PlayerEntity))) + .filter(e -> !(config.filterAnimal && !(e instanceof AnimalEntity))) + .filter(e -> !(config.filterMob && !(e instanceof Monster))) + .filter(e -> !(config.filterBaby && !(e instanceof PassiveEntity && ((PassiveEntity) e).isBaby()))) + .filter(e -> !(config.filterNamed && !e.hasCustomName())) + .filter(e -> !(config.filterTamed && !(e instanceof TameableEntity && ((TameableEntity) e).isTamed() || e instanceof HorseBaseEntity && ((HorseBaseEntity) e).isTame()))) + .filter(e -> !(config.filterTrader && !(e instanceof MerchantEntity))) + .filter(e -> !(config.filterCrystal && !(e instanceof EndCrystalEntity))) + .min(config.type.comparator) + .orElse(null); + } + + public static class TargetFilterConfiguration + { + + public Type type = Type.DISTANCE; + public boolean filterPlayer = false; + public boolean filterAnimal = false; + public boolean filterMob = false; + public boolean filterBaby = false; + public boolean filterNamed = false; + public boolean filterTamed = false; + public boolean filterTrader = false; + public boolean filterCrystal = false; + public ArrayList> filteredEntities = new ArrayList<>(); + + public enum Type + { + HEALTH(Comparator.comparingDouble(e -> + { + if (e instanceof LivingEntity a) + { + return a.getHealth() + a.getAbsorptionAmount(); + } + return 0; + })), + DISTANCE(Comparator.comparingDouble(e -> e.squaredDistanceTo(MC.player))), + ANGLE(Comparator.comparingDouble(e -> RotationUtils.getAngleToLookVec(e.getPos()))); + + public final Comparator comparator; + + Type(Comparator comparator) + { + this.comparator = comparator; + } + } + } +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index cfc0564..64f4568 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -1,7 +1,7 @@ { "schemaVersion": 1, "id": "cwhack", - "version": "a0.2.0", + "version": "a0.5.0", "name": "CwHack", "description": "CwHack private version", @@ -25,7 +25,7 @@ "depends": { "fabricloader": ">=0.11.3", "fabric": "*", - "minecraft": "1.17.x", - "java": ">=16" + "minecraft": "1.18.x", + "java": ">=17" } } diff --git a/src/main/resources/modid.mixins.json b/src/main/resources/modid.mixins.json index 6ce4038..4d21013 100644 --- a/src/main/resources/modid.mixins.json +++ b/src/main/resources/modid.mixins.json @@ -21,7 +21,8 @@ "LivingEntityRendererMixin", "Matrix4fMixin", "MinecraftClientMixin", - "MouseMixin" + "MouseMixin", + "WorldMixin" ], "injectors": { "defaultRequire": 1