diff --git a/build.gradle b/build.gradle index c420968..dbd6be7 100644 --- a/build.gradle +++ b/build.gradle @@ -31,7 +31,7 @@ dependencies { modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}" // sistema de eventos - modImplementation "com.github.retuci0:neutrino:${project.neutrino_version}" + include(modImplementation "com.github.retuci0:neutrino:${project.neutrino_version}") // rpc de discord include(modImplementation "dev.firstdark.discordrpc:discord-rpc:1.0.3") diff --git a/cambios.md b/cambios.md index 2430358..448fb37 100644 --- a/cambios.md +++ b/cambios.md @@ -1,20 +1,18 @@ -# v3.3 +# v3.5 ## novedades ### adiciones -- ahora se puede asignar un botón del ratón a un módulo #### módulos nuevos: -- mochila: te permite llevar items en los slots de crafteo del inventario -- tecla de perla: te permite lanzar una perla con tan solo un pulsamiento de tecla, siempre y cuando tengas en el inventario ### arreglos / mejoras -- arreglada la cagada de Mojang de las teclas debug +- arreglado el crash por no incluir el sistema de eventos en el mod (soy gilipollas) +- mejoras varias al módulo tobillos fuertes +- ahora el módulo de interfaces en portales funciona correctamente +- reponer ya no está repe ## problemas reconocidos - -- muchos, pero repórtalos en la página de problemas si quieres para que queden bien registrados \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index cb5feb9..aa078ef 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.3 +mod_version=3.5 maven_group=me.retucio archives_base_name=sputnik \ No newline at end of file diff --git a/src/main/java/me/retucio/sputnik/module/ModuleManager.java b/src/main/java/me/retucio/sputnik/module/ModuleManager.java index fafcf37..4644899 100644 --- a/src/main/java/me/retucio/sputnik/module/ModuleManager.java +++ b/src/main/java/me/retucio/sputnik/module/ModuleManager.java @@ -90,7 +90,6 @@ public class ModuleManager { add(new BossbarStack()); add(new ChatPlus()); add(new FakePlayer()); - add(new Replenish()); add(new ScreenshotPlus()); add(new UnfocusedCpu()); } diff --git a/src/main/java/me/retucio/sputnik/module/modules/player/NoFall.java b/src/main/java/me/retucio/sputnik/module/modules/player/NoFall.java index 5b4adc4..74c0370 100644 --- a/src/main/java/me/retucio/sputnik/module/modules/player/NoFall.java +++ b/src/main/java/me/retucio/sputnik/module/modules/player/NoFall.java @@ -11,7 +11,10 @@ import me.retucio.sputnik.module.setting.settings.NumberSetting; import me.retucio.sputnik.util.ChatUtil; import me.retucio.sputnik.util.InventoryUtil; import me.retucio.sputnik.util.Lists; +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -20,21 +23,32 @@ import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.HitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import java.util.List; // todo: arreglar MLGs con bloques public class NoFall extends Module { - private boolean placed; + private boolean placed, shouldUse; - private final List mlgItems = List.of(Items.WATER_BUCKET, Items.ENDER_PEARL, Items.POWDER_SNOW_BUCKET, - Items.SLIME_BLOCK, Items.HAY_BLOCK, Items.HONEY_BLOCK, Items.BLACK_BED, + private final List mlgItems = List.of(Items.WATER_BUCKET, Items.ENDER_PEARL, + Items.POWDER_SNOW_BUCKET, Items.TWISTING_VINES, Items.SLIME_BLOCK, + Items.HAY_BLOCK, Items.HONEY_BLOCK, Items.BLACK_BED, Items.BLUE_BED, Items.BROWN_BED, Items.CYAN_BED, Items.GRAY_BED, Items.GREEN_BED, Items.LIGHT_BLUE_BED, Items.LIGHT_GRAY_BED, Items.LIME_BED, Items.MAGENTA_BED, Items.ORANGE_BED, Items.PINK_BED, Items.PURPLE_BED, Items.RED_BED, Items.WHITE_BED, Items.YELLOW_BED); + private final List safeBlocks = List.of( + Blocks.WATER, Blocks.SLIME_BLOCK, Blocks.HAY_BLOCK, Blocks.HONEY_BLOCK, + Blocks.TWISTING_VINES, Blocks.BLACK_BED, Blocks.BLUE_BED, Blocks.BROWN_BED, + Blocks.CYAN_BED, Blocks.GRAY_BED, Blocks.GREEN_BED, Blocks.LIGHT_BLUE_BED, + Blocks.LIGHT_GRAY_BED, Blocks.LIME_BED, Blocks.MAGENTA_BED, Blocks.ORANGE_BED, + Blocks.PINK_BED, Blocks.PURPLE_BED, Blocks.RED_BED, Blocks. WHITE_BED, + Blocks.YELLOW_BED); + private final EnumSetting mode = sgGeneral.add(new EnumSetting<>( "modo", "de qué manera evitar el daño de caída", @@ -57,12 +71,18 @@ public class NoFall extends Module { 1 )); - private final BooleanSetting clutch = sgGeneral.add( new BooleanSetting( + private final BooleanSetting clutch = sgGeneral.add(new BooleanSetting( "salvada", "cambiar a modo paquete si no se encuentra un cubo disponible", true )); + private final BooleanSetting center = sgGeneral.add(new BooleanSetting( + "centrar jugador", + "centrar jugador respecto al bloque que tenga debajo", + false + )); + public NoFall() { super("tobillos fuertes", "evita el daño de caída", Category.PLAYER); } @@ -77,11 +97,34 @@ public class NoFall extends Module { if (mc.player.isOnGround()) { placed = false; + shouldUse = false; } - if (mode.is(NoFallMode.CLUTCH) && mc.player.fallDistance >= distance.getValue() && !mc.player.isOnGround() && !placed) { - HitResult result = mc.getCameraEntity().raycast(3, 0, false); - if (result instanceof BlockHitResult) { + if (shouldUse) { + mc.doItemUse(); + } + + if (mode.is(NoFallMode.CLUTCH) + && mc.player.fallDistance >= distance.getValue() + && !mc.player.isOnGround() + && !placed) { + + if (center.getValue()) { + Vec3d diff = mc.player.getEntityPos().subtract(mc.player.getBlockPos().toCenterPos()); + if (diff.lengthSquared() > 10e-3) { + Vec3d impulse = new Vec3d(-diff.x * 0.05, 0, -diff.z * 0.05); + mc.player.addVelocity(impulse.x, impulse.y, impulse.z); + } + } + + HitResult result = mc.getCameraEntity().raycast(3, 0, true); + if (result instanceof BlockHitResult bhr) { + BlockPos pos = bhr.getBlockPos(); + while (mc.world.getBlockState(pos).isOf(Blocks.AIR)) { + pos = pos.down(); + } + if (isSafeBlock(pos)) return; + // encontrar ítem ItemStack mlgItem = getMlgItem(); if (mlgItem == null) { @@ -102,6 +145,13 @@ public class NoFall extends Module { int slot = mc.player.getInventory().getSlotWithStack(mlgItem); mc.player.getInventory().setSelectedSlot(slot); + // usar bloque + if (mlgItem.getItem() instanceof BlockItem) { + shouldUse = true; + placed = true; + return; + } + // usar ítem ActionResult didPlace = mc.interactionManager.interactItem(mc.player, Hand.MAIN_HAND); if (didPlace.isAccepted()) @@ -151,6 +201,10 @@ public class NoFall extends Module { return null; } + private boolean isSafeBlock(BlockPos pos) { + return safeBlocks.contains(mc.world.getBlockState(pos).getBlock()); + } + private enum NoFallMode { CLUTCH("waterdrop"), PACKET("paquetes"); diff --git a/src/main/resources/sputnik.mixins.json b/src/main/resources/sputnik.mixins.json index b9e3979..3ace205 100644 --- a/src/main/resources/sputnik.mixins.json +++ b/src/main/resources/sputnik.mixins.json @@ -60,6 +60,7 @@ "mixins.network.ResourcePackPolicyMixin", "mixins.network.ServerInfoMixin", "mixins.network.TelemetryManagerMixin", + "mixins.player.ClientPlayerEntityMixin", "mixins.player.ClientPlayerInteractionManagerMixin", "mixins.render.BufferStorageMixin", "mixins.render.CameraMixin",