diff --git a/cambios.md b/cambios.md index 416abc6..caf3b6a 100644 --- a/cambios.md +++ b/cambios.md @@ -1,4 +1,4 @@ -# v3.8 +# v3.9 ## novedades @@ -6,15 +6,12 @@ #### módulos nuevos: -- desync de hitbox: exploit chino para meterse en bloques -- recorrido: muestra tu recorrido -- retroceso: modifica el retroceso a tomar +- escaleras veloces: sube escaleras más rápido +- parkour: salta automáticamente +- confetti: cambia el color de las partículas del pop del tótem ### arreglos / mejoras -- rotar, de andamios, ahora solo rota server-side -- mostrar últimos bloques colocados en andamios - ## problemas reconocidos - lo de siempre \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index a8f4219..f1ace47 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,6 +10,6 @@ fabric_api_version=0.140.2+1.21.11 neutrino_version=1.1.0 -mod_version=3.8 +mod_version=3.9 maven_group=me.retucio archives_base_name=sputnik \ No newline at end of file diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/player/ClientPlayerEntityMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/player/ClientPlayerEntityMixin.java index c836265..44fa1d9 100644 --- a/src/main/java/me/retucio/sputnik/mixin/mixins/player/ClientPlayerEntityMixin.java +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/player/ClientPlayerEntityMixin.java @@ -6,6 +6,7 @@ import com.llamalad7.mixinextras.sugar.Local; import me.retucio.sputnik.module.ModuleManager; import me.retucio.sputnik.module.modules.world.NoMiningInterruptions; import me.retucio.sputnik.module.modules.inventory.PortalGUI; +import me.retucio.sputnik.util.ChatUtil; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.util.hit.EntityHitResult; @@ -15,6 +16,8 @@ import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import static me.retucio.sputnik.Sputnik.mc; diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/world/TotemParticleMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/world/TotemParticleMixin.java new file mode 100644 index 0000000..d9ac23b --- /dev/null +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/world/TotemParticleMixin.java @@ -0,0 +1,33 @@ +package me.retucio.sputnik.mixin.mixins.world; + +import me.retucio.sputnik.module.ModuleManager; +import me.retucio.sputnik.module.modules.render.Confetti; +import net.minecraft.client.particle.TotemParticle; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArgs; +import org.spongepowered.asm.mixin.injection.invoke.arg.Args; + +@Mixin(TotemParticle.class) +public abstract class TotemParticleMixin { + + @ModifyArgs(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/TotemParticle;setColor(FFF)V", ordinal = 0)) + private void setConfettiColor1(Args args) { + Confetti confetti = ModuleManager.INSTANCE.getModuleByClass(Confetti.class); + if (confetti.isEnabled()) { + args.set(0, confetti.color1.getR() / 255f); + args.set(1, confetti.color1.getG() / 255f); + args.set(2, confetti.color1.getB() / 255f); + } + } + + @ModifyArgs(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/TotemParticle;setColor(FFF)V", ordinal = 1)) + private void setConfettiColor2(Args args) { + Confetti confetti = ModuleManager.INSTANCE.getModuleByClass(Confetti.class); + if (confetti.isEnabled()) { + args.set(0, confetti.color2.getR() / 255f); + args.set(1, confetti.color2.getG() / 255f); + args.set(2, confetti.color2.getB() / 255f); + } + } +} diff --git a/src/main/java/me/retucio/sputnik/module/ModuleManager.java b/src/main/java/me/retucio/sputnik/module/ModuleManager.java index 5a5f0ff..e5f2895 100644 --- a/src/main/java/me/retucio/sputnik/module/ModuleManager.java +++ b/src/main/java/me/retucio/sputnik/module/ModuleManager.java @@ -111,10 +111,12 @@ public class ModuleManager { add(new Dolphin()); add(new ElytraBounce()); add(new ElytraFly()); + add(new FastStairs()); add(new Headhitters()); add(new HitboxDesync()); add(new InfiniteElytra()); add(new Jesus()); + add(new Parkour()); add(new ReverseStep()); add(new SafeWalk()); add(new Scaffold()); @@ -153,6 +155,7 @@ public class ModuleManager { add(new BlockOutline()); add(new Breadcrumbs()); add(new BreakingProgress()); + add(new Confetti()); add(new CritsPlus()); add(new DamageOverlay()); add(new EntityESP()); diff --git a/src/main/java/me/retucio/sputnik/module/modules/movement/FastStairs.java b/src/main/java/me/retucio/sputnik/module/modules/movement/FastStairs.java new file mode 100644 index 0000000..1157c3d --- /dev/null +++ b/src/main/java/me/retucio/sputnik/module/modules/movement/FastStairs.java @@ -0,0 +1,40 @@ +package me.retucio.sputnik.module.modules.movement; + +import me.retucio.sputnik.module.Category; +import me.retucio.sputnik.module.Module; +import me.retucio.sputnik.module.setting.settings.BooleanSetting; +import net.minecraft.block.Block; +import net.minecraft.block.StairsBlock; + +public class FastStairs extends Module { + + private final BooleanSetting onlyWhenSprinting = sgGeneral.add(new BooleanSetting( + "solo al correr", + "solo saltar al estar esprintando", + true + )); + + private final BooleanSetting onlyWhenStairsNext = sgGeneral.add(new BooleanSetting( + "solo al haber más escaleras", + "solo saltar cuando el siguiente bloque también son escaleras", + true + )); + + public FastStairs() { + super("escaleras veloces", "sube escaleras más rápidamente", Category.MOVEMENT); + } + + @Override + public void onTick() { + if (mc.player == null || mc.world == null) return; + if (!mc.player.isSprinting() && onlyWhenSprinting.getValue()) return; + + Block nextBlock = mc.world.getBlockState(mc.player.getBlockPos().add(mc.player.getHorizontalFacing().getVector())).getBlock(); + if (!(nextBlock instanceof StairsBlock && onlyWhenStairsNext.getValue())) return; + + if (mc.world.getBlockState(mc.player.getBlockPos().down()).getBlock() instanceof StairsBlock + && mc.player.forwardSpeed > 0 && mc.player.isOnGround()) { + mc.player.jump(); + } + } +} diff --git a/src/main/java/me/retucio/sputnik/module/modules/movement/Parkour.java b/src/main/java/me/retucio/sputnik/module/modules/movement/Parkour.java new file mode 100644 index 0000000..e58b130 --- /dev/null +++ b/src/main/java/me/retucio/sputnik/module/modules/movement/Parkour.java @@ -0,0 +1,63 @@ +package me.retucio.sputnik.module.modules.movement; + +import com.google.common.collect.Streams; +import me.retucio.sputnik.module.Category; +import me.retucio.sputnik.module.Module; +import me.retucio.sputnik.module.setting.settings.BooleanSetting; +import me.retucio.sputnik.module.setting.settings.NumberSetting; +import net.minecraft.util.math.Box; +import net.minecraft.util.shape.VoxelShape; + +import java.util.stream.Stream; + +/** + * @link yes i'm a skid + * @"author" retucio + */ +public class Parkour extends Module { + + private final BooleanSetting onlyWhenSprinting = sgGeneral.add(new BooleanSetting( + "solo al correr", + "solo aplicar salto al estar esprintando", + false + )); + + private final BooleanSetting dontWhenSneaking = sgGeneral.add(new BooleanSetting( + "no al agacharse", + "no saltar al estar agachado", + false + )); + + private final NumberSetting offset = sgGeneral.add(new NumberSetting( + "offset", + "cuán antes saltar", + 0.001, + 0.001, + 0.6, + 0.001 + )); + + public Parkour() { + super("parkour", + "salta automáticamente en el último tick posible, en la esquina del bloque", + Category.MOVEMENT); + } + + @Override + public void onTick() { + if (mc.player == null || mc.world == null) return; + + if (!(mc.player.isSprinting() || mc.options.sprintKey.isPressed()) && onlyWhenSprinting.getValue()) return; + if ((mc.player.isSneaking() || mc.options.sneakKey.isPressed()) && dontWhenSneaking.getValue()) return; + + if(!mc.player.isOnGround() || mc.options.jumpKey.isPressed()) return; + + Box box = mc.player.getBoundingBox(); + Box adjustedBox = box.offset(0, -0.5, 0).expand(-offset.getValue(), 0, -offset.getValue()); + + Stream blockCollisions = Streams.stream(mc.world.getBlockCollisions(mc.player, adjustedBox)); + if (blockCollisions.findAny().isPresent()) return; + + mc.player.jump(); + } +} diff --git a/src/main/java/me/retucio/sputnik/module/modules/render/Confetti.java b/src/main/java/me/retucio/sputnik/module/modules/render/Confetti.java new file mode 100644 index 0000000..426b0ff --- /dev/null +++ b/src/main/java/me/retucio/sputnik/module/modules/render/Confetti.java @@ -0,0 +1,32 @@ +package me.retucio.sputnik.module.modules.render; + +import me.retucio.sputnik.module.Category; +import me.retucio.sputnik.module.Module; +import me.retucio.sputnik.module.setting.settings.ColorSetting; +import me.retucio.sputnik.util.Colors; + + +/** + * continúa en: + * @see me.retucio.sputnik.mixin.mixins.world.TotemParticleMixin + */ +public class Confetti extends Module { + + public ColorSetting color1 = sgGeneral.add(new ColorSetting( + "color 1", + "en vez de amarillo", + Colors.BLACK, + false + )); + + public ColorSetting color2 = sgGeneral.add(new ColorSetting( + "color 2", + "en vez de verde", + Colors.mainColor, + true + )); + + public Confetti() { + super("confetti", "cambia el color de las partículas del pop del tótem", Category.RENDER); + } +} diff --git a/src/main/java/me/retucio/sputnik/util/MiscUtil.java b/src/main/java/me/retucio/sputnik/util/MiscUtil.java index b128127..550519b 100644 --- a/src/main/java/me/retucio/sputnik/util/MiscUtil.java +++ b/src/main/java/me/retucio/sputnik/util/MiscUtil.java @@ -1,5 +1,6 @@ package me.retucio.sputnik.util; +import com.github.retucio.neutrino.EventListener; import me.retucio.sputnik.event.TickEvent; import me.retucio.sputnik.module.ModuleManager; import me.retucio.sputnik.module.modules.client.HUD; @@ -21,6 +22,7 @@ public class MiscUtil { public static Screen screen; + @EventListener public static void onTick(TickEvent.Post event) { if (screen != null && mc.currentScreen == null) { mc.setScreen(screen); diff --git a/src/main/resources/sputnik.mixins.json b/src/main/resources/sputnik.mixins.json index 5c398e0..1c74d7f 100644 --- a/src/main/resources/sputnik.mixins.json +++ b/src/main/resources/sputnik.mixins.json @@ -100,6 +100,7 @@ "mixins.world.DamageParticleMixin", "mixins.world.EmitterParticleMixin", "mixins.world.ParticleManagerMixin", - "mixins.world.RenderTickCounterDynamicMixin" + "mixins.world.RenderTickCounterDynamicMixin", + "mixins.world.TotemParticleMixin" ] } \ No newline at end of file