From 67cc34a08cc4fa885012c613248e62196c31bd37 Mon Sep 17 00:00:00 2001 From: retuci0 Date: Wed, 6 May 2026 17:59:19 +0200 Subject: [PATCH] v4.7 --- cambios.md | 14 +-- gradle.properties | 2 +- src/main/java/me/retucio/sputnik/Sputnik.java | 11 ++- .../sputnik/command/CommandManager.java | 1 + .../command/commands/FriendCommand.java | 52 +++++++++++ .../sputnik/config/BinarySerializer.java | 14 +-- .../retucio/sputnik/config/ClientConfig.java | 25 ++++++ .../retucio/sputnik/config/ConfigManager.java | 23 +++-- .../sputnik/event/sputnik/FriendEvent.java | 26 ++++++ .../event/sputnik/LoadFriendManagerEvent.java | 5 ++ .../me/retucio/sputnik/friend/Friend.java | 49 ++++++++++ .../retucio/sputnik/friend/FriendManager.java | 89 +++++++++++++++++++ .../mixin/mixins/item/ItemStackMixin.java | 3 + .../render/EquipmentLayerRendererMixin.java | 1 + .../render/ItemFeatureRendererMixin.java | 20 +---- .../mixins/render/LevelRendererMixin.java | 2 - .../mixins/render/RenderBuffersMixin.java | 17 ++-- .../retucio/sputnik/module/ModuleManager.java | 2 + .../module/modules/client/Friends.java | 64 +++++++++++++ .../module/modules/combat/CrystalAura.java | 8 ++ .../module/modules/combat/SpearKill.java | 22 +++-- .../module/modules/misc/FakePlayer.java | 4 + .../me/retucio/sputnik/util/EntityUtil.java | 41 +++++++++ .../sputnik/util/render/GlintRenderType.java | 78 +++++++--------- 24 files changed, 468 insertions(+), 105 deletions(-) create mode 100644 src/main/java/me/retucio/sputnik/command/commands/FriendCommand.java create mode 100644 src/main/java/me/retucio/sputnik/event/sputnik/FriendEvent.java create mode 100644 src/main/java/me/retucio/sputnik/event/sputnik/LoadFriendManagerEvent.java create mode 100644 src/main/java/me/retucio/sputnik/friend/Friend.java create mode 100644 src/main/java/me/retucio/sputnik/friend/FriendManager.java create mode 100644 src/main/java/me/retucio/sputnik/module/modules/client/Friends.java diff --git a/cambios.md b/cambios.md index ff4a1ea..ea4c262 100644 --- a/cambios.md +++ b/cambios.md @@ -1,22 +1,22 @@ -# v4.6 +# v4.7 ## novedades ### adiciones +- sistema de amigos + #### módulos nuevos: +- amigos: añade o elimina amigos con la rueda del ratón, para evitar atacarles por accidente + ### arreglos / mejoras -- el editor del hud por defecto ahora se abre con `insertar` (no confundir con `enter`) -- renombrado todos los `frame`s a `panel`s -- `colocar en aire` ya funciona correctamente -- `delay de paquetes` no _debería_ de crashear el juego ya +- `destello de enchants.` ya funciona en items 2d ## problemas reconocidos - lo de siempre, además de: - - `delay de paquetes` puede crashear el juego - `inventario plus` no funciona en creativo - `RPC de Discord` no funciona e incluso puede provocar crashes - - `destello de enchants.` no funciona, solamente lo hace en la armadura equipada y en ítems translúcidos. \ No newline at end of file + - las cajas `puntos de desconexión` están mal renderizadas \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 0ffbb5b..3ddad52 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=4.6 +mod_version=4.7 maven_group=me.retucio archives_base_name=sputnik \ No newline at end of file diff --git a/src/main/java/me/retucio/sputnik/Sputnik.java b/src/main/java/me/retucio/sputnik/Sputnik.java index 806e88d..b128626 100644 --- a/src/main/java/me/retucio/sputnik/Sputnik.java +++ b/src/main/java/me/retucio/sputnik/Sputnik.java @@ -10,11 +10,9 @@ import me.retucio.sputnik.config.ConfigManager; import me.retucio.sputnik.event.ShutdownEvent; import me.retucio.sputnik.event.interact.OpenScreenEvent; -import me.retucio.sputnik.event.sputnik.LoadCapeManagerEvent; -import me.retucio.sputnik.event.sputnik.LoadClickGuiEvent; -import me.retucio.sputnik.event.sputnik.LoadCommandManagerEvent; -import me.retucio.sputnik.event.sputnik.LoadModuleManagerEvent; +import me.retucio.sputnik.event.sputnik.*; +import me.retucio.sputnik.friend.FriendManager; import me.retucio.sputnik.module.Module; import me.retucio.sputnik.module.ModuleManager; import me.retucio.sputnik.module.modules.client.Hud; @@ -111,11 +109,16 @@ public class Sputnik implements ClientModInitializer { CommandManager.INSTANCE = new CommandManager(); EVENT_BUS.post(new LoadCommandManagerEvent()); + FriendManager.INSTANCE = new FriendManager(); + EVENT_BUS.post(new LoadFriendManagerEvent()); + mc.execute(() -> { Textures.init(); + ClickGui.INSTANCE = new ClickGui(); HudEditorScreen.INSTANCE = new HudEditorScreen(); EVENT_BUS.post(new LoadClickGuiEvent()); + HudRenderer.init(); }); diff --git a/src/main/java/me/retucio/sputnik/command/CommandManager.java b/src/main/java/me/retucio/sputnik/command/CommandManager.java index 8f4efeb..cb8c10c 100644 --- a/src/main/java/me/retucio/sputnik/command/CommandManager.java +++ b/src/main/java/me/retucio/sputnik/command/CommandManager.java @@ -36,6 +36,7 @@ public class CommandManager { addCommand(new ConfigCommand()); addCommand(new CopyScreenshotCommand()); addCommand(new EnderChestCommand()); + addCommand(new FriendCommand()); addCommand(new GarbageCleanerCommand()); addCommand(new PeekCommand()); addCommand(new PluginsCommand()); diff --git a/src/main/java/me/retucio/sputnik/command/commands/FriendCommand.java b/src/main/java/me/retucio/sputnik/command/commands/FriendCommand.java new file mode 100644 index 0000000..0e0a241 --- /dev/null +++ b/src/main/java/me/retucio/sputnik/command/commands/FriendCommand.java @@ -0,0 +1,52 @@ +package me.retucio.sputnik.command.commands; + +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import me.retucio.sputnik.command.Command; +import me.retucio.sputnik.command.args.PlayerArgumentType; +import me.retucio.sputnik.friend.Friend; +import me.retucio.sputnik.friend.FriendManager; +import me.retucio.sputnik.util.ChatUtil; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.world.entity.player.Player; + +public class FriendCommand extends Command { + + public FriendCommand() { + super("friend", "gestión de amigos", "amigo", "f"); + } + + @Override + public void build(LiteralArgumentBuilder builder) { + builder + .then(literal("add") + .then(argument("amigo", PlayerArgumentType.INSTANCE) + .executes(ctx -> { + Player friend = ctx.getArgument("amigo", Player.class); + FriendManager.INSTANCE.add(friend.getUUID()); + ChatUtil.info(ChatFormatting.GREEN + friend.getName().getString() + ChatFormatting.RESET + " ahora es tu amigo :)"); + return SUCCESS; + }) + ) + ) + .then(literal("remove") + .then(argument("amigo", PlayerArgumentType.INSTANCE) + .executes(ctx -> { + Player friend = ctx.getArgument("amigo", Player.class); + FriendManager.INSTANCE.remove(friend.getUUID()); + ChatUtil.info(ChatFormatting.GREEN + friend.getName().getString() + ChatFormatting.RESET + " ya no es tu amigo :("); + return SUCCESS; + }) + ) + ) + .then(literal("list") + .executes(ctx -> { + ChatUtil.info(ChatFormatting.GOLD + "amigos:"); + for (Friend friend : FriendManager.INSTANCE.getFriends()) { + ChatUtil.info("- " + friend.getName()); + } + return SUCCESS; + }) + ); + } +} diff --git a/src/main/java/me/retucio/sputnik/config/BinarySerializer.java b/src/main/java/me/retucio/sputnik/config/BinarySerializer.java index 2e13867..289fb0b 100644 --- a/src/main/java/me/retucio/sputnik/config/BinarySerializer.java +++ b/src/main/java/me/retucio/sputnik/config/BinarySerializer.java @@ -2,13 +2,15 @@ package me.retucio.sputnik.config; import java.io.*; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class BinarySerializer { - private static final int MAGIC_NUMBER = 0x53505554; // "SPUT" - private static final int VERSION = 1; + private static final int MAGIC_NUMBER = 0x53505554; // "SPUT" + private static final int VERSION = 2; private static final byte TYPE_NULL = 0; private static final byte TYPE_BOOLEAN = 1; @@ -36,6 +38,7 @@ public class BinarySerializer { writeStringIntArrayMap(out, config.hudPositions); writeStringBooleanMap(out, config.hudVisibilities); writeStringStringMap(out, config.hudImagePaths); + writeStringStringMap(out, config.friends); // posición de la barra de búsqueda if (config.searchBarPosition != null) { @@ -82,6 +85,7 @@ public class BinarySerializer { config.hudPositions = readStringIntArrayMap(in); config.hudVisibilities = readStringBooleanMap(in); config.hudImagePaths = readStringStringMap(in); + config.friends = readStringStringMap(in); // leer pos. de la barra de búsqueda if (in.readBoolean()) { @@ -297,8 +301,7 @@ public class BinarySerializer { } } - private static Map readExtendablePanels(DataInputStream in) - throws IOException { + private static Map readExtendablePanels(DataInputStream in) throws IOException { int size = in.readInt(); Map map = new HashMap<>(size); for (int i = 0; i < size; i++) { @@ -336,7 +339,6 @@ public class BinarySerializer { return map; } - // Optimized string writing (UTF-8 with length prefix) private static void writeString(DataOutputStream out, String str) throws IOException { if (str == null) { out.writeInt(-1); @@ -352,6 +354,6 @@ public class BinarySerializer { if (length == -1) return null; byte[] bytes = new byte[length]; in.readFully(bytes); - return new String(bytes, "UTF-8"); + return new String(bytes, StandardCharsets.UTF_8); } } diff --git a/src/main/java/me/retucio/sputnik/config/ClientConfig.java b/src/main/java/me/retucio/sputnik/config/ClientConfig.java index 2dc0ac7..b079f2c 100644 --- a/src/main/java/me/retucio/sputnik/config/ClientConfig.java +++ b/src/main/java/me/retucio/sputnik/config/ClientConfig.java @@ -4,10 +4,13 @@ import com.github.retucio.neutrino.EventListener; import me.retucio.sputnik.event.sputnik.*; import me.retucio.sputnik.module.setting.settings.*; import me.retucio.sputnik.ui.screen.ClickGui; +import me.retucio.sputnik.util.ChatUtil; import java.io.Serial; import java.io.Serializable; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import static me.retucio.sputnik.Sputnik.EVENT_BUS; @@ -40,6 +43,9 @@ public class ClientConfig { // posición de la barra de búsqueda (x, y) public int[] searchBarPosition = new int[] { 340, 16 }; + // amigos: uuid -> nombre + public Map friends = new HashMap<>(); + public ClientConfig() { EVENT_BUS.subscribe(this); } @@ -94,6 +100,7 @@ public class ClientConfig { ClickGui.INSTANCE.getModulesPanel().getX(), ClickGui.INSTANCE.getModulesPanel().getY(), ClickGui.INSTANCE.getModulesPanel().extended)); + ConfigManager.save(); } @EventListener @@ -102,6 +109,7 @@ public class ClientConfig { ClickGui.INSTANCE.getModulesPanel().getX(), ClickGui.INSTANCE.getModulesPanel().getY(), ClickGui.INSTANCE.getModulesPanel().extended)); + ConfigManager.save(); } @EventListener @@ -110,6 +118,7 @@ public class ClientConfig { ClickGui.INSTANCE.getClientSettingsPanel().getX(), ClickGui.INSTANCE.getClientSettingsPanel().getY(), ClickGui.INSTANCE.getClientSettingsPanel().extended)); + ConfigManager.save(); } @EventListener @@ -118,6 +127,22 @@ public class ClientConfig { ClickGui.INSTANCE.getClientSettingsPanel().getX(), ClickGui.INSTANCE.getClientSettingsPanel().getY(), ClickGui.INSTANCE.getClientSettingsPanel().extended)); + ConfigManager.save(); + } + + @EventListener + public void onAddFriend(FriendEvent.Add event) { + String uuid = event.getFriend().getUuid().toString(); + String name = event.getFriend().getName(); + if (!friends.containsKey(uuid)) { + friends.put(uuid, name); + } + ConfigManager.save(); + } + @EventListener + public void onRemoveFriend(FriendEvent.Remove event) { + friends.remove(event.getFriend().getUuid().toString()); + ConfigManager.save(); } public record PanelData(int x, int y, boolean extended) implements Serializable { diff --git a/src/main/java/me/retucio/sputnik/config/ConfigManager.java b/src/main/java/me/retucio/sputnik/config/ConfigManager.java index 1a5975f..7ff91db 100644 --- a/src/main/java/me/retucio/sputnik/config/ConfigManager.java +++ b/src/main/java/me/retucio/sputnik/config/ConfigManager.java @@ -3,6 +3,8 @@ package me.retucio.sputnik.config; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import me.retucio.sputnik.Sputnik; +import me.retucio.sputnik.friend.Friend; +import me.retucio.sputnik.friend.FriendManager; import me.retucio.sputnik.module.Module; import me.retucio.sputnik.module.ModuleManager; import me.retucio.sputnik.module.setting.*; @@ -18,6 +20,7 @@ import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.Map; +import java.util.UUID; import java.util.function.Consumer; // se ocupa de guardar, cargar y aplicar ajustes @@ -58,7 +61,7 @@ public class ConfigManager { } } - // Fallback to legacy JSON + // fallback to legacy JSON if (LEGACY_JSON_FILE.exists()) { try (FileReader reader = new FileReader(LEGACY_JSON_FILE)) { Gson gson = new GsonBuilder().setPrettyPrinting().create(); @@ -87,6 +90,7 @@ public class ConfigManager { applySearchBarPosition(); applyClientSettings(); applyExtendablePanels(); + applyFriends(); loaded = true; Sputnik.LOGGER.info("ajustes aplicados"); @@ -149,8 +153,17 @@ public class ConfigManager { // ------------------ APLICAR AJUSTES ------------------ + public static void applyFriends() { + Sputnik.LOGGER.info("aplicando amigos: {}", config.friends); + config.friends.forEach((uuid, name) -> { + Friend friend = new Friend(UUID.fromString(uuid)); + friend.setName(name); + FriendManager.INSTANCE.add(friend); + }); + } + @SuppressWarnings({"rawtypes", "unchecked"}) - public static void applySetting(Module parent, Setting setting) { + public static void applySetting(Setting setting) { String key = getSettingKey(setting); if (!config.settings.containsKey(key)) return; @@ -181,7 +194,7 @@ public class ConfigManager { private static void applyModuleSettings() { ModuleManager.INSTANCE.getModules().forEach(module -> { - module.getSettings().forEach(setting -> applySetting(module, setting)); + module.getSettings().forEach(ConfigManager::applySetting); }); Sputnik.LOGGER.info("ajustes de módulos aplicados"); } @@ -211,9 +224,7 @@ public class ConfigManager { private static void applyClientSettings() { ClientSettingsPanel.clientSettings.setEnabled(true); - ClientSettingsPanel.clientSettings.getSettings().forEach(setting -> { - applySetting(ClientSettingsPanel.clientSettings, setting); - }); + ClientSettingsPanel.clientSettings.getSettings().forEach(ConfigManager::applySetting); Sputnik.LOGGER.info("ajustes del cliente aplicados"); } diff --git a/src/main/java/me/retucio/sputnik/event/sputnik/FriendEvent.java b/src/main/java/me/retucio/sputnik/event/sputnik/FriendEvent.java new file mode 100644 index 0000000..31450c8 --- /dev/null +++ b/src/main/java/me/retucio/sputnik/event/sputnik/FriendEvent.java @@ -0,0 +1,26 @@ +package me.retucio.sputnik.event.sputnik; + +import com.github.retucio.neutrino.Event; +import me.retucio.sputnik.friend.Friend; + +// evento lanzado cuando se agrega o se elimina un amigo +public class FriendEvent extends Event { + + private final Friend friend; + + public FriendEvent(Friend friend) { + this.friend = friend; + } + + public Friend getFriend() { + return friend; + } + + public static class Add extends FriendEvent { + public Add(Friend friend) { super(friend); } + } + + public static class Remove extends FriendEvent { + public Remove(Friend friend) { super(friend); } + } +} diff --git a/src/main/java/me/retucio/sputnik/event/sputnik/LoadFriendManagerEvent.java b/src/main/java/me/retucio/sputnik/event/sputnik/LoadFriendManagerEvent.java new file mode 100644 index 0000000..0285f84 --- /dev/null +++ b/src/main/java/me/retucio/sputnik/event/sputnik/LoadFriendManagerEvent.java @@ -0,0 +1,5 @@ +package me.retucio.sputnik.event.sputnik; + +import com.github.retucio.neutrino.Event; + +public class LoadFriendManagerEvent extends Event {} diff --git a/src/main/java/me/retucio/sputnik/friend/Friend.java b/src/main/java/me/retucio/sputnik/friend/Friend.java new file mode 100644 index 0000000..3d9cba0 --- /dev/null +++ b/src/main/java/me/retucio/sputnik/friend/Friend.java @@ -0,0 +1,49 @@ +package me.retucio.sputnik.friend; + +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + + +public class Friend { + + private static final Minecraft mc = Minecraft.getInstance(); + + private String name; + private final UUID uuid; + + public Friend(UUID uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public UUID getUuid() { + return uuid; + } + + public @Nullable Player getPlayer() { + if (mc.level == null) return null; + Entity entity = mc.level.getEntity(uuid); + if (!(entity instanceof Player player)) return null; + return player; + } + + public enum Status { + SUCCESS, + ALREADY_BEFRIENDED, + NOT_PLAYER, + + NOT_BEFRIENDED, + NO_FRIENDS; // :( + } +} diff --git a/src/main/java/me/retucio/sputnik/friend/FriendManager.java b/src/main/java/me/retucio/sputnik/friend/FriendManager.java new file mode 100644 index 0000000..28c5e17 --- /dev/null +++ b/src/main/java/me/retucio/sputnik/friend/FriendManager.java @@ -0,0 +1,89 @@ +package me.retucio.sputnik.friend; + +import me.retucio.sputnik.Sputnik; +import me.retucio.sputnik.event.sputnik.FriendEvent; +import me.retucio.sputnik.module.ModuleManager; +import me.retucio.sputnik.module.modules.misc.FakePlayer; +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + + +public class FriendManager { + + public static FriendManager INSTANCE; + + private final Minecraft mc = Minecraft.getInstance(); + + private final List friends = new ArrayList<>(); + + public void add(Friend friend) { + friends.add(friend); + Sputnik.EVENT_BUS.post(new FriendEvent.Add(friend)); + } + + public void add(UUID uuid) { + Friend friend = new Friend(uuid); + friend.setName(friend.getPlayer().getName().getString()); + add(friend); + } + + public void remove(Friend friend) { + friends.remove(friend); + Sputnik.EVENT_BUS.post(new FriendEvent.Remove(friend)); + } + + public void remove(UUID uuid) { + Friend friend = get(uuid); + remove(friend); + } + + public Friend.Status add(Entity entity) { + if (!(entity instanceof Player) || entity == ModuleManager.INSTANCE.getModuleByClass(FakePlayer.class).getPlayer()) { + return Friend.Status.NOT_PLAYER; + } + if (isFriend(entity)) return Friend.Status.ALREADY_BEFRIENDED; + + add(entity.getUUID()); + return Friend.Status.SUCCESS; + } + + public Friend.Status remove(Entity entity) { + if (!(entity instanceof Player)) return Friend.Status.NOT_PLAYER; + if (friends.isEmpty()) return Friend.Status.NO_FRIENDS; + if (!isFriend(entity)) return Friend.Status.NOT_BEFRIENDED; + + remove(entity.getUUID()); + return Friend.Status.SUCCESS; + } + + public Friend get(UUID uuid) { + for (Friend friend : friends) { + if (friend.getUuid().equals(uuid)) { + return friend; + } + } + return null; + } + + public Friend fromName(String name) { + for (Friend friend : friends) { + if (friend.getName().equals(name)) { + return friend; + } + } + return null; + } + + public boolean isFriend(Entity entity) { + return get(entity.getUUID()) != null; + } + + public List getFriends() { + return new ArrayList<>(friends); + } +} diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/item/ItemStackMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/item/ItemStackMixin.java index dd5c109..5d2ca5f 100644 --- a/src/main/java/me/retucio/sputnik/mixin/mixins/item/ItemStackMixin.java +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/item/ItemStackMixin.java @@ -1,7 +1,10 @@ package me.retucio.sputnik.mixin.mixins.item; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import me.retucio.sputnik.Sputnik; import me.retucio.sputnik.event.interact.DamageItemEvent; +import me.retucio.sputnik.module.ModuleManager; +import me.retucio.sputnik.module.modules.render.GlintPlus; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/render/EquipmentLayerRendererMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/render/EquipmentLayerRendererMixin.java index 87b2096..3595e2d 100644 --- a/src/main/java/me/retucio/sputnik/mixin/mixins/render/EquipmentLayerRendererMixin.java +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/render/EquipmentLayerRendererMixin.java @@ -6,6 +6,7 @@ import net.minecraft.client.renderer.entity.layers.EquipmentLayerRenderer; import net.minecraft.client.renderer.rendertype.RenderType; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(EquipmentLayerRenderer.class) diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/render/ItemFeatureRendererMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/render/ItemFeatureRendererMixin.java index 3ceea40..ea2b8be 100644 --- a/src/main/java/me/retucio/sputnik/mixin/mixins/render/ItemFeatureRendererMixin.java +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/render/ItemFeatureRendererMixin.java @@ -6,41 +6,27 @@ import net.minecraft.client.renderer.feature.ItemFeatureRenderer; import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.client.renderer.rendertype.RenderTypes; 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.Redirect; + @Mixin(ItemFeatureRenderer.class) public abstract class ItemFeatureRendererMixin { // obtener módulo en cada redirect, ya que tiene un inicializador estático - @Shadow - private static boolean useTransparentGlint(RenderType renderType) { - throw new UnsupportedOperationException("implemented via mixin"); - } - - @Redirect(method = "getFoilRenderType", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/feature/ItemFeatureRenderer;useTransparentGlint(Lnet/minecraft/client/renderer/rendertype/RenderType;)Z")) - private static boolean alwaysUseTranslucentGlint(RenderType renderType) { - GlintPlus glintPlus = ModuleManager.INSTANCE.getModuleByClass(GlintPlus.class); - if (!glintPlus.isEnabled()) { - useTransparentGlint(renderType); - } - return true; - } - @Redirect(method = "getFoilRenderType", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/rendertype/RenderTypes;glint()Lnet/minecraft/client/renderer/rendertype/RenderType;")) private static RenderType redirectGlint() { GlintPlus glintPlus = ModuleManager.INSTANCE.getModuleByClass(GlintPlus.class); if (glintPlus == null) return RenderTypes.glint(); - return glintPlus.getGlintTranslucent(); + return glintPlus.getGlint(); } @Redirect(method = "getFoilRenderType", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/rendertype/RenderTypes;entityGlint()Lnet/minecraft/client/renderer/rendertype/RenderType;")) private static RenderType redirectEntityGlint() { GlintPlus glintPlus = ModuleManager.INSTANCE.getModuleByClass(GlintPlus.class); if (glintPlus == null) return RenderTypes.entityGlint(); - return glintPlus.getGlintTranslucent(); + return glintPlus.getEntityGlint(); } @Redirect(method = "getFoilRenderType", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/rendertype/RenderTypes;glintTranslucent()Lnet/minecraft/client/renderer/rendertype/RenderType;")) diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/render/LevelRendererMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/render/LevelRendererMixin.java index cfd798b..ab8d694 100644 --- a/src/main/java/me/retucio/sputnik/mixin/mixins/render/LevelRendererMixin.java +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/render/LevelRendererMixin.java @@ -10,7 +10,6 @@ import me.retucio.sputnik.event.render.Render3DEvent; import me.retucio.sputnik.event.render.RenderBlockOutlineEvent; import me.retucio.sputnik.module.ModuleManager; import me.retucio.sputnik.module.modules.camera.Freecam; -import me.retucio.sputnik.module.modules.render.NoRender; import net.minecraft.client.DeltaTracker; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; @@ -23,7 +22,6 @@ import org.joml.Vector4f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.invoke.arg.Args; import static me.retucio.sputnik.Sputnik.EVENT_BUS; diff --git a/src/main/java/me/retucio/sputnik/mixin/mixins/render/RenderBuffersMixin.java b/src/main/java/me/retucio/sputnik/mixin/mixins/render/RenderBuffersMixin.java index f9e8d69..24ab881 100644 --- a/src/main/java/me/retucio/sputnik/mixin/mixins/render/RenderBuffersMixin.java +++ b/src/main/java/me/retucio/sputnik/mixin/mixins/render/RenderBuffersMixin.java @@ -3,20 +3,23 @@ package me.retucio.sputnik.mixin.mixins.render; import com.mojang.blaze3d.vertex.ByteBufferBuilder; import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; import me.retucio.sputnik.util.render.GlintRenderType; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderBuffers; import net.minecraft.client.renderer.rendertype.RenderType; - 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 org.spongepowered.asm.mixin.injection.Redirect; +import java.util.SequencedMap; @Mixin(RenderBuffers.class) public abstract class RenderBuffersMixin { - @Inject(method = "put", at = @At("HEAD")) - private static void addGlintTypes(Object2ObjectLinkedOpenHashMap map, RenderType type, CallbackInfo ci) { - GlintRenderType.addGlintTypes(map); + @Redirect(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/MultiBufferSource;immediateWithBuffers(Ljava/util/SequencedMap;Lcom/mojang/blaze3d/vertex/ByteBufferBuilder;)Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;", ordinal = 0)) + private MultiBufferSource.BufferSource injectGlintBuffers(SequencedMap fixedBuffers, ByteBufferBuilder sharedBuffer) { + if (fixedBuffers instanceof Object2ObjectLinkedOpenHashMap map) { + GlintRenderType.addGlintTypes(map); + } + return MultiBufferSource.immediateWithBuffers(fixedBuffers, sharedBuffer); } -} +} \ No newline at end of file diff --git a/src/main/java/me/retucio/sputnik/module/ModuleManager.java b/src/main/java/me/retucio/sputnik/module/ModuleManager.java index ab67ee1..e3ed1fd 100644 --- a/src/main/java/me/retucio/sputnik/module/ModuleManager.java +++ b/src/main/java/me/retucio/sputnik/module/ModuleManager.java @@ -3,6 +3,7 @@ package me.retucio.sputnik.module; import com.github.retucio.neutrino.EventListener; import me.retucio.sputnik.Sputnik; import me.retucio.sputnik.module.modules.client.DiscordRPC; +import me.retucio.sputnik.module.modules.client.Friends; import me.retucio.sputnik.module.modules.client.Hud; import me.retucio.sputnik.module.modules.camera.*; import me.retucio.sputnik.module.modules.combat.*; @@ -78,6 +79,7 @@ public class ModuleManager { private void addClient() { add(new DiscordRPC()); + add(new Friends()); add(new Hud()); } diff --git a/src/main/java/me/retucio/sputnik/module/modules/client/Friends.java b/src/main/java/me/retucio/sputnik/module/modules/client/Friends.java new file mode 100644 index 0000000..c96b24a --- /dev/null +++ b/src/main/java/me/retucio/sputnik/module/modules/client/Friends.java @@ -0,0 +1,64 @@ +package me.retucio.sputnik.module.modules.client; + +import com.github.retucio.neutrino.EventListener; +import me.retucio.sputnik.event.input.MouseClickEvent; +import me.retucio.sputnik.event.interact.AttackEntityEvent; +import me.retucio.sputnik.friend.FriendManager; +import me.retucio.sputnik.module.Category; +import me.retucio.sputnik.module.Module; +import me.retucio.sputnik.module.setting.settings.BooleanSetting; +import me.retucio.sputnik.util.ChatUtil; +import net.minecraft.ChatFormatting; +import net.minecraft.world.entity.Entity; +import org.lwjgl.glfw.GLFW; + + +public class Friends extends Module { + + public BooleanSetting middleClick = sgGeneral.add(new BooleanSetting( + "ruedita para añadir amigo", + "pulsara la ruedita del ratón para (des)marcar a un jugador como amigo", + true + )); + + public BooleanSetting preventAttack = sgGeneral.add(new BooleanSetting( + "prevenir ataques", + "no dejar que les ataques manualmente", + true + )); + + public Friends() { + super("amigos", "sistema de amigos para evitar atacar a ciertos jugadores con módulos de combate", Category.CLIENT); + } + + @EventListener + public void onMouseClick(MouseClickEvent event) { + if (event.getButton() == GLFW.GLFW_MOUSE_BUTTON_MIDDLE + && event.getAction() == GLFW.GLFW_PRESS + && middleClick.getValue()) + { + Entity target = mc.crosshairPickEntity; + if (target == null) return; + + if (FriendManager.INSTANCE.isFriend(target)) { + FriendManager.INSTANCE.remove(target); + ChatUtil.info(ChatFormatting.GREEN + target.getName().getString() + ChatFormatting.RESET + " ya no es tu amigo :("); + } else { + switch (FriendManager.INSTANCE.add(target)) { + case SUCCESS -> ChatUtil.info(ChatFormatting.GREEN + target.getName().getString() + ChatFormatting.RESET + " agregado como amigo :)"); + case ALREADY_BEFRIENDED -> ChatUtil.warn(ChatFormatting.GREEN + target.getName().getString() + ChatFormatting.RESET + " ya es tu amigo"); + case NOT_PLAYER -> ChatUtil.error("no se pudo añadir a " + ChatFormatting.GREEN + target.getName().getString() + ChatFormatting.RESET + " como amigo"); + } + } + } + } + + @EventListener + public void onAttack(AttackEntityEvent event) { + if (FriendManager.INSTANCE.isFriend(event.getEntity()) + && preventAttack.getValue()) + { + event.cancel(); + } + } +} diff --git a/src/main/java/me/retucio/sputnik/module/modules/combat/CrystalAura.java b/src/main/java/me/retucio/sputnik/module/modules/combat/CrystalAura.java index c882fa5..a853ec4 100644 --- a/src/main/java/me/retucio/sputnik/module/modules/combat/CrystalAura.java +++ b/src/main/java/me/retucio/sputnik/module/modules/combat/CrystalAura.java @@ -2,6 +2,7 @@ package me.retucio.sputnik.module.modules.combat; import com.github.retucio.neutrino.EventListener; import me.retucio.sputnik.event.render.Render3DEvent; +import me.retucio.sputnik.friend.FriendManager; import me.retucio.sputnik.module.Category; import me.retucio.sputnik.module.Module; import me.retucio.sputnik.module.setting.SettingGroup; @@ -55,6 +56,12 @@ public class CrystalAura extends Module { 5, 0, 12, 0.1 )); + private final BooleanSetting ignoreFriends = sgGeneral.add(new BooleanSetting( + "ignorar amigos", + "no targetear amigos", + true + )); + // ajustes al colocar los cristales @@ -296,6 +303,7 @@ public class CrystalAura extends Module { if (!entity.isAlive() || entity.hasInfiniteMaterials() || entity.equals(mc.player)) continue; if (!entities.isEnabled(entity.getType())) continue; if (entity.distanceToSqr(mc.player) > targetRange.getValue() * targetRange.getValue()) continue; + if (ignoreFriends.getValue() && FriendManager.INSTANCE.isFriend(entity)) continue; targets.add(entity); } } diff --git a/src/main/java/me/retucio/sputnik/module/modules/combat/SpearKill.java b/src/main/java/me/retucio/sputnik/module/modules/combat/SpearKill.java index e10223b..b61b2fd 100644 --- a/src/main/java/me/retucio/sputnik/module/modules/combat/SpearKill.java +++ b/src/main/java/me/retucio/sputnik/module/modules/combat/SpearKill.java @@ -1,5 +1,6 @@ package me.retucio.sputnik.module.modules.combat; +import me.retucio.sputnik.friend.FriendManager; import me.retucio.sputnik.module.Category; import me.retucio.sputnik.module.Module; import me.retucio.sputnik.module.setting.settings.BooleanSetting; @@ -30,7 +31,6 @@ public class SpearKill extends Module { true )); - private final NumberSetting speed = sgGeneral.add(new NumberSetting( "velocidad", "velocidad del impulso", @@ -40,6 +40,12 @@ public class SpearKill extends Module { 0.2 )); + private final BooleanSetting ignoreFriends = sgGeneral.add(new BooleanSetting( + "ignorar amigos", + "no targetear amigos", + true + )); + private int heldTicks = 0; private Entity crosshairTarget; @@ -106,18 +112,20 @@ public class SpearKill extends Module { List candidates = mc.level.getEntities(mc.player, mc.player.getBoundingBox().expandTowards(lookVec.scale(rayLength)), - e -> e instanceof LivingEntity && e.isAlive() && e != mc.player); + e -> e instanceof LivingEntity + && e.isAlive() && e != mc.player + && (!ignoreFriends.getValue() || FriendManager.INSTANCE.isFriend(e))); candidates.sort(Comparator.comparingDouble(e -> eyePos.distanceToSqr(e.getBoundingBox().getCenter()))); double coneAngle = 0.999; - for (Entity e : candidates) { - if (eyePos.distanceTo(e.getBoundingBox().getCenter()) > rayLength) break; - Vec3 toEntity = e.getBoundingBox().getCenter().subtract(eyePos).normalize(); + for (Entity entity : candidates) { + if (eyePos.distanceTo(entity.getBoundingBox().getCenter()) > rayLength) break; + Vec3 toEntity = entity.getBoundingBox().getCenter().subtract(eyePos).normalize(); if (lookVec.dot(toEntity) > coneAngle && - (!onlyPlayers.getValue() || e instanceof Player)) { - return e; + (!onlyPlayers.getValue() || entity instanceof Player)) { + return entity; } } diff --git a/src/main/java/me/retucio/sputnik/module/modules/misc/FakePlayer.java b/src/main/java/me/retucio/sputnik/module/modules/misc/FakePlayer.java index 6fb28db..faf0eec 100644 --- a/src/main/java/me/retucio/sputnik/module/modules/misc/FakePlayer.java +++ b/src/main/java/me/retucio/sputnik/module/modules/misc/FakePlayer.java @@ -58,4 +58,8 @@ public class FakePlayer extends Module { player.onClientRemoval(); player = null; } + + public RemotePlayer getPlayer() { + return player; + } } diff --git a/src/main/java/me/retucio/sputnik/util/EntityUtil.java b/src/main/java/me/retucio/sputnik/util/EntityUtil.java index f068a55..543a60e 100644 --- a/src/main/java/me/retucio/sputnik/util/EntityUtil.java +++ b/src/main/java/me/retucio/sputnik/util/EntityUtil.java @@ -108,6 +108,47 @@ public class EntityUtil { )); } + public static Vec3 getHorizontalVelocity(double bps) { + float yaw = mc.player.getYRot(); + + Vec3 forward = Vec3.directionFromRotation(0, yaw); + Vec3 right = Vec3.directionFromRotation(0, yaw + 90); + double velX = 0; + double velZ = 0; + + + boolean x = false; + if (mc.player.input.keyPresses.right()) { + velX += right.x / 20 * bps; + velZ += right.z / 20 * bps; + x = true; + } + if (mc.player.input.keyPresses.left()) { + velX -= right.x / 20 * bps; + velZ -= right.z / 20 * bps; + x = true; + } + + boolean z = false; + if (mc.player.input.keyPresses.forward()) { + velX += forward.x / 20 * bps; + velZ += forward.z / 20 * bps; + z = true; + } + if (mc.player.input.keyPresses.backward()) { + velX -= forward.x / 20 * bps; + velZ -= forward.z / 20 * bps; + z = true; + } + + if (x && z) { + velX /= Mth.SQRT_OF_TWO; + velZ /= Mth.SQRT_OF_TWO; + } + + return new Vec3(velX, 0, velZ); + } + public enum Target { HEAD, BODY, diff --git a/src/main/java/me/retucio/sputnik/util/render/GlintRenderType.java b/src/main/java/me/retucio/sputnik/util/render/GlintRenderType.java index 7508db0..bdc690d 100644 --- a/src/main/java/me/retucio/sputnik/util/render/GlintRenderType.java +++ b/src/main/java/me/retucio/sputnik/util/render/GlintRenderType.java @@ -1,8 +1,6 @@ package me.retucio.sputnik.util.render; import com.mojang.blaze3d.vertex.ByteBufferBuilder; -import com.mojang.blaze3d.vertex.MeshData; -import com.mojang.blaze3d.vertex.VertexFormat; import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; import me.retucio.sputnik.Sputnik; import me.retucio.sputnik.module.modules.render.GlintPlus; @@ -10,25 +8,24 @@ import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.client.renderer.rendertype.*; import net.minecraft.resources.Identifier; import net.minecraft.world.item.DyeColor; -import org.jspecify.annotations.NonNull; import java.util.ArrayList; import java.util.List; import java.util.function.Function; -/** clase modificada de RenderType para modificar el color del destello de encantamientos +/** utilidad para crear RenderTypes de glint con color personalizado * @see GlintPlus * yoinkeado de: https://github.com/Pepperoni-Jabroni/NoMorePurple/blob/main/src/main/java/pepjebs/no_more_purple/client/GlintRenderLayer.java * (y actualizado) */ -public class GlintRenderType extends RenderType { +public class GlintRenderType { - public static List glintColor = newRenderList(GlintRenderType::buildGlintRenderType); - public static List entityGlintColor = newRenderList(GlintRenderType::buildEntityGlintRenderType); - public static List armorEntityGlintColor = newRenderList(GlintRenderType::buildArmorEntityGlintRenderType); - public static List glintTranslucentColor = newRenderList(GlintRenderType::buildGlintTranslucentRenderType); + public static final List glintColor = newRenderList(GlintRenderType::buildGlintRenderType); + public static final List entityGlintColor = newRenderList(GlintRenderType::buildEntityGlintRenderType); + public static final List armorEntityGlintColor = newRenderList(GlintRenderType::buildArmorEntityGlintRenderType); + public static final List glintTranslucentColor = newRenderList(GlintRenderType::buildGlintTranslucentRenderType); public static void addGlintTypes(Object2ObjectLinkedOpenHashMap map) { addGlintTypes(map, glintColor); @@ -37,12 +34,8 @@ public class GlintRenderType extends RenderType { addGlintTypes(map, armorEntityGlintColor); } - public GlintRenderType(String name) { - super(name, RenderSetup.builder(RenderPipelines.GLINT).createRenderSetup()); - } - private static List newRenderList(Function func) { - ArrayList list = new ArrayList<>(DyeColor.values().length); + ArrayList list = new ArrayList<>(DyeColor.values().length + 2); for (DyeColor color : DyeColor.values()) list.add(func.apply(color.name())); @@ -54,65 +47,54 @@ public class GlintRenderType extends RenderType { } public static void addGlintTypes(Object2ObjectLinkedOpenHashMap map, List typeList) { - for(RenderType renderType : typeList) + for (RenderType renderType : typeList) if (!map.containsKey(renderType)) map.put(renderType, new ByteBufferBuilder(renderType.bufferSize())); } private static RenderType buildGlintRenderType(String name) { final Identifier res = Identifier.fromNamespaceAndPath(Sputnik.MOD_ID, "textures/misc/glint_" + name.toLowerCase() + ".png"); - return RenderType.create( - "glint_" + name, - RenderSetup.builder(RenderPipelines.GLINT) - .withTexture("Sampler0", res) - .setTextureTransform(TextureTransform.GLINT_TEXTURING) - .setOutputTarget(OutputTarget.ITEM_ENTITY_TARGET) - .createRenderSetup() + "glint_" + name, + RenderSetup.builder(RenderPipelines.GLINT) + .withTexture("Sampler0", res) + .setTextureTransform(TextureTransform.GLINT_TEXTURING) + .createRenderSetup() ); } private static RenderType buildGlintTranslucentRenderType(String name) { final Identifier res = Identifier.fromNamespaceAndPath(Sputnik.MOD_ID, "textures/misc/glint_" + name.toLowerCase() + ".png"); - return RenderType.create( - "glint_translucent_" + name, - RenderSetup.builder(RenderPipelines.GLINT) - .withTexture("Sampler0", res) - .setTextureTransform(TextureTransform.GLINT_TEXTURING) - .setOutputTarget(OutputTarget.ITEM_ENTITY_TARGET) - .createRenderSetup() + "glint_translucent_" + name, + RenderSetup.builder(RenderPipelines.GLINT) + .withTexture("Sampler0", res) + .setTextureTransform(TextureTransform.GLINT_TEXTURING) + .setOutputTarget(OutputTarget.ITEM_ENTITY_TARGET) + .createRenderSetup() ); } private static RenderType buildEntityGlintRenderType(String name) { final Identifier res = Identifier.fromNamespaceAndPath(Sputnik.MOD_ID, "textures/misc/glint_" + name.toLowerCase() + ".png"); - return RenderType.create( - "entity_glint_" + name, - RenderSetup.builder(RenderPipelines.GLINT) - .withTexture("Sampler0", res) - .setTextureTransform(TextureTransform.ENTITY_GLINT_TEXTURING) - .createRenderSetup() + "entity_glint_" + name, + RenderSetup.builder(RenderPipelines.GLINT) + .withTexture("Sampler0", res) + .setTextureTransform(TextureTransform.ENTITY_GLINT_TEXTURING) + .createRenderSetup() ); } private static RenderType buildArmorEntityGlintRenderType(String name) { final Identifier res = Identifier.fromNamespaceAndPath(Sputnik.MOD_ID, "textures/misc/glint_" + name.toLowerCase() + ".png"); - return RenderType.create( - "armor_glint_" + name, - RenderSetup.builder(RenderPipelines.GLINT) - .withTexture("Sampler0", res) - .setTextureTransform(TextureTransform.ARMOR_ENTITY_GLINT_TEXTURING) - .setLayeringTransform(LayeringTransform.VIEW_OFFSET_Z_LAYERING) - .createRenderSetup() + "armor_glint_" + name, + RenderSetup.builder(RenderPipelines.GLINT) + .withTexture("Sampler0", res) + .setTextureTransform(TextureTransform.ARMOR_ENTITY_GLINT_TEXTURING) + .setLayeringTransform(LayeringTransform.VIEW_OFFSET_Z_LAYERING) + .createRenderSetup() ); } - - @Override - public void draw(@NonNull MeshData buffer) {} - - @Override - public @NonNull VertexFormat format() { return VertexFormat.builder().build(); } } \ No newline at end of file