From ac7de7a07a1d85c6d4be8d8de935b71a86b19b69 Mon Sep 17 00:00:00 2001 From: retucio Date: Thu, 27 Aug 2026 01:00:19 +0200 Subject: [PATCH] v6.1 --- README.md | 2 +- cambios.md | 10 +- gradle.properties | 2 +- .../command/commands/PurgeCommand.java | 3 +- .../render/ApplyTransformationEvent.java | 24 +++ .../event/render/RenderItemEntityEvent.java | 25 +++ .../ItemStackRenderStateAccessor.java | 16 ++ .../accessors/LayerRenderStateAccessor.java | 14 ++ .../mixin/mixins/entity/EntityMixin.java | 4 - .../mixin/mixins/hud/ChatComponentMixin.java | 8 +- .../mixin/mixins/hud/GuiMessageLineMixin.java | 2 +- .../mixin/mixins/hud/GuiMessageMixin.java | 2 +- .../mixins/item/ItemEntityRendererMixin.java | 36 ++++ .../mixin/mixins/item/ItemTransformMixin.java | 21 +++ .../mixin/mixins/misc/MinecraftMixin.java | 4 +- .../sputnik/mixin/mixins/misc/Vec3Mixin.java | 2 +- .../mixins/network/ChatListenerMixin.java | 2 +- .../ClientCommonPacketListenerImplMixin.java | 2 +- .../render/EntityRenderDispatcherMixin.java | 22 +++ .../mixins/render/EntityRenderStateMixin.java | 26 +++ .../mixins/screen/ConfirmScreenMixin.java | 2 +- .../IChatComponent.java | 2 +- .../IChatListener.java | 2 +- .../IConfirmScreen.java | 2 +- .../mixinterfaces/IEntityRenderState.java | 13 ++ .../IGuiMessage.java | 2 +- .../IGuiMessageLine.java | 2 +- .../interfaces => mixinterfaces}/IVec3.java | 2 +- .../TextVisitor.java | 2 +- .../retucio/sputnik/module/ModuleManager.java | 1 + .../module/modules/combat/KillAura.java | 40 +++-- .../sputnik/module/modules/misc/ChatPlus.java | 6 +- .../module/modules/movement/Scaffold.java | 18 +- .../module/modules/render/ItemPhysics.java | 165 ++++++++++++++++++ .../module/modules/world/AutoTool.java | 25 ++- .../retucio/sputnik/ui/hud/HudRenderer.java | 1 + .../sputnik/ui/hud/elements/SpeedElement.java | 39 +++++ .../me/retucio/sputnik/util/MiscUtil.java | 1 + .../resources/assets/sputnik/lang/en_us.json | 78 +++++---- .../resources/assets/sputnik/lang/es_es.json | 8 + src/main/resources/sputnik.mixins.json | 6 + 41 files changed, 551 insertions(+), 93 deletions(-) create mode 100644 src/main/java/me/retucio/sputnik/event/render/ApplyTransformationEvent.java create mode 100644 src/main/java/me/retucio/sputnik/event/render/RenderItemEntityEvent.java create mode 100644 src/main/java/me/retucio/sputnik/mixin/accessors/ItemStackRenderStateAccessor.java create mode 100644 src/main/java/me/retucio/sputnik/mixin/accessors/LayerRenderStateAccessor.java create mode 100644 src/main/java/me/retucio/sputnik/mixin/mixins/item/ItemEntityRendererMixin.java create mode 100644 src/main/java/me/retucio/sputnik/mixin/mixins/item/ItemTransformMixin.java create mode 100644 src/main/java/me/retucio/sputnik/mixin/mixins/render/EntityRenderDispatcherMixin.java create mode 100644 src/main/java/me/retucio/sputnik/mixin/mixins/render/EntityRenderStateMixin.java rename src/main/java/me/retucio/sputnik/{util/interfaces => mixinterfaces}/IChatComponent.java (85%) rename src/main/java/me/retucio/sputnik/{util/interfaces => mixinterfaces}/IChatListener.java (72%) rename src/main/java/me/retucio/sputnik/{util/interfaces => mixinterfaces}/IConfirmScreen.java (66%) create mode 100644 src/main/java/me/retucio/sputnik/mixinterfaces/IEntityRenderState.java rename src/main/java/me/retucio/sputnik/{util/interfaces => mixinterfaces}/IGuiMessage.java (84%) rename src/main/java/me/retucio/sputnik/{util/interfaces => mixinterfaces}/IGuiMessageLine.java (76%) rename src/main/java/me/retucio/sputnik/{util/interfaces => mixinterfaces}/IVec3.java (89%) rename src/main/java/me/retucio/sputnik/{util/interfaces => mixinterfaces}/TextVisitor.java (96%) create mode 100644 src/main/java/me/retucio/sputnik/module/modules/render/ItemPhysics.java create mode 100644 src/main/java/me/retucio/sputnik/ui/hud/elements/SpeedElement.java diff --git a/README.md b/README.md index 98b0ef5..63adee5 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ mod para Minecraft Fabric 26.2 que añade algunas cosas QOL, mayormente relacion ## instalación ### para gente normal: -1. ir a [lanzamientos](https://github.com/retuci0/sputnik/releases) +1. ir a [lanzamientos](https://codeberg.org/retucio/sputnik/releases) 2. selecionar la versión más reciente 3. descargar el .jar 4. moverlo a tu directorio de mods (probablemente `%appdata%/.minecraft/mods`) diff --git a/cambios.md b/cambios.md index b334ce9..50cfdbf 100644 --- a/cambios.md +++ b/cambios.md @@ -1,4 +1,4 @@ -# v6.0 +# v6.1 ## novedades @@ -6,15 +6,17 @@ #### módulos nuevos: -#### comandos nuevos: +- físicas de items: aplica físicas "realistas" a los items del suelo #### elementos del HUD nuevos: -- imagen custom: imagen custom. +- velocidad: velocidad del jugador ### arreglos / mejoras -- ahora se guardan correctamente los ajustes de archivo +- killaura ya no te echa por exceder el límite de paquetes +- el mj bridge de andamios ya funciona correctamente al no usarse en el aire +- ahora no hace falta volver a clicar cada vez que quieras cambiar de herramienta en `auto herramienta`, con el modo `cada tick` ## problemas reconocidos diff --git a/gradle.properties b/gradle.properties index e6dbb68..4b92ada 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,6 +10,6 @@ discord_rpc_version=1.0.3 neutrino_version=1.1.0 jdk_version=25 -mod_version=6.0 +mod_version=6.1 maven_group=me.retucio archives_base_name=sputnik \ No newline at end of file diff --git a/src/main/java/me/retucio/sputnik/command/commands/PurgeCommand.java b/src/main/java/me/retucio/sputnik/command/commands/PurgeCommand.java index 5db98ff..6c84399 100644 --- a/src/main/java/me/retucio/sputnik/command/commands/PurgeCommand.java +++ b/src/main/java/me/retucio/sputnik/command/commands/PurgeCommand.java @@ -3,12 +3,11 @@ package me.retucio.sputnik.command.commands; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import me.retucio.sputnik.command.Command; -import me.retucio.sputnik.util.interfaces.IChatComponent; +import me.retucio.sputnik.mixinterfaces.IChatComponent; import net.minecraft.client.gui.components.ChatComponent; import net.minecraft.client.multiplayer.chat.GuiMessage; import net.minecraft.commands.SharedSuggestionProvider; -import java.awt.*; import java.util.List; public class PurgeCommand extends Command { diff --git a/src/main/java/me/retucio/sputnik/event/render/ApplyTransformationEvent.java b/src/main/java/me/retucio/sputnik/event/render/ApplyTransformationEvent.java new file mode 100644 index 0000000..ef45dc6 --- /dev/null +++ b/src/main/java/me/retucio/sputnik/event/render/ApplyTransformationEvent.java @@ -0,0 +1,24 @@ +package me.retucio.sputnik.event.render; + +import com.github.retucio.neutrino.Event; +import net.minecraft.client.resources.model.cuboid.ItemTransform; + + +public class ApplyTransformationEvent extends Event { + + private final ItemTransform transformation; + private final boolean leftHanded; + + public ApplyTransformationEvent(ItemTransform transformation, boolean leftHanded) { + this.transformation = transformation; + this.leftHanded = leftHanded; + } + + public ItemTransform getTransformation() { + return transformation; + } + + public boolean isLeftHanded() { + return leftHanded; + } +} diff --git a/src/main/java/me/retucio/sputnik/event/render/RenderItemEntityEvent.java b/src/main/java/me/retucio/sputnik/event/render/RenderItemEntityEvent.java new file mode 100644 index 0000000..72a008d --- /dev/null +++ b/src/main/java/me/retucio/sputnik/event/render/RenderItemEntityEvent.java @@ -0,0 +1,25 @@ +package me.retucio.sputnik.event.render; + +import com.github.retucio.neutrino.Event; +import com.mojang.blaze3d.vertex.PoseStack; +import me.retucio.sputnik.mixinterfaces.IEntityRenderState; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.entity.state.ItemEntityRenderState; +import net.minecraft.world.entity.item.ItemEntity; + +public class RenderItemEntityEvent extends Event { + + public final ItemEntity itemEntity; + public final ItemEntityRenderState renderState; + public final PoseStack matrixStack; + public final SubmitNodeCollector renderCommandQueue; + public final int light; + + public RenderItemEntityEvent(ItemEntityRenderState renderState, PoseStack matrixStack, SubmitNodeCollector renderCommandQueue, int light) { + this.itemEntity = (ItemEntity) ((IEntityRenderState) renderState).sputnik$getEntity(); + this.renderState = renderState; + this.matrixStack = matrixStack; + this.renderCommandQueue = renderCommandQueue; + this.light = light; + } +} \ No newline at end of file diff --git a/src/main/java/me/retucio/sputnik/mixin/accessors/ItemStackRenderStateAccessor.java b/src/main/java/me/retucio/sputnik/mixin/accessors/ItemStackRenderStateAccessor.java new file mode 100644 index 0000000..666914f --- /dev/null +++ b/src/main/java/me/retucio/sputnik/mixin/accessors/ItemStackRenderStateAccessor.java @@ -0,0 +1,16 @@ +package me.retucio.sputnik.mixin.accessors; + +import net.minecraft.client.renderer.item.ItemStackRenderState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + + +@Mixin(ItemStackRenderState.class) +public interface ItemStackRenderStateAccessor { + + @Accessor("activeLayerCount") + int getActiveLayerCount(); + + @Accessor("layers") + ItemStackRenderState.LayerRenderState[] getLayers(); +} diff --git a/src/main/java/me/retucio/sputnik/mixin/accessors/LayerRenderStateAccessor.java b/src/main/java/me/retucio/sputnik/mixin/accessors/LayerRenderStateAccessor.java new file mode 100644 index 0000000..9717f41 --- /dev/null +++ b/src/main/java/me/retucio/sputnik/mixin/accessors/LayerRenderStateAccessor.java @@ -0,0 +1,14 @@ +package me.retucio.sputnik.mixin.accessors; + +import net.minecraft.client.renderer.item.ItemStackRenderState; +import net.minecraft.client.resources.model.cuboid.ItemTransform; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + + +@Mixin(ItemStackRenderState.LayerRenderState.class) +public interface LayerRenderStateAccessor { + + @Accessor("itemTransform") + ItemTransform sputnik$getTransform(); +} \ No newline at end of file diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/entity/EntityMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/entity/EntityMixin.java index c4e20dc..c179cb0 100644 --- a/src/main/java/me/retucio/sputnik/mixin/mixins/entity/EntityMixin.java +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/entity/EntityMixin.java @@ -11,9 +11,7 @@ import me.retucio.sputnik.module.modules.misc.AntiInvis; import me.retucio.sputnik.module.modules.movement.BoatFly; import me.retucio.sputnik.module.modules.movement.Velocity; import me.retucio.sputnik.module.modules.render.Nametags; -import me.retucio.sputnik.util.interfaces.IVec3; import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; @@ -25,8 +23,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.arrow.AbstractArrow; import net.minecraft.world.entity.vehicle.boat.AbstractBoat; import net.minecraft.world.phys.HitResult; -import net.minecraft.world.phys.Vec3; -import org.joml.Vector3d; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/hud/ChatComponentMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/hud/ChatComponentMixin.java index 98ce340..197097f 100644 --- a/src/main/java/me/retucio/sputnik/mixin/mixins/hud/ChatComponentMixin.java +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/hud/ChatComponentMixin.java @@ -5,10 +5,10 @@ import me.retucio.sputnik.event.network.ReceiveMessageEvent; import me.retucio.sputnik.module.ModuleManager; import me.retucio.sputnik.module.modules.misc.ChatPlus; -import me.retucio.sputnik.util.interfaces.IChatComponent; -import me.retucio.sputnik.util.interfaces.IGuiMessage; -import me.retucio.sputnik.util.interfaces.IGuiMessageLine; -import me.retucio.sputnik.util.interfaces.IChatListener; +import me.retucio.sputnik.mixinterfaces.IChatComponent; +import me.retucio.sputnik.mixinterfaces.IGuiMessage; +import me.retucio.sputnik.mixinterfaces.IGuiMessageLine; +import me.retucio.sputnik.mixinterfaces.IChatListener; import net.minecraft.client.gui.components.ChatComponent; import net.minecraft.client.multiplayer.chat.GuiMessage; diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/hud/GuiMessageLineMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/hud/GuiMessageLineMixin.java index 0db7345..0d43be8 100644 --- a/src/main/java/me/retucio/sputnik/mixin/mixins/hud/GuiMessageLineMixin.java +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/hud/GuiMessageLineMixin.java @@ -1,7 +1,7 @@ package me.retucio.sputnik.mixin.mixins.hud; import com.mojang.authlib.GameProfile; -import me.retucio.sputnik.util.interfaces.IGuiMessageLine; +import me.retucio.sputnik.mixinterfaces.IGuiMessageLine; import net.minecraft.client.multiplayer.chat.GuiMessage; import net.minecraft.util.FormattedCharSequence; import org.spongepowered.asm.mixin.Final; diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/hud/GuiMessageMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/hud/GuiMessageMixin.java index 090e7a7..afdda1d 100644 --- a/src/main/java/me/retucio/sputnik/mixin/mixins/hud/GuiMessageMixin.java +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/hud/GuiMessageMixin.java @@ -1,7 +1,7 @@ package me.retucio.sputnik.mixin.mixins.hud; import com.mojang.authlib.GameProfile; -import me.retucio.sputnik.util.interfaces.IGuiMessage; +import me.retucio.sputnik.mixinterfaces.IGuiMessage; import net.minecraft.client.multiplayer.chat.GuiMessage; import net.minecraft.network.chat.Component; import org.spongepowered.asm.mixin.Final; diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/item/ItemEntityRendererMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/item/ItemEntityRendererMixin.java new file mode 100644 index 0000000..5742481 --- /dev/null +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/item/ItemEntityRendererMixin.java @@ -0,0 +1,36 @@ +package me.retucio.sputnik.mixin.mixins.item; + +import me.retucio.sputnik.Sputnik; +import me.retucio.sputnik.event.render.RenderItemEntityEvent; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.entity.ItemEntityRenderer; +import net.minecraft.client.renderer.entity.state.ItemEntityRenderState; +import net.minecraft.client.renderer.state.level.CameraRenderState; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + + +@Mixin(ItemEntityRenderer.class) +public class ItemEntityRendererMixin { + + @Inject(method = "submit(Lnet/minecraft/client/renderer/entity/state/ItemEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/CameraRenderState;)V", at = @At("HEAD"), cancellable = true) + private void onSubmit(ItemEntityRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera, CallbackInfo ci) { + RenderItemEntityEvent event = Sputnik.EVENT_BUS.post( + new RenderItemEntityEvent( + state, + poseStack, + submitNodeCollector, + state.lightCoords + ) + ); + + if (event.isCancelled()) { + ci.cancel(); + } + } +} diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/item/ItemTransformMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/item/ItemTransformMixin.java new file mode 100644 index 0000000..b24b9fc --- /dev/null +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/item/ItemTransformMixin.java @@ -0,0 +1,21 @@ +package me.retucio.sputnik.mixin.mixins.item; + +import com.mojang.blaze3d.vertex.PoseStack; +import me.retucio.sputnik.Sputnik; +import me.retucio.sputnik.event.render.ApplyTransformationEvent; +import net.minecraft.client.resources.model.cuboid.ItemTransform; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ItemTransform.class) +public abstract class ItemTransformMixin { + @Inject(method = "apply", at = @At("HEAD"), cancellable = true) + private void onApply(boolean applyLeftHandFix, PoseStack.Pose pose, CallbackInfo ci) { + ApplyTransformationEvent event = Sputnik.EVENT_BUS.post(new ApplyTransformationEvent((ItemTransform) (Object) this, applyLeftHandFix)); + if (event.isCancelled()) { + ci.cancel(); + } + } +} \ No newline at end of file diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/misc/MinecraftMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/misc/MinecraftMixin.java index c9b2823..9af65f1 100644 --- a/src/main/java/me/retucio/sputnik/mixin/mixins/misc/MinecraftMixin.java +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/misc/MinecraftMixin.java @@ -3,16 +3,14 @@ package me.retucio.sputnik.mixin.mixins.misc; import com.llamalad7.mixinextras.sugar.Local; import me.retucio.sputnik.Sputnik; import me.retucio.sputnik.event.network.JoinWorldEvent; -import me.retucio.sputnik.event.interact.OpenScreenEvent; import me.retucio.sputnik.event.ShutdownEvent; import me.retucio.sputnik.event.TickEvent; import me.retucio.sputnik.event.interact.UseItemEvent; import me.retucio.sputnik.module.ModuleManager; import me.retucio.sputnik.module.modules.camera.Freecam; import me.retucio.sputnik.module.modules.player.FastUse; -import me.retucio.sputnik.util.interfaces.IVec3; +import me.retucio.sputnik.mixinterfaces.IVec3; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/misc/Vec3Mixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/misc/Vec3Mixin.java index eb32648..9dc4a94 100644 --- a/src/main/java/me/retucio/sputnik/mixin/mixins/misc/Vec3Mixin.java +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/misc/Vec3Mixin.java @@ -1,6 +1,6 @@ package me.retucio.sputnik.mixin.mixins.misc; -import me.retucio.sputnik.util.interfaces.IVec3; +import me.retucio.sputnik.mixinterfaces.IVec3; import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/network/ChatListenerMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/network/ChatListenerMixin.java index 422e8fa..43d8de8 100644 --- a/src/main/java/me/retucio/sputnik/mixin/mixins/network/ChatListenerMixin.java +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/network/ChatListenerMixin.java @@ -1,7 +1,7 @@ package me.retucio.sputnik.mixin.mixins.network; import com.mojang.authlib.GameProfile; -import me.retucio.sputnik.util.interfaces.IChatListener; +import me.retucio.sputnik.mixinterfaces.IChatListener; import net.minecraft.client.multiplayer.chat.ChatListener; import net.minecraft.network.chat.ChatType; import net.minecraft.network.chat.Component; diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/network/ClientCommonPacketListenerImplMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/network/ClientCommonPacketListenerImplMixin.java index cd7c748..08e2aaa 100644 --- a/src/main/java/me/retucio/sputnik/mixin/mixins/network/ClientCommonPacketListenerImplMixin.java +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/network/ClientCommonPacketListenerImplMixin.java @@ -4,7 +4,7 @@ import me.retucio.sputnik.mixin.accessors.PackConfirmScreenAccessor; import me.retucio.sputnik.mixin.accessors.PendingRequestAccessor; import me.retucio.sputnik.module.ModuleManager; import me.retucio.sputnik.module.modules.network.RPackBypass; -import me.retucio.sputnik.util.interfaces.IConfirmScreen; +import me.retucio.sputnik.mixinterfaces.IConfirmScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.multiplayer.ClientCommonPacketListenerImpl; diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/render/EntityRenderDispatcherMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/render/EntityRenderDispatcherMixin.java new file mode 100644 index 0000000..f8d5b12 --- /dev/null +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/render/EntityRenderDispatcherMixin.java @@ -0,0 +1,22 @@ +package me.retucio.sputnik.mixin.mixins.render; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import me.retucio.sputnik.mixinterfaces.IEntityRenderState; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.state.EntityRenderState; +import net.minecraft.world.entity.Entity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + + +@Mixin(EntityRenderDispatcher.class) +public abstract class EntityRenderDispatcherMixin { + @ModifyExpressionValue( + method = "extractEntity(Lnet/minecraft/world/entity/Entity;F)Lnet/minecraft/client/renderer/entity/state/EntityRenderState;", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/EntityRenderer;createRenderState(Lnet/minecraft/world/entity/Entity;F)Lnet/minecraft/client/renderer/entity/state/EntityRenderState;") + ) + private EntityRenderState getAndUpdateRenderState$setEntity(EntityRenderState state, E entity, float partialTicks) { + ((IEntityRenderState) state).sputnik$setEntity(entity); + return state; + } +} diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/render/EntityRenderStateMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/render/EntityRenderStateMixin.java new file mode 100644 index 0000000..b97ea26 --- /dev/null +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/render/EntityRenderStateMixin.java @@ -0,0 +1,26 @@ +package me.retucio.sputnik.mixin.mixins.render; + +import me.retucio.sputnik.mixinterfaces.IEntityRenderState; +import net.minecraft.client.renderer.entity.state.EntityRenderState; +import net.minecraft.world.entity.Entity; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + + +@Mixin(EntityRenderState.class) +public abstract class EntityRenderStateMixin implements IEntityRenderState { + @Unique + private Entity entity; + + @Override + @Nullable + public Entity sputnik$getEntity() { + return entity; + } + + @Override + public void sputnik$setEntity(Entity entity) { + this.entity = entity; + } +} \ No newline at end of file diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/screen/ConfirmScreenMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/screen/ConfirmScreenMixin.java index 587b52f..8980ee2 100644 --- a/src/main/java/me/retucio/sputnik/mixin/mixins/screen/ConfirmScreenMixin.java +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/screen/ConfirmScreenMixin.java @@ -2,7 +2,7 @@ package me.retucio.sputnik.mixin.mixins.screen; import me.retucio.sputnik.module.ModuleManager; import me.retucio.sputnik.module.modules.network.RPackBypass; -import me.retucio.sputnik.util.interfaces.IConfirmScreen; +import me.retucio.sputnik.mixinterfaces.IConfirmScreen; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.layouts.LinearLayout; diff --git a/src/main/java/me/retucio/sputnik/util/interfaces/IChatComponent.java b/src/main/java/me/retucio/sputnik/mixinterfaces/IChatComponent.java similarity index 85% rename from src/main/java/me/retucio/sputnik/util/interfaces/IChatComponent.java rename to src/main/java/me/retucio/sputnik/mixinterfaces/IChatComponent.java index 9ac220d..5f4135a 100644 --- a/src/main/java/me/retucio/sputnik/util/interfaces/IChatComponent.java +++ b/src/main/java/me/retucio/sputnik/mixinterfaces/IChatComponent.java @@ -1,4 +1,4 @@ -package me.retucio.sputnik.util.interfaces; +package me.retucio.sputnik.mixinterfaces; import net.minecraft.client.multiplayer.chat.GuiMessage; import net.minecraft.network.chat.Component; diff --git a/src/main/java/me/retucio/sputnik/util/interfaces/IChatListener.java b/src/main/java/me/retucio/sputnik/mixinterfaces/IChatListener.java similarity index 72% rename from src/main/java/me/retucio/sputnik/util/interfaces/IChatListener.java rename to src/main/java/me/retucio/sputnik/mixinterfaces/IChatListener.java index dda3b44..761d6a4 100644 --- a/src/main/java/me/retucio/sputnik/util/interfaces/IChatListener.java +++ b/src/main/java/me/retucio/sputnik/mixinterfaces/IChatListener.java @@ -1,4 +1,4 @@ -package me.retucio.sputnik.util.interfaces; +package me.retucio.sputnik.mixinterfaces; import com.mojang.authlib.GameProfile; diff --git a/src/main/java/me/retucio/sputnik/util/interfaces/IConfirmScreen.java b/src/main/java/me/retucio/sputnik/mixinterfaces/IConfirmScreen.java similarity index 66% rename from src/main/java/me/retucio/sputnik/util/interfaces/IConfirmScreen.java rename to src/main/java/me/retucio/sputnik/mixinterfaces/IConfirmScreen.java index 6e303d7..650cf7f 100644 --- a/src/main/java/me/retucio/sputnik/util/interfaces/IConfirmScreen.java +++ b/src/main/java/me/retucio/sputnik/mixinterfaces/IConfirmScreen.java @@ -1,4 +1,4 @@ -package me.retucio.sputnik.util.interfaces; +package me.retucio.sputnik.mixinterfaces; public interface IConfirmScreen { diff --git a/src/main/java/me/retucio/sputnik/mixinterfaces/IEntityRenderState.java b/src/main/java/me/retucio/sputnik/mixinterfaces/IEntityRenderState.java new file mode 100644 index 0000000..53c1349 --- /dev/null +++ b/src/main/java/me/retucio/sputnik/mixinterfaces/IEntityRenderState.java @@ -0,0 +1,13 @@ +package me.retucio.sputnik.mixinterfaces; + +import net.minecraft.world.entity.Entity; +import org.jspecify.annotations.Nullable; + + +public interface IEntityRenderState { + + @Nullable + Entity sputnik$getEntity(); + + void sputnik$setEntity(Entity entity); +} \ No newline at end of file diff --git a/src/main/java/me/retucio/sputnik/util/interfaces/IGuiMessage.java b/src/main/java/me/retucio/sputnik/mixinterfaces/IGuiMessage.java similarity index 84% rename from src/main/java/me/retucio/sputnik/util/interfaces/IGuiMessage.java rename to src/main/java/me/retucio/sputnik/mixinterfaces/IGuiMessage.java index 49bbee6..fc0e2e1 100644 --- a/src/main/java/me/retucio/sputnik/util/interfaces/IGuiMessage.java +++ b/src/main/java/me/retucio/sputnik/mixinterfaces/IGuiMessage.java @@ -1,4 +1,4 @@ -package me.retucio.sputnik.util.interfaces; +package me.retucio.sputnik.mixinterfaces; import com.mojang.authlib.GameProfile; diff --git a/src/main/java/me/retucio/sputnik/util/interfaces/IGuiMessageLine.java b/src/main/java/me/retucio/sputnik/mixinterfaces/IGuiMessageLine.java similarity index 76% rename from src/main/java/me/retucio/sputnik/util/interfaces/IGuiMessageLine.java rename to src/main/java/me/retucio/sputnik/mixinterfaces/IGuiMessageLine.java index e165f84..870adbd 100644 --- a/src/main/java/me/retucio/sputnik/util/interfaces/IGuiMessageLine.java +++ b/src/main/java/me/retucio/sputnik/mixinterfaces/IGuiMessageLine.java @@ -1,4 +1,4 @@ -package me.retucio.sputnik.util.interfaces; +package me.retucio.sputnik.mixinterfaces; public interface IGuiMessageLine extends IGuiMessage { diff --git a/src/main/java/me/retucio/sputnik/util/interfaces/IVec3.java b/src/main/java/me/retucio/sputnik/mixinterfaces/IVec3.java similarity index 89% rename from src/main/java/me/retucio/sputnik/util/interfaces/IVec3.java rename to src/main/java/me/retucio/sputnik/mixinterfaces/IVec3.java index cc56a0f..75d5bf3 100644 --- a/src/main/java/me/retucio/sputnik/util/interfaces/IVec3.java +++ b/src/main/java/me/retucio/sputnik/mixinterfaces/IVec3.java @@ -1,4 +1,4 @@ -package me.retucio.sputnik.util.interfaces; +package me.retucio.sputnik.mixinterfaces; import net.minecraft.core.Vec3i; import org.joml.Vector3d; diff --git a/src/main/java/me/retucio/sputnik/util/interfaces/TextVisitor.java b/src/main/java/me/retucio/sputnik/mixinterfaces/TextVisitor.java similarity index 96% rename from src/main/java/me/retucio/sputnik/util/interfaces/TextVisitor.java rename to src/main/java/me/retucio/sputnik/mixinterfaces/TextVisitor.java index bf734a0..b86503d 100644 --- a/src/main/java/me/retucio/sputnik/util/interfaces/TextVisitor.java +++ b/src/main/java/me/retucio/sputnik/mixinterfaces/TextVisitor.java @@ -1,6 +1,6 @@ /* code by meteorclient dev team */ -package me.retucio.sputnik.util.interfaces; +package me.retucio.sputnik.mixinterfaces; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; diff --git a/src/main/java/me/retucio/sputnik/module/ModuleManager.java b/src/main/java/me/retucio/sputnik/module/ModuleManager.java index e74c809..73f17ab 100644 --- a/src/main/java/me/retucio/sputnik/module/ModuleManager.java +++ b/src/main/java/me/retucio/sputnik/module/ModuleManager.java @@ -177,6 +177,7 @@ public class ModuleManager { add(new Fonts()); add(new GlintPlus()); add(new Hitboxes()); + add(new ItemPhysics()); add(new Lsd()); add(new Nametags()); add(new NoRender()); diff --git a/src/main/java/me/retucio/sputnik/module/modules/combat/KillAura.java b/src/main/java/me/retucio/sputnik/module/modules/combat/KillAura.java index 836f67d..95d6353 100644 --- a/src/main/java/me/retucio/sputnik/module/modules/combat/KillAura.java +++ b/src/main/java/me/retucio/sputnik/module/modules/combat/KillAura.java @@ -61,26 +61,42 @@ public class KillAura extends Module { public void onTick() { if (mc.player == null || mc.level == null) return; - for (Entity entity : mc.level.getEntities().getAll()) { - if (shouldAttack(entity)) { - attack(entity); - } + Entity target = findClosestTarget(); + if (target != null) { + attack(target); } } + private Entity findClosestTarget() { + Entity closest = null; + double closestDistSq = reach.getValue() * reach.getValue(); + + for (Entity entity : mc.level.getEntities().getAll()) { + if (!shouldAttack(entity)) continue; + + double distSq = entity.distanceToSqr(mc.player); + if (distSq > closestDistSq) continue; + + closest = entity; + closestDistSq = distSq; + } + return closest; + } + private void attack(Entity entity) { + if (mc.player.getAttackStrengthScale(0) < cooldownPercentage.getNormalizedValue() + && attackMode.is(AttackMode.TIMED) + ) { + return; + } + + if (!mc.level.isTickingEntity(entity)) return; + if (swingHand.getValue()) { mc.player.swing(InteractionHand.MAIN_HAND); } - if (attackMode.is(AttackMode.TIMED)) { - if (mc.player.getAttackStrengthScale(0) < cooldownPercentage.getNormalizedValue()) { - return; - } - } - if (mc.level.isTickingEntity(entity)) { - mc.gameMode.attack(mc.player, entity); - } + mc.gameMode.attack(mc.player, entity); } private boolean shouldAttack(Entity entity) { diff --git a/src/main/java/me/retucio/sputnik/module/modules/misc/ChatPlus.java b/src/main/java/me/retucio/sputnik/module/modules/misc/ChatPlus.java index 238672c..3f15fc8 100644 --- a/src/main/java/me/retucio/sputnik/module/modules/misc/ChatPlus.java +++ b/src/main/java/me/retucio/sputnik/module/modules/misc/ChatPlus.java @@ -15,9 +15,9 @@ import me.retucio.sputnik.module.setting.SettingGroup; import me.retucio.sputnik.module.setting.settings.BooleanSetting; import me.retucio.sputnik.module.setting.settings.NumberSetting; import me.retucio.sputnik.util.ChatUtil; -import me.retucio.sputnik.util.interfaces.IGuiMessage; -import me.retucio.sputnik.util.interfaces.IGuiMessageLine; -import me.retucio.sputnik.util.interfaces.TextVisitor; +import me.retucio.sputnik.mixinterfaces.IGuiMessage; +import me.retucio.sputnik.mixinterfaces.IGuiMessageLine; +import me.retucio.sputnik.mixinterfaces.TextVisitor; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.PlayerFaceExtractor; diff --git a/src/main/java/me/retucio/sputnik/module/modules/movement/Scaffold.java b/src/main/java/me/retucio/sputnik/module/modules/movement/Scaffold.java index 41f48a7..8cb04cc 100644 --- a/src/main/java/me/retucio/sputnik/module/modules/movement/Scaffold.java +++ b/src/main/java/me/retucio/sputnik/module/modules/movement/Scaffold.java @@ -228,8 +228,12 @@ public class Scaffold extends Module { // seleccionar nivel Y double y; - if (mjBridge.getValue() && mjY != null && isMoving()) { - y = mjY; + if (mjBridge.getValue()) { + if (mjY == null || !isMoving()) { + // no moving (or not yet initialized): keep mjY synced to the real ground level + mjY = (int) Math.floor(pos.y - 0.5); + } + y = isMoving() ? mjY : (pos.y - 0.5); } else { y = pos.y - 0.5; } @@ -294,14 +298,6 @@ public class Scaffold extends Module { } } - @EventListener - private void onPlaceBlock(PlaceBlockEvent event) { - // guardar último valor Y para el mj bridge - if (mjBridge.getValue()) { - mjY = event.getResult().getBlockPos().getY(); - } - } - @EventListener private void onSneak(SneakEvent event) { // no agacharse @@ -377,7 +373,7 @@ public class Scaffold extends Module { } private boolean isMoving() { - return mc.player.zza != 0 + return mc.player.zza != 0 || mc.player.xxa != 0; } diff --git a/src/main/java/me/retucio/sputnik/module/modules/render/ItemPhysics.java b/src/main/java/me/retucio/sputnik/module/modules/render/ItemPhysics.java new file mode 100644 index 0000000..34cc6c5 --- /dev/null +++ b/src/main/java/me/retucio/sputnik/module/modules/render/ItemPhysics.java @@ -0,0 +1,165 @@ +package me.retucio.sputnik.module.modules.render; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import me.retucio.sputnik.event.render.ApplyTransformationEvent; +import me.retucio.sputnik.event.render.RenderItemEntityEvent; +import me.retucio.sputnik.mixin.accessors.ItemStackRenderStateAccessor; +import me.retucio.sputnik.mixin.accessors.LayerRenderStateAccessor; +import me.retucio.sputnik.module.Category; +import me.retucio.sputnik.module.Module; +import me.retucio.sputnik.module.setting.SettingGroup; +import me.retucio.sputnik.module.setting.settings.BooleanSetting; +import com.github.retucio.neutrino.EventListener; +import net.minecraft.client.renderer.item.ItemStackRenderState; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.resources.model.cuboid.ItemTransform; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.item.ItemEntity; +import org.joml.Vector3f; +import org.joml.Vector3fc; + +import java.util.List; + +public class ItemPhysics extends Module { + + private static final float PIXEL_SIZE = 1f / 16f; + + private final BooleanSetting randomRotation = sgGeneral.add(new BooleanSetting( + "rotación aleatoria", + "añade una rotación aleatoria a cada objeto", + true + )); + + private final RandomSource random = RandomSource.createThreadLocalInstance(); + private boolean skipTransformation; + + public ItemPhysics() { + super("física de objetos", "aplica física a los objetos en el suelo", Category.RENDER); + } + + @EventListener + private void onRenderItemEntity(RenderItemEntityEvent event) { + event.cancel(); + + if (event.renderState.item.isEmpty() || event.itemEntity == null) return; + + PoseStack matrices = event.matrixStack; + random.setSeed(event.itemEntity.getId() * 0x53505554L); + + var accessor = (ItemStackRenderStateAccessor) event.renderState.item; + for (int i = 0; i < accessor.getActiveLayerCount(); i++) { + ItemStackRenderState.LayerRenderState layer = accessor.getLayers()[i]; + ModelInfo info = getInfo(layer.prepareQuadList()); + + matrices.pushPose(); + applyTransformation(matrices, ((LayerRenderStateAccessor) layer).sputnik$getTransform()); + matrices.translate(0, info.offsetY, 0); + offsetInWater(matrices, event.itemEntity); + + if (info.flat) { + matrices.mulPose(Axis.XP.rotationDegrees(90)); + matrices.translate(0, 0, info.offsetZ); + } + + if (randomRotation.getValue()) { + var axis = Axis.YP; + var x = 0.5f; var y = 0.0f; var z = 0.5f; + + if (info.flat) { + axis = Axis.ZP; + y = 0.5f; z = 0.0f; + } + + float degrees = (random.nextFloat() * 2 - 1) * 90; + matrices.translate(x, y, z); + matrices.mulPose(axis.rotationDegrees(degrees)); + matrices.translate(-x, -y, -z); + } + + renderLayer(event, info); + matrices.popPose(); + } + } + + @EventListener + private void onApplyTransformation(ApplyTransformationEvent event) { + if (skipTransformation) { + event.cancel(); + } + } + + private void renderLayer(RenderItemEntityEvent event, ModelInfo info) { + PoseStack matrices = event.matrixStack; + skipTransformation = true; + + for (int j = 0; j < event.renderState.count; j++) { + matrices.pushPose(); + + if (j > 0) { + float x = (random.nextFloat() * 2 - 1) * 0.25f; + float z = (random.nextFloat() * 2 - 1) * 0.25f; + translate(matrices, info, x, 0, z); + } + + event.renderState.item.submit(matrices, event.renderCommandQueue, event.light, OverlayTexture.NO_OVERLAY, event.renderState.outlineColor); + matrices.popPose(); + + float y = Math.max(random.nextFloat() * PIXEL_SIZE, PIXEL_SIZE / 2f); + translate(matrices, info, 0, y, 0); + } + + skipTransformation = false; + } + + private void translate(PoseStack matrices, ModelInfo info, float x, float y, float z) { + if (info.flat) { + float temp = y; y = z; z = -temp; + } + matrices.translate(x, y, z); + } + + private void applyTransformation(PoseStack matrices, ItemTransform transform) { + transform = new ItemTransform( + transform.rotation(), + new Vector3f(transform.translation().x(), 0, transform.translation().z()), + transform.scale() + ); + transform.apply(false, matrices.last()); + } + + private void offsetInWater(PoseStack matrices, ItemEntity entity) { + if (entity.isInWater()) { + matrices.translate(0, 0.333f, 0); + } + } + + private ModelInfo getInfo(List quads) { + float minX = Float.MAX_VALUE, maxX = Float.MIN_VALUE; + float minY = Float.MAX_VALUE, maxY = Float.MIN_VALUE; + float minZ = Float.MAX_VALUE, maxZ = Float.MIN_VALUE; + + for (var quad : quads) { + for (int i = 0; i < 4; i++) { + Vector3fc vec = quad.position(i); + minY = Math.min(minY, vec.y()); maxY = Math.max(maxY, vec.y()); + minZ = Math.min(minZ, vec.z()); maxZ = Math.max(maxZ, vec.z()); + minX = Math.min(minX, vec.x()); maxX = Math.max(maxX, vec.x()); + } + } + + if (minX == Float.MAX_VALUE) minX = 0; + if (minY == Float.MAX_VALUE) minY = 0; + if (minZ == Float.MAX_VALUE) minZ = 0; + if (maxX == Float.MIN_VALUE) maxX = 1; + if (maxY == Float.MIN_VALUE) maxY = 1; + if (maxZ == Float.MIN_VALUE) maxZ = 1; + + float x = maxX - minX, y = maxY - minY, z = maxZ - minZ; + boolean flat = (x > PIXEL_SIZE && y > PIXEL_SIZE && z <= PIXEL_SIZE); + + return new ModelInfo(flat, 0.5f - minY, -maxZ); + } + + private record ModelInfo(boolean flat, float offsetY, float offsetZ) {} +} diff --git a/src/main/java/me/retucio/sputnik/module/modules/world/AutoTool.java b/src/main/java/me/retucio/sputnik/module/modules/world/AutoTool.java index 7b64e73..6a3fd49 100644 --- a/src/main/java/me/retucio/sputnik/module/modules/world/AutoTool.java +++ b/src/main/java/me/retucio/sputnik/module/modules/world/AutoTool.java @@ -6,12 +6,14 @@ import me.retucio.sputnik.event.input.MouseClickEvent; 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.EnumSetting; import me.retucio.sputnik.module.setting.settings.NumberSetting; import me.retucio.sputnik.util.InventoryUtil; import me.retucio.sputnik.util.KeyUtil; import me.retucio.sputnik.util.MiscUtil; import net.minecraft.core.component.DataComponents; +import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.component.Tool; import net.minecraft.world.level.block.state.BlockState; @@ -26,6 +28,11 @@ import java.util.Map; public class AutoTool extends Module { + private final EnumSetting mode = sgGeneral.add(new EnumSetting<>( + "modo", "de qué manera ejecutar el módulo", + AutoToolMode.class, AutoToolMode.ON_CLICK + )); + private final NumberSetting delaySetting = sgGeneral.add(new NumberSetting( "delay", "delay al cambiar de herramienta", @@ -86,6 +93,11 @@ public class AutoTool extends Module { @Override public void onTick() { if (mc.player == null) return; + if (mc.gui.screen() != null) return; + + if (mode.is(AutoToolMode.ON_TICK) && mc.options.keyAttack.isDown()) { + handle(KeyUtil.getKey(mc.options.keyAttack), GLFW.GLFW_PRESS); + } if (startedMining && delaySetting.getIntValue() > 0) { delay++; @@ -165,10 +177,12 @@ public class AutoTool extends Module { BlockState state = mc.level.getBlockState(bhr.getBlockPos()); List tools = InventoryUtil.findAllStacks(stack -> stack.has(DataComponents.TOOL)); - if (tools.isEmpty()) return; Map speeds = new HashMap<>(); for (ItemStack tool : tools) { + int slot = mc.player.getInventory().findSlotMatchingItem(tool); + if (!Inventory.isHotbarSlot(slot)) continue; // skip anything outside the hotbar + Tool toolComponent = tool.get(DataComponents.TOOL); if (toolComponent != null) { speeds.put(toolComponent.getMiningSpeed(state), tool); @@ -193,4 +207,13 @@ public class AutoTool extends Module { finishedMining = false; switchBackDelay = 0; } + + private enum AutoToolMode { + ON_TICK("cada tick"), + ON_CLICK("cada click"); + + private final String name; + AutoToolMode(String name) { this.name = name; } + @Override public String toString() { return name; } + } } \ No newline at end of file diff --git a/src/main/java/me/retucio/sputnik/ui/hud/HudRenderer.java b/src/main/java/me/retucio/sputnik/ui/hud/HudRenderer.java index 5ff72a1..8eb596e 100644 --- a/src/main/java/me/retucio/sputnik/ui/hud/HudRenderer.java +++ b/src/main/java/me/retucio/sputnik/ui/hud/HudRenderer.java @@ -44,6 +44,7 @@ public class HudRenderer { addElement(new RotationElement(), positions, visibilities); addElement(new TimeElement(), positions, visibilities); addElement(new UptimeElement(), positions, visibilities); + addElement(new SpeedElement(), positions, visibilities); addElement(new DynoElement(), positions, visibilities); addElement(new EchestElement(), positions, visibilities); diff --git a/src/main/java/me/retucio/sputnik/ui/hud/elements/SpeedElement.java b/src/main/java/me/retucio/sputnik/ui/hud/elements/SpeedElement.java new file mode 100644 index 0000000..5892c08 --- /dev/null +++ b/src/main/java/me/retucio/sputnik/ui/hud/elements/SpeedElement.java @@ -0,0 +1,39 @@ +package me.retucio.sputnik.ui.hud.elements; + +import me.retucio.sputnik.module.modules.client.Hud; +import me.retucio.sputnik.ui.hud.TextHudElement; + +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; + +import java.util.List; + + +public class SpeedElement extends TextHudElement { + + public SpeedElement() { + super("velocidad", 0, (mc.getWindow().getGuiScaledHeight() - mc.font.lineHeight) / 2); + } + + @Override + public String getText(float delta, Hud hud) { + if (mc.player == null) return getPreviewText(); + return String.format("%.2f b/s", Mth.sqrt( + (float) (mc.player.getDeltaMovement().x() * mc.player.getDeltaMovement().x()) + + (float) (mc.player.getDeltaMovement().z() * mc.player.getDeltaMovement().z()) + )); + } + + @Override + public String getPreviewText() { + return "0 b/s"; + } + + @Override + public List getTooltip() { + return List.of( + Component.translatable("sputnik.hud.element.speed.name"), + Component.translatable("sputnik.hud.element.speed.desc") + ); + } +} diff --git a/src/main/java/me/retucio/sputnik/util/MiscUtil.java b/src/main/java/me/retucio/sputnik/util/MiscUtil.java index 4096e48..23c69b5 100644 --- a/src/main/java/me/retucio/sputnik/util/MiscUtil.java +++ b/src/main/java/me/retucio/sputnik/util/MiscUtil.java @@ -49,6 +49,7 @@ public class MiscUtil { } public static T getHighest(List list) { + if (list.isEmpty()) return null; if (list.getFirst() == null) return null; T maxValue = list.getFirst(); for (T t : list) { diff --git a/src/main/resources/assets/sputnik/lang/en_us.json b/src/main/resources/assets/sputnik/lang/en_us.json index 22443ac..d62f854 100644 --- a/src/main/resources/assets/sputnik/lang/en_us.json +++ b/src/main/resources/assets/sputnik/lang/en_us.json @@ -41,9 +41,9 @@ "sputnik.commands.macro.removed": "macro %s removed", "sputnik.commands.panorama.desc": "creates a panorama resource pack based on your current position", "sputnik.commands.panorama.errorassemble": "failed to assemble custom resource pack! does a pack of that name already exist?", + "sputnik.commands.panorama.finalizing": "finalizing resource pack...", "sputnik.commands.panorama.packdesc": "generated by Sputnik", "sputnik.commands.panorama.ready": "resource pack ready!", - "sputnik.commands.panorama.finalizing": "finalizing resource pack...", "sputnik.commands.peek.desc": "peeks at another player's inventory", "sputnik.commands.plugins.calmdown": "calm dooowwnnn", "sputnik.commands.plugins.desc": "looks for the plugins the server has", @@ -129,8 +129,8 @@ "sputnik.enum.module.modules.combat.holdattack.attackmode.time": "time", "sputnik.enum.module.modules.combat.killaura.attackmode.spam": "spam", "sputnik.enum.module.modules.combat.killaura.attackmode.timed": "time", - "sputnik.enum.module.modules.combat.killaura.listmode.whitelist": "whitelist", "sputnik.enum.module.modules.combat.killaura.listmode.blacklist": "blacklist", + "sputnik.enum.module.modules.combat.killaura.listmode.whitelist": "whitelist", "sputnik.enum.module.modules.combat.projectiletrajectories.trajectorystyle.dashed": "dashed", "sputnik.enum.module.modules.combat.projectiletrajectories.trajectorystyle.dotted": "points", "sputnik.enum.module.modules.combat.projectiletrajectories.trajectorystyle.solid": "solid", @@ -157,8 +157,8 @@ "sputnik.enum.module.modules.network.packetdelay.packets.keep_alive": "KeepAlive packets", "sputnik.enum.module.modules.network.packetdelay.packets.others": "all but KeepAlive", "sputnik.enum.module.modules.network.packetlogger.logmode.chat": "chat", - "sputnik.enum.module.modules.network.packetlogger.logmode.notification": "notification", "sputnik.enum.module.modules.network.packetlogger.logmode.file": "save to file", + "sputnik.enum.module.modules.network.packetlogger.logmode.notification": "notification", "sputnik.enum.module.modules.network.packetmine.clickaction.add_priority": "add priority", "sputnik.enum.module.modules.network.packetmine.clickaction.none": "nothing", "sputnik.enum.module.modules.network.packetmine.clickaction.unselect": "unselect", @@ -209,6 +209,8 @@ "sputnik.enum.module.modules.render.norender.colors.red": "red", "sputnik.enum.module.modules.render.norender.colors.white": "white", "sputnik.enum.module.modules.render.norender.colors.yellow": "yellow", + "sputnik.enum.module.modules.world.autotool.autotoolmode.on_click": "on click", + "sputnik.enum.module.modules.world.autotool.autotoolmode.on_tick": "on tick", "sputnik.enum.module.modules.world.blockinfo.copymode.command": "copy /setblock command", "sputnik.enum.module.modules.world.blockinfo.copymode.dont": "don't copy", "sputnik.enum.module.modules.world.blockinfo.copymode.json": "copy json contents", @@ -223,8 +225,8 @@ "sputnik.enum.module.modules.world.timechanger.moonphases.waxing_gibbous": "waxing gibbous", "sputnik.filesetting.cannotwrite": "cannot write to \"%s\"!", "sputnik.filesetting.choose": "choose a file", - "sputnik.filesetting.supportedfiles": "supported files", "sputnik.filesetting.doesnotexist": "file \"%s\" does not exist!", + "sputnik.filesetting.supportedfiles": "supported files", "sputnik.group.andamios.bloques": "blocks", "sputnik.group.andamios.puente": "bridge", "sputnik.group.andamios.renderizado": "render", @@ -312,6 +314,8 @@ "sputnik.hud.element.ping.name": "ping", "sputnik.hud.element.rotation.desc": "shows your current rotation", "sputnik.hud.element.rotation.name": "rotations", + "sputnik.hud.element.speed.desc": "the player's speed", + "sputnik.hud.element.speed.name": "speed", "sputnik.hud.element.time.desc": "hours and minutes in the selected timezone", "sputnik.hud.element.time.name": "time", "sputnik.hud.element.totems.desc": "totems available", @@ -392,6 +396,8 @@ "sputnik.module.bypassearpacks.name": "bypass packs", "sputnik.module.camaralibre.desc": "lets the camera move independently from the player. useful for scouting around", "sputnik.module.camaralibre.name": "freecam", + "sputnik.module.canceladordepaquetes.desc": "cancels packets.", + "sputnik.module.canceladordepaquetes.name": "packet cancel", "sputnik.module.capas.desc": "choose which cape to wear (only visible to you)", "sputnik.module.capas.name": "capes", "sputnik.module.capturasdepantalla.desc": "choose what to do after taking a screenshot", @@ -450,6 +456,8 @@ "sputnik.module.estampaescrotos.desc": "stamp other people's ballsacks", "sputnik.module.estampaescrotos.name": "ballsack stamper", "sputnik.module.freecam.damagedisable": "freecam was disabled because you took damage", + "sputnik.module.fisicadeobjetos.name": "item physics", + "sputnik.module.fisicadeobjetos.desc": "applies physics to dropped items", "sputnik.module.friends.already": "%s is already your friend", "sputnik.module.friends.notplayer": "%s could not be added as a friend", "sputnik.module.fuentes.desc": "changes the font used when rendering text", @@ -462,8 +470,8 @@ "sputnik.module.hotkeysinvcreativo.name": "creative inv. hotkeys", "sputnik.module.hud.desc": "screen overlay with extra info", "sputnik.module.hud.name": "HUD", - "sputnik.module.imandeitems.name": "item magnet", "sputnik.module.imandeitems.desc": "picks up distant items quickly via movement packets", + "sputnik.module.imandeitems.name": "item magnet", "sputnik.module.infodebloque.desc": "shows the nbt contents of the block you're looking at", "sputnik.module.infodebloque.name": "block info", "sputnik.module.interfaz.desc": "gui settings, and other miscellaneous ones", @@ -479,12 +487,12 @@ "sputnik.module.jugadorfalso.desc": "spawns a fake player entity for testing purposes", "sputnik.module.jugadorfalso.name": "fake player", "sputnik.module.keypearl.nopearls": "you have no pearls", - "sputnik.module.killaura.name": "killaura", "sputnik.module.killaura.desc": "if violence doesn't work, you haven't applied enough of it.", + "sputnik.module.killaura.name": "killaura", + "sputnik.module.loggerdepaquetes.desc": "logs packets", + "sputnik.module.loggerdepaquetes.name": "packet logger", "sputnik.module.lsd.desc": "what the actual FUCK", "sputnik.module.lsd.name": "lsd", - "sputnik.module.loggerdepaquetes.name": "packet logger", - "sputnik.module.loggerdepaquetes.desc": "logs packets", "sputnik.module.macekill.oops": "oops: %s", "sputnik.module.manos.desc": "changes the way hands are rendered", "sputnik.module.manos.name": "hands", @@ -512,8 +520,6 @@ "sputnik.module.notificaciones.name": "notifications", "sputnik.module.packetdelay.singleplayer": "packet delay doesn't work in singleplayer", "sputnik.module.packetmine.pickbreaking": "the pickaxe is about to break", - "sputnik.module.canceladordepaquetes.name": "packet cancel", - "sputnik.module.canceladordepaquetes.desc": "cancels packets.", "sputnik.module.parkour.desc": "automatically jumps on the last possible tick, at the block's edge", "sputnik.module.parkour.name": "parkour", "sputnik.module.particulas.desc": "emits artificial particles", @@ -532,8 +538,8 @@ "sputnik.module.progresodeminado.name": "mining progress", "sputnik.module.puntosdedesconexion.desc": "shows you the spots where other players log out", "sputnik.module.puntosdedesconexion.name": "logout spots", - "sputnik.module.putogordo.name": "fatass", "sputnik.module.putogordo.desc": "automatically eats when hungry", + "sputnik.module.putogordo.name": "fatass", "sputnik.module.racismo.desc": "detroit moment", "sputnik.module.racismo.name": "racism", "sputnik.module.reconectar.desc": "adds a button to reconnect to a server after being disconnected", @@ -595,7 +601,7 @@ "sputnik.module.trianguladordestrongholds.desc": "uses fancy math to work out where the closest stronghold is", "sputnik.module.trianguladordestrongholds.name": "stronghold triangulator", "sputnik.module.yunquesconpluma.desc": "lets you use different typefaces when renaming items in an anvil", - "sputnik.module.yunquesconpluma.name": "anvils with a quill", + "sputnik.module.yunquesconpluma.name": "faggot anvils", "sputnik.module.zoom.desc": "magnifying glass", "sputnik.module.zoom.name": "zoom", "sputnik.profile.error.dir": "could not create the profiles directory", @@ -711,6 +717,8 @@ "sputnik.setting.autoherramienta.general.delay.name": "delay", "sputnik.setting.autoherramienta.general.delaydelcambiodevuelta.desc": "delay in ticks before switching back to the original tool", "sputnik.setting.autoherramienta.general.delaydelcambiodevuelta.name": "switch back delay", + "sputnik.setting.autoherramienta.general.modo.desc": "when to check for changing tools", + "sputnik.setting.autoherramienta.general.modo.name": "mode", "sputnik.setting.autopechera.general.cambiardevuelta.desc": "switch back to elytra, if they were equipped", "sputnik.setting.autopechera.general.cambiardevuelta.name": "switch back", "sputnik.setting.autopesca.general.evitarromper.desc": "avoid breaking the rod if it's about to go", @@ -765,10 +773,10 @@ "sputnik.setting.camaralibre.velocidad.tecladelscroll.name": "scroll key", "sputnik.setting.camaralibre.velocidad.velocidad.desc": "camera movement speed", "sputnik.setting.camaralibre.velocidad.velocidad.name": "speed", - "sputnik.setting.canceladordepaquetes.general.c2s.name": "C2S", "sputnik.setting.canceladordepaquetes.general.c2s.desc": "serverbound packets to cancel", - "sputnik.setting.canceladordepaquetes.general.s2c.name": "S2C", + "sputnik.setting.canceladordepaquetes.general.c2s.name": "C2S", "sputnik.setting.canceladordepaquetes.general.s2c.desc": "clientbound packets to cancel", + "sputnik.setting.canceladordepaquetes.general.s2c.name": "S2C", "sputnik.setting.capas.general.capa.desc": "which cape to wear", "sputnik.setting.capas.general.capa.name": "cape", "sputnik.setting.capturasdepantalla.botones.botondeabrir.desc": "show a button to open the screenshot file", @@ -926,6 +934,8 @@ "sputnik.setting.estampaescrotos.general.maximapotencia.name": "max power", "sputnik.setting.estampaescrotos.general.prevenirmuerte.desc": "prevent death from fall damage if the attack was blocked, by cancelling the movement packets", "sputnik.setting.estampaescrotos.general.prevenirmuerte.name": "prevent death", + "sputnik.setting.fisicadeobjetos.general.rotacionaleatoria.name": "rotación aleatoria", + "sputnik.setting.fisicadeobjetos.general.rotacionaleatoria.desc": "añade una rotación aleatoria a cada objeto", "sputnik.setting.friend.nickname.desc": "what name to save the friend under", "sputnik.setting.friend.nickname.name": "name", "sputnik.setting.fuentes.general.fuente.desc": "font to use", @@ -954,8 +964,8 @@ "sputnik.setting.hud.elementos.formatodelahora.name": "time format", "sputnik.setting.hud.elementos.mododecoordenadas.desc": "which coordinates to show", "sputnik.setting.hud.elementos.mododecoordenadas.name": "coords mode", - "sputnik.setting.hud.elementos.rutadeimagen.name": "path", "sputnik.setting.hud.elementos.rutadeimagen.desc": "path to custom image", + "sputnik.setting.hud.elementos.rutadeimagen.name": "path", "sputnik.setting.hud.elementos.textocustom.desc": "watermark (leave empty to remove)", "sputnik.setting.hud.elementos.textocustom.name": "custom text", "sputnik.setting.hud.elementos.zonahoraria.desc": "timezone as UTC+n", @@ -968,8 +978,8 @@ "sputnik.setting.hud.visualizacion.mostrarenf3.name": "show in F3", "sputnik.setting.hud.visualizacion.sombra.desc": "text with shadow", "sputnik.setting.hud.visualizacion.sombra.name": "shadow", - "sputnik.setting.imandeitems.general.rango.name": "range", "sputnik.setting.imandeitems.general.rango.desc": "how far to reach out for items", + "sputnik.setting.imandeitems.general.rango.name": "range", "sputnik.setting.infodebloque.general.copiar.desc": "copy to clipboard", "sputnik.setting.infodebloque.general.copiar.name": "copy", "sputnik.setting.infodebloque.general.liquidos.desc": "also include liquids in the raycast", @@ -1037,26 +1047,26 @@ "sputnik.setting.jugadorfalso.general.nombre.desc": "what name to give the player", "sputnik.setting.jugadorfalso.general.nombre.name": "name", "sputnik.setting.key.reset": "keybind for module %s reset", - "sputnik.setting.killaura.general.alcance.name": "reach", - "sputnik.setting.killaura.general.alcance.desc": "how far to reach", - "sputnik.setting.killaura.general.mododeataque.name": "attack mode", - "sputnik.setting.killaura.general.mododeataque.desc": "how to attack", - "sputnik.setting.killaura.general.moverlamano.name": "swing", - "sputnik.setting.killaura.general.moverlamano.desc": "whether to swing the hand when attacking", - "sputnik.setting.killaura.general.porcentajedecooldown.name": "cooldown percentage", - "sputnik.setting.killaura.general.porcentajedecooldown.desc": "how long to wait for the cooldown bar to fill", - "sputnik.setting.killaura.entidades.entidades.name": "entities", "sputnik.setting.killaura.entidades.entidades.desc": "entities to attack", - "sputnik.setting.killaura.entidades.entidades1.name": "entities", + "sputnik.setting.killaura.entidades.entidades.name": "entities", "sputnik.setting.killaura.entidades.entidades1.desc": "entities NOT to attack", - "sputnik.setting.killaura.entidades.mododelista.name": "list mode", + "sputnik.setting.killaura.entidades.entidades1.name": "entities", "sputnik.setting.killaura.entidades.mododelista.desc": "how to interpret the list", - "sputnik.setting.loggerdepaquetes.general.paquetes.name": "packets", - "sputnik.setting.loggerdepaquetes.general.paquetes.desc": "packets to log", - "sputnik.setting.loggerdepaquetes.general.mododelogueo.name": "logging mode", - "sputnik.setting.loggerdepaquetes.general.mododelogueo.desc": "how to log packets", - "sputnik.setting.loggerdepaquetes.general.archivo.name": "file", + "sputnik.setting.killaura.entidades.mododelista.name": "list mode", + "sputnik.setting.killaura.general.alcance.desc": "how far to reach", + "sputnik.setting.killaura.general.alcance.name": "reach", + "sputnik.setting.killaura.general.mododeataque.desc": "how to attack", + "sputnik.setting.killaura.general.mododeataque.name": "attack mode", + "sputnik.setting.killaura.general.moverlamano.desc": "whether to swing the hand when attacking", + "sputnik.setting.killaura.general.moverlamano.name": "swing", + "sputnik.setting.killaura.general.porcentajedecooldown.desc": "how long to wait for the cooldown bar to fill", + "sputnik.setting.killaura.general.porcentajedecooldown.name": "cooldown percentage", "sputnik.setting.loggerdepaquetes.general.archivo.desc": "file to use as log file", + "sputnik.setting.loggerdepaquetes.general.archivo.name": "file", + "sputnik.setting.loggerdepaquetes.general.mododelogueo.desc": "how to log packets", + "sputnik.setting.loggerdepaquetes.general.mododelogueo.name": "logging mode", + "sputnik.setting.loggerdepaquetes.general.paquetes.desc": "packets to log", + "sputnik.setting.loggerdepaquetes.general.paquetes.name": "packets", "sputnik.setting.lsd.general.intensidad.desc": "how much the image is distorted and tinted", "sputnik.setting.lsd.general.intensidad.name": "strength", "sputnik.setting.lsd.general.rotaciones.desc": "how much the offset swirls; higher = more whirls", @@ -1331,8 +1341,8 @@ "sputnik.setting.puntosdedesconexion.relleno.colordelrelleno.name": "fill color", "sputnik.setting.puntosdedesconexion.relleno.relleno.desc": "render the box fill (faces)", "sputnik.setting.puntosdedesconexion.relleno.relleno.name": "fill", - "sputnik.setting.putogordo.general.hambre.name": "hunger", "sputnik.setting.putogordo.general.hambre.desc": "how hungry you have to be to eat (food points)", + "sputnik.setting.putogordo.general.hambre.name": "hunger", "sputnik.setting.recorrido.general.color.desc": "color to use", "sputnik.setting.recorrido.general.color.name": "color", "sputnik.setting.recorrido.general.esperanzadevida.desc": "how long the trails last", @@ -1553,7 +1563,7 @@ "sputnik.ui.tab.profiles": "profiles", "sputnik.update.clickhere": "CLICK HERE", "sputnik.update.download": "download the latest version (%s) from here:", - "sputnik.update.idgaf": "i don't care", + "sputnik.update.idgaf": "i don't give a FUCK", "sputnik.update.outdated": "outdated version: %s", "sputnik.update.title": "update", "sputnik.version.error.fetch": "could not check the latest version", diff --git a/src/main/resources/assets/sputnik/lang/es_es.json b/src/main/resources/assets/sputnik/lang/es_es.json index a883fee..6f456b9 100644 --- a/src/main/resources/assets/sputnik/lang/es_es.json +++ b/src/main/resources/assets/sputnik/lang/es_es.json @@ -209,6 +209,8 @@ "sputnik.enum.module.modules.render.norender.colors.red": "rojo", "sputnik.enum.module.modules.render.norender.colors.white": "blanco", "sputnik.enum.module.modules.render.norender.colors.yellow": "amarillo", + "sputnik.enum.module.modules.world.autotool.autotoolmode.on_tick": "cada tick", + "sputnik.enum.module.modules.world.autotool.autotoolmode.on_click": "cada click", "sputnik.enum.module.modules.world.blockinfo.copymode.command": "copiar comando /setblock", "sputnik.enum.module.modules.world.blockinfo.copymode.dont": "no copiar", "sputnik.enum.module.modules.world.blockinfo.copymode.json": "copiar contenido json", @@ -312,6 +314,8 @@ "sputnik.hud.element.ping.name": "ping", "sputnik.hud.element.rotation.desc": "te muestra tu rotación actual", "sputnik.hud.element.rotation.name": "rotaciones", + "sputnik.hud.element.speed.name": "velocidad", + "sputnik.hud.element.speed.desc": "velocidad del jugador", "sputnik.hud.element.time.desc": "hora y minutos de la zona horaria seleccionada", "sputnik.hud.element.time.name": "hora", "sputnik.hud.element.totems.desc": "totems disponibles", @@ -450,6 +454,8 @@ "sputnik.module.estampaescrotos.desc": "estampa escrotos ajenos", "sputnik.module.estampaescrotos.name": "estampaescrotos", "sputnik.module.freecam.damagedisable": "cámara libre se ha desactivado porque has recibido daño", + "sputnik.module.fisicadeobjetos.name": "física de objetos", + "sputnik.module.fisicadeobjetos.desc": "aplica física a los objetos en el suelo", "sputnik.module.friends.already": "%s ya es tu amigo", "sputnik.module.friends.notplayer": "no se pudo añadir a %s como amigo", "sputnik.module.fuentes.desc": "modifica el tipo de letra utilizado al renderizar texto", @@ -711,6 +717,8 @@ "sputnik.setting.autoherramienta.general.delay.name": "delay", "sputnik.setting.autoherramienta.general.delaydelcambiodevuelta.desc": "delay en ticks para cambiar de vuelta a la herramienta inicial", "sputnik.setting.autoherramienta.general.delaydelcambiodevuelta.name": "delay del cambio de vuelta", + "sputnik.setting.autoherramienta.general.modo.desc": "de qué manera ejecutar el módulo", + "sputnik.setting.autoherramienta.general.modo.name": "modo", "sputnik.setting.autopechera.general.cambiardevuelta.desc": "cambiar de vuelta a elytras, si estaban puestas", "sputnik.setting.autopechera.general.cambiardevuelta.name": "cambiar de vuelta", "sputnik.setting.autopesca.general.evitarromper.desc": "evitar romper la caña si está en las últimas", diff --git a/src/main/resources/sputnik.mixins.json b/src/main/resources/sputnik.mixins.json index 362bad9..dcafa58 100644 --- a/src/main/resources/sputnik.mixins.json +++ b/src/main/resources/sputnik.mixins.json @@ -41,7 +41,9 @@ "accessors.AbstractSignEditScreenAccessor", "accessors.AnvilScreenAccessor", "accessors.ClientPacketListenerAccessor", + "accessors.ItemStackRenderStateAccessor", "accessors.KeyBindingAccessor", + "accessors.LayerRenderStateAccessor", "accessors.OverlayTextureAccessor", "mixins.entity.EntityRendererMixin", "mixins.hud.BossBarHudMixin", @@ -56,6 +58,8 @@ "mixins.io.KeyboardHandlerMixin", "mixins.io.MouseHandlerMixin", "mixins.io.ScreenshotMixin", + "mixins.item.ItemEntityRendererMixin", + "mixins.item.ItemTransformMixin", "mixins.misc.FontManagerMixin", "mixins.misc.MinecraftMixin", "mixins.misc.OptionsMixin", @@ -73,6 +77,8 @@ "mixins.render.CapeLayerMixin", "mixins.render.ChunkBorderRendererMixin", "mixins.render.EntityHitboxDebugRendererMixin", + "mixins.render.EntityRenderDispatcherMixin", + "mixins.render.EntityRenderStateMixin", "mixins.render.EquipmentLayerRendererMixin", "mixins.render.FogRendererMixin", "mixins.render.FontMixin",