diff --git a/README.md b/README.md index 8764799..5d4c4b2 100644 --- a/README.md +++ b/README.md @@ -65,4 +65,22 @@ no sé, haz lo que quieras con esto, es puta basura xd aunque estaría guay que acreditases -pero bueno \ No newline at end of file +pero bueno + +## descargo de responsabilidad + +me importa una puta mierda lo que pase al usar este mod en servers donde es baneable y así. + +## mods recomendados + +> mods que recomiendo usar junto a este: + +- [fabric api (necesario)](https://modrinth.com/mod/fabric-api/): necesario para el mod +- [sodium](https://modrinth.com/mod/sodium): mejora el rendimiento general del juego +- [viafabricplus](https://modrinth.com/mod/viafabricplus): te permite conectarte a servidores que tengan una versión distinta a la de tu cliente +- [xaero's world map](https://modrinth.com/mod/xaeros-world-map/) y [xaero's minimap](https://modrinth.com/mod/xaeros-minimap/): mapa chulo +- [mod menu](https://modrinth.com/mod/modmenu): lista de los mods instalados, y sus ajustes +- [iris](https://modrinth.com/mod/iris): shaders +- [lambdynamiclights](https://modrinth.com/mod/lambdynamiclights): iluminación dinámica +- [appleskin](https://modrinth.com/mod/appleskin/): información relacionada con la comida +- [baritone (desactualizado)](https://github.com/cabaletta/baritone): google maps para juego de cubos \ No newline at end of file diff --git a/cambios.md b/cambios.md index f16b156..3bdba29 100644 --- a/cambios.md +++ b/cambios.md @@ -1,21 +1,35 @@ -# v1.6 +# v1.7 + +> al parecer me he saltado la versión 1.6, y la llamé 1.7, o sea que esta será 1.7.1 en el commit y a tomar por culo la 1.6 ## novedades -todo un sistema de renderizado skiddeado de https://github.com/mioclient/oyvey-ported/ +- se ha cambiado el icono a uno más "family friendly" ### adiciones -- marca de agua en la pantalla de inicio porque molo un montón -- prev. de shulkers: te permite previsualizar el contenido de cajas de shulker desde el inventario -- puntos de desconexión: te muestra el punto donde un jugador se desconecta +- opción para agregar un pequeño tooltip a los shulkers (prev. de shulkers) +- marca de agua para interfaces opcional y customizable +- opción para desactivar flashes del end de norender. aún se cambia el nivel de luz porque eso se maneja server-side + +#### módulos nuevos: + +- attribute-swapper: automatiza el attribute swapping (aplicar propiedades de una herramienta a otra al intercambiar y usar una al mismo tiempo) +- autocartel: te permite colocar carteles con un texto preconfigurado sin tener que abrir la interfaz de cada uno +- bungeecord spoofer: (no funciona bien (todavía)) te permite conectarte a un servidor backend de un server con bungeecord mal configurado y manipular tu UUID mediante un proxy +- carteles gays: te permite agregar formato a los carteles mediante un símbolo a elegir que será reemplazado por el símbolo de formato de Minecraft (§) +- headhitters: establece jumpingCooldown como 0 siempre para que puedas mantener espacio en vez de espamearlo, para hacer headhitters (espamear espacio al estar bajo bloques para avanzar más rápido) +- minar sin interrupción: te permite ignorar entidades al minar y romper bloques a través de ellas +- precoz: reduce el cooldown de algunas cosas como colocar bloques o usar items al valor deseado +- rotaciones: te permite forzar una rotación específica del lado del cliente y del servidor ### arreglos / mejoras -- el scroll del freecam ahora requiere una tecla (para mayor comodidad) -- ahora puedes ver tu propio nametag (nametags -> mostrar propio) -- opción para desactivar hud en chat agregada -- arreglos menores varios +- ya no se activan / desactivan los módulos sin tecla asignada al subir y bajar el volumen (era porque tenía el número de tecla -1 que se usa también para cuando no hay una tecla) +- arreglado el freecam y su opción de cancelar paquetes +- arreglada la sensibilidad de perspectiva libre +- otros cambios irrelevantes al público general (hablo como si más de una persona usase el mod) +- ya no se marcan como jugadores desconectados aquellos que abandonan la distancia de renderizado ## problemas reconocidos diff --git a/credits.txt b/credits.txt index 8089650..1b8bc50 100644 --- a/credits.txt +++ b/credits.txt @@ -1,8 +1,9 @@ -Meteor Client: https://github.com/MeteorDevelopment/meteor-client | https://meteorclient.com +Meteor Client: https://github.com/MeteorDevelopment/meteor-client | https://meteorclient.com OyVey Port: https://github.com/mioclient/oyvey-ported/ Lenny Boi: https://www.youtube.com/@lennyboi7195 Shotify: https://modrinth.com/mod/shotify No Telemetry: https://modrinth.com/mod/no-telemetry +Trouser Streak: https://github.com/etianl/Trouser-Streak probablemente más pero como tengo demencia se me olvida si quieres que te acredite mándame un mensaje en discord (username: retucio) y sin problemas :) \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index b1dd9b1..58ce14d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ yarn_mappings=1.21.10+build.2 loader_version=0.17.3 loom_version=1.11-SNAPSHOT -mod_version=1.6 +mod_version=1.7 maven_group=me.retucio archives_base_name=camtweaks diff --git a/src.zip b/src.zip new file mode 100644 index 0000000..d746cad Binary files /dev/null and b/src.zip differ diff --git a/src/main/java/me/retucio/camtweaks/CameraTweaks.java b/src/main/java/me/retucio/camtweaks/CameraTweaks.java index 50c2c57..d2d7ef0 100644 --- a/src/main/java/me/retucio/camtweaks/CameraTweaks.java +++ b/src/main/java/me/retucio/camtweaks/CameraTweaks.java @@ -35,6 +35,7 @@ import me.retucio.camtweaks.util.MiscUtil; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.SharedConstants; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; @@ -212,4 +213,8 @@ public class CameraTweaks implements ClientModInitializer { public void onStop(ShutdownEvent event) { ConfigManager.save(); } + + public static String getVersionName() { + return MOD_ID + "_v" + MOD_VERSION + "_" + SharedConstants.getGameVersion().name(); + } } \ No newline at end of file diff --git a/src/main/java/me/retucio/camtweaks/command/CommandManager.java b/src/main/java/me/retucio/camtweaks/command/CommandManager.java index 6e50973..340bed9 100644 --- a/src/main/java/me/retucio/camtweaks/command/CommandManager.java +++ b/src/main/java/me/retucio/camtweaks/command/CommandManager.java @@ -31,6 +31,7 @@ public class CommandManager { addCommand(new BindCommand()); addCommand(new CopyScreenshotCommand()); // addCommand(new EnderChestCommand()); no funciona D: + addCommand(new GarbageCleanerCommand()); addCommand(new PeekCommand()); addCommand(new PrefixCommand()); addCommand(new PurgeCommand()); diff --git a/src/main/java/me/retucio/camtweaks/command/commands/GarbageCleanerCommand.java b/src/main/java/me/retucio/camtweaks/command/commands/GarbageCleanerCommand.java new file mode 100644 index 0000000..4ec8687 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/command/commands/GarbageCleanerCommand.java @@ -0,0 +1,23 @@ +package me.retucio.camtweaks.command.commands; + +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import me.retucio.camtweaks.command.Command; +import me.retucio.camtweaks.util.ChatUtil; +import net.minecraft.command.CommandSource; +import net.minecraft.text.Text; + +public class GarbageCleanerCommand extends Command { + + public GarbageCleanerCommand() { + super("cleanram", "limpia la ram mediante el recolector de basura (gc)", "gc", "garbagecollect"); + } + + @Override + public void build(LiteralArgumentBuilder builder) { + builder.executes(context -> { + System.gc(); + ChatUtil.info(Text.of("ram limpiada")); + return SUCCESS; + }); + } +} \ No newline at end of file diff --git a/src/main/java/me/retucio/camtweaks/event/events/AttackEntityEvent.java b/src/main/java/me/retucio/camtweaks/event/events/AttackEntityEvent.java new file mode 100644 index 0000000..4b3e35c --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/event/events/AttackEntityEvent.java @@ -0,0 +1,17 @@ +package me.retucio.camtweaks.event.events; + +import me.retucio.camtweaks.event.Event; +import net.minecraft.entity.Entity; + +public class AttackEntityEvent extends Event { + + private final Entity entity; + + public AttackEntityEvent(Entity entity) { + this.entity = entity; + } + + public Entity getEntity() { + return entity; + } +} diff --git a/src/main/java/me/retucio/camtweaks/event/events/BreakBlockEvent.java b/src/main/java/me/retucio/camtweaks/event/events/BreakBlockEvent.java new file mode 100644 index 0000000..ddd5ff9 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/event/events/BreakBlockEvent.java @@ -0,0 +1,21 @@ +package me.retucio.camtweaks.event.events; + +import me.retucio.camtweaks.event.Event; +import net.minecraft.util.math.BlockPos; + +public class BreakBlockEvent extends Event { + + private BlockPos pos; + + public BreakBlockEvent(BlockPos pos) { + this.pos = pos; + } + + public BlockPos getPos() { + return pos; + } + + public void setPos(BlockPos pos) { + this.pos = pos; + } +} diff --git a/src/main/java/me/retucio/camtweaks/event/events/ChangeRotationEvent.java b/src/main/java/me/retucio/camtweaks/event/events/ChangeRotationEvent.java new file mode 100644 index 0000000..fced821 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/event/events/ChangeRotationEvent.java @@ -0,0 +1,30 @@ +package me.retucio.camtweaks.event.events; + +import me.retucio.camtweaks.event.Event; + +public class ChangeRotationEvent extends Event { + + private float yaw; + private float pitch; + + public ChangeRotationEvent(float yaw, float pitch) { + this.yaw = yaw; + this.pitch = pitch; + } + + public float getYaw() { + return yaw; + } + + public void setYaw(float yaw) { + this.yaw = yaw; + } + + public float getPitch() { + return pitch; + } + + public void setPitch(float pitch) { + this.pitch = pitch; + } +} diff --git a/src/main/java/me/retucio/camtweaks/event/events/InteractEntityEvent.java b/src/main/java/me/retucio/camtweaks/event/events/InteractEntityEvent.java new file mode 100644 index 0000000..948e660 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/event/events/InteractEntityEvent.java @@ -0,0 +1,29 @@ +package me.retucio.camtweaks.event.events; + +import me.retucio.camtweaks.event.Event; +import net.minecraft.entity.Entity; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; + +public class InteractEntityEvent extends Event { + + private final Entity entity; + private Hand hand; + + public InteractEntityEvent(Entity entity, Hand hand) { + this.entity = entity; + this.hand = hand; + } + + public Entity getEntity() { + return entity; + } + + public Hand getHand() { + return hand; + } + + public void setHand(Hand hand) { + this.hand = hand; + } +} \ No newline at end of file diff --git a/src/main/java/me/retucio/camtweaks/event/events/PlaceBlockEvent.java b/src/main/java/me/retucio/camtweaks/event/events/PlaceBlockEvent.java new file mode 100644 index 0000000..7eda79d --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/event/events/PlaceBlockEvent.java @@ -0,0 +1,33 @@ +package me.retucio.camtweaks.event.events; + +import me.retucio.camtweaks.event.Event; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; + +public class PlaceBlockEvent extends Event { + + private Hand hand; + private BlockHitResult result; + + public PlaceBlockEvent(Hand hand, BlockHitResult result) { + this.hand = hand; + this.result = result; + } + + public Hand getHand() { + return hand; + } + + public void setHand(Hand hand) { + this.hand = hand; + } + + public BlockHitResult getResult() { + return result; + } + + public void setResult(BlockHitResult result) { + this.result = result; + } +} diff --git a/src/main/java/me/retucio/camtweaks/mixin/ClientPlayerInteractionManagerMixin.java b/src/main/java/me/retucio/camtweaks/mixin/ClientPlayerInteractionManagerMixin.java index 31fa683..620befe 100644 --- a/src/main/java/me/retucio/camtweaks/mixin/ClientPlayerInteractionManagerMixin.java +++ b/src/main/java/me/retucio/camtweaks/mixin/ClientPlayerInteractionManagerMixin.java @@ -1,7 +1,14 @@ package me.retucio.camtweaks.mixin; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.llamalad7.mixinextras.sugar.Local; +import me.retucio.camtweaks.event.events.AttackEntityEvent; +import me.retucio.camtweaks.event.events.BreakBlockEvent; +import me.retucio.camtweaks.event.events.InteractEntityEvent; +import me.retucio.camtweaks.event.events.PlaceBlockEvent; import me.retucio.camtweaks.module.ModuleManager; import me.retucio.camtweaks.module.modules.Freecam; +import me.retucio.camtweaks.util.ChatUtil; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.network.ClientPlayerEntity; @@ -12,16 +19,24 @@ import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import static me.retucio.camtweaks.CameraTweaks.EVENT_BUS; +import static me.retucio.camtweaks.CameraTweaks.mc; + @Mixin(ClientPlayerInteractionManager.class) public abstract class ClientPlayerInteractionManagerMixin { + @Shadow + @Final + private MinecraftClient client; @Unique Freecam freecam; @@ -30,19 +45,31 @@ public abstract class ClientPlayerInteractionManagerMixin { freecam = ModuleManager.INSTANCE.getModuleByClass(Freecam.class); } - // los paquetes ya se cancelan en la clase de Freecam, pero visualmente el bloque sigue apareciendo roto + @Inject(method = "breakBlock", at = @At("HEAD"), cancellable = true) - private void cancelBlockBreaking(BlockPos pos, CallbackInfoReturnable cir) { - if (freecam.isEnabled() && freecam.cancelActionPackets.isEnabled()) cir.setReturnValue(false); + private void onBlockBreak(BlockPos pos, CallbackInfoReturnable cir) { + BreakBlockEvent event = EVENT_BUS.post(new BreakBlockEvent(pos)); + if (event.isCancelled()) cir.cancel(); } @Inject(method = "interactBlock", at = @At("HEAD"), cancellable = true) - private void cancelBlockPlacement(ClientPlayerEntity player, Hand hand, BlockHitResult hitResult, CallbackInfoReturnable cir) { - if (freecam.isEnabled() && freecam.cancelActionPackets.isEnabled()) cir.setReturnValue(ActionResult.FAIL); + private void onBlockPlace(ClientPlayerEntity player, Hand hand, BlockHitResult result, CallbackInfoReturnable cir) { + if (mc.player != player) return; + PlaceBlockEvent event = EVENT_BUS.post(new PlaceBlockEvent(hand, result)); + if (event.isCancelled()) cir.cancel(); } @Inject(method = "interactEntity", at = @At("HEAD"), cancellable = true) - private void cancelEntityInteractions(PlayerEntity player, Entity entity, Hand hand, CallbackInfoReturnable cir) { - if (freecam.isEnabled() && freecam.cancelActionPackets.isEnabled()) cir.setReturnValue(ActionResult.FAIL); + private void onEntityInteract(PlayerEntity player, Entity entity, Hand hand, CallbackInfoReturnable cir) { + if (mc.player != player) return; + InteractEntityEvent event = EVENT_BUS.post(new InteractEntityEvent(entity, hand)); + if (event.isCancelled()) cir.cancel(); + } + + @Inject(method = "attackEntity", at = @At("HEAD"), cancellable = true) + private void onAttackEntity(PlayerEntity player, Entity target, CallbackInfo ci) { + if (player != client.player) return; + AttackEntityEvent event = EVENT_BUS.post(new AttackEntityEvent(target)); + if (event.isCancelled()) ci.cancel(); } } diff --git a/src/main/java/me/retucio/camtweaks/mixin/EntityMixin.java b/src/main/java/me/retucio/camtweaks/mixin/EntityMixin.java index 963930f..d149ffd 100644 --- a/src/main/java/me/retucio/camtweaks/mixin/EntityMixin.java +++ b/src/main/java/me/retucio/camtweaks/mixin/EntityMixin.java @@ -1,11 +1,9 @@ package me.retucio.camtweaks.mixin; import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import me.retucio.camtweaks.event.events.ChangeRotationEvent; import me.retucio.camtweaks.module.ModuleManager; -import me.retucio.camtweaks.module.modules.AntiInvis; -import me.retucio.camtweaks.module.modules.Freecam; -import me.retucio.camtweaks.module.modules.Freelook; -import me.retucio.camtweaks.module.modules.Nametags; +import me.retucio.camtweaks.module.modules.*; import net.minecraft.entity.*; import net.minecraft.entity.passive.TameableEntity; import net.minecraft.entity.player.PlayerEntity; @@ -21,6 +19,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import static me.retucio.camtweaks.CameraTweaks.EVENT_BUS; import static me.retucio.camtweaks.CameraTweaks.mc; @Mixin(Entity.class) @@ -32,6 +31,12 @@ public abstract class EntityMixin { @Shadow public abstract EntityType getType(); + @Shadow + private float yaw; + + @Shadow + private float pitch; + @Unique Freecam freecam; @@ -41,12 +46,16 @@ public abstract class EntityMixin { @Unique Nametags nametags; + @Unique + Rotations rotations; + @SuppressWarnings("rawtypes") @Inject(method = "", at = @At("TAIL")) private void getModules(EntityType type, World world, CallbackInfo ci) { freecam = ModuleManager.INSTANCE.getModuleByClass(Freecam.class); freelook = ModuleManager.INSTANCE.getModuleByClass(Freelook.class); nametags = ModuleManager.INSTANCE.getModuleByClass(Nametags.class); + rotations = ModuleManager.INSTANCE.getModuleByClass(Rotations.class); } @@ -62,10 +71,10 @@ public abstract class EntityMixin { ci.cancel(); } else if (freelook.isEnabled() && freelook.mode.is(Freelook.CameraMode.CAMERA)) { - freelook.setYaw(freelook.getYaw() + (float) (cursorDeltaX / freelook.mouseSens.getFloatValue())); - freelook.setPitch(freelook.getPitch() + (float) (cursorDeltaY / freelook.mouseSens.getFloatValue())); + freelook.setYaw(freelook.getYaw() + (float) (cursorDeltaX * freelook.mouseSens.getFloatValue())); + freelook.setPitch(freelook.getPitch() + (float) (cursorDeltaY * freelook.mouseSens.getFloatValue())); - if (Math.abs(freelook.getPitch()) > 90.0F) freelook.setPitch(freelook.getPitch() > 0 ? 90 : -90); + if (Math.abs(freelook.getPitch()) > 90) freelook.setPitch(freelook.getPitch() > 0 ? 90 : -90); ci.cancel(); } } @@ -115,6 +124,30 @@ public abstract class EntityMixin { } + // rotaciones + + @Inject(method = "setRotation", at = @At("HEAD"), cancellable = true) + private void onRotation(float yaw, float pitch, CallbackInfo ci) { + if ((Object) this != mc.player) return; + ChangeRotationEvent event = EVENT_BUS.post(new ChangeRotationEvent(yaw, pitch)); + if (event.isCancelled()) ci.cancel(); + } + + @Inject(method = "setYaw", at = @At("HEAD"), cancellable = true) + private void onChangeYaw(float yaw, CallbackInfo ci) { + if ((Object) this != mc.player) return; + ChangeRotationEvent event = EVENT_BUS.post(new ChangeRotationEvent(yaw, this.pitch)); + if (event.isCancelled()) ci.cancel(); + } + + @Inject(method = "setPitch", at = @At("HEAD"), cancellable = true) + private void onChangePitch(float pitch, CallbackInfo ci) { + if ((Object) this != mc.player) return; + ChangeRotationEvent event = EVENT_BUS.post(new ChangeRotationEvent(this.yaw, pitch)); + if (event.isCancelled()) ci.cancel(); + } + + // otros @Inject(method = "isInvisibleTo", at = @At("RETURN"), cancellable = true) diff --git a/src/main/java/me/retucio/camtweaks/mixin/FogRendererMixin.java b/src/main/java/me/retucio/camtweaks/mixin/FogRendererMixin.java index ad94c71..a27c09c 100644 --- a/src/main/java/me/retucio/camtweaks/mixin/FogRendererMixin.java +++ b/src/main/java/me/retucio/camtweaks/mixin/FogRendererMixin.java @@ -36,8 +36,7 @@ public abstract class FogRendererMixin { if ((className.equals("BlindnessEffectFogModifier") && !noRender.blindnessEffect.isEnabled()) || (className.equals("DarknessEffectFogModifier") && !noRender.darknessEffect.isEnabled()) || ((className.equals("LavaFogModifier") || className.equals("WaterFogModifier") - || className.equals("PowederSnowFogModifier")) && !noRender.fluidOverlay.isEnabled()) - || (className.equals("DimensionOrBossFogModifier") && !noRender.dimensionFog.isEnabled())) + || className.equals("PowederSnowFogModifier")) && !noRender.fluidOverlay.isEnabled())) return false; return instance.shouldApply(cameraSubmersionType, entity); diff --git a/src/main/java/me/retucio/camtweaks/mixin/GameRendererMixin.java b/src/main/java/me/retucio/camtweaks/mixin/GameRendererMixin.java index f64126a..fbabdff 100644 --- a/src/main/java/me/retucio/camtweaks/mixin/GameRendererMixin.java +++ b/src/main/java/me/retucio/camtweaks/mixin/GameRendererMixin.java @@ -1,9 +1,11 @@ package me.retucio.camtweaks.mixin; +import com.llamalad7.mixinextras.sugar.Local; import me.retucio.camtweaks.event.events.GetFOVEvent; import me.retucio.camtweaks.module.ModuleManager; import me.retucio.camtweaks.module.modules.Freecam; +import me.retucio.camtweaks.module.modules.NoMiningInterruptions; import me.retucio.camtweaks.module.modules.NoRender; import me.retucio.camtweaks.module.modules.Zoom; import me.retucio.camtweaks.util.interfaces.IVec3d; @@ -15,6 +17,8 @@ import net.minecraft.client.render.block.BlockRenderManager; import net.minecraft.client.render.item.HeldItemRenderer; import net.minecraft.entity.Entity; +import net.minecraft.util.hit.EntityHitResult; +import net.minecraft.util.hit.HitResult; import org.joml.Matrix4f; import org.joml.Vector3d; @@ -119,4 +123,15 @@ public abstract class GameRendererMixin { private float noRenderNauseaDistortion(float scaledNauseaEffectFactor) { return (noRender.isEnabled() && !noRender.nauseaEffect.isEnabled()) ? 0 : scaledNauseaEffectFactor; } + + @ModifyReturnValue(method = "findCrosshairTarget", at = @At("RETURN")) + private HitResult onTargetEntity(HitResult original, @Local HitResult hitResult) { + NoMiningInterruptions nmi = ModuleManager.INSTANCE.getModuleByClass(NoMiningInterruptions.class); + + Entity entity = original instanceof EntityHitResult result ? result.getEntity() : null; + if (nmi.shouldIgnoreEntity(entity) && hitResult.getType() == HitResult.Type.BLOCK) + return hitResult; + + return original; + } } diff --git a/src/main/java/me/retucio/camtweaks/mixin/HandshakeC2SPacketMixin.java b/src/main/java/me/retucio/camtweaks/mixin/HandshakeC2SPacketMixin.java new file mode 100644 index 0000000..bb53c73 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/mixin/HandshakeC2SPacketMixin.java @@ -0,0 +1,77 @@ +package me.retucio.camtweaks.mixin; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import me.retucio.camtweaks.CameraTweaks; +import me.retucio.camtweaks.module.ModuleManager; +import me.retucio.camtweaks.module.modules.BungeecordSpoofer; +import net.minecraft.network.packet.c2s.handshake.ConnectionIntent; +import net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static me.retucio.camtweaks.CameraTweaks.mc; + +@Mixin(HandshakeC2SPacket.class) +public abstract class HandshakeC2SPacketMixin { + + @Shadow @Mutable @Final + private String address; + + @Unique + private final Gson gson = new Gson(); + + @Unique + private static final ExecutorService executor = Executors.newCachedThreadPool(); + + @Shadow + public abstract ConnectionIntent intendedState(); + + @SuppressWarnings("deprecation") + @Inject(method = "(ILjava/lang/String;ILnet/minecraft/network/packet/c2s/handshake/ConnectionIntent;)V", at = @At("RETURN")) + private void onHandshakeC2SPacket(int i, String string, int j, ConnectionIntent connectionIntent, CallbackInfo ci) { + BungeecordSpoofer spoofer = ModuleManager.INSTANCE.getModuleByClass(BungeecordSpoofer.class); + if (!spoofer.isEnabled()) return; + + if (this.intendedState() != ConnectionIntent.LOGIN) return; + + final String[] spoofedUUID = {CameraTweaks.mc.getSession().getUuidOrNull().toString()}; + String URL = "https://api.mojang.com/users/profiles/minecraft/" + mc.getSession().getUsername(); + + executor.execute(() -> { + try { + HttpURLConnection req = (HttpURLConnection) new URL(URL).openConnection(); + req.setRequestMethod("GET"); + req.setConnectTimeout(5000); + req.setReadTimeout(5000); + + if (req.getResponseCode() != 200) { + this.address += "\u0000" + spoofer.address.getValue() + "\u0000" + spoofedUUID[0]; + return; + } + + JsonObject obj = JsonParser.parseReader(new InputStreamReader(req.getInputStream())).getAsJsonObject(); + + if (obj.has("id")) + spoofedUUID[0] = obj.get("id").getAsString(); + + this.address += "\u0000" + spoofer.address.getValue() + "\u0000" + spoofedUUID[0]; + + } catch (Exception e) { + e.printStackTrace(); + this.address += "\u0000" + spoofer.address.getValue() + "\u0000" + spoofedUUID[0]; + } + }); + } + + +} diff --git a/src/main/java/me/retucio/camtweaks/mixin/ItemMixin.java b/src/main/java/me/retucio/camtweaks/mixin/ItemMixin.java new file mode 100644 index 0000000..71828c9 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/mixin/ItemMixin.java @@ -0,0 +1,42 @@ +package me.retucio.camtweaks.mixin; + +import me.retucio.camtweaks.module.ModuleManager; +import me.retucio.camtweaks.module.modules.ShulkerPeek; +import net.minecraft.block.ShulkerBoxBlock; +import net.minecraft.component.type.TooltipDisplayComponent; +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.tooltip.TooltipType; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +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; + +import java.util.function.Consumer; + +@Mixin(Item.class) +public abstract class ItemMixin { + + @Inject(method = "appendTooltip", at = @At("HEAD")) + private void onAppendTooltip(ItemStack stack, Item.TooltipContext context, TooltipDisplayComponent displayComponent, Consumer textConsumer, TooltipType type, CallbackInfo ci) { + ShulkerPeek shulkerPeek = ModuleManager.INSTANCE.getModuleByClass(ShulkerPeek.class); + if (!shulkerPeek.isEnabled() || !shulkerPeek.showTooltips.isEnabled()) return; + + if (stack.getItem() instanceof BlockItem blockItem && blockItem.getBlock() instanceof ShulkerBoxBlock) { + if (ShulkerPeek.isShulkerEmpty(stack)) { + textConsumer.accept(Text.literal("vacío").formatted(Formatting.GRAY, Formatting.ITALIC)); + } else { + textConsumer.accept( + Text.literal("mantén ") + .append(Text.literal(shulkerPeek.previewKey.getKeyName()) + .formatted(Formatting.GOLD, Formatting.BOLD)) + .append(" para previsualizar") + .formatted(Formatting.GRAY) + ); + } + } + } +} diff --git a/src/main/java/me/retucio/camtweaks/mixin/KeyboardMixin.java b/src/main/java/me/retucio/camtweaks/mixin/KeyboardMixin.java index fbbad87..c78afd6 100644 --- a/src/main/java/me/retucio/camtweaks/mixin/KeyboardMixin.java +++ b/src/main/java/me/retucio/camtweaks/mixin/KeyboardMixin.java @@ -2,6 +2,7 @@ package me.retucio.camtweaks.mixin; import me.retucio.camtweaks.CameraTweaks; import me.retucio.camtweaks.event.events.KeyEvent; +import me.retucio.camtweaks.util.ChatUtil; import net.minecraft.client.Keyboard; import net.minecraft.client.input.KeyInput; import org.spongepowered.asm.mixin.Mixin; @@ -16,8 +17,8 @@ public abstract class KeyboardMixin { @Inject(method = "onKey", at = @At("HEAD"), cancellable = true) private void onKeyPress(long window, int action, KeyInput input, CallbackInfo ci) { + if (input.key() == -1) return; CameraTweaks.INSTANCE.onKeyPress(input.key(), action); - KeyEvent event = EVENT_BUS.post(new KeyEvent(input.key(), input.scancode(), action)); if (event.isCancelled()) ci.cancel(); } diff --git a/src/main/java/me/retucio/camtweaks/mixin/MinecraftClientMixin.java b/src/main/java/me/retucio/camtweaks/mixin/MinecraftClientMixin.java index f490613..8e7db4c 100644 --- a/src/main/java/me/retucio/camtweaks/mixin/MinecraftClientMixin.java +++ b/src/main/java/me/retucio/camtweaks/mixin/MinecraftClientMixin.java @@ -1,13 +1,19 @@ package me.retucio.camtweaks.mixin; +import com.ibm.icu.util.CodePointTrie; import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.llamalad7.mixinextras.sugar.Local; import me.retucio.camtweaks.CameraTweaks; import me.retucio.camtweaks.event.events.OpenScreenEvent; import me.retucio.camtweaks.event.events.ShutdownEvent; import me.retucio.camtweaks.event.events.TickEvent; +import me.retucio.camtweaks.module.ModuleManager; +import me.retucio.camtweaks.module.modules.FastUse; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; +import net.minecraft.item.ItemStack; 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; @@ -18,6 +24,9 @@ import static me.retucio.camtweaks.CameraTweaks.EVENT_BUS; @Mixin(MinecraftClient.class) public abstract class MinecraftClientMixin { + @Shadow + private int itemUseCooldown; + @Inject(method = "tick", at = @At("HEAD")) private void onTickPre(CallbackInfo ci) { CameraTweaks.INSTANCE.onTick(); @@ -44,4 +53,11 @@ public abstract class MinecraftClientMixin { private void disableMicropenisTelemetryShi(CallbackInfoReturnable cir) { cir.setReturnValue(false); } + + @Inject(method = "doItemUse", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isItemEnabled(Lnet/minecraft/resource/featuretoggle/FeatureSet;)Z")) + private void modifyItemUseCooldown(CallbackInfo ci, @Local ItemStack stack) { + FastUse fastUse = ModuleManager.INSTANCE.getModuleByClass(FastUse.class); + if (!fastUse.isEnabled()) return; + itemUseCooldown = fastUse.getCooldown(stack); + } } \ No newline at end of file diff --git a/src/main/java/me/retucio/camtweaks/mixin/ScreenMixin.java b/src/main/java/me/retucio/camtweaks/mixin/ScreenMixin.java index d44f5a4..148a5c6 100644 --- a/src/main/java/me/retucio/camtweaks/mixin/ScreenMixin.java +++ b/src/main/java/me/retucio/camtweaks/mixin/ScreenMixin.java @@ -1,9 +1,13 @@ package me.retucio.camtweaks.mixin; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import me.retucio.camtweaks.CameraTweaks; import me.retucio.camtweaks.command.CommandManager; import me.retucio.camtweaks.event.events.ClientClickEvent; +import me.retucio.camtweaks.ui.frames.ClientSettingsFrame; +import net.minecraft.SharedConstants; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.ClickEvent; import org.spongepowered.asm.mixin.Mixin; @@ -11,6 +15,11 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.awt.*; + +import static me.retucio.camtweaks.CameraTweaks.getVersionName; +import static me.retucio.camtweaks.CameraTweaks.mc; + @Mixin(Screen.class) public class ScreenMixin { @@ -19,4 +28,18 @@ public class ScreenMixin { if (clickEvent instanceof ClientClickEvent event && event.getValue().startsWith(CommandManager.INSTANCE.getPrefix())) CommandManager.dispatch(event.getValue().substring(CommandManager.INSTANCE.getPrefix().length())); } + + @Inject(method = "render", at = @At("HEAD")) + private void renderWatermark(DrawContext context, int mouseX, int mouseY, float deltaTicks, CallbackInfo ci) { + String watermark = ClientSettingsFrame.guiSettings.watermark.getValue(); + if (watermark == null || watermark.isEmpty()) return; + context.drawText(mc.textRenderer, watermark, + mc.getWindow().getScaledWidth() - mc.textRenderer.getWidth(watermark) - 2, 2, + new Color((int) ClientSettingsFrame.guiSettings.red.getDefaultValue(), + (int) ClientSettingsFrame.guiSettings.green.getDefaultValue(), + (int) ClientSettingsFrame.guiSettings.blue.getDefaultValue(), + (int) ClientSettingsFrame.guiSettings.alpha.getDefaultValue() + ).getRGB(), false + ); + } } diff --git a/src/main/java/me/retucio/camtweaks/mixin/SkyRendererMixin.java b/src/main/java/me/retucio/camtweaks/mixin/SkyRendererMixin.java index 153d515..dba3c65 100644 --- a/src/main/java/me/retucio/camtweaks/mixin/SkyRendererMixin.java +++ b/src/main/java/me/retucio/camtweaks/mixin/SkyRendererMixin.java @@ -1,8 +1,11 @@ package me.retucio.camtweaks.mixin; +import com.mojang.blaze3d.buffers.GpuBuffer; import me.retucio.camtweaks.module.ModuleManager; +import me.retucio.camtweaks.module.modules.NoRender; import me.retucio.camtweaks.module.modules.PerspectivePlus; import me.retucio.camtweaks.module.modules.TimeChanger; +import me.retucio.camtweaks.util.ChatUtil; import net.minecraft.client.render.SkyRendering; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.util.math.MatrixStack; @@ -11,6 +14,7 @@ import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(SkyRendering.class) public abstract class SkyRendererMixin { @@ -37,4 +41,10 @@ public abstract class SkyRendererMixin { private void onRenderStars(float brightness, MatrixStack matrices, CallbackInfo ci) { if (timeChanger.isEnabled() && !timeChanger.renderStars.isEnabled()) ci.cancel(); } + + @Inject(method = "drawEndLightFlash", at = @At("HEAD"), cancellable = true) + private void onEndFlash(MatrixStack matrixStack, float f, float skyFactor, float pitch, CallbackInfo ci) { + NoRender noRender = ModuleManager.INSTANCE.getModuleByClass(NoRender.class); + if (noRender.isEnabled() && !noRender.endFlashes.isEnabled()) ci.cancel(); + } } \ No newline at end of file diff --git a/src/main/java/me/retucio/camtweaks/mixin/TitleScreenMixin.java b/src/main/java/me/retucio/camtweaks/mixin/TitleScreenMixin.java deleted file mode 100644 index 350acd1..0000000 --- a/src/main/java/me/retucio/camtweaks/mixin/TitleScreenMixin.java +++ /dev/null @@ -1,33 +0,0 @@ -package me.retucio.camtweaks.mixin; - -import me.retucio.camtweaks.CameraTweaks; -import me.retucio.camtweaks.ui.frames.ClientSettingsFrame; -import net.minecraft.SharedConstants; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.TitleScreen; -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; - -import java.awt.*; - -import static me.retucio.camtweaks.CameraTweaks.mc; - -@Mixin(TitleScreen.class) -public abstract class TitleScreenMixin { - - // marca de agua porque soy superguay - @Inject(method = "render", at = @At("TAIL")) - private void renderWatermark(DrawContext context, int mouseX, int mouseY, float deltaTicks, CallbackInfo ci) { - String watermark = CameraTweaks.MOD_ID + "_v" + CameraTweaks.MOD_VERSION + "_" + SharedConstants.getGameVersion().name(); - context.drawText(mc.textRenderer, watermark, - mc.getWindow().getScaledWidth() - mc.textRenderer.getWidth(watermark) - 2, 2, - new Color((int) ClientSettingsFrame.guiSettings.red.getDefaultValue(), - (int) ClientSettingsFrame.guiSettings.green.getDefaultValue(), - (int) ClientSettingsFrame.guiSettings.blue.getDefaultValue(), - (int) ClientSettingsFrame.guiSettings.alpha.getDefaultValue() - ).getRGB(), false - ); - } -} diff --git a/src/main/java/me/retucio/camtweaks/mixin/accessor/AbstractSignEditScreenAccessor.java b/src/main/java/me/retucio/camtweaks/mixin/accessor/AbstractSignEditScreenAccessor.java new file mode 100644 index 0000000..bbd75ad --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/mixin/accessor/AbstractSignEditScreenAccessor.java @@ -0,0 +1,13 @@ +package me.retucio.camtweaks.mixin.accessor; + +import net.minecraft.block.entity.SignBlockEntity; +import net.minecraft.client.gui.screen.ingame.AbstractSignEditScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(AbstractSignEditScreen.class) +public interface AbstractSignEditScreenAccessor { + + @Accessor("blockEntity") + SignBlockEntity getBlockEntity(); +} diff --git a/src/main/java/me/retucio/camtweaks/module/ModuleManager.java b/src/main/java/me/retucio/camtweaks/module/ModuleManager.java index e7b62df..4c062c4 100644 --- a/src/main/java/me/retucio/camtweaks/module/ModuleManager.java +++ b/src/main/java/me/retucio/camtweaks/module/ModuleManager.java @@ -26,22 +26,30 @@ public class ModuleManager { // por orden alfabético y todo, flipas private void addModules() { modules.add(new AntiInvis()); + modules.add(new AttributeSwapper()); + modules.add(new AutoSign()); modules.add(new BlockOutline()); modules.add(new BossbarStack()); + modules.add(new BungeecordSpoofer()); modules.add(new ChatPlus()); + modules.add(new ColoredSigns()); modules.add(new CritsPlus()); modules.add(new DamageOverlay()); modules.add(new FakePlayer()); + modules.add(new FastUse()); modules.add(new Freecam()); modules.add(new Freelook()); modules.add(new Fullbright()); modules.add(new HandView()); + modules.add(new Headhitters()); modules.add(new HUD()); modules.add(new LogoutSpots()); modules.add(new Nametags()); + modules.add(new NoMiningInterruptions()); modules.add(new NoRender()); modules.add(new PerspectivePlus()); modules.add(new PortalGUI()); + modules.add(new Rotations()); modules.add(new ScreenshotPlus()); modules.add(new ShulkerPeek()); modules.add(new TimeChanger()); diff --git a/src/main/java/me/retucio/camtweaks/module/modules/AttributeSwapper.java b/src/main/java/me/retucio/camtweaks/module/modules/AttributeSwapper.java new file mode 100644 index 0000000..28ab3e6 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/module/modules/AttributeSwapper.java @@ -0,0 +1,39 @@ +package me.retucio.camtweaks.module.modules; + +import me.retucio.camtweaks.event.SubscribeEvent; +import me.retucio.camtweaks.event.events.AttackEntityEvent; +import me.retucio.camtweaks.module.Module; +import me.retucio.camtweaks.module.settings.BooleanSetting; +import me.retucio.camtweaks.module.settings.NumberSetting; + +public class AttributeSwapper extends Module { + + public NumberSetting slot = addSetting(new NumberSetting("slot", "slot al que cambiar", 1, 1, 9, 1)); + public BooleanSetting swap = addSetting(new BooleanSetting("cambiar de vuelta", "volver al slot inicial tras haber aplicado el swapping", true)); + public NumberSetting swapDelay = addSetting(new NumberSetting("delay de cambio de vuelta", "tiempo que se tarda en volver al slot inicial", 1, 1, 20, 1)); + + private int delay = 0; + private int prevSlot = -1; + + public AttributeSwapper() { + super("attribute-swapper", "utiliza el \"attribute swapping\" entre dos herramientas para negar daño de durabilidad o aplicar encantamientos adicionales a estas"); + } + + @Override + public void onTick() { + if (mc.player == null || !swap.isEnabled()) return; + if (delay < swapDelay.getIntValue()) delay++; + if (delay >= swapDelay.getIntValue() && prevSlot != -1) { + mc.player.getInventory().setSelectedSlot(prevSlot); + prevSlot = -1; + delay = 0; + } + } + + @SubscribeEvent + public void onAttack(AttackEntityEvent event) { + prevSlot = mc.player.getInventory().getSelectedSlot(); + mc.player.getInventory().setSelectedSlot(slot.getIntValue() - 1); + delay = 0; + } +} diff --git a/src/main/java/me/retucio/camtweaks/module/modules/AutoSign.java b/src/main/java/me/retucio/camtweaks/module/modules/AutoSign.java new file mode 100644 index 0000000..13f5eac --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/module/modules/AutoSign.java @@ -0,0 +1,56 @@ +package me.retucio.camtweaks.module.modules; + +import me.retucio.camtweaks.event.SubscribeEvent; +import me.retucio.camtweaks.event.events.OpenScreenEvent; +import me.retucio.camtweaks.event.events.PacketEvent; +import me.retucio.camtweaks.mixin.accessor.AbstractSignEditScreenAccessor; +import me.retucio.camtweaks.module.Module; +import me.retucio.camtweaks.util.ChatUtil; +import net.minecraft.block.entity.SignBlockEntity; +import net.minecraft.client.gui.screen.ingame.AbstractSignEditScreen; +import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; +import net.minecraft.util.math.BlockPos; + +public class AutoSign extends Module { + + public String[] text = null; + + public AutoSign() { + super("autocartel", "te permite colocar carteles con el mismo texto sin tener que escribirlo uno por uno"); + } + + @Override + public void onEnable() { + if (text == null) ChatUtil.info("coloca un primer cartel, del cual copiar el contenido"); + super.onEnable(); + } + + @Override + public void onDisable() { + text = null; + super.onDisable(); + } + + @SubscribeEvent + public void onOpenScreen(OpenScreenEvent event) { + if (event.getScreen() instanceof AbstractSignEditScreen screen && text != null && mc != null && mc.player != null) { + event.cancel(); + SignBlockEntity sign = ((AbstractSignEditScreenAccessor) screen).getBlockEntity(); + fillText(sign.getPos(), sign.isPlayerFacingFront(mc.player), text); + } + } + + @SubscribeEvent + public void onSendPacket(PacketEvent.Send event) { + if (event.getPacket() instanceof UpdateSignC2SPacket packet) { + if (text == null) text = packet.getText().clone(); + else System.arraycopy(text, 0, packet.getText(), 0, 4); + } + } + + private void fillText(BlockPos blockPos, boolean front, String[] text) { + mc.getNetworkHandler().sendPacket(new UpdateSignC2SPacket( + blockPos, front, text[0], text[1], text[2], text[3] + )); + } +} \ No newline at end of file diff --git a/src/main/java/me/retucio/camtweaks/module/modules/BungeecordSpoofer.java b/src/main/java/me/retucio/camtweaks/module/modules/BungeecordSpoofer.java new file mode 100644 index 0000000..70399b7 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/module/modules/BungeecordSpoofer.java @@ -0,0 +1,21 @@ +package me.retucio.camtweaks.module.modules; + +import me.retucio.camtweaks.module.Module; +import me.retucio.camtweaks.module.settings.StringSetting; +import me.retucio.camtweaks.util.ChatUtil; + +public class BungeecordSpoofer extends Module { + + public StringSetting address = addSetting(new StringSetting("dirección", "la dirección IP que será enviada al server", "127.0.0.1", 15)); + + public BungeecordSpoofer() { + super("spoofer de bungeecord", "te permite conectarte a los servidores backend de un server bungeecord mal configurado"); + + address.onUpdate(text -> { + if (!text.matches("^[0-9a-f\\\\.:]{0,45}$")) { + address.setValue(address.getDefaultValue()); + ChatUtil.error("dirección IP inválida"); + } + }); + } +} diff --git a/src/main/java/me/retucio/camtweaks/module/modules/ColoredSigns.java b/src/main/java/me/retucio/camtweaks/module/modules/ColoredSigns.java new file mode 100644 index 0000000..ddb22e2 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/module/modules/ColoredSigns.java @@ -0,0 +1,25 @@ +package me.retucio.camtweaks.module.modules; + +import me.retucio.camtweaks.event.SubscribeEvent; +import me.retucio.camtweaks.event.events.PacketEvent; +import me.retucio.camtweaks.module.Module; +import me.retucio.camtweaks.module.settings.StringSetting; +import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; + +public class ColoredSigns extends Module { + + public StringSetting symbol = addSetting(new StringSetting("símbolo", "símbolo a reemplazar por \"§\"", "&", 5)); + + public ColoredSigns() { + super("carteles gays", "te permite usar un símbolo a elegir como § para añadir formato a estos."); + } + + @SubscribeEvent + public void onSendPacket(PacketEvent.Send event) { + if (event.getPacket() instanceof UpdateSignC2SPacket packet) { + for (int i = 0; i < 4; i++) { + packet.getText()[i] = packet.getText()[i].replace(symbol.getValue(), "\247" + "\247a"); + } + } + } +} diff --git a/src/main/java/me/retucio/camtweaks/module/modules/FastUse.java b/src/main/java/me/retucio/camtweaks/module/modules/FastUse.java new file mode 100644 index 0000000..d8cef34 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/module/modules/FastUse.java @@ -0,0 +1,29 @@ +package me.retucio.camtweaks.module.modules; + +import me.retucio.camtweaks.module.Module; +import me.retucio.camtweaks.module.settings.BooleanSetting; +import me.retucio.camtweaks.module.settings.NumberSetting; +import net.minecraft.item.BlockItem; +import net.minecraft.item.ItemStack; + +public class FastUse extends Module { + + public BooleanSetting items = addSetting(new BooleanSetting("items", "usar items precozmente", true)); + public NumberSetting itemCooldown = addSetting(new NumberSetting("cooldown de items", "cooldown para usar items en ticks", 0, 0, 4, 1)); + + public BooleanSetting blocks = addSetting(new BooleanSetting("bloques", "colocar bloques precozmente", true)); + public NumberSetting blockCooldown = addSetting(new NumberSetting("cooldown de bloques", "cooldown para colocar bloques en ticks", 0, 0, 4, 1)); + + public FastUse() { + super("precoz", "hace cosas como usar items o colocar bloques más rápido"); + + items.onUpdate(v -> itemCooldown.setVisible(v)); + blocks.onUpdate(v -> blockCooldown.setVisible(v)); + } + + public int getCooldown(ItemStack stack) { + if (stack.getItem() instanceof BlockItem && blocks.isEnabled()) return blockCooldown.getIntValue(); + if (items.isEnabled() && !(stack.getItem() instanceof BlockItem)) return itemCooldown.getIntValue(); + else return 4; // cooldown por defecto, 4 ticks + } +} diff --git a/src/main/java/me/retucio/camtweaks/module/modules/Freecam.java b/src/main/java/me/retucio/camtweaks/module/modules/Freecam.java index 115e8ad..8baa62d 100644 --- a/src/main/java/me/retucio/camtweaks/module/modules/Freecam.java +++ b/src/main/java/me/retucio/camtweaks/module/modules/Freecam.java @@ -13,7 +13,6 @@ import me.retucio.camtweaks.util.MiscUtil; import net.minecraft.client.gui.Click; import net.minecraft.client.input.KeyInput; import net.minecraft.client.input.MouseInput; -import net.minecraft.client.option.KeyBinding; import net.minecraft.client.option.Perspective; import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.c2s.play.HandSwingC2SPacket; @@ -22,6 +21,7 @@ import net.minecraft.network.packet.c2s.play.PlayerInteractBlockC2SPacket; import net.minecraft.network.packet.c2s.play.PlayerInteractItemC2SPacket; import net.minecraft.network.packet.s2c.play.DeathMessageS2CPacket; import net.minecraft.network.packet.s2c.play.HealthUpdateS2CPacket; +import net.minecraft.util.ActionResult; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import org.joml.Vector3d; @@ -192,7 +192,7 @@ public class Freecam extends Module { } @SubscribeEvent - public void onPacketSend(PacketEvent.Send event) { + public void onSendPacket(PacketEvent.Send event) { if (!isEnabled() || !cancelActionPackets.isEnabled()) return; if (event.getStage() != Stage.PRE) return; @@ -310,6 +310,28 @@ public class Freecam extends Module { prevPitch = pitch; } + // los paquetes ya se cancelan, pero visualmente estos eventos se siguen dando + + @SubscribeEvent + public void onBreakBlock(BreakBlockEvent event) { + if (cancelActionPackets.isEnabled()) event.cancel(); + } + + @SubscribeEvent + public void onPlaceBlock(PlaceBlockEvent event) { + if (cancelActionPackets.isEnabled()) event.cancel(); + } + + @SubscribeEvent + public void onInteractEntity(InteractEntityEvent event) { + if (cancelActionPackets.isEnabled()) event.cancel(); + } + + @SubscribeEvent + public void onAttack(AttackEntityEvent event) { + if (cancelActionPackets.isEnabled()) event.cancel(); + } + public void changeLookDirection(double deltaX, double deltaY) { prevYaw = yaw; prevPitch = pitch; diff --git a/src/main/java/me/retucio/camtweaks/module/modules/Freelook.java b/src/main/java/me/retucio/camtweaks/module/modules/Freelook.java index 51fceb4..e2f7085 100644 --- a/src/main/java/me/retucio/camtweaks/module/modules/Freelook.java +++ b/src/main/java/me/retucio/camtweaks/module/modules/Freelook.java @@ -22,7 +22,7 @@ public class Freelook extends Module { 4, 0, 10, 0.1)); public NumberSetting mouseSens = addSetting(new NumberSetting("sensibilidad del ratón", ".", - 8, 0, 10, 0.1)); + 0.1, 0, 2, 0.05)); private float yaw; private float pitch; diff --git a/src/main/java/me/retucio/camtweaks/module/modules/GUI.java b/src/main/java/me/retucio/camtweaks/module/modules/GUI.java index 9ec7597..e58f2ed 100644 --- a/src/main/java/me/retucio/camtweaks/module/modules/GUI.java +++ b/src/main/java/me/retucio/camtweaks/module/modules/GUI.java @@ -43,6 +43,7 @@ public class GUI extends Module { // ^^^ no sé de qué sirve porque está todo en minúsculas pero bueno public BooleanSetting blur = addSetting(new BooleanSetting("desenfoque", "desenfocar el fondo mientras la interfaz está abierta", true)); + public StringSetting watermark = addSetting(new StringSetting("marca de agua", "marca de agua para interfaces (dejar vacío para desactivar)", CameraTweaks.getVersionName(), 40)); public StringSetting commandPrefix = addSetting(new StringSetting("prefijo", "prefijo de los comandos", "$", 10)); public StringSetting chatName = addSetting(new StringSetting("nombre", "qué nombre usar en notificaciones por el chat", "smegma", 20)); diff --git a/src/main/java/me/retucio/camtweaks/module/modules/Headhitters.java b/src/main/java/me/retucio/camtweaks/module/modules/Headhitters.java new file mode 100644 index 0000000..a9338ad --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/module/modules/Headhitters.java @@ -0,0 +1,16 @@ +package me.retucio.camtweaks.module.modules; + +import me.retucio.camtweaks.module.Module; + +public class Headhitters extends Module { + + public Headhitters() { + super("headhitters", "mantén pulsado el espacio para hacer headhitting sin tener que espamearlo"); + } + + @Override + public void onTick() { + if (mc.player == null) return; + mc.player.jumpingCooldown = 0; + } +} diff --git a/src/main/java/me/retucio/camtweaks/module/modules/LogoutSpots.java b/src/main/java/me/retucio/camtweaks/module/modules/LogoutSpots.java index beb05e5..497a99f 100644 --- a/src/main/java/me/retucio/camtweaks/module/modules/LogoutSpots.java +++ b/src/main/java/me/retucio/camtweaks/module/modules/LogoutSpots.java @@ -1,14 +1,12 @@ package me.retucio.camtweaks.module.modules; import me.retucio.camtweaks.event.SubscribeEvent; -import me.retucio.camtweaks.event.events.KeyEvent; import me.retucio.camtweaks.event.events.RenderWorldEvent; import me.retucio.camtweaks.event.events.camtweaks.AddEntityEvent; import me.retucio.camtweaks.event.events.camtweaks.RemoveEntityEvent; import me.retucio.camtweaks.module.Module; import me.retucio.camtweaks.module.ModuleManager; import me.retucio.camtweaks.module.settings.BooleanSetting; -import me.retucio.camtweaks.module.settings.KeySetting; import me.retucio.camtweaks.module.settings.NumberSetting; import me.retucio.camtweaks.util.render.RenderUtil; @@ -19,7 +17,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import org.joml.*; -import org.lwjgl.glfw.GLFW; import java.awt.*; import java.time.Instant; @@ -32,8 +29,6 @@ import java.util.List; public class LogoutSpots extends Module { - public KeySetting clearBoxesKey = addSetting(new KeySetting("vaciar cajas", "tecla asignada a olvidar todas las cajas activas", GLFW.GLFW_KEY_UNKNOWN)); - public BooleanSetting filledBox = addSetting(new BooleanSetting("caja rellena", "rellenar caja", true)); public BooleanSetting outlineBox = addSetting(new BooleanSetting("caja de esquinas", "contorno de caja", true)); @@ -42,7 +37,8 @@ public class LogoutSpots extends Module { public NumberSetting blue = addSetting(new NumberSetting("azul", "cantidad de azul", 255, 0, 255, 1)); public NumberSetting alpha = addSetting(new NumberSetting("opacidad", "antitransparencia", 50, 0, 255, 1)); - public NumberSetting lineWidth = addSetting(new NumberSetting("grosor", "grosor de las líneas a dibujar", 2, 1, 10, 0.5f)); + public NumberSetting lineWidth = addSetting(new NumberSetting("grosor", "grosor de las líneas a dibujar", + 2, 1, 10, 0.5f)); private final List boxes = new ArrayList<>(); @@ -72,6 +68,7 @@ public class LogoutSpots extends Module { @SubscribeEvent public void onEntityRemoved(RemoveEntityEvent event) { if (event.getEntity() instanceof PlayerEntity player && player != mc.player) { + if (mc.world != null && mc.world.hasEntity(player)) return; // asegurarse de que salirse de la distancia de renderizado no cuenta como "desconectarse" String playerName = player.getName().getString() + " (" + getLogoutTime(System.currentTimeMillis()) + ")"; boxes.add(new LogoutBox( @@ -86,16 +83,15 @@ public class LogoutSpots extends Module { boxes.removeIf(box -> event.getEntity().getUuid().equals(box.dummy.getUuid())); } - @SubscribeEvent - public void onKey(KeyEvent event) { - if (event.getKey() == clearBoxesKey.getKey()) { - boxes.forEach(box -> { - box.dummy.setRemoved(Entity.RemovalReason.KILLED); - box.dummy.onRemoved(); - }); + @Override + public void onDisable() { + boxes.forEach(box -> { + box.dummy.setRemoved(Entity.RemovalReason.KILLED); + box.dummy.onRemoved(); + }); - boxes.clear(); - } + boxes.clear(); + super.onDisable(); } private String getLogoutTime(long logoutTimeMillis) { diff --git a/src/main/java/me/retucio/camtweaks/module/modules/NoMiningInterruptions.java b/src/main/java/me/retucio/camtweaks/module/modules/NoMiningInterruptions.java new file mode 100644 index 0000000..de688ff --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/module/modules/NoMiningInterruptions.java @@ -0,0 +1,24 @@ +package me.retucio.camtweaks.module.modules; + +import me.retucio.camtweaks.module.Module; +import me.retucio.camtweaks.module.settings.BooleanSetting; +import net.minecraft.entity.Entity; +import net.minecraft.registry.tag.ItemTags; + +public class NoMiningInterruptions extends Module { + + public BooleanSetting withPickaxeOnly = addSetting(new BooleanSetting("solo con pico", "ignorar entidades solamente cuando se sujeta un pico", false)); + + public NoMiningInterruptions() { + super("minar sin interrupción", "te permite minar bloques a través de entidades"); + } + + public boolean shouldIgnoreEntity(Entity entity) { + if (entity == null || !this.isEnabled()) return false; + if (withPickaxeOnly.isEnabled()) + return (mc.player.getMainHandStack().isIn(ItemTags.PICKAXES) || mc.player.getOffHandStack().isIn(ItemTags.PICKAXES)); + return true; + } + + +} diff --git a/src/main/java/me/retucio/camtweaks/module/modules/NoRender.java b/src/main/java/me/retucio/camtweaks/module/modules/NoRender.java index 5c0aabf..d6503a8 100644 --- a/src/main/java/me/retucio/camtweaks/module/modules/NoRender.java +++ b/src/main/java/me/retucio/camtweaks/module/modules/NoRender.java @@ -32,8 +32,7 @@ public class NoRender extends Module { public BooleanSetting rain = addSetting(new BooleanSetting("lluvia", "l l u v i a", true)); public BooleanSetting snow = addSetting(new BooleanSetting("nieve", "n i e v e", true)); - public BooleanSetting dimensionFog = addSetting(new BooleanSetting("niebla de dimensión", "n i e b l a", true)); - public BooleanSetting endFlashes; // para cuando actualice + public BooleanSetting endFlashes = addSetting(new BooleanSetting("flashes del end", "renderizar los recientemente añadidos flashes en el end", true)); public ListSetting> particles = addSetting(new ListSetting<>("partículas", "lista de partículas que se renderizan", Lists.particleList, Lists.allTrue(Lists.particleList), Lists.particleNames)); @@ -41,7 +40,6 @@ public class NoRender extends Module { public BooleanSetting nauseaEffect = addSetting(new BooleanSetting("náusea", "renderizar borrachera", false)); public BooleanSetting blindnessEffect = addSetting(new BooleanSetting("ceguera", "renderizar miopía", false)); public BooleanSetting darknessEffect = addSetting(new BooleanSetting("oscuridad", "renderizar miedo a la oscuridad", false)); - public BooleanSetting nightVisionEffect; public BooleanSetting scoreboard = addSetting(new BooleanSetting("marcador", "mostrar marcador a la derecha", false)); public BooleanSetting titles = addSetting(new BooleanSetting("títulos", "mostrar títulos (del comando /title)", false)); diff --git a/src/main/java/me/retucio/camtweaks/module/modules/Rotations.java b/src/main/java/me/retucio/camtweaks/module/modules/Rotations.java new file mode 100644 index 0000000..ca4c50e --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/module/modules/Rotations.java @@ -0,0 +1,41 @@ +package me.retucio.camtweaks.module.modules; + +import me.retucio.camtweaks.event.SubscribeEvent; +import me.retucio.camtweaks.event.events.ChangeRotationEvent; +import me.retucio.camtweaks.module.Module; +import me.retucio.camtweaks.module.settings.BooleanSetting; +import me.retucio.camtweaks.module.settings.NumberSetting; +import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; + +public class Rotations extends Module { + + public NumberSetting yaw = addSetting(new NumberSetting("guiñada", "eje vertical - giro horizontal (yaw)", 0, -180, 180, 1)); + public NumberSetting pitch = addSetting(new NumberSetting("cabeceo", "eje horizontal - giro vertical (pitch)", 0, -90, 90, 1)); + + public BooleanSetting smooth = addSetting(new BooleanSetting("evitar movimiento", "cancela todo movimiento de la cámara", false)); + public BooleanSetting serverSide = addSetting(new BooleanSetting("serverside", "espamea paquetes de rotación al servidor", false)); + + public Rotations() { + super("rotaciones", "te permite forzar una rotación específica"); + } + + @Override + public void onTick() { + if (mc.player == null) return; + + mc.player.setYaw(yaw.getFloatValue()); + mc.player.setPitch(pitch.getFloatValue()); + + if (serverSide.isEnabled()) + mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.LookAndOnGround( + yaw.getFloatValue(), pitch.getFloatValue(), mc.player.isOnGround(), mc.player.horizontalCollision)); + } + + @SubscribeEvent + public void onChangeRotation(ChangeRotationEvent event) { + if (smooth.isEnabled() + && (event.getYaw() != yaw.getFloatValue() || event.getPitch() != pitch.getFloatValue())){ + event.cancel(); + }} + +} diff --git a/src/main/java/me/retucio/camtweaks/module/modules/ShulkerPeek.java b/src/main/java/me/retucio/camtweaks/module/modules/ShulkerPeek.java index 1a7e032..8b0f1ae 100644 --- a/src/main/java/me/retucio/camtweaks/module/modules/ShulkerPeek.java +++ b/src/main/java/me/retucio/camtweaks/module/modules/ShulkerPeek.java @@ -4,27 +4,40 @@ import me.retucio.camtweaks.event.SubscribeEvent; import me.retucio.camtweaks.event.events.KeyEvent; import me.retucio.camtweaks.mixin.accessor.HandledScreenAccessor; import me.retucio.camtweaks.module.Module; +import me.retucio.camtweaks.module.settings.BooleanSetting; import me.retucio.camtweaks.module.settings.KeySetting; import me.retucio.camtweaks.ui.screen.ShulkerPreviewScreen; import net.minecraft.block.ShulkerBoxBlock; import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.component.ComponentType; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.ContainerComponent; +import net.minecraft.component.type.TooltipDisplayComponent; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; import org.lwjgl.glfw.GLFW; import java.awt.*; +import java.util.Collection; import java.util.HashMap; +import java.util.function.Consumer; + + +/** + * + */ public class ShulkerPeek extends Module { public KeySetting previewKey = addSetting(new KeySetting("tecla de previsualización", "tecla a mantener para previsualizar", GLFW.GLFW_KEY_LEFT_ALT)); + public BooleanSetting showTooltips = addSetting(new BooleanSetting("mostrar tooltips", "añadir texto a los tooltips (cajas de texto) de los shulkers", true)); public static final HashMap SHULKER_COLORS = new HashMap<>(); diff --git a/src/main/java/me/retucio/camtweaks/module/modules/Zoom.java b/src/main/java/me/retucio/camtweaks/module/modules/Zoom.java index 7d87f4d..eb141e0 100644 --- a/src/main/java/me/retucio/camtweaks/module/modules/Zoom.java +++ b/src/main/java/me/retucio/camtweaks/module/modules/Zoom.java @@ -26,7 +26,7 @@ public class Zoom extends Module { 6, 1, 10, 0.1)); public NumberSetting mouseSensMultiplier = addSetting(new NumberSetting("sensibilidad", "multiplicador de la sensibilidad del ratón", - 0.7, 0.01, 1, 0.05)); + 0.4, 0, 1, 0.05)); public BooleanSetting smoothCam = addSetting(new BooleanSetting("cámara cinemática", "usa la cámara cinemática mientras hagas zoom", false)); diff --git a/src/main/resources/assets/camtweaks/icon.png b/src/main/resources/assets/camtweaks/icon.png index 0d58243..ff3b394 100644 Binary files a/src/main/resources/assets/camtweaks/icon.png and b/src/main/resources/assets/camtweaks/icon.png differ diff --git a/src/main/resources/assets/camtweaks/icon_old.png b/src/main/resources/assets/camtweaks/icon_old.png new file mode 100644 index 0000000..0d58243 Binary files /dev/null and b/src/main/resources/assets/camtweaks/icon_old.png differ diff --git a/src/main/resources/camtweaks.accesswidener b/src/main/resources/camtweaks.accesswidener index b87b453..a32183c 100644 --- a/src/main/resources/camtweaks.accesswidener +++ b/src/main/resources/camtweaks.accesswidener @@ -7,6 +7,7 @@ accessible field net/minecraft/client/particle/BillboardParticle scale F accessible field net/minecraft/client/particle/Particle velocityMultiplier F accessible field net/minecraft/client/particle/Particle gravityStrength F accessible field net/minecraft/client/particle/Particle collidesWithWorld Z +accessible field net/minecraft/entity/LivingEntity jumpingCooldown I accessible method net/minecraft/client/render/WorldRenderer method_74752 (Lnet/minecraft/client/render/Camera;Lnet/minecraft/client/render/Frustum;Z)V accessible method net/minecraft/client/render/GameRenderer getProjectionMatrix (F)Lorg/joml/Matrix4f; diff --git a/src/main/resources/camtweaks.mixins.json b/src/main/resources/camtweaks.mixins.json index 63072c1..4f73a44 100644 --- a/src/main/resources/camtweaks.mixins.json +++ b/src/main/resources/camtweaks.mixins.json @@ -6,7 +6,9 @@ "ClientConnectionMixin", "DimensionTypeMixin", "EntityMixin", + "HandshakeC2SPacketMixin", "ItemEntityMixin", + "ItemMixin", "KeyInputMixin", "PlayerEntityMixin", "StringHelperMixin", @@ -58,9 +60,9 @@ "TelemetryManagerMixin", "TextRendererDrawerMixin", "TextRendererMixin", - "TitleScreenMixin", "WeatherRenderingMixin", "WorldRendererMixin", + "accessor.AbstractSignEditScreenAccessor", "accessor.ClientPlayNetworkHandlerAccessor", "accessor.HandledScreenAccessor", "accessor.KeyBindingAccessor"