This commit is contained in:
retuci0 committed 2026-01-06 18:09:52 +01:00
1 parent ec3e633cec
commit f794457538
77 files changed
+881 -513

No files matched your search

+2 -6
View File
@@ -1,19 +1,15 @@
# v2.4
# v2.5
## novedades
ahora se usa el formato binario (.dat) en vez de .json para guardar ajustes, lo que los hace más rápidos, y el archivo más liviano
- grupos de ajustes, para mayor orden, y arreglo de algún que otro bug
### adiciones
#### módulos nuevos:
- capas: cambia (solo visualmente, para ti) la capa que usas a una custom de las disponibles
### arreglos / mejoras
- renombrado bien todo que lo hice con prisa
## problemas reconocidos
- muchos, pero repórtalos en la página de problemas si quieres para que queden bien registrados
+1 -1
View File
@@ -8,6 +8,6 @@ loom_version=1.13-SNAPSHOT
fabric_api_version=0.140.2+1.21.11
mod_version=2.4
mod_version=2.5
maven_group=me.retucio
archives_base_name=sputnik
@@ -120,7 +120,6 @@ public class Sputnik implements ClientModInitializer {
// se ejecuta cada vez que se presiona una tecla
public void onKey(int key, int action) {
if (key == GLFW.GLFW_KEY_F3) return; // prevenir activación de módulos al usar combinaciones de F3
ModuleManager.INSTANCE.getEnabledModules().forEach(module -> module.onKey(key, action));
boolean anyFocused = isAnySettingButtonFocused() || ClickGUI.INSTANCE.getSearchBar().isFocused();
ClickGUI.INSTANCE.setAnyFocused(anyFocused);
@@ -4,7 +4,7 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import me.retucio.sputnik.command.Command;
import me.retucio.sputnik.command.args.ModuleArgumentType;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.KeySetting;
import me.retucio.sputnik.module.setting.settings.KeySetting;
import me.retucio.sputnik.util.ChatUtil;
import me.retucio.sputnik.util.KeyUtil;
import net.minecraft.command.CommandSource;
@@ -2,7 +2,7 @@ package me.retucio.sputnik.config;
import me.retucio.sputnik.event.SubscribeEvent;
import me.retucio.sputnik.event.events.sputnik.*;
import me.retucio.sputnik.module.settings.*;
import me.retucio.sputnik.module.setting.settings.*;
import me.retucio.sputnik.ui.screen.ClickGUI;
import java.io.Serial;
@@ -78,13 +78,13 @@ public class ClientConfig {
@SubscribeEvent
public void onCloseSettingsFrame(SettingsFrameEvent.Close event) {
settingsFrames.remove(event.getFrame().module.getName());
settingsFrames.remove(event.getFrame().getModule().getName());
ConfigManager.save();
}
@SubscribeEvent
public void onMoveSettingsFrame(SettingsFrameEvent.Move event) {
settingsFrames.replace(event.getFrame().module.getName(), new int[]{event.getFrame().getX(), event.getFrame().getY()});
settingsFrames.replace(event.getFrame().getModule().getName(), new int[]{event.getFrame().getX(), event.getFrame().getY()});
ConfigManager.save();
}
@@ -5,20 +5,20 @@ import com.google.gson.GsonBuilder;
import me.retucio.sputnik.Sputnik;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.ModuleManager;
import me.retucio.sputnik.module.settings.*;
import me.retucio.sputnik.module.setting.*;
import me.retucio.sputnik.module.setting.settings.*;
import me.retucio.sputnik.ui.widgets.Frame;
import me.retucio.sputnik.ui.widgets.frames.ModuleFrame;
import me.retucio.sputnik.ui.screen.ClickGUI;
import me.retucio.sputnik.ui.widgets.frames.settings.ClientSettingsFrame;
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
import me.retucio.sputnik.util.ChatUtil;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;
// se ocupa de guardar, cargar y aplicar ajustes
public class ConfigManager {
@@ -115,10 +115,10 @@ public class ConfigManager {
public static void setFramePosition(SettingsFrame frame) {
ensureConfig();
if (!config.settingsFrames.containsKey(frame.module.getName()))
config.settingsFrames.put(frame.module.getName(), new int[] {frame.getX(), frame.getY()});
if (!config.settingsFrames.containsKey(frame.getModule().getName()))
config.settingsFrames.put(frame.getModule().getName(), new int[] {frame.getX(), frame.getY()});
else
config.settingsFrames.replace(frame.module.getName(), new int[] {frame.getX(), frame.getY()});
config.settingsFrames.replace(frame.getModule().getName(), new int[] {frame.getX(), frame.getY()});
save();
}
@@ -140,17 +140,6 @@ public class ConfigManager {
save();
}
public static void setHudImagePath(String id, String imagePath) {
ensureConfig();
config.hudImagePaths.put(id, imagePath);
save();
}
public static String getHudImagePath(String id) {
ensureConfig();
return config.hudImagePaths.getOrDefault(id, "");
}
public static void setSearchBarPosition(int x, int y) {
ensureConfig();
config.searchBarPosition = new int[] {x, y};
@@ -248,6 +237,7 @@ public class ConfigManager {
}
}
// ajustes de módulos
private static void applyBooleanSetting(BooleanSetting setting, Object value) {
@@ -306,8 +296,14 @@ public class ConfigManager {
Number b = (Number) map.get("b");
Number a = (Number) map.get("a");
if (r != null && g != null && b != null && a != null)
setting.setRGB(r.intValue(), g.intValue(), b.intValue(), a.intValue());
if (r != null && g != null && b != null && a != null) {
setting.setRGB(
r.intValue(),
g.intValue(),
b.intValue(),
a.intValue()
);
}
applyOptionalProperty(map, "rb", Boolean.class, setting::setRainbow);
applyOptionalProperty(map, "rs", Number.class, val -> setting.setRainbowSpeed(val.intValue()));
@@ -321,7 +317,7 @@ public class ConfigManager {
}
}
private static <T> void applyOptionalProperty(Map<?, ?> map, String key, Class<T> type, java.util.function.Consumer<T> setter) {
private static <T> void applyOptionalProperty(Map<?, ?> map, String key, Class<T> type, Consumer<T> setter) {
Object value = map.get(key);
if (type.isInstance(value)) {
setter.accept(type.cast(value));
@@ -340,7 +336,7 @@ public class ConfigManager {
}
private static String getSettingKey(Setting setting) {
return setting.getModule().getName() + ":" + setting.getName();
return setting.getSg().getModule().getName() + ":" + setting.getName();
}
public static boolean hasLoaded() {
@@ -0,0 +1,24 @@
package me.retucio.sputnik.event.events;
import me.retucio.sputnik.event.Event;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.RenderTickCounter;
public class Render2DEvent extends Event {
private final DrawContext ctx;
private final RenderTickCounter tc;
public Render2DEvent(DrawContext ctx, RenderTickCounter tc) {
this.ctx = ctx;
this.tc = tc;
}
public DrawContext getCtx() {
return ctx;
}
public RenderTickCounter getTc() {
return tc;
}
}
@@ -9,13 +9,13 @@ import net.minecraft.client.util.math.MatrixStack;
/**
* @see me.retucio.sputnik.mixin.WorldRendererMixin#render
*/
public class RenderWorldEvent extends Event {
public class Render3DEvent extends Event {
private final MatrixStack matrices;
private final RenderTickCounter tc;
private final Camera camera;
public RenderWorldEvent(MatrixStack matrices, RenderTickCounter tc, Camera camera) {
public Render3DEvent(MatrixStack matrices, RenderTickCounter tc, Camera camera) {
this.matrices = matrices;
this.tc = tc;
this.camera = camera;
@@ -1,7 +1,7 @@
package me.retucio.sputnik.event.events.sputnik;
import me.retucio.sputnik.event.Event;
import me.retucio.sputnik.module.settings.Setting;
import me.retucio.sputnik.module.setting.Setting;
// se genera cada que se cambia el valor de un ajuste
public class UpdateSettingEvent extends Event {
@@ -1,6 +1,8 @@
package me.retucio.sputnik.mixin;
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import me.retucio.sputnik.Sputnik;
import me.retucio.sputnik.event.events.Render2DEvent;
import me.retucio.sputnik.module.ModuleManager;
import me.retucio.sputnik.module.modules.misc.ChatPlus;
import me.retucio.sputnik.module.modules.camera.Freecam;
@@ -28,6 +30,11 @@ public abstract class InGameHudMixin {
noRender = ModuleManager.INSTANCE.getModuleByClass(NoRender.class);
}
@Inject(method = "render", at = @At("TAIL"))
private void onRenderHud(DrawContext ctx, RenderTickCounter tc, CallbackInfo ci) {
Sputnik.EVENT_BUS.post(new Render2DEvent(ctx, tc));
}
// norender
@@ -14,8 +14,7 @@ import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Hand;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
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;
@@ -3,7 +3,7 @@ package me.retucio.sputnik.mixin;
import com.llamalad7.mixinextras.sugar.Local;
import com.mojang.blaze3d.buffers.GpuBufferSlice;
import me.retucio.sputnik.Sputnik;
import me.retucio.sputnik.event.events.RenderWorldEvent;
import me.retucio.sputnik.event.events.Render3DEvent;
import me.retucio.sputnik.module.ModuleManager;
import me.retucio.sputnik.module.modules.render.BlockOutline;
import me.retucio.sputnik.module.modules.camera.Freecam;
@@ -47,7 +47,7 @@ public abstract class WorldRendererMixin {
matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(camera.getYaw() + 180f));
profiler.push(Sputnik.MOD_ID + "-3d");
EVENT_BUS.post(new RenderWorldEvent(matrices, tickCounter, camera));
EVENT_BUS.post(new Render3DEvent(matrices, tickCounter, camera));
profiler.pop();
matrices.pop();
@@ -4,10 +4,11 @@ import me.retucio.sputnik.Sputnik;
import me.retucio.sputnik.config.ConfigManager;
import me.retucio.sputnik.event.SubscribeEvent;
import me.retucio.sputnik.event.events.sputnik.ToggleModuleEvent;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.EnumSetting;
import me.retucio.sputnik.module.settings.KeySetting;
import me.retucio.sputnik.module.settings.Setting;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.EnumSetting;
import me.retucio.sputnik.module.setting.settings.KeySetting;
import me.retucio.sputnik.module.setting.Setting;
import me.retucio.sputnik.util.ChatUtil;
import net.minecraft.client.MinecraftClient;
import org.lwjgl.glfw.GLFW;
@@ -15,6 +16,7 @@ import org.lwjgl.glfw.GLFW;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
// clase base para los módulos
public class Module {
@@ -33,22 +35,24 @@ public class Module {
protected KeySetting bind = new KeySetting("tecla", "tecla asignada al módulo, ESC para desactivar", GLFW.GLFW_KEY_UNKNOWN);
protected BooleanSetting notify = new BooleanSetting("notificar", "notificar en el chat al activar / desactivar", true);
private final List<Setting> settings = new ArrayList<>();
protected final List<SettingGroup> sgs = new ArrayList<>();
protected final SettingGroup sgGeneral = addSg(new SettingGroup("general", true));
protected MinecraftClient mc = MinecraftClient.getInstance();
public Module(String name, String description, Category category) {
this.name = name;
this.description = description;
this.category = category;
addSettings(bind, keyMode, notify);
sgGeneral.addAll(bind, keyMode, notify);
}
public Module(String name, String description, Category category, int key) {
this.name = name;
this.description = description;
this.category = category;
addSettings(bind, keyMode, notify);
sgGeneral.addAll(bind, keyMode, notify);
this.bind.setDefaultKey(key);
// puto marcos
@@ -57,22 +61,34 @@ public class Module {
this.bind.setKey(key);
}
// ajustes
public SettingGroup addSg(SettingGroup sg) {
sgs.add(sg);
sg.setModule(this);
return sg;
}
public List<SettingGroup> getSgs() {
return sgs;
}
public SettingGroup getSg(String name) {
for (SettingGroup sg : sgs) {
if (sg.getName().equals(name)) {
return sg;
}
}
return null;
}
public List<Setting> getSettings() {
List<Setting> settings = new ArrayList<>();
sgs.forEach(sg -> sg.forEach(settings::add));
return settings;
}
@SuppressWarnings("unchecked")
public <S extends Setting> S addSetting(Setting setting) {
settings.add(setting);
setting.setModule(this);
return (S) setting; // por conveniencia
}
public void addSettings(Setting... settings) {
for (Setting setting : settings) addSetting(setting);
}
// encendido y apagado del módulo
public void toggle() {
@@ -100,9 +116,8 @@ public class Module {
}
// otros métodos
// tick (ejecutado 20 veces por segundo)
public void onTick() {}
public void onKey(int key, int action) {}
// getters y setters
public String getName() {
@@ -2,8 +2,8 @@ package me.retucio.sputnik.module;
import me.retucio.sputnik.Sputnik;
import me.retucio.sputnik.event.SubscribeEvent;
import me.retucio.sputnik.module.modules.camera.*;
import me.retucio.sputnik.module.modules.client.HUD;
import me.retucio.sputnik.module.modules.camera.*;
import me.retucio.sputnik.module.modules.misc.*;
import me.retucio.sputnik.module.modules.network.*;
import me.retucio.sputnik.module.modules.player.*;
@@ -5,9 +5,10 @@ import me.retucio.sputnik.event.SubscribeEvent;
import me.retucio.sputnik.event.events.*;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.KeySetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.KeySetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import me.retucio.sputnik.util.ChatUtil;
import me.retucio.sputnik.util.KeyUtil;
import me.retucio.sputnik.util.MiscUtil;
@@ -41,21 +42,22 @@ import org.lwjgl.glfw.GLFW;
public class Freecam extends Module {
// ajustes
SettingGroup sgSpeed = addSg(new SettingGroup("velocidad", true));
public BooleanSetting toggleOnDamage = addSetting(new BooleanSetting("desactivar al recibir daño", "desactiva el módulo tras recibir daño", true));
public BooleanSetting reloadChunks = addSetting(new BooleanSetting("recargar chunks", "recargar chunks para arreglar el culling de las cuevas", true));
public BooleanSetting renderHands = addSetting(new BooleanSetting("manos visibles", "decide si se renderizan las manos mientras la cámara esté libre", true));
public BooleanSetting stayCrouching = addSetting(new BooleanSetting("mantenerse agachado", "mantener al jugador agachado tras entrar en el modo de cámara libre", false));
public BooleanSetting staticView = addSetting(new BooleanSetting("visión estática", "desactiva ajustes que muevan la cámara", true));
public BooleanSetting cancelActionPackets = addSetting(new BooleanSetting("cancelar paquetes", "evita flaggear el anticheat al interactuar con bloques / entidades", true));
public BooleanSetting blockOutlines = addSetting(new BooleanSetting("contorno de bloques", "mostrar el contorno de los bloques estando en el modo de cámara libre", true));
public BooleanSetting toggleOnDamage = sgGeneral.add(new BooleanSetting("desactivar al recibir daño", "desactiva el módulo tras recibir daño", true));
public BooleanSetting reloadChunks = sgGeneral.add(new BooleanSetting("recargar chunks", "recargar chunks para arreglar el culling de las cuevas", true));
public BooleanSetting renderHands = sgGeneral.add(new BooleanSetting("manos visibles", "decide si se renderizan las manos mientras la cámara esté libre", true));
public BooleanSetting stayCrouching = sgGeneral.add(new BooleanSetting("mantenerse agachado", "mantener al jugador agachado tras entrar en el modo de cámara libre", false));
public BooleanSetting staticView = sgGeneral.add(new BooleanSetting("visión estática", "desactiva ajustes que muevan la cámara", true));
public BooleanSetting cancelActionPackets = sgGeneral.add(new BooleanSetting("cancelar paquetes", "evita flaggear el anticheat al interactuar con bloques / entidades", true));
public BooleanSetting blockOutlines = sgGeneral.add(new BooleanSetting("contorno de bloques", "mostrar el contorno de los bloques estando en el modo de cámara libre", true));
public NumberSetting speedSetting = addSetting(new NumberSetting(
public NumberSetting speedSetting = sgSpeed.add(new NumberSetting(
"velocidad", "velocidad de movimiento de la cámara",
1, 0, 10, 0.2));
public KeySetting scrollKey = addSetting(new KeySetting("tecla del scroll", "tecla a mantener pulsada para cambiar velocidad con el scroll", GLFW.GLFW_KEY_LEFT_CONTROL));
public NumberSetting scrollSens = addSetting(new NumberSetting(
public KeySetting scrollKey = sgSpeed.add(new KeySetting("tecla del scroll", "tecla a mantener pulsada para cambiar velocidad con el scroll", GLFW.GLFW_KEY_LEFT_CONTROL));
public NumberSetting scrollSens = sgSpeed.add(new NumberSetting(
"sensibilidad del scroll", "sensibilidad de la rueda del ratón para modificar la velocidad, 0 para desactivar",
1, 0, 2, 0.1));
@@ -2,8 +2,8 @@ package me.retucio.sputnik.module.modules.camera;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.EnumSetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.settings.EnumSetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import me.retucio.sputnik.util.KeyUtil;
import net.minecraft.client.option.Perspective;
import net.minecraft.util.math.MathHelper;
@@ -16,13 +16,13 @@ import org.lwjgl.glfw.GLFW;
public class Freelook extends Module {
public EnumSetting<CameraMode> mode = addSetting(new EnumSetting<>("cámara a mover", "elige cual cámara mover con el ratón y cuál se queda estática",
public EnumSetting<CameraMode> mode = sgGeneral.add(new EnumSetting<>("cámara a mover", "elige cual cámara mover con el ratón y cuál se queda estática",
CameraMode.class, CameraMode.CAMERA));
public NumberSetting arrowSens = addSetting(new NumberSetting("sensibilidad de las flechas", "cuánto rotan la cámara estática las flechas (0 para desactivar)",
public NumberSetting arrowSens = sgGeneral.add(new NumberSetting("sensibilidad de las flechas", "cuánto rotan la cámara estática las flechas (0 para desactivar)",
4, 0, 10, 0.1));
public NumberSetting mouseSens = addSetting(new NumberSetting("sensibilidad del ratón", ".",
public NumberSetting mouseSens = sgGeneral.add(new NumberSetting("sensibilidad del ratón", ".",
0.1, 0, 2, 0.05));
private float yaw;
@@ -3,8 +3,8 @@ package me.retucio.sputnik.module.modules.camera;
import me.retucio.sputnik.mixin.accessor.StatusEffectInstanceAccessor;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.ColorSetting;
import me.retucio.sputnik.module.settings.EnumSetting;
import me.retucio.sputnik.module.setting.settings.ColorSetting;
import me.retucio.sputnik.module.setting.settings.EnumSetting;
import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.entity.effect.StatusEffects;
import net.minecraft.registry.Registries;
@@ -18,9 +18,9 @@ import java.awt.*;
public class Fullbright extends Module {
public EnumSetting<Modes> mode = addSetting(new EnumSetting<>("modo", "qué modo de iluminación emplear (usar poción con shaders)", Modes.class, Modes.GAMMA));
public EnumSetting<Modes> mode = sgGeneral.add(new EnumSetting<>("modo", "qué modo de iluminación emplear (usar poción con shaders)", Modes.class, Modes.GAMMA));
public ColorSetting color = addSetting(new ColorSetting("filtro", "filtro de color", new Color(255, 255, 255, 255), false));
public ColorSetting color = sgGeneral.add(new ColorSetting("filtro", "filtro de color", new Color(255, 255, 255, 255), false));
public Fullbright() {
super("brilli brilli",
@@ -5,28 +5,35 @@ import me.retucio.sputnik.event.events.MouseScrollEvent;
import me.retucio.sputnik.event.events.PerspectiveChangeEvent;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.*;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.KeySetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import me.retucio.sputnik.util.KeyUtil;
import org.lwjgl.glfw.GLFW;
// continúa en CameraMixin
public class PerspectivePlus extends Module {
private double distance;
// ajustes
public BooleanSetting clip = addSetting(new BooleanSetting(
SettingGroup sgScroll = addSg(new SettingGroup("scrolleo", true));
public BooleanSetting clip = sgGeneral.add(new BooleanSetting(
"clip", "atravesar bloques con la cámara", true));
public NumberSetting defaultDistance = addSetting(new NumberSetting(
public NumberSetting defaultDistance = sgGeneral.add(new NumberSetting(
"distancia", "distancia a la que está la cámara del jugador por defecto",
4, 1, 20, 0.2));
public NumberSetting scrollSens = addSetting(new NumberSetting(
public NumberSetting scrollSens = sgScroll.add(new NumberSetting(
"sensibilidad del scroll", "sensibilidad de la rueda del ratón (0 para desactivar)",
1, 0, 8, 0.1));
public KeySetting scrollKey = addSetting(new KeySetting("tecla del scroll", "qué tecla mantener para usar la rueda del ratón", GLFW.GLFW_KEY_LEFT_ALT));
public KeySetting scrollKey = sgScroll.add(new KeySetting("tecla del scroll", "qué tecla mantener para usar la rueda del ratón",
GLFW.GLFW_KEY_LEFT_ALT));
private double distance;
public PerspectivePlus() {
super("perspectiva plus",
@@ -4,17 +4,17 @@ import me.retucio.sputnik.event.SubscribeEvent;
import me.retucio.sputnik.event.events.ChangeRotationEvent;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.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 NumberSetting yaw = sgGeneral.add(new NumberSetting("guiñada", "eje vertical - giro horizontal (yaw)", 0, -180, 180, 1));
public NumberSetting pitch = sgGeneral.add(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 BooleanSetting smooth = sgGeneral.add(new BooleanSetting("evitar movimiento", "cancela todo movimiento de la cámara", false));
public BooleanSetting serverSide = sgGeneral.add(new BooleanSetting("serverside", "espamea paquetes de rotación al servidor", false));
public Rotations() {
super("rotaciones",
@@ -5,30 +5,34 @@ import me.retucio.sputnik.event.events.GetFOVEvent;
import me.retucio.sputnik.event.events.MouseScrollEvent;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.KeySetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.KeySetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import me.retucio.sputnik.util.KeyUtil;
import org.lwjgl.glfw.GLFW;
// continúa en GameRendererMixin
public class Zoom extends Module {
public BooleanSetting showHands = addSetting(new BooleanSetting("mostrar manos", "esconde o muestra las manos al hacer zoom", true));
public BooleanSetting showHUD = addSetting(new BooleanSetting("mostrar HUD", "esconde o muestra los indicadores en pantalla", true));
SettingGroup sgVisual = addSg(new SettingGroup("visual", true));
SettingGroup sgScroll = addSg(new SettingGroup("scrolleo", true));
SettingGroup sgCam = addSg(new SettingGroup("cámara", true));
public NumberSetting scrollSens = addSetting(new NumberSetting("sensibilidad del scroll", "sensibilidad de la rueda del ratón (0 para desactivar)",
0.4, 0, 8, 0.1));
public KeySetting scrollKey = addSetting(new KeySetting("tecla del scroll", "qué tecla mantener para usar la rueda del ratón", GLFW.GLFW_KEY_LEFT_CONTROL));
public NumberSetting defaultZoom = addSetting(new NumberSetting("zoom", "cantidad de zoom",
public NumberSetting defaultZoom = sgGeneral.add(new NumberSetting("zoom", "cantidad de zoom",
6, 1, 10, 0.1));
public NumberSetting mouseSensMultiplier = addSetting(new NumberSetting("sensibilidad", "multiplicador de la sensibilidad del ratón",
0.4, 0, 1, 0.05));
public BooleanSetting showHands = sgVisual.add(new BooleanSetting("mostrar manos", "esconde o muestra las manos al hacer zoom", true));
public BooleanSetting showHUD = sgVisual.add(new BooleanSetting("mostrar HUD", "esconde o muestra los indicadores en pantalla", true));
public BooleanSetting smoothCam = addSetting(new BooleanSetting("cámara cinemática", "usa la cámara cinemática mientras hagas zoom", false));
public NumberSetting scrollSens = sgScroll.add(new NumberSetting("sensibilidad del scroll", "sensibilidad de la rueda del ratón (0 para desactivar)",
0.4, 0, 8, 0.1));
public KeySetting scrollKey = sgScroll.add(new KeySetting("tecla del scroll", "qué tecla mantener para usar la rueda del ratón",
GLFW.GLFW_KEY_LEFT_CONTROL));
public NumberSetting mouseSensMultiplier = sgCam.add(new NumberSetting("sensibilidad", "multiplicador de la sensibilidad del ratón",
0.4, 0, 1, 0.05));
public BooleanSetting smoothCam = sgCam.add(new BooleanSetting("cámara cinemática", "usa la cámara cinemática mientras hagas zoom", false));
private boolean prevSmoothCam;
private double prevMouseSens;
@@ -9,10 +9,11 @@ import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.ModuleManager;
import me.retucio.sputnik.module.modules.misc.ChatPlus;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.ColorSetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.settings.StringSetting;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.ColorSetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import me.retucio.sputnik.module.setting.settings.StringSetting;
import me.retucio.sputnik.util.ChatUtil;
import me.retucio.sputnik.util.Colors;
import org.lwjgl.glfw.GLFW;
@@ -22,25 +23,30 @@ import java.awt.*;
// módulo no visible solo para los ajustes de la interfaz (y del cliente en general)
public class GUI extends Module {
public ColorSetting color = addSetting(new ColorSetting("color", "color principal de la interfaz y el mod",
SettingGroup sgWidgets = addSg(new SettingGroup("widgets", true));
SettingGroup sgUi = addSg(new SettingGroup("interfaz", true));
SettingGroup sgChat = addSg(new SettingGroup("chat", true));
SettingGroup sgMisc = addSg(new SettingGroup("misc.", true));
public ColorSetting color = sgGeneral.add(new ColorSetting("color", "color principal de la interfaz y el mod",
new Color(70, 20, 210, 230), false));
// números negativos para deslizamiento inverso, 0 para desactivar
public NumberSetting scrollSens = addSetting(new NumberSetting("sensibilidad del scroll", "qué tan sensible es la interfaz a la rueda del ratón",
public NumberSetting scrollSens = sgWidgets.add(new NumberSetting("sensibilidad del scroll", "qué tan sensible es la interfaz a la rueda del ratón",
5, -15, 15, 0.5));
public BooleanSetting scrollBar = addSetting(new BooleanSetting("barra de desplazamiento", "renderizar una barra de desplazamiento a la derecha de la interfaz", true));
public BooleanSetting scrollBar = sgWidgets.add(new BooleanSetting("barra de desplazamiento", "renderizar una barra de desplazamiento a la derecha de la interfaz", true));
public BooleanSetting searchBar = addSetting(new BooleanSetting("barra de búsqueda", "renderizar una barra de búsqueda que filtra resultados en todos los marcos abiertos", true));
public BooleanSetting matchCase = addSetting(new BooleanSetting("distinguir mayúsculas", "la búsqueda es sensible a mayúsculas y minúsculas", false));
public BooleanSetting searchBar = sgWidgets.add(new BooleanSetting("barra de búsqueda", "renderizar una barra de búsqueda que filtra resultados en todos los marcos abiertos", true));
public BooleanSetting matchCase = sgWidgets.add(new BooleanSetting("distinguir mayúsculas", "la búsqueda es sensible a mayúsculas y minúsculas", false));
// ^^^ 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)", me.retucio.sputnik.Sputnik.getVersionName(), 40));
public BooleanSetting blur = sgUi.add(new BooleanSetting("desenfoque", "desenfocar el fondo mientras la interfaz está abierta", true));
public StringSetting watermark = sgUi.add(new StringSetting("marca de agua", "marca de agua para interfaces (dejar vacío para desactivar)", me.retucio.sputnik.Sputnik.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));
public StringSetting commandPrefix = sgChat.add(new StringSetting("prefijo", "prefijo de los comandos", "$", 10));
public StringSetting chatName = sgChat.add(new StringSetting("nombre", "qué nombre usar en notificaciones por el chat", "smegma", 20));
public BooleanSetting multipleKeybinds = addSetting(new BooleanSetting("teclas multimódulo", "permitir asignar la misma tecla a más de un módulo", false));
public BooleanSetting multipleKeybinds = sgMisc.add(new BooleanSetting("teclas multimódulo", "permitir asignar la misma tecla a más de un módulo", false));
public GUI() {
super("interfaz",
@@ -2,7 +2,8 @@ package me.retucio.sputnik.module.modules.client;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.*;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.module.setting.settings.*;
import me.retucio.sputnik.ui.hud.HudElement;
import me.retucio.sputnik.ui.hud.HudRenderer;
import me.retucio.sputnik.ui.hud.HudEditorScreen;
@@ -19,21 +20,25 @@ import java.awt.*;
public class HUD extends Module {
SettingGroup sgEditor = addSg(new SettingGroup("editor", true));
SettingGroup sgDisplay = addSg(new SettingGroup("visualización", true));
SettingGroup sgElements = addSg(new SettingGroup("elementos", false));
// editor
public KeySetting editorKey = addSetting(new KeySetting("tecla del editor", "tecla asignada al editor de elementos del hud", GLFW.GLFW_KEY_PAGE_UP));
public KeySetting editorKey = sgEditor.add(new KeySetting("tecla del editor", "tecla asignada al editor de elementos del hud", GLFW.GLFW_KEY_PAGE_UP));
// ajustes
public ColorSetting color = addSetting(new ColorSetting("color", "color del texto de los elementos del HUD",
public ColorSetting color = sgDisplay.add(new ColorSetting("color", "color del texto de los elementos del HUD",
new Color(255, 255, 255, 255), false));
public BooleanSetting showOnF3 = addSetting(new BooleanSetting("mostrar en F3", "renderizar HUD en el menú de debug", false));
public BooleanSetting showOnChat = addSetting(new BooleanSetting("mostrar en chat", "renderizar HUD en la pantalla del chat", false));
public BooleanSetting shadow = sgDisplay.add(new BooleanSetting("sombra", "texto con sombra", true));
public BooleanSetting showOnF3 = sgDisplay.add(new BooleanSetting("mostrar en F3", "renderizar HUD en el menú de debug", false));
public BooleanSetting showOnChat = sgDisplay.add(new BooleanSetting("mostrar en chat", "renderizar HUD en la pantalla del chat", false));
public BooleanSetting shadow = addSetting(new BooleanSetting("sombra", "texto con sombra", true));
public NumberSetting timezone = addSetting(new NumberSetting("zona horaria", "zona horaria en UTC+n", 1, -6, 6, 1));
public EnumSetting<TimeFormat> timeFormat = addSetting(new EnumSetting<>("formato de la hora", "12h o 24h", TimeFormat.class, TimeFormat.TWENTY_FOUR_HOUR));
public StringSetting customText = addSetting(new StringSetting("texto custom", "marca de agua (dejar vacío para quitar)", "adolf jitler inshtagram feishbuc twiter", 40));
public EnumSetting<CoordsMode> coordsMode = addSetting(new EnumSetting<>("modo de coordenadas", "qué coordenadas mostrar", CoordsMode.class, CoordsMode.OVERWORLD));
public EnumSetting<Dynosaurs> dyno = addSetting(new EnumSetting<>("dinosaurio", "qué dinosaurio mostrar",
public NumberSetting timezone = sgElements.add(new NumberSetting("zona horaria", "zona horaria en UTC+n", 1, -6, 6, 1));
public EnumSetting<TimeFormat> timeFormat = sgElements.add(new EnumSetting<>("formato de la hora", "12h o 24h", TimeFormat.class, TimeFormat.TWENTY_FOUR_HOUR));
public StringSetting customText = sgElements.add(new StringSetting("texto custom", "marca de agua (dejar vacío para quitar)", "adolf jitler inshtagram feishbuc twiter", 40));
public EnumSetting<CoordsMode> coordsMode = sgElements.add(new EnumSetting<>("modo de coordenadas", "qué coordenadas mostrar", CoordsMode.class, CoordsMode.OVERWORLD));
public EnumSetting<Dynosaurs> dyno = sgElements.add(new EnumSetting<>("dinosaurio", "qué dinosaurio mostrar",
Dynosaurs.class, Dynosaurs.SPINOSAURUS));
public HUD() {
@@ -3,7 +3,7 @@ package me.retucio.sputnik.module.modules.misc;
import me.retucio.sputnik.mixin.accessor.AnvilScreenAccessor;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.EnumSetting;
import me.retucio.sputnik.module.setting.settings.EnumSetting;
import net.minecraft.client.gui.screen.ingame.AnvilScreen;
import net.minecraft.client.gui.widget.TextFieldWidget;
@@ -17,7 +17,7 @@ import java.util.Map;
public class AnvilFont extends Module {
public EnumSetting<FontMode> fontMode = addSetting(new EnumSetting<>("tipografía", "qué tipografía utilizar",
public EnumSetting<FontMode> fontMode = sgGeneral.add(new EnumSetting<>("tipografía", "qué tipografía utilizar",
FontMode.class, FontMode.NORMAL));
String text;
@@ -4,8 +4,8 @@ import me.retucio.sputnik.event.events.RenderBossbarEvent;
import me.retucio.sputnik.event.SubscribeEvent;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import net.minecraft.client.gui.hud.ClientBossBar;
import net.minecraft.text.Text;
@@ -15,9 +15,9 @@ import java.util.WeakHashMap;
public class BossbarStack extends Module {
public BooleanSetting stackBars = addSetting(new BooleanSetting("apilar barras", "apilar las bossbars", true));
public BooleanSetting hideNames = addSetting(new BooleanSetting("esconder nombres", "no renderiza el nombre de los bosses", false));
public NumberSetting spaceReduction = addSetting(new NumberSetting("reducción de espacio", "cuánto reducir el espacio entre bossbars",
public BooleanSetting stackBars = sgGeneral.add(new BooleanSetting("apilar barras", "apilar las bossbars", true));
public BooleanSetting hideNames = sgGeneral.add(new BooleanSetting("esconder nombres", "no renderiza el nombre de los bosses", false));
public NumberSetting spaceReduction = sgGeneral.add(new NumberSetting("reducción de espacio", "cuánto reducir el espacio entre bossbars",
0, 0, 10, 0.1));
private final Map<ClientBossBar, Integer> bossBarMap = new WeakHashMap<>();
@@ -10,8 +10,9 @@ import me.retucio.sputnik.event.events.ReceiveMessageEvent;
import me.retucio.sputnik.event.events.SendMessageEvent;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import me.retucio.sputnik.util.ChatUtil;
import me.retucio.sputnik.util.interfaces.IChatHudLine;
import me.retucio.sputnik.util.interfaces.IChatHudLineVisible;
@@ -43,15 +44,17 @@ import java.util.regex.Pattern;
public class ChatPlus extends Module {
// ajustes
public BooleanSetting timestamps = addSetting(new BooleanSetting("sello de tiempo", "muestra a qué hora se ha enviado un mensaje", true));
public BooleanSetting timestampSecs = addSetting(new BooleanSetting("mostrar segundos", "muestra segundos también en el sello de tiempo", false));
public BooleanSetting showHeads = addSetting(new BooleanSetting("cabezas", "muestra la cabeza del jugador junto a su mensaje", true));
public BooleanSetting coordsProtection = addSetting(new BooleanSetting("proteger coordenadas", "evitar enviar coordenadas por el chat", true));
SettingGroup sgChat = addSg(new SettingGroup("funcionamiento del chat", true));
public BooleanSetting keepHistory = addSetting(new BooleanSetting("no borrar chat", "no borrar el chat tras desconectarse", true));
public BooleanSetting logger = addSetting(new BooleanSetting("registro", "evita que se borre el chat de un server", true));
public BooleanSetting noCharLimit = addSetting(new BooleanSetting("quitar límite de caracteres", "te deja escribir mensajes tan largos como desees", false));
public NumberSetting chatHistoryExtraLength = addSetting(new NumberSetting("expandir chat", "cuántas líneas añadir al historial del chat",
public BooleanSetting timestamps = sgGeneral.add(new BooleanSetting("sello de tiempo", "muestra a qué hora se ha enviado un mensaje", true));
public BooleanSetting timestampSecs = sgGeneral.add(new BooleanSetting("mostrar segundos", "muestra segundos también en el sello de tiempo", false));
public BooleanSetting showHeads = sgGeneral.add(new BooleanSetting("cabezas", "muestra la cabeza del jugador junto a su mensaje", true));
public BooleanSetting coordsProtection = sgChat.add(new BooleanSetting("proteger coordenadas", "evitar enviar coordenadas por el chat", true));
public BooleanSetting keepHistory = sgChat.add(new BooleanSetting("no borrar chat", "no borrar el chat tras desconectarse", true));
public BooleanSetting logger = sgChat.add(new BooleanSetting("registro", "evita que se borre el chat de un server", true));
public BooleanSetting noCharLimit = sgChat.add(new BooleanSetting("quitar límite de caracteres", "te deja escribir mensajes tan largos como desees", false));
public NumberSetting chatHistoryExtraLength = sgChat.add(new NumberSetting("expandir chat", "cuántas líneas añadir al historial del chat",
0, 0, 1000, 1));
public ChatPlus() {
@@ -3,7 +3,7 @@ package me.retucio.sputnik.module.modules.misc;
import com.mojang.authlib.GameProfile;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.StringSetting;
import me.retucio.sputnik.module.setting.settings.StringSetting;
import net.minecraft.client.network.OtherClientPlayerEntity;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
@@ -12,7 +12,7 @@ import java.util.UUID;
public class FakePlayer extends Module {
public StringSetting name = addSetting(new StringSetting("nombre", "qué nombre asignarle al jugador", "apio boy", 22));
public StringSetting name = sgGeneral.add(new StringSetting("nombre", "qué nombre asignarle al jugador", "apio boy", 22));
private OtherClientPlayerEntity player = null;
@@ -4,8 +4,9 @@ import me.retucio.sputnik.command.CommandManager;
import me.retucio.sputnik.event.events.ClientClickEvent;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.EnumSetting;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.EnumSetting;
import me.retucio.sputnik.util.ChatUtil;
import net.minecraft.client.texture.NativeImage;
import net.minecraft.text.ClickEvent;
@@ -30,14 +31,16 @@ import java.io.IOException;
public class ScreenshotPlus extends Module {
public BooleanSetting saveButton = addSetting(new BooleanSetting("botón de guardar", "mostrar botón para guardar la captura localmente", true));
public BooleanSetting copyButton = addSetting(new BooleanSetting("botón de copiar", "mostrar botón para copiar la captura al portapapeles", true));
public BooleanSetting openButton = addSetting(new BooleanSetting("botón de abrir", "mostrar botón para abrir el archivo de la captura", true));
public BooleanSetting discardButton = addSetting(new BooleanSetting("botón de descartar", "mostrar botón para descartar la captura", true));
SettingGroup sgButtons = addSg(new SettingGroup("botones", true));
public EnumSetting<ScreenshotActions> defaultAction = addSetting(new EnumSetting<>("por defecto", "qué acción tomar por defecto",
public EnumSetting<ScreenshotActions> defaultAction = sgGeneral.add(new EnumSetting<>("por defecto", "qué acción tomar por defecto",
ScreenshotActions.class, ScreenshotActions.NONE));
public BooleanSetting saveButton = sgButtons.add(new BooleanSetting("botón de guardar", "mostrar botón para guardar la captura localmente", true));
public BooleanSetting copyButton = sgButtons.add(new BooleanSetting("botón de copiar", "mostrar botón para copiar la captura al portapapeles", true));
public BooleanSetting openButton = sgButtons.add(new BooleanSetting("botón de abrir", "mostrar botón para abrir el archivo de la captura", true));
public BooleanSetting discardButton = sgButtons.add(new BooleanSetting("botón de descartar", "mostrar botón para descartar la captura", true));
private NativeImage screenshot;
private File screenshotFile;
@@ -5,8 +5,8 @@ import me.retucio.sputnik.event.events.KeyEvent;
import me.retucio.sputnik.mixin.accessor.HandledScreenAccessor;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.KeySetting;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.KeySetting;
import me.retucio.sputnik.ui.screen.PreviewScreen;
import me.retucio.sputnik.util.ChatUtil;
import me.retucio.sputnik.util.Colors;
@@ -29,8 +29,8 @@ import java.util.HashMap;
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 KeySetting previewKey = sgGeneral.add(new KeySetting("tecla de previsualización", "tecla a mantener para previsualizar", GLFW.GLFW_KEY_LEFT_ALT));
public BooleanSetting showTooltips = sgGeneral.add(new BooleanSetting("mostrar tooltips", "añadir texto a los tooltips (cajas de texto) de los shulkers", true));
public static final HashMap<Item, Color> SHULKER_COLORS = new HashMap<>();
@@ -2,12 +2,12 @@ package me.retucio.sputnik.module.modules.network;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.StringSetting;
import me.retucio.sputnik.module.setting.settings.StringSetting;
import me.retucio.sputnik.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 StringSetting address = sgGeneral.add(new StringSetting("dirección", "la dirección IP que será enviada al server", "127.0.0.1", 15));
public BungeecordSpoofer() {
super("spoofer de bungeecord",
@@ -2,14 +2,15 @@ package me.retucio.sputnik.module.modules.network;
import me.retucio.sputnik.event.SubscribeEvent;
import me.retucio.sputnik.event.events.AddEntityEvent;
import me.retucio.sputnik.event.events.RenderWorldEvent;
import me.retucio.sputnik.event.events.Render3DEvent;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.ModuleManager;
import me.retucio.sputnik.module.modules.misc.FakePlayer;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.ColorSetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.ColorSetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import me.retucio.sputnik.util.MiscUtil;
import me.retucio.sputnik.util.render.RenderUtil;
import net.minecraft.client.network.OtherClientPlayerEntity;
@@ -31,16 +32,20 @@ import java.util.UUID;
// lógica sutilmente robada de MeteorClient porque la mía era una mierda
public class LogoutSpots extends Module {
public BooleanSetting outlines = addSetting(new BooleanSetting("contorno", "renderizar contorno de la caja (lados)", true));
public ColorSetting outlineColor = addSetting(new ColorSetting("color del contorno", "Color de las líneas", new Color(255, 0, 0, 230), false));
public NumberSetting lineWidth = addSetting(new NumberSetting("grosor de línea", "grosor de las líneas del contorno", 1.5, 0.5, 5, 0.1));
SettingGroup sgOutlines = addSg(new SettingGroup("contorno", true));
SettingGroup sgFilling = addSg(new SettingGroup("relleno", true));
SettingGroup sgMisc = addSg(new SettingGroup("misc.", true));
public BooleanSetting filling = addSetting(new BooleanSetting("relleno", "renderizar relleno de la caja (caras)", true));
public ColorSetting fillingColor = addSetting(new ColorSetting("color del relleno", "Color de los lados", new Color(230, 0, 0, 55), false));
public BooleanSetting outlines = sgOutlines.add(new BooleanSetting("contorno", "renderizar contorno de la caja (lados)", true));
public ColorSetting outlineColor = sgOutlines.add(new ColorSetting("color del contorno", "Color de las líneas", new Color(255, 0, 0, 230), false));
public NumberSetting lineWidth = sgOutlines.add(new NumberSetting("grosor de línea", "grosor de las líneas del contorno", 1.5, 0.5, 5, 0.1));
public BooleanSetting fullHeight = addSetting(new BooleanSetting("hitbox completa", "renderizar la caja completa de la hitbox, o solo marcar la posición", true));
public BooleanSetting filling = sgFilling.add(new BooleanSetting("relleno", "renderizar relleno de la caja (caras)", true));
public ColorSetting fillingColor = sgFilling.add(new ColorSetting("color del relleno", "Color de los lados", new Color(230, 0, 0, 55), false));
public BooleanSetting dummy = addSetting(new BooleanSetting("monigote", "spawnear un monigote para marcar la posición", true));
public BooleanSetting fullHeight = sgMisc.add(new BooleanSetting("hitbox completa", "renderizar la caja completa de la hitbox, o solo marcar la posición", true));
public BooleanSetting dummy = sgMisc.add(new BooleanSetting("monigote", "spawnear un monigote para marcar la posición", true));
private final List<LogoutEntry> players = new ArrayList<>();
private final List<PlayerListEntry> lastPlayerList = new ArrayList<>();
@@ -165,7 +170,7 @@ public class LogoutSpots extends Module {
}
@SubscribeEvent
public void onWorldRender(RenderWorldEvent event) {
public void onWorldRender(Render3DEvent event) {
if (mc.player == null || mc.world == null) return;
for (LogoutEntry entry : players)
@@ -5,8 +5,8 @@ import me.retucio.sputnik.event.SubscribeEvent;
import me.retucio.sputnik.event.events.PacketEvent;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.EnumSetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.settings.EnumSetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import me.retucio.sputnik.util.ChatUtil;
import me.retucio.sputnik.util.NetworkUtil;
@@ -22,10 +22,10 @@ import java.util.concurrent.CopyOnWriteArrayList;
public class PacketDelay extends Module {
public NumberSetting delay = addSetting(new NumberSetting("delay", "delay a añadir a los paquetes, en milisegundos", 1500, 0, 3000, 5));
public EnumSetting<Directions> directions = addSetting(new EnumSetting<>("dirección", "dirección de los paquetes a los que añadir delay",
public NumberSetting delay = sgGeneral.add(new NumberSetting("delay", "delay a añadir a los paquetes, en milisegundos", 1500, 0, 3000, 5));
public EnumSetting<Directions> directions = sgGeneral.add(new EnumSetting<>("dirección", "dirección de los paquetes a los que añadir delay",
Directions.class, Directions.BOTH));
public EnumSetting<Packets> packets = addSetting(new EnumSetting<>("paquetes", "paquetes a los que aplicar el delay",
public EnumSetting<Packets> packets = sgGeneral.add(new EnumSetting<>("paquetes", "paquetes a los que aplicar el delay",
Packets.class, Packets.ALL));
private final List<DelayedPacket> delayedPackets = new CopyOnWriteArrayList<>();
@@ -4,14 +4,14 @@ import me.retucio.sputnik.event.SubscribeEvent;
import me.retucio.sputnik.event.events.AttackEntityEvent;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.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));
public NumberSetting slot = sgGeneral.add(new NumberSetting("slot", "slot al que cambiar", 1, 1, 9, 1));
public BooleanSetting swap = sgGeneral.add(new BooleanSetting("cambiar de vuelta", "volver al slot inicial tras haber aplicado el swapping", true));
public NumberSetting swapDelay = sgGeneral.add(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;
@@ -4,11 +4,11 @@ import me.retucio.sputnik.cape.Cape;
import me.retucio.sputnik.cape.CapeManager;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.OptionSetting;
import me.retucio.sputnik.module.setting.settings.OptionSetting;
public class Capes extends Module {
public OptionSetting<Cape> cape = addSetting(new OptionSetting<>("capa", "qué capa llevar puesta",
public OptionSetting<Cape> cape = sgGeneral.add(new OptionSetting<>("capa", "qué capa llevar puesta",
CapeManager.INSTANCE.getCapes(), CapeManager.INSTANCE.getCape("hollow-knight")));
public Capes() {
@@ -2,18 +2,18 @@ package me.retucio.sputnik.module.modules.player;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.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 items = sgGeneral.add(new BooleanSetting("items", "usar items precozmente", true));
public NumberSetting itemCooldown = sgGeneral.add(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 BooleanSetting blocks = sgGeneral.add(new BooleanSetting("bloques", "colocar bloques precozmente", true));
public NumberSetting blockCooldown = sgGeneral.add(new NumberSetting("cooldown de bloques", "cooldown para colocar bloques en ticks", 0, 0, 4, 1));
public FastUse() {
super("precoz",
@@ -5,8 +5,9 @@ import me.retucio.sputnik.event.events.RenderHeldItemEvent;
import me.retucio.sputnik.event.events.RenderArmEvent;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Hand;
import net.minecraft.util.math.RotationAxis;
@@ -18,75 +19,80 @@ import org.joml.Vector3d;
public class HandView extends Module {
SettingGroup sgAnimations = addSg(new SettingGroup("animaciones", false));
SettingGroup sgMainHand = addSg(new SettingGroup("mano principal", false));
SettingGroup sgOffhand = addSg(new SettingGroup("mano secundaria", false));
SettingGroup sgArm = addSg(new SettingGroup("brazo", false));
// ajustes de animaciones
public BooleanSetting oldAnimations = addSetting(new BooleanSetting("animaciones viejas", "como las de la 1.8, al pegar", false));
public BooleanSetting skipSwapping = addSetting(new BooleanSetting("no swap", "se salta la animación de cambiar items de mano", false));
public BooleanSetting noFood = addSetting(new BooleanSetting("no comer", "no renderiza la animación de comer", false));
public BooleanSetting oldAnimations = sgAnimations.add(new BooleanSetting("animaciones viejas", "como las de la 1.8, al pegar", false));
public BooleanSetting skipSwapping = sgAnimations.add(new BooleanSetting("no swap", "se salta la animación de cambiar items de mano", false));
public BooleanSetting noFood = sgAnimations.add(new BooleanSetting("no comer", "no renderiza la animación de comer", false));
// ajustes de mano principal
public NumberSetting scaleMainX = addSetting(new NumberSetting("escala de la mano principal (X)", ".",
public NumberSetting scaleMainX = sgMainHand.add(new NumberSetting("escala de la mano principal (X)", ".",
1, 0.01, 5, 0.1));
public NumberSetting scaleMainY = addSetting(new NumberSetting("escala de la mano principal (Y)", ".",
public NumberSetting scaleMainY = sgMainHand.add(new NumberSetting("escala de la mano principal (Y)", ".",
1, 0.01, 5, 0.1));
public NumberSetting scaleMainZ = addSetting(new NumberSetting("escala de la mano principal (Z)", ".",
public NumberSetting scaleMainZ = sgMainHand.add(new NumberSetting("escala de la mano principal (Z)", ".",
1, 0.01, 5, 0.1));
public NumberSetting posMainX = addSetting(new NumberSetting("posición de la mano principal (X)", ".",
public NumberSetting posMainX = sgMainHand.add(new NumberSetting("posición de la mano principal (X)", ".",
0, -3, 3, 0.1));
public NumberSetting posMainY = addSetting(new NumberSetting("posición de la mano principal (Y)", ".",
public NumberSetting posMainY = sgMainHand.add(new NumberSetting("posición de la mano principal (Y)", ".",
0, -3, 3, 0.1));
public NumberSetting posMainZ = addSetting(new NumberSetting("posición de la mano principal (Z)", ".",
public NumberSetting posMainZ = sgMainHand.add(new NumberSetting("posición de la mano principal (Z)", ".",
0, -3, 3, 0.1));
public NumberSetting rotMainX = addSetting(new NumberSetting("rotación de la mano principal (X)", ".",
public NumberSetting rotMainX = sgMainHand.add(new NumberSetting("rotación de la mano principal (X)", ".",
0, -180, 180, 1));
public NumberSetting rotMainY = addSetting(new NumberSetting("rotación de la mano principal (Y)", ".",
public NumberSetting rotMainY = sgMainHand.add(new NumberSetting("rotación de la mano principal (Y)", ".",
0, -180, 180, 1));
public NumberSetting rotMainZ = addSetting(new NumberSetting("rotación de la mano principal (Z)", ".",
public NumberSetting rotMainZ = sgMainHand.add(new NumberSetting("rotación de la mano principal (Z)", ".",
0, -180, 180, 1));
// ajustes de mano secundaria
public NumberSetting scaleOffX = addSetting(new NumberSetting("escala de la mano secundaria (X)", ".",
public NumberSetting scaleOffX = sgOffhand.add(new NumberSetting("escala de la mano secundaria (X)", ".",
1, 0.01, 5, 0.1));
public NumberSetting scaleOffY = addSetting(new NumberSetting("escala de la mano secundaria (Y)", ".",
public NumberSetting scaleOffY = sgOffhand.add(new NumberSetting("escala de la mano secundaria (Y)", ".",
1, 0.01, 5, 0.1));
public NumberSetting scaleOffZ = addSetting(new NumberSetting("escala de la mano secundaria (Z)", ".",
public NumberSetting scaleOffZ = sgOffhand.add(new NumberSetting("escala de la mano secundaria (Z)", ".",
1, 0.01, 5, 0.1));
public NumberSetting posOffX = addSetting(new NumberSetting("posición de la mano secundaria (X)", ".",
public NumberSetting posOffX = sgOffhand.add(new NumberSetting("posición de la mano secundaria (X)", ".",
0, -3, 3, 0.1));
public NumberSetting posOffY = addSetting(new NumberSetting("posición de la mano secundaria (Y)", ".",
public NumberSetting posOffY = sgOffhand.add(new NumberSetting("posición de la mano secundaria (Y)", ".",
0, -3, 3, 0.1));
public NumberSetting posOffZ = addSetting(new NumberSetting("posición de la mano secundaria (Z)", ".",
public NumberSetting posOffZ = sgOffhand.add(new NumberSetting("posición de la mano secundaria (Z)", ".",
0, -3, 3, 0.1));
public NumberSetting rotOffX = addSetting(new NumberSetting("rotación de la mano secundaria (X)", ".",
public NumberSetting rotOffX = sgOffhand.add(new NumberSetting("rotación de la mano secundaria (X)", ".",
0, -180, 180, 1));
public NumberSetting rotOffY = addSetting(new NumberSetting("rotación de la mano secundaria (Y)", ".",
public NumberSetting rotOffY = sgOffhand.add(new NumberSetting("rotación de la mano secundaria (Y)", ".",
0, -180, 180, 1));
public NumberSetting rotOffZ = addSetting(new NumberSetting("rotación de la mano secundaria (Z)", ".",
public NumberSetting rotOffZ = sgOffhand.add(new NumberSetting("rotación de la mano secundaria (Z)", ".",
0, -180, 180, 1));
// brazo
public NumberSetting scaleArmX = addSetting(new NumberSetting("escala del brazo (X)", ".",
public NumberSetting scaleArmX = sgArm.add(new NumberSetting("escala del brazo (X)", ".",
1, 0.01, 5, 0.1));
public NumberSetting scaleArmY = addSetting(new NumberSetting("escala del brazo (Y)", ".",
public NumberSetting scaleArmY = sgArm.add(new NumberSetting("escala del brazo (Y)", ".",
1, 0.01, 5, 0.1));
public NumberSetting scaleArmZ = addSetting(new NumberSetting("escala del brazo (Z)", ".",
public NumberSetting scaleArmZ = sgArm.add(new NumberSetting("escala del brazo (Z)", ".",
1, 0.01, 5, 0.1));
public NumberSetting posArmX = addSetting(new NumberSetting("posición del brazo (X)", ".",
public NumberSetting posArmX = sgArm.add(new NumberSetting("posición del brazo (X)", ".",
0, -3, 3, 0.1));
public NumberSetting posArmY = addSetting(new NumberSetting("posición del brazo (Y)", ".",
public NumberSetting posArmY = sgArm.add(new NumberSetting("posición del brazo (Y)", ".",
0, -3, 3, 0.1));
public NumberSetting posArmZ = addSetting(new NumberSetting("posición del brazo (Z)", ".",
public NumberSetting posArmZ = sgArm.add(new NumberSetting("posición del brazo (Z)", ".",
0, -3, 3, 0.1));
public NumberSetting rotArmX = addSetting(new NumberSetting("rotación del brazo (X)", ".",
public NumberSetting rotArmX = sgArm.add(new NumberSetting("rotación del brazo (X)", ".",
0, -180, 180, 1));
public NumberSetting rotArmY = addSetting(new NumberSetting("rotación del brazo (Y)", ".",
public NumberSetting rotArmY = sgArm.add(new NumberSetting("rotación del brazo (Y)", ".",
0, -180, 180, 1));
public NumberSetting rotArmZ = addSetting(new NumberSetting("rotación del brazo (Z)", ".",
public NumberSetting rotArmZ = sgArm.add(new NumberSetting("rotación del brazo (Z)", ".",
0, -180, 180, 1));
public HandView() {
@@ -2,11 +2,11 @@ package me.retucio.sputnik.module.modules.player;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
public class Headhitters extends Module {
public NumberSetting delay = addSetting(new NumberSetting("delay", "delay de saltos", 0, 0, 20, 1));
public NumberSetting delay = sgGeneral.add(new NumberSetting("delay", "delay de saltos", 0, 0, 20, 1));
public Headhitters() {
super("headhitters",
@@ -7,7 +7,7 @@ import me.retucio.sputnik.event.events.MouseClickEvent;
import me.retucio.sputnik.mixin.accessor.HandledScreenAccessor;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.KeySetting;
import me.retucio.sputnik.module.setting.settings.KeySetting;
import me.retucio.sputnik.util.InventoryUtil;
import me.retucio.sputnik.util.KeyUtil;
import net.minecraft.client.gui.screen.ingame.HandledScreen;
@@ -16,9 +16,9 @@ import org.lwjgl.glfw.GLFW;
public class InventoryPlus extends Module {
public KeySetting row1key = addSetting(new KeySetting("fila 1", "tecla para mover items a la primera fila", GLFW.GLFW_KEY_A));
public KeySetting row2key = addSetting(new KeySetting("fila 2", "tecla para mover items a la segunda fila", GLFW.GLFW_KEY_S));
public KeySetting row3key = addSetting(new KeySetting("fila 3", "tecla para mover items a la tercera fila", GLFW.GLFW_KEY_D));
public KeySetting row1key = sgGeneral.add(new KeySetting("fila 1", "tecla para mover items a la primera fila", GLFW.GLFW_KEY_A));
public KeySetting row2key = sgGeneral.add(new KeySetting("fila 2", "tecla para mover items a la segunda fila", GLFW.GLFW_KEY_S));
public KeySetting row3key = sgGeneral.add(new KeySetting("fila 3", "tecla para mover items a la tercera fila", GLFW.GLFW_KEY_D));
public InventoryPlus() {
super("inventario plus",
@@ -2,9 +2,9 @@ package me.retucio.sputnik.module.modules.player;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.settings.OptionSetting;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import me.retucio.sputnik.module.setting.settings.OptionSetting;
import me.retucio.sputnik.util.Lists;
import net.minecraft.item.Item;
import net.minecraft.item.Items;
@@ -16,10 +16,10 @@ import net.minecraft.util.math.Direction;
public class Offhand extends Module {
public OptionSetting<Item> item = addSetting(new OptionSetting<>("ítem", "ítem a equipar",
public OptionSetting<Item> item = sgGeneral.add(new OptionSetting<>("ítem", "ítem a equipar",
Lists.itemList, Items.TOTEM_OF_UNDYING, Lists.itemNames));
public NumberSetting delaySetting = addSetting(new NumberSetting("delay", "delay del cambiazo (en ticks)", 0, 0, 20, 1));
public BooleanSetting override = addSetting(new BooleanSetting("anular", "ignora que ya haya un ítem en la mano secundaria", true));
public NumberSetting delaySetting = sgGeneral.add(new NumberSetting("delay", "delay del cambiazo (en ticks)", 0, 0, 20, 1));
public BooleanSetting override = sgGeneral.add(new BooleanSetting("anular", "ignora que ya haya un ítem en la mano secundaria", true));
private int delay;
@@ -4,7 +4,7 @@ import me.retucio.sputnik.event.SubscribeEvent;
import me.retucio.sputnik.event.events.ClipAtLedgeEvent;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.Vec3d;
@@ -13,7 +13,7 @@ import net.minecraft.world.RaycastContext;
public class SafeWalk extends Module {
public NumberSetting fallDistance = addSetting(new NumberSetting("distancia de caída", "distancia de caída máxima permitida", 1, 0, 10, 0.1));
public NumberSetting fallDistance = sgGeneral.add(new NumberSetting("distancia de caída", "distancia de caída máxima permitida", 1, 0, 10, 0.1));
public SafeWalk() {
super("muletas",
@@ -3,7 +3,7 @@ package me.retucio.sputnik.module.modules.player;
import me.retucio.sputnik.mixin.accessor.KeyBindingAccessor;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.ListSetting;
import me.retucio.sputnik.module.setting.settings.ListSetting;
import me.retucio.sputnik.ui.screen.ClickGUI;
import me.retucio.sputnik.util.KeyUtil;
import me.retucio.sputnik.util.Lists;
@@ -19,7 +19,7 @@ import java.util.List;
public class UIMove extends Module {
public ListSetting<ScreenHandlerType<?>> screens = addSetting(new ListSetting<>("interfaces", "interfaces en las que te podrás mover",
public ListSetting<ScreenHandlerType<?>> screens = sgGeneral.add(new ListSetting<>("interfaces", "interfaces en las que te podrás mover",
Lists.screenList, Lists.allTrue(Lists.screenList), Lists.screenNames));
private List<KeyBinding> movementKeys;
@@ -2,9 +2,10 @@ package me.retucio.sputnik.module.modules.player;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.settings.OptionSetting;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import me.retucio.sputnik.module.setting.settings.OptionSetting;
import me.retucio.sputnik.util.ChatUtil;
import me.retucio.sputnik.util.Lists;
import net.minecraft.item.ItemStack;
@@ -21,16 +22,19 @@ import java.util.List;
public class WarnLowDurability extends Module {
public NumberSetting limitPercentage = addSetting(new NumberSetting("porcentaje", "porcentaje de durabilidad restante a la que se te avisa",
SettingGroup sgWarn = addSg(new SettingGroup("aviso", true));
SettingGroup sgSound = addSg(new SettingGroup("sonido", true));
public NumberSetting limitPercentage = sgGeneral.add(new NumberSetting("porcentaje", "porcentaje de durabilidad restante a la que se te avisa",
5, 1, 100, 1));
public BooleanSetting message = addSetting(new BooleanSetting("enviar mensaje", "enviar un mensaje para alertar al usuario", true));
public BooleanSetting message = sgWarn.add(new BooleanSetting("enviar mensaje", "enviar un mensaje para alertar al usuario", true));
public BooleanSetting playSound = sgWarn.add(new BooleanSetting("reproducir sonido", "reproducir un sonido para alertar al usuario", true));
public BooleanSetting playSound = addSetting(new BooleanSetting("reproducir sonido", "reproducir un sonido para alertar al usuario", true));
public OptionSetting<SoundEvent> sound = addSetting(new OptionSetting<>("sonido", "qué sonido reproducir",
public OptionSetting<SoundEvent> sound = sgSound.add(new OptionSetting<>("sonido", "qué sonido reproducir",
Lists.soundList, SoundEvents.BLOCK_NOTE_BLOCK_BELL.value(), Lists.soundNames));
public NumberSetting volume = addSetting(new NumberSetting("volumen", "volumen del sonido", 70, 0, 125, 1));
public NumberSetting pitch = addSetting(new NumberSetting("frecuencia", "altura del sonido", 70, 0, 125, 1));
public NumberSetting volume = sgSound.add(new NumberSetting("volumen", "volumen del sonido", 70, 0, 125, 1));
public NumberSetting pitch = sgSound.add(new NumberSetting("frecuencia", "altura del sonido", 70, 0, 125, 1));
private final List<ItemStack> warned = new ArrayList<>();
private float prevPercentage = -1;
@@ -1,13 +1,14 @@
package me.retucio.sputnik.module.modules.render;
import me.retucio.sputnik.event.SubscribeEvent;
import me.retucio.sputnik.event.events.RenderWorldEvent;
import me.retucio.sputnik.event.events.Render3DEvent;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.ColorSetting;
import me.retucio.sputnik.module.settings.ListSetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.ColorSetting;
import me.retucio.sputnik.module.setting.settings.ListSetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import me.retucio.sputnik.util.Colors;
import me.retucio.sputnik.util.Lists;
import me.retucio.sputnik.util.render.RenderUtil;
@@ -23,17 +24,20 @@ import java.util.List;
public class BlockESP extends Module {
public ListSetting<Block> blocks = addSetting(new ListSetting<>("bloques", "bloques a resaltar",
SettingGroup sgOulines = addSg(new SettingGroup("contorno", true));
SettingGroup sgFilling = addSg(new SettingGroup("relleno", true));
public ListSetting<Block> blocks = sgGeneral.add(new ListSetting<>("bloques", "bloques a resaltar",
Lists.blockList, Lists.allFalse(Lists.blockList), Lists.blockNames));
public NumberSetting radius = sgGeneral.add(new NumberSetting("radio", "radio de búsqueda de bloques",
24, 2, 128, 1));
public NumberSetting radius = addSetting(new NumberSetting("radio", "radio de búsqueda de bloques", 24, 2, 128, 1));
public BooleanSetting outlines = sgOulines.add(new BooleanSetting("contorno", "renderizar contorno de bloques", true));
public ColorSetting outlineColor = sgOulines.add(new ColorSetting("color del contorno", "color del contorno", Colors.CELESTE, false));
public NumberSetting lineWidth = sgOulines.add(new NumberSetting("grosor del contorno", "grosor de las líneas del contorno", 1, 1, 5, 0.2));
public BooleanSetting outlines = addSetting(new BooleanSetting("contorno", "renderizar contorno de bloques", true));
public ColorSetting outlineColor = addSetting(new ColorSetting("color del contorno", "color del contorno", Colors.CELESTE, false));
public NumberSetting lineWidth = addSetting(new NumberSetting("grosor del contorno", "grosor de las líneas del contorno", 1, 1, 5, 0.2));
public BooleanSetting fillings = addSetting(new BooleanSetting("relleno", "renderizar relleno de bloques", true));
public ColorSetting fillingColor = addSetting(new ColorSetting("color del relleno", "color del relleno", new Color(57, 177, 215, 67), false));
public BooleanSetting fillings = sgFilling.add(new BooleanSetting("relleno", "renderizar relleno de bloques", true));
public ColorSetting fillingColor = sgFilling.add(new ColorSetting("color del relleno", "color del relleno", new Color(57, 177, 215, 67), false));
public BlockESP() {
@@ -50,7 +54,7 @@ public class BlockESP extends Module {
}
@SubscribeEvent
public void onRenderWorld(RenderWorldEvent event) {
public void onRenderWorld(Render3DEvent event) {
if (mc.player == null || mc.world == null) return;
for (Block block : blocks.getOptions()) {
@@ -2,7 +2,7 @@ package me.retucio.sputnik.module.modules.render;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.ColorSetting;
import me.retucio.sputnik.module.setting.settings.ColorSetting;
import java.awt.*;
@@ -12,7 +12,7 @@ import java.awt.*;
public class BlockOutline extends Module {
public ColorSetting color = addSetting(new ColorSetting("color", "color del contorno de los bloques",
public ColorSetting color = sgGeneral.add(new ColorSetting("color", "color del contorno de los bloques",
new Color(0, 0, 0, 102), true));
public BlockOutline() {
@@ -1,13 +1,14 @@
package me.retucio.sputnik.module.modules.render;
import me.retucio.sputnik.event.SubscribeEvent;
import me.retucio.sputnik.event.events.RenderWorldEvent;
import me.retucio.sputnik.event.events.Render3DEvent;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.ColorSetting;
import me.retucio.sputnik.module.settings.EnumSetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.ColorSetting;
import me.retucio.sputnik.module.setting.settings.EnumSetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import me.retucio.sputnik.util.render.RenderUtil;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos;
@@ -18,18 +19,22 @@ import java.awt.*;
public class BreakingProgress extends Module {
public EnumSetting<BreakMode> breakMode = addSetting(new EnumSetting<>("modo de minado", "elige si el cubo se encoge o se dilata",
SettingGroup sgOulines = addSg(new SettingGroup("contorno", true));
SettingGroup sgFilling = addSg(new SettingGroup("relleno", true));
public EnumSetting<BreakMode> breakMode = sgGeneral.add(new EnumSetting<>("modo de minado", "elige si el cubo se encoge o se dilata",
BreakMode.class, BreakMode.INWARDS));
public BooleanSetting outlines = addSetting(new BooleanSetting("contorno", "renderizar contorno", true));
public ColorSetting outlineColor = addSetting(new ColorSetting("color del contorno", "color del contorno",
public BooleanSetting outlines = sgOulines.add(new BooleanSetting("contorno", "renderizar contorno", true));
public ColorSetting outlineColor = sgOulines.add(new ColorSetting("color del contorno", "color del contorno",
new Color(0, 255, 0, 200), false));
public NumberSetting lineWidth = addSetting(new NumberSetting("grosor de línea", "grosor de las líneas del contorno", 1, 1, 5, 0.1));
public NumberSetting lineWidth = sgOulines.add(new NumberSetting("grosor de línea", "grosor de las líneas del contorno", 1, 1, 5, 0.1));
public BooleanSetting fillings = addSetting(new BooleanSetting("relleno", "renderizar relleno", true));
public ColorSetting fillingColor = addSetting(new ColorSetting("color del relleno", "color del relleno",
public BooleanSetting fillings = sgFilling.add(new BooleanSetting("relleno", "renderizar relleno", true));
public ColorSetting fillingColor = sgFilling.add(new ColorSetting("color del relleno", "color del relleno",
new Color(0, 255, 0, 60), false));
public BreakingProgress() {
super("progreso de minado",
"te muestra el progreso de minado de un bloque de manera más visible",
@@ -37,7 +42,7 @@ public class BreakingProgress extends Module {
}
@SubscribeEvent
public void onRenderWorld(RenderWorldEvent event) {
public void onRenderWorld(Render3DEvent event) {
if (mc.interactionManager == null || mc.world == null) return;
if (!(mc.crosshairTarget instanceof BlockHitResult hitResult)) return;
BlockPos pos = hitResult.getBlockPos();
@@ -2,9 +2,10 @@ package me.retucio.sputnik.module.modules.render;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.ColorSetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.ColorSetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import java.awt.*;
@@ -15,14 +16,17 @@ import java.awt.*;
public class CritsPlus extends Module {
public ColorSetting color = addSetting(new ColorSetting("color", "color de las partículas", new Color(0, 0, 255, 255), false));
SettingGroup sgAppearance = addSg(new SettingGroup("aspecto", true));
SettingGroup sgBehaviour = addSg(new SettingGroup("funcionamiento", true));
public NumberSetting scale = addSetting(new NumberSetting("escala", "tamaño", 1, 0, 2, 0.05));
public NumberSetting multiplier = addSetting(new NumberSetting("múltiplo", "número por el que multiplicar la cantidad de partículas generadas", 1, 0, 10, 0.1));
public NumberSetting velocityMultipler = addSetting(new NumberSetting("dispersión", "multiplicador de la velocidad de dispersión", 1, 0, 10, 0.1));
public NumberSetting gravity = addSetting(new NumberSetting("gravedad", "multiplicador de fuerza de gravedad", 1, 0, 10, 0.1));
public NumberSetting maxAge = addSetting(new NumberSetting("vida máxima", "cuánto persiste la partícula", 10, 0, 50, 1));
public BooleanSetting collide = addSetting(new BooleanSetting("colisionar", "colisionar con bloques", false));
public ColorSetting color = sgAppearance.add(new ColorSetting("color", "color de las partículas", new Color(0, 0, 255, 255), false));
public NumberSetting scale = sgAppearance.add(new NumberSetting("escala", "tamaño", 1, 0, 2, 0.05));
public NumberSetting multiplier = sgAppearance.add(new NumberSetting("múltiplo", "número por el que multiplicar la cantidad de partículas generadas", 1, 0, 10, 0.1));
public NumberSetting velocityMultipler = sgBehaviour.add(new NumberSetting("dispersión", "multiplicador de la velocidad de dispersión", 1, 0, 10, 0.1));
public NumberSetting gravity = sgBehaviour.add(new NumberSetting("gravedad", "multiplicador de fuerza de gravedad", 1, 0, 10, 0.1));
public NumberSetting maxAge = sgBehaviour.add(new NumberSetting("vida máxima", "cuánto persiste la partícula", 10, 0, 50, 1));
public BooleanSetting collide = sgBehaviour.add(new BooleanSetting("colisionar", "colisionar con bloques", false));
public CritsPlus() {
super("críticos",
@@ -3,7 +3,7 @@ package me.retucio.sputnik.module.modules.render;
import me.retucio.sputnik.mixin.accessor.OverlayTextureAccessor;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.ColorSetting;
import me.retucio.sputnik.module.setting.settings.ColorSetting;
import net.minecraft.client.texture.NativeImage;
import net.minecraft.client.texture.NativeImageBackedTexture;
@@ -16,7 +16,7 @@ import java.awt.*;
public class DamageOverlay extends Module {
public ColorSetting colorSetting = addSetting(new ColorSetting("color", "color", new Color(255, 0, 0, 77), false));
public ColorSetting colorSetting = sgGeneral.add(new ColorSetting("color", "color", new Color(255, 0, 0, 77), false));
private NativeImageBackedTexture texture = null;
@@ -2,8 +2,8 @@ package me.retucio.sputnik.module.modules.render;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.EnumSetting;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.EnumSetting;
import me.retucio.sputnik.util.render.GlintRenderLayer;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.RenderLayers;
@@ -17,9 +17,9 @@ import net.minecraft.util.DyeColor;
public class GlintPlus extends Module {
public BooleanSetting items = addSetting(new BooleanSetting("items", "modificar el destello de encantamiento de los items", true));
public BooleanSetting armor = addSetting(new BooleanSetting("armadura", "modificar el destello de encantamiento de la armadura", true));
public EnumSetting<GlintColors> glintColor = addSetting(new EnumSetting<>("colores", "color del glint", GlintColors.class, GlintColors.PURPLE));
public BooleanSetting items = sgGeneral.add(new BooleanSetting("items", "modificar el destello de encantamiento de los items", true));
public BooleanSetting armor = sgGeneral.add(new BooleanSetting("armadura", "modificar el destello de encantamiento de la armadura", true));
public EnumSetting<GlintColors> glintColor = sgGeneral.add(new EnumSetting<>("colores", "color del glint", GlintColors.class, GlintColors.PURPLE));
public GlintPlus() {
super("destello de enchants.",
@@ -4,9 +4,10 @@ import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.EnumSetting;
import me.retucio.sputnik.module.settings.ListSetting;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.EnumSetting;
import me.retucio.sputnik.module.setting.settings.ListSetting;
import me.retucio.sputnik.util.Lists;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.EntityType;
@@ -38,22 +39,25 @@ import java.util.concurrent.Executors;
public class Nametags extends Module {
SettingGroup sgInfo = addSg(new SettingGroup("info. adicional", true));
Map<EntityType<?>, Boolean> defaultEntities = Lists.allFalse(Lists.entityList);
public ListSetting<EntityType<?>> entities = addSetting(new ListSetting<>("entidades", "entidades cuyo nametag será visible",
public ListSetting<EntityType<?>> entities = sgGeneral.add(new ListSetting<>("entidades", "entidades cuyo nametag será visible",
Lists.entityList, defaultEntities, Lists.entityNames));
public BooleanSetting alwaysVisible = addSetting(new BooleanSetting("siempre mostrar nametags", "mostrar nametag cuando el jugador está agachado o es invisible", false));
public BooleanSetting health = addSetting(new BooleanSetting("mostrar vida", "muestra la vida de una entidad en su nametag", true));
public EnumSetting<HealthMode> healthMode = addSetting(new EnumSetting<>("mostrar vida en", "de qué manera mostrar la vida", HealthMode.class, HealthMode.POINTS));
public BooleanSetting countItems = addSetting(new BooleanSetting("contar items", "muestra cuánto de un item hay en un stack dropeado", true));
public ListSetting<Item> items = addSetting(new ListSetting<>("items", "te permite elegir cuáles items tienen su nombre visible",
public ListSetting<Item> items = sgGeneral.add(new ListSetting<>("items", "te permite elegir cuáles items tienen su nombre visible",
Lists.itemList, Lists.allTrue(Lists.itemList), Lists.itemNames));
public BooleanSetting showProjectileDamage = addSetting(new BooleanSetting("daño del proyectil", "muestra cuánto daño hace un proyectil en su nametag", true));
public BooleanSetting showSelf = addSetting(new BooleanSetting("mostrar propio", "mostrar nametag propio", false));
public BooleanSetting distinguishBabies = addSetting(new BooleanSetting("distinguir bebés", "cambia el nametag cuando una entidad está en su fase bebé", false));
public BooleanSetting petOwner = addSetting(new BooleanSetting("mostrar dueño", "muestra el dueño de una mascota (no funciona en servers no premium)", false));
public BooleanSetting health = sgGeneral.add(new BooleanSetting("mostrar vida", "muestra la vida de una entidad en su nametag", true));
public EnumSetting<HealthMode> healthMode = sgGeneral.add(new EnumSetting<>("mostrar vida en", "de qué manera mostrar la vida", HealthMode.class, HealthMode.POINTS));
public BooleanSetting alwaysVisible = sgGeneral.add(new BooleanSetting("siempre mostrar nametags", "mostrar nametag cuando el jugador está agachado o es invisible", false));
public BooleanSetting showSelf = sgGeneral.add(new BooleanSetting("mostrar propio", "mostrar nametag propio", false));
public BooleanSetting countItems = sgInfo.add(new BooleanSetting("contar items", "muestra cuánto de un item hay en un stack dropeado", true));
public BooleanSetting showProjectileDamage = sgInfo.add(new BooleanSetting("daño del proyectil", "muestra cuánto daño hace un proyectil en su nametag", true));
public BooleanSetting distinguishBabies = sgInfo.add(new BooleanSetting("distinguir bebés", "cambia el nametag cuando una entidad está en su fase bebé", false));
public BooleanSetting petOwner = sgInfo.add(new BooleanSetting("mostrar dueño", "muestra el dueño de una mascota (no funciona en servers no premium)", false));
private final Map<UUID, String> cache = new ConcurrentHashMap<>();
private static final ExecutorService executor = Executors.newCachedThreadPool();
@@ -2,9 +2,10 @@ package me.retucio.sputnik.module.modules.render;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.EnumSetting;
import me.retucio.sputnik.module.settings.ListSetting;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.EnumSetting;
import me.retucio.sputnik.module.setting.settings.ListSetting;
import me.retucio.sputnik.util.Lists;
import net.minecraft.particle.ParticleType;
import net.minecraft.util.Formatting;
@@ -24,35 +25,41 @@ import net.minecraft.util.Formatting;
public class NoRender extends Module {
public BooleanSetting spyglassOverlay = addSetting(new BooleanSetting("catalejo", "renderizar overlay del catalejo", false));
public BooleanSetting fluidOverlay = addSetting(new BooleanSetting("fluídos", "renderizar fluídos sobre la cámara como el agua, lava o nieve en polvo (aunque no sea un fluído)", false));
public BooleanSetting pumpkinOverlay = addSetting(new BooleanSetting("calabaza", "renderiza el overlay de la calabaza tallada", false));
public BooleanSetting fireOverlay = addSetting(new BooleanSetting("fuego", "renderizar llamas sobre la cámara", false));
public BooleanSetting portalOverlay = addSetting(new BooleanSetting("portal", "renderizar el overlay del portal del nether", false));
SettingGroup sgOverlays = addSg(new SettingGroup("overlays", true));
SettingGroup sgAmbient = addSg(new SettingGroup("ambiente", true));
SettingGroup sgEffects = addSg(new SettingGroup("efectos", true));
SettingGroup sgUi = addSg(new SettingGroup("interfaz", true));
SettingGroup sgText = addSg(new SettingGroup("texto", true));
SettingGroup sgMisc = addSg(new SettingGroup("misc.", true));
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 endFlashes = addSetting(new BooleanSetting("flashes del end", "renderizar los recientemente añadidos flashes en el end", true));
public BooleanSetting spyglassOverlay = sgOverlays.add(new BooleanSetting("catalejo", "renderizar overlay del catalejo", false));
public BooleanSetting fluidOverlay = sgOverlays.add(new BooleanSetting("fluídos", "renderizar fluídos sobre la cámara como el agua, lava o nieve en polvo (aunque no sea un fluído)", false));
public BooleanSetting pumpkinOverlay = sgOverlays.add(new BooleanSetting("calabaza", "renderiza el overlay de la calabaza tallada", false));
public BooleanSetting fireOverlay = sgOverlays.add(new BooleanSetting("fuego", "renderizar llamas sobre la cámara", false));
public BooleanSetting portalOverlay = sgOverlays.add(new BooleanSetting("portal", "renderizar el overlay del portal del nether", false));
public ListSetting<ParticleType<?>> particles = addSetting(new ListSetting<>("partículas", "lista de partículas que se renderizan",
public BooleanSetting rain = sgAmbient.add(new BooleanSetting("lluvia", "l l u v i a", true));
public BooleanSetting snow = sgAmbient.add(new BooleanSetting("nieve", "n i e v e", true));
public BooleanSetting endFlashes = sgAmbient.add(new BooleanSetting("flashes del end", "renderizar los recientemente añadidos flashes en el end", true));
public ListSetting<ParticleType<?>> particles = sgAmbient.add(new ListSetting<>("partículas", "lista de partículas que se renderizan",
Lists.particleList, Lists.allTrue(Lists.particleList), Lists.particleNames));
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 nauseaEffect = sgEffects.add(new BooleanSetting("náusea", "renderizar borrachera", false));
public BooleanSetting blindnessEffect = sgEffects.add(new BooleanSetting("ceguera", "renderizar miopía", false));
public BooleanSetting darknessEffect = sgEffects.add(new BooleanSetting("oscuridad", "renderizar miedo a la oscuridad", false));
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));
public BooleanSetting totemPop = addSetting(new BooleanSetting("tótem", "renderizar el pop del tótem", true));
public BooleanSetting scoreboard = sgUi.add(new BooleanSetting("marcador", "mostrar marcador a la derecha", false));
public BooleanSetting titles = sgUi.add(new BooleanSetting("títulos", "mostrar títulos (del comando /title)", false));
public BooleanSetting totemPop = sgUi.add(new BooleanSetting("tótem", "renderizar el pop del tótem", true));
public BooleanSetting stuckArrows = addSetting(new BooleanSetting("flechas clavadas", "renderizar flechas clavadas en jugadores", false));
public BooleanSetting bold = addSetting(new BooleanSetting("negrita", "letra pero §lgorda", true));
public BooleanSetting bold = sgText.add(new BooleanSetting("negrita", "letra pero §lgorda", true));
// public BooleanSetting italics = addSetting(new BooleanSetting("cursiva", "letra pero §otorcida", true));
public BooleanSetting underlined = addSetting(new BooleanSetting("subrayado", "letra pero §nen el suelo", true));
public BooleanSetting strikethrough = addSetting(new BooleanSetting("tachado", "letra pero §mdiscriminada", true));
public EnumSetting<Colors> color = addSetting(new EnumSetting<>("colores", "§co§4r§6g§eu§al§2l§9o §1g§5a§dy", Colors.class, Colors.DEFAULT));
public BooleanSetting scrambledText = addSetting(new BooleanSetting("garabato", "engarabatar texto (o como se diga) (§kasí§r)", false));
public BooleanSetting underlined = sgText.add(new BooleanSetting("subrayado", "letra pero §nen el suelo", true));
public BooleanSetting strikethrough = sgText.add(new BooleanSetting("tachado", "letra pero §mdiscriminada", true));
public EnumSetting<Colors> color = sgText.add(new EnumSetting<>("colores", "§co§4r§6g§eu§al§2l§9o §1g§5a§dy", Colors.class, Colors.DEFAULT));
public BooleanSetting scrambledText = sgText.add(new BooleanSetting("garabato", "engarabatar texto (o como se diga) (§kasí§r)", false));
public BooleanSetting stuckArrows = sgMisc.add(new BooleanSetting("flechas clavadas", "renderizar flechas clavadas en jugadores", false));
public NoRender() {
super("no render",
@@ -4,12 +4,12 @@ import me.retucio.sputnik.event.SubscribeEvent;
import me.retucio.sputnik.event.events.PacketEvent;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.StringSetting;
import me.retucio.sputnik.module.setting.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 StringSetting symbol = sgGeneral.add(new StringSetting("símbolo", "símbolo a reemplazar por \"§\"", "&", 5));
public ColoredSigns() {
super("carteles gays",
@@ -1,12 +1,13 @@
package me.retucio.sputnik.module.modules.world;
import me.retucio.sputnik.event.SubscribeEvent;
import me.retucio.sputnik.event.events.RenderWorldEvent;
import me.retucio.sputnik.event.events.Render3DEvent;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.ColorSetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.ColorSetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import me.retucio.sputnik.util.render.RenderUtil;
import net.minecraft.block.*;
import net.minecraft.block.Blocks;
@@ -20,20 +21,25 @@ import java.util.List;
public class LightOverlay extends Module {
public NumberSetting radius = addSetting(new NumberSetting("radio", "radio a tener en cuenta al renderizar superposición",
SettingGroup sgDetection = addSg(new SettingGroup("detección", true));
SettingGroup sgColors = addSg(new SettingGroup("colores", true));
public NumberSetting radius = sgDetection.add(new NumberSetting("radio", "radio a tener en cuenta al renderizar superposición",
16, 5, 128, 1));
public NumberSetting yRadius = addSetting(new NumberSetting("rango vertical", "distancia vertical a tener en cuenta",
public NumberSetting yRadius = sgDetection.add(new NumberSetting("rango vertical", "distancia vertical a tener en cuenta",
4, 1, 16, 1));
public NumberSetting interval = addSetting(new NumberSetting("intervalo", "cada cuántos ticks comprobar el nivel de luz",
public NumberSetting interval = sgDetection.add(new NumberSetting("intervalo", "cada cuántos ticks comprobar el nivel de luz",
10, 1, 80, 1));
public ColorSetting lightColor = addSetting(new ColorSetting("color de la luz", "color de los bloques con luz",
public BooleanSetting onWater = sgDetection.add(new BooleanSetting("en agua", "mostrar también bloques cubiertos en agua", true));
public BooleanSetting dontCullWater = sgDetection.add(new BooleanSetting("evitar culling en agua", "mostrar superposición a través de bloques para poder verla desde fuera del agua", false));
public ColorSetting lightColor = sgColors.add(new ColorSetting("color de la luz", "color de los bloques con luz",
new Color(0, 255, 0, 67), false));
public ColorSetting darknessColor = addSetting(new ColorSetting("color de oscuridad", "color de bloques con 0 luz",
public ColorSetting darknessColor = sgColors.add(new ColorSetting("color de oscuridad", "color de bloques con 0 luz",
new Color(255, 0, 0, 67), false));
public BooleanSetting onWater = addSetting(new BooleanSetting("en agua", "mostrar también bloques cubiertos en agua", true));
List<BlockPos> blocks = new ArrayList<>();
@@ -44,7 +50,7 @@ public class LightOverlay extends Module {
}
@SubscribeEvent
public void onRenderWorld(RenderWorldEvent event) {
public void onRenderWorld(Render3DEvent event) {
if (mc.player == null || mc.world == null) return;
if (mc.player.age % interval.getIntValue() == 0) {
blocks = findExposedBlocks(
@@ -65,7 +71,8 @@ public class LightOverlay extends Module {
(lightColor.getB() / 15) * light,
lightColor.getA());
RenderUtil.drawBlockFaceFilled(event.getMatrices(), block, Direction.UP, color, 0.001f, true);
boolean shouldCull = !(onWater.isEnabled() && mc.world.getBlockState(block.up()).isOf(Blocks.WATER) && dontCullWater.isEnabled());
RenderUtil.drawBlockFaceFilled(event.getMatrices(), block, Direction.UP, color, 0.001f, shouldCull);
}
}
@@ -2,8 +2,8 @@ package me.retucio.sputnik.module.modules.world;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.ListSetting;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.ListSetting;
import me.retucio.sputnik.util.Lists;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
@@ -11,8 +11,8 @@ 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 ListSetting<EntityType<?>> entities = addSetting(new ListSetting<>("entidades", "entidades a ignorar",
public BooleanSetting withPickaxeOnly = sgGeneral.add(new BooleanSetting("solo con pico", "ignorar entidades solamente cuando se sujeta un pico", false));
public ListSetting<EntityType<?>> entities = sgGeneral.add(new ListSetting<>("entidades", "entidades a ignorar",
Lists.entityList, Lists.allTrue(Lists.entityList), Lists.entityNames));
public NoMiningInterruptions() {
@@ -4,20 +4,24 @@ import me.retucio.sputnik.event.SubscribeEvent;
import me.retucio.sputnik.event.events.PacketEvent;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.EnumSetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.EnumSetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket;
// continúa en ClientWorldPropertiesMixin, DimensionTypeMixin,
public class TimeChanger extends Module {
public BooleanSetting renderSun = addSetting(new BooleanSetting("sol", "que haya sol o no", true));
public BooleanSetting renderMoon = addSetting(new BooleanSetting("luna", "que haya luna o no", true));
public BooleanSetting renderStars = addSetting(new BooleanSetting("estrellas", "que hayan estrellas o no", true));
SettingGroup sgCelestialBodies = addSg(new SettingGroup("cuerpos celeste", false));
public EnumSetting<MoonPhases> moonPhase = addSetting(new EnumSetting<>("fase lunar", "fase lunar actual", MoonPhases.class, MoonPhases.DEFAULT));
public NumberSetting time = addSetting(new NumberSetting("hora", "hora del juego", 0, -20000, 20000, 1));
public NumberSetting time = sgGeneral.add(new NumberSetting("hora", "hora del juego", 0, -20000, 20000, 1));
public BooleanSetting renderSun = sgCelestialBodies.add(new BooleanSetting("sol", "que haya sol o no", true));
public BooleanSetting renderMoon = sgCelestialBodies.add(new BooleanSetting("luna", "que haya luna o no", true));
public BooleanSetting renderStars = sgCelestialBodies.add(new BooleanSetting("estrellas", "que hayan estrellas o no", true));
public EnumSetting<MoonPhases> moonPhase = sgCelestialBodies.add(new EnumSetting<>("fase lunar", "fase lunar actual", MoonPhases.class, MoonPhases.DEFAULT));
public TimeChanger() {
super("cielo custom",
@@ -1,4 +1,4 @@
package me.retucio.sputnik.module.settings;
package me.retucio.sputnik.module.setting;
import me.retucio.sputnik.Sputnik;
import me.retucio.sputnik.event.events.sputnik.UpdateSettingEvent;
@@ -13,7 +13,7 @@ public abstract class Setting {
private boolean visible = true;
private boolean searchMatch = true;
private Module module;
private SettingGroup sg;
protected Setting(String name, String description) {
this.name = name;
@@ -44,15 +44,21 @@ public abstract class Setting {
return description;
}
public Module getModule() {
return module;
public SettingGroup getSg() {
return sg;
}
public void setModule(Module module) {
this.module = module;
public void setSg(SettingGroup sg) {
this.sg = sg;
}
public void fireUpdateEvent() {
Sputnik.EVENT_BUS.post(new UpdateSettingEvent(this, module.shouldSaveSettings()));
Sputnik.EVENT_BUS.post(
new UpdateSettingEvent(
this,
sg.getModule()
.shouldSaveSettings()
)
);
}
}
@@ -0,0 +1,71 @@
package me.retucio.sputnik.module.setting;
import me.retucio.sputnik.module.Module;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class SettingGroup implements Iterable<Setting> {
private Module module;
private final String name;
private boolean extended;
final List<Setting> settings = new ArrayList<>(1);
public SettingGroup(String name, boolean extended) {
this.name = name;
this.extended = extended;
}
@Override
public @NotNull Iterator<Setting> iterator() {
return settings.iterator();
}
public <S extends Setting> S add(S setting) {
setting.setSg(this);
settings.add(setting);
return setting;
}
@SafeVarargs
public final <S extends Setting> void addAll(S... ss) {
for (S s : ss) {
add(s);
}
}
public Setting getSetting(String name) {
for (Setting setting : this)
if (setting.getName().equals(name))
return setting;
return null;
}
public String getName() {
return name;
}
public boolean isExtended() {
return extended;
}
public void setExtended(boolean extended) {
this.extended = extended;
}
public Module getModule() {
return module;
}
public void setModule(Module module) {
this.module = module;
}
}
@@ -1,4 +1,6 @@
package me.retucio.sputnik.module.settings;
package me.retucio.sputnik.module.setting.settings;
import me.retucio.sputnik.module.setting.Setting;
import java.util.function.Consumer;
@@ -1,5 +1,6 @@
package me.retucio.sputnik.module.settings;
package me.retucio.sputnik.module.setting.settings;
import me.retucio.sputnik.module.setting.Setting;
import me.retucio.sputnik.util.Colors;
import net.minecraft.text.Text;
@@ -1,4 +1,6 @@
package me.retucio.sputnik.module.settings;
package me.retucio.sputnik.module.setting.settings;
import me.retucio.sputnik.module.setting.Setting;
import java.util.Arrays;
import java.util.List;
@@ -1,7 +1,8 @@
package me.retucio.sputnik.module.settings;
package me.retucio.sputnik.module.setting.settings;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.ModuleManager;
import me.retucio.sputnik.module.setting.Setting;
import me.retucio.sputnik.ui.widgets.frames.settings.ClientSettingsFrame;
import me.retucio.sputnik.util.ChatUtil;
import me.retucio.sputnik.util.KeyUtil;
@@ -1,4 +1,6 @@
package me.retucio.sputnik.module.settings;
package me.retucio.sputnik.module.setting.settings;
import me.retucio.sputnik.module.setting.Setting;
import java.util.ArrayList;
import java.util.HashMap;
@@ -1,4 +1,6 @@
package me.retucio.sputnik.module.settings;
package me.retucio.sputnik.module.setting.settings;
import me.retucio.sputnik.module.setting.Setting;
import java.util.function.Consumer;
@@ -1,10 +1,12 @@
package me.retucio.sputnik.module.settings;
package me.retucio.sputnik.module.setting.settings;
import me.retucio.sputnik.module.setting.Setting;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
public class OptionSetting<T> extends Setting{
public class OptionSetting<T> extends Setting {
private final List<T> options;
private Map<T, String> displayNames;
@@ -1,4 +1,6 @@
package me.retucio.sputnik.module.settings;
package me.retucio.sputnik.module.setting.settings;
import me.retucio.sputnik.module.setting.Setting;
import java.util.function.Consumer;
@@ -7,8 +7,8 @@ import me.retucio.sputnik.event.events.MouseClickEvent;
import me.retucio.sputnik.event.events.MouseScrollEvent;
import me.retucio.sputnik.event.events.sputnik.SettingsFrameEvent;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.Setting;
import me.retucio.sputnik.module.settings.ColorSetting;
import me.retucio.sputnik.module.setting.Setting;
import me.retucio.sputnik.module.setting.settings.ColorSetting;
import me.retucio.sputnik.ui.widgets.buttons.settings.ListButton;
import me.retucio.sputnik.ui.widgets.buttons.ModuleButton;
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
@@ -233,15 +233,17 @@ public class ClickGUI extends Screen {
continue;
}
String name = setting.getName();
String description = setting.getDescription();
String name = MiscUtil.removeAccentMarks(setting.getName());
String description = MiscUtil.removeAccentMarks(setting.getDescription());
String sgName = MiscUtil.removeAccentMarks(setting.getSg().getName());
if (!guiSettings.matchCase.isEnabled()) {
name = name.toLowerCase();
description = description.toLowerCase();
sgName = sgName.toLowerCase();
}
setting.setSearchMatch(name.contains(searchInput) || description.contains(searchInput));
setting.setSearchMatch(name.contains(searchInput) || description.contains(searchInput) || sgName.contains(searchInput));
}
}
}
@@ -249,7 +251,7 @@ public class ClickGUI extends Screen {
// abrir un marco donde se encuentran los ajustes del módulo deseado
public void openSettingsFrame(Module module, int x, int y) {
for (SettingsFrame frame : settingsFrames) {
if (frame.module == module) {
if (frame.getModule() == module) {
frame.setX(x);
frame.setY(y);
return;
@@ -275,7 +277,7 @@ public class ClickGUI extends Screen {
List<SettingsFrame> toRemove = new ArrayList<>();
for (SettingsFrame sf : settingsFrames) {
if ((sf instanceof ColorPickerFrame cpf && cpf.dummyModule == module) // para los selectores de colores
|| (!(sf instanceof ColorPickerFrame) && sf.module == module)) { // lógica muy mierdas, lo sé, pero paso de hacerlo bien
|| (!(sf instanceof ColorPickerFrame) && sf.getModule() == module)) { // lógica muy mierdas, lo sé, pero paso de hacerlo bien
toRemove.add(sf);
Sputnik.EVENT_BUS.post(new SettingsFrameEvent.Close(sf));
unselect(sf);
@@ -288,7 +290,7 @@ public class ClickGUI extends Screen {
// verificar si un módulo tiene su marco de ajustes abierto
public boolean isSettingsFrameOpen(Module module) {
return settingsFrames.stream()
.anyMatch(sf -> sf.module.getName().equals(module.getName()));
.anyMatch(sf -> sf.getModule().getName().equals(module.getName()));
}
public boolean isColorPickerFrameOpen(ColorSetting setting) {
@@ -1,6 +1,6 @@
package me.retucio.sputnik.ui.widgets.buttons;
import me.retucio.sputnik.module.settings.Setting;
import me.retucio.sputnik.module.setting.Setting;
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
import me.retucio.sputnik.ui.widgets.Button;
import net.minecraft.client.gui.DrawContext;
@@ -24,6 +24,12 @@ public abstract class SettingButton<S extends Setting> extends Button {
ctx.drawTooltip(Text.of(setting.getDescription()), mouseX, mouseY + 20);
}
@Override
public boolean isHovered(int mouseX, int mouseY) {
return setting.getSg().isExtended()
&& super.isHovered(mouseX, mouseY);
}
public S getSetting() {
return setting;
}
@@ -1,6 +1,6 @@
package me.retucio.sputnik.ui.widgets.buttons.settings;
import me.retucio.sputnik.module.settings.KeySetting;
import me.retucio.sputnik.module.setting.settings.KeySetting;
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
import me.retucio.sputnik.ui.screen.ClickGUI;
import me.retucio.sputnik.ui.widgets.frames.settings.ClientSettingsFrame;
@@ -2,8 +2,8 @@ package me.retucio.sputnik.ui.widgets.buttons.settings;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.OptionSetting;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.OptionSetting;
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
import me.retucio.sputnik.ui.screen.ClickGUI;
@@ -99,7 +99,7 @@ public class ChooseButton<T> extends SettingButton<OptionSetting<T>> {
}
});
dummy.addSetting(b);
dummy.getSg("general").add(b);
optionButtons.put(option, b);
});
}
@@ -1,6 +1,6 @@
package me.retucio.sputnik.ui.widgets.buttons.settings;
import me.retucio.sputnik.module.settings.ColorSetting;
import me.retucio.sputnik.module.setting.settings.ColorSetting;
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
import me.retucio.sputnik.ui.screen.ClickGUI;
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
@@ -28,6 +28,7 @@ public class ColorButton extends SettingButton<ColorSetting> {
Color bgColor = isHovered(mouseX, mouseY)
? Colors.buttonColor.brighter()
: Colors.buttonColor;
ctx.fill(x, y, x + w, y + h, bgColor.getRGB());
// prev. del color
@@ -55,7 +56,7 @@ public class ColorButton extends SettingButton<ColorSetting> {
if (button == 0) {
// clic izq.: abrir selector de colores
ClickGUI.INSTANCE.openColorPickerFrame(
setting.getModule(), setting,
setting.getSg().getModule(), setting,
parent.getX() + parent.getW() + 120,
parent.getRenderY() + offset);
} else if (button == 1 && KeyUtil.isShiftDown()) {
@@ -1,6 +1,6 @@
package me.retucio.sputnik.ui.widgets.buttons.settings;
import me.retucio.sputnik.module.settings.EnumSetting;
import me.retucio.sputnik.module.setting.settings.EnumSetting;
import me.retucio.sputnik.ui.screen.ClickGUI;
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
@@ -2,8 +2,8 @@ package me.retucio.sputnik.ui.widgets.buttons.settings;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.ListSetting;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.ListSetting;
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
import me.retucio.sputnik.ui.screen.ClickGUI;
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
@@ -90,7 +90,7 @@ public class ListButton<T> extends SettingButton<ListSetting<T>> {
.sorted(Comparator.comparing(setting::getDisplayName, String.CASE_INSENSITIVE_ORDER))
.forEach(option -> {
String displayName = setting.getDisplayName(option);
BooleanSetting b = dummy.addSetting(new BooleanSetting(
BooleanSetting b = dummy.getSg("general").add(new BooleanSetting(
displayName,
"incluir " + displayName,
setting.isEnabled(option)
@@ -1,6 +1,6 @@
package me.retucio.sputnik.ui.widgets.buttons.settings;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import me.retucio.sputnik.ui.screen.ClickGUI;
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
@@ -1,6 +1,6 @@
package me.retucio.sputnik.ui.widgets.buttons.settings;
import me.retucio.sputnik.module.settings.StringSetting;
import me.retucio.sputnik.module.setting.settings.StringSetting;
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
import me.retucio.sputnik.ui.screen.ClickGUI;
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
@@ -1,6 +1,6 @@
package me.retucio.sputnik.ui.widgets.buttons.settings;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
import me.retucio.sputnik.ui.screen.ClickGUI;
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
@@ -3,7 +3,8 @@ package me.retucio.sputnik.ui.widgets.frames;
import me.retucio.sputnik.Sputnik;
import me.retucio.sputnik.event.events.sputnik.SettingsFrameEvent;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.*;
import me.retucio.sputnik.module.setting.*;
import me.retucio.sputnik.module.setting.settings.*;
import me.retucio.sputnik.ui.widgets.buttons.settings.*;
import me.retucio.sputnik.ui.screen.ClickGUI;
import me.retucio.sputnik.ui.widgets.buttons.*;
@@ -20,19 +21,16 @@ import java.util.List;
// marco para los botones de los ajustes de cada módulo
public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
public Module module;
private Module module;
protected List<SettingGroup> settingGroups;
private static final int PADDING = 4; // para ser consistente
public SettingsFrame(Module module, int x, int y, int w, int h) {
super("ajustes de " + module.getName(), x, y, w, h);
this.module = module;
this.settingGroups = module.getSgs();
// asegurarse de que no se sale de la pantalla
if (mc.getWindow() != null) {
this.x = Math.clamp(this.x, 0, mc.getWindow().getScaledWidth() - w);
this.y = Math.clamp(this.y, 0, mc.getWindow().getScaledHeight() - totalHeight - h);
}
addButtons();
addButtonsByGroups();
visibleButtons = buttons.stream()
.filter(sb -> sb.getSetting().isVisible())
@@ -46,7 +44,7 @@ public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
// cabezal
int centerX = x + w / 2;
int centerY = renderY + h / 2;
int titleX = x + 8;
int titleX = x + 2 * PADDING;
int titleY = centerY - mc.textRenderer.fontHeight / 2;
int headerColor = module.isEnabled()
@@ -57,31 +55,96 @@ public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
? Color.RED.getRGB()
: -1;
if (!module.shouldSaveSettings()) headerColor = (int) module.getSettings().stream().filter(s -> ((BooleanSetting) s).isEnabled()).count() > 0
? Colors.enabledToggleButtonColor.getRGB()
: Colors.disabledToggleButtonColor.getRGB();
ctx.fill(x, renderY, x + w, renderY + h, headerColor);
ctx.drawText(mc.textRenderer, title, titleX, titleY, -1, true);
ctx.drawText(mc.textRenderer, "×", x + w - mc.textRenderer.getWidth("×") - 8, titleY, closeButtonColor, true);
ctx.drawText(mc.textRenderer, "×", x + w - mc.textRenderer.getWidth("×") - 2 * PADDING, titleY, closeButtonColor, true);
// filtrar botones visibles
visibleButtons = buttons.stream()
.filter(sb -> sb.getSetting().isVisible() && sb.getSetting().isSearchMatch())
.toList();
// descripción
List<String> descLines = wrapDescription(module.getDescription(), w - 8);
List<String> descLines = wrapDescription(module.getDescription(), w - 2 * PADDING);
int lineSpacing = 2;
int descHeight = descLines.size() * mc.textRenderer.fontHeight + (descLines.size() - 1) * lineSpacing;
int descBoxTop = renderY + h + 5;
int descBoxBottom = descBoxTop + descHeight + 8;
int descBoxTop = renderY + h + PADDING;
int descBoxBottom = descBoxTop + descHeight + PADDING * 2;
totalHeight = descHeight + 8 + h * visibleButtons.size() + 4;
totalHeight = descHeight + 3 * PADDING;
int currentY;
ctx.fill(x, descBoxTop - 4, x + w, descBoxTop + totalHeight, Colors.frameBGColor.getRGB());
ctx.fill(x + 4, descBoxTop, x + w - 4, descBoxBottom, Colors.buttonColor.getRGB());
// obtener valores de altura y tal
for (SettingGroup group : settingGroups) {
if (hasVisibleSettingsInGroup(group)) {
totalHeight += h + PADDING;
if (group.isExtended()) {
List<SettingButton<?>> groupButtons = getButtonsForGroup(group);
for (int j = 0; j < groupButtons.size(); j++) {
SettingButton<?> sb = groupButtons.get(j);
if (sb.getSetting().isVisible() && sb.getSetting().isSearchMatch()) {
if (j < groupButtons.size() - 1) {
totalHeight += (h - h / 4) + PADDING;
} else {
totalHeight += (h - h / 4);
}
}
}
totalHeight += PADDING;
}
}
}
// fondo del marco
ctx.fill(x, descBoxTop - PADDING + 1, x + w, descBoxTop + totalHeight, Colors.frameBGColor.getRGB());
// fondo de la descripción
ctx.fill(x + PADDING, descBoxTop, x + w - PADDING, descBoxBottom, Colors.buttonColor.getRGB());
// restablecer currentY
currentY = descBoxBottom + PADDING;
// dibujar botones y cabezales
for (int i = 0; i < settingGroups.size(); i++) {
SettingGroup group = settingGroups.get(i);
if (hasVisibleSettingsInGroup(group)) {
int groupHeaderColor = isGroupHeaderHovered(mouseX, mouseY, i)
? Colors.buttonColor.brighter().getRGB()
: Colors.buttonColor.getRGB();
ctx.fill(x + PADDING, currentY, x + w - PADDING, currentY + h, groupHeaderColor);
ctx.drawText(mc.textRenderer, group.getName(), x + PADDING * 2, currentY + (h - mc.textRenderer.fontHeight) / 2, -1, true);
ctx.drawText(mc.textRenderer, group.isExtended() ? "-" : "+", x + w - 4 * PADDING, currentY + (h - mc.textRenderer.fontHeight) / 2, -1, true);
currentY += h + PADDING;
// ajustes de grupos extendidos
if (group.isExtended()) {
List<SettingButton<?>> groupButtons = getButtonsForGroup(group);
for (int j = 0; j < groupButtons.size(); j++) {
SettingButton<?> sb = groupButtons.get(j);
if (sb.getSetting().isVisible() && sb.getSetting().isSearchMatch()) {
sb.setX(x + PADDING * 2);
sb.setY(currentY);
sb.setW(w - PADDING * 4);
sb.setH(h - h / 4);
sb.render(ctx, mouseX, mouseY, delta);
if (j < groupButtons.size() - 1) {
currentY += (h - h / 4) + PADDING;
} else {
currentY += (h - h / 4);
}
}
}
currentY += PADDING;
}
}
}
// texto de la desc.
int firstLineY = descBoxTop + ((descBoxBottom - descBoxTop) - descHeight) / 2;
for (int i = 0; i < descLines.size(); i++) {
String line = descLines.get(i);
@@ -89,16 +152,6 @@ public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
int lineY = firstLineY + i * (mc.textRenderer.fontHeight + lineSpacing);
ctx.drawText(mc.textRenderer, line, lineX, lineY, -1, true);
}
int startButtonY = firstLineY - descBoxTop + descBoxBottom;
for (SettingButton<?> sb : visibleButtons) {
sb.setX(x + 4);
sb.setY(startButtonY);
sb.setW(w - 8);
sb.setH(h - h / 4);
sb.render(ctx, mouseX, mouseY, delta);
startButtonY += h;
}
}
@Override
@@ -113,7 +166,8 @@ public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
if (isCloseButtonHovered(mouseX, mouseY)) {
ClickGUI.INSTANCE.closeSettingsFrame(this.module);
return;
} if (button == 0) {
}
if (button == 0) {
dragging = true;
dragX = mouseX - x;
dragY = mouseY - y;
@@ -122,9 +176,20 @@ public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
}
}
for (SettingButton<?> sb : visibleButtons)
// al hacer clic en los cabezales de los grupos de ajustes
for (int i = 0; i < settingGroups.size(); i++) {
SettingGroup group = settingGroups.get(i);
if (hasVisibleSettingsInGroup(group) && isGroupHeaderHovered(mouseX, mouseY, i)) {
group.setExtended(!group.isExtended());
updateVisibleButtonsForGroup(group);
return;
}
}
for (SettingButton<?> sb : visibleButtons) {
sb.mouseClicked(mouseX, mouseY, button);
}
}
@Override
public void mouseReleased(int mouseX, int mouseY, int button) {
@@ -132,9 +197,10 @@ public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
if (button == 0) {
dragging = false;
if (isHovered(mouseX, mouseY))
if (isHovered(mouseX, mouseY)) {
Sputnik.EVENT_BUS.post(new SettingsFrameEvent.Move(this));
}
}
for (SettingButton<?> sb : visibleButtons)
sb.mouseReleased(mouseX, mouseY, button);
@@ -166,6 +232,12 @@ public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
int textWidth = mc.textRenderer.getWidth(text);
maxWidth = Math.max(maxWidth, textWidth);
}
for (SettingGroup group : settingGroups) {
int groupTextWidth = mc.textRenderer.getWidth("▶ " + group.getName());
maxWidth = Math.max(maxWidth, groupTextWidth);
}
this.w = maxWidth + 30;
}
@@ -176,6 +248,109 @@ public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
}
}
public int getGroupHeaderY(int groupIndex) {
int currentY = renderY + h + PADDING;
List<String> descLines = wrapDescription(module.getDescription(), w - 2 * PADDING);
int descHeight = descLines.size() * mc.textRenderer.fontHeight + (descLines.size() - 1) * 2;
currentY += descHeight + 3 * PADDING; // descBoxBottom + padding
// iterar hasta llegar al grupo deseado
int currentIndex = 0;
for (SettingGroup group : settingGroups) {
if (hasVisibleSettingsInGroup(group)) {
if (currentIndex == groupIndex) {
return currentY;
}
currentY += h + PADDING;
if (group.isExtended()) {
List<SettingButton<?>> groupButtons = getButtonsForGroup(group);
for (int j = 0; j < groupButtons.size(); j++) {
SettingButton<?> sb = groupButtons.get(j);
if (sb.getSetting().isVisible() && sb.getSetting().isSearchMatch()) {
if (j < groupButtons.size() - 1) {
currentY += (h - h / 4) + PADDING;
} else {
currentY += (h - h / 4);
}
}
}
currentY += PADDING;
}
currentIndex++;
}
} // fallback
return currentY;
}
public boolean isGroupHeaderHovered(int mouseX, int mouseY, int groupIndex) {
int headerY = getGroupHeaderY(groupIndex);
return mouseX > x + PADDING && mouseX < x + w - PADDING &&
mouseY > headerY && mouseY < headerY + h;
}
private void addButtonsByGroups() {
int offset = h;
for (SettingGroup group : settingGroups) {
for (Setting setting : group) {
SettingButton<?> button = createSettingButton(setting, offset);
if (button != null) {
addButton(button);
offset += button.getH() + PADDING;
}
}
}
}
private SettingButton<?> createSettingButton(Setting setting, int offset) {
return switch (setting) {
case BooleanSetting b -> new ToggleButton(b, this, offset);
case NumberSetting n -> new SliderButton(n, this, offset);
case EnumSetting<?> e -> new CycleButton<>(e, this, offset);
case KeySetting k -> new BindButton(k, this, offset);
case StringSetting s -> new TextButton(s, this, offset);
case ListSetting<?> l -> new ListButton<>(l, this, offset);
case ColorSetting c -> new ColorButton(c, this, offset);
case OptionSetting<?> o -> new ChooseButton<>(o, this, offset);
default -> null;
};
}
protected boolean hasVisibleSettingsInGroup(SettingGroup group) {
for (Setting setting : group) {
if (setting.isVisible()) {
return true;
}
}
return false;
}
private List<SettingButton<?>> getButtonsForGroup(SettingGroup group) {
List<SettingButton<?>> groupButtons = new ArrayList<>();
for (SettingButton<?> button : buttons) {
for (Setting setting : group) {
if (setting == button.getSetting()) {
groupButtons.add(button);
break;
}
}
}
return groupButtons;
}
protected void updateVisibleButtonsForGroup(SettingGroup group) {
visibleButtons = new ArrayList<>();
for (SettingGroup sg : settingGroups) {
if (sg.isExtended()) {
visibleButtons.addAll(getButtonsForGroup(sg).stream()
.filter(sb -> sb.getSetting().isVisible() && sb.getSetting().isSearchMatch())
.toList());
}
}
}
private List<String> wrapDescription(String text, int maxWidth) {
List<String> lines = new ArrayList<>();
@@ -186,7 +361,7 @@ public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
for (String word : words) {
String testLine = line.isEmpty() ? word : line + " " + word;
if (mc.textRenderer.getWidth(testLine) > maxWidth - 8) { // padding of 4 each side
if (mc.textRenderer.getWidth(testLine) > maxWidth - 2 * PADDING) {
if (!line.isEmpty()) lines.add(line.toString());
line = new StringBuilder(word);
} else {
@@ -197,56 +372,29 @@ public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
return lines;
}
private void addButtons() {
int offset = h;
for (Setting setting : module.getSettings()) {
switch (setting) {
case BooleanSetting b -> {
addButton(new ToggleButton(b, this, offset));
offset += 18;
}
case NumberSetting n -> {
addButton(new SliderButton(n, this, offset));
offset += 18;
}
case EnumSetting<?> e -> {
addButton(new CycleButton<>(e, this, offset));
offset += 18;
}
case KeySetting k -> {
addButton(new BindButton(k, this, offset));
offset += 18;
}
case StringSetting s -> {
addButton(new TextButton(s, this, offset));
offset += 18;
}
case ListSetting<?> l -> {
addButton(new ListButton<>(l, this, offset));
offset += 18;
}
case ColorSetting c -> {
addButton(new ColorButton(c, this, offset));
offset += 18;
}
case OptionSetting<?> o -> {
addButton(new ChooseButton<>(o, this, offset));
offset += 18;
}
default -> {
}
}
}
}
public void addButton(SettingButton<?> button) {
buttons.add(button);
updateWidth(); // actualizar anchura del frame tras cada iteración
}
protected boolean isCloseButtonHovered(double mouseX, double mouseY) {
return mouseX > x + w - mc.textRenderer.getWidth("×") - 12 && mouseX < x + w - 4
&& mouseY > renderY + 4 && mouseY < renderY + h - 4;
return mouseX > x + w - mc.textRenderer.getWidth("×") - 3 * PADDING && mouseX < x + w - PADDING
&& mouseY > renderY + PADDING && mouseY < renderY + h - PADDING;
}
public Module getModule() {
return module;
}
public void setModule(Module module) {
this.module = module;
}
public List<SettingGroup> getSettingGroups() {
return settingGroups;
}
public void setSettingGroups(List<SettingGroup> settingGroups) {
this.settingGroups = settingGroups;
}
}
@@ -3,6 +3,7 @@ package me.retucio.sputnik.ui.widgets.frames.settings;
import me.retucio.sputnik.Sputnik;
import me.retucio.sputnik.event.events.sputnik.GUISettingsFrameEvent;
import me.retucio.sputnik.module.modules.client.GUI;
import me.retucio.sputnik.module.setting.SettingGroup;
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
import me.retucio.sputnik.ui.screen.ClickGUI;
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
@@ -24,6 +25,13 @@ public class ClientSettingsFrame extends SettingsFrame {
@Override
public void render(DrawContext ctx, int mouseX, int mouseY, float delta) {
updateWidth();
// botones, fondo, etc.
if (extended) {
super.render(ctx, mouseX, mouseY, delta);
}
// cabezal
ctx.fill(x, renderY, x + w, renderY + h, Colors.mainColor.getRGB());
ctx.drawText(mc.textRenderer, title,
@@ -36,25 +44,6 @@ public class ClientSettingsFrame extends SettingsFrame {
renderY + (h / 2) - (mc.textRenderer.fontHeight / 2),
-1, true);
List<SettingButton<?>> visibleButtons = buttons.stream()
.filter(sb -> sb.getSetting().isVisible() && sb.getSetting().isSearchMatch())
.toList();
if (extended) {
int currentY = renderY + h + 3;
totalHeight = visibleButtons.size() * h;
ctx.fill(x, currentY - 2, x + w, currentY + totalHeight, Colors.frameBGColor.getRGB());
for (SettingButton<?> sb : visibleButtons) {
sb.setX(x + 4);
sb.setY(currentY);
sb.setW(w - 8);
sb.setH(h - h / 4);
sb.render(ctx, mouseX, mouseY, delta);
sb.drawTooltip(ctx, mouseX, mouseY);
currentY += h;
}
} else totalHeight = 0;
}
@Override
@@ -70,9 +59,21 @@ public class ClientSettingsFrame extends SettingsFrame {
}
}
if (!extended) return; // solo dejar clicar en los módulos si el marco está extendido
for (SettingButton<?> settingButton : buttons)
settingButton.mouseClicked(mouseX, mouseY, button);
// solo dejar clicar en los ajustes si el marco está extendido
if (!extended) return;
for (int i = 0; i < settingGroups.size(); i++) {
SettingGroup group = settingGroups.get(i);
if (hasVisibleSettingsInGroup(group) && isGroupHeaderHovered(mouseX, mouseY, i)) {
group.setExtended(!group.isExtended());
updateVisibleButtonsForGroup(group);
return;
}
}
for (SettingButton<?> sb : buttons) {
sb.mouseClicked(mouseX, mouseY, button);
}
}
@Override
@@ -2,10 +2,10 @@ package me.retucio.sputnik.ui.widgets.frames.settings;
import me.retucio.sputnik.module.Category;
import me.retucio.sputnik.module.Module;
import me.retucio.sputnik.module.settings.Setting;
import me.retucio.sputnik.module.settings.BooleanSetting;
import me.retucio.sputnik.module.settings.ColorSetting;
import me.retucio.sputnik.module.settings.NumberSetting;
import me.retucio.sputnik.module.setting.Setting;
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
import me.retucio.sputnik.module.setting.settings.ColorSetting;
import me.retucio.sputnik.module.setting.settings.NumberSetting;
import me.retucio.sputnik.ui.widgets.buttons.*;
import me.retucio.sputnik.ui.widgets.buttons.settings.SliderButton;
import me.retucio.sputnik.ui.widgets.buttons.settings.ToggleButton;
@@ -75,7 +75,7 @@ public class ColorPickerFrame extends SettingsFrame {
brightnessSetting.setDefaultValue(colorSetting.getDefaultBrightness());
// añadir ajustes y tal
dummyModule.addSettings(redSetting, greenSetting, blueSetting, rainbowSpeedSetting, saturationSetting, brightnessSetting, rainbowSetting);
dummyModule.getSg("general").addAll(redSetting, greenSetting, blueSetting, rainbowSpeedSetting, saturationSetting, brightnessSetting, rainbowSetting);
for (Setting setting : dummyModule.getSettings()) {
if (setting instanceof NumberSetting n) n.onUpdate(v -> updateColorFromSettings());
if (setting instanceof BooleanSetting b) b.onUpdate(v -> updateColorFromSettings());
@@ -92,8 +92,8 @@ public class ColorPickerFrame extends SettingsFrame {
buttons.clear();
Module originalModule = this.module;
this.module = dummyModule;
Module originalModule = this.getModule();
this.setModule(dummyModule);
// añadir botones
int offset = h;
@@ -111,7 +111,7 @@ public class ColorPickerFrame extends SettingsFrame {
}
}
this.module = originalModule;
this.setModule(originalModule);
}
+3
View File
@@ -1,5 +1,7 @@
accessWidener v2 named
accessible class net/minecraft/client/MinecraftClient$LoadingContext
accessible field net/minecraft/client/texture/TextureManager textures Ljava/util/Map;
accessible method net/minecraft/network/ClientConnection handleQueuedTasks ()V
@@ -11,6 +13,7 @@ accessible class net/minecraft/client/network/ClientCommonNetworkHandler$Confirm
accessible class net/minecraft/client/network/ClientCommonNetworkHandler$ConfirmServerResourcePackScreen$Pack
accessible class net/minecraft/client/font/TextRenderer$Drawer
accessible method net/minecraft/client/font/FontManager getStorageInternal (Lnet/minecraft/util/Identifier;)Lnet/minecraft/client/font/FontStorage;
accessible method net/minecraft/entity/Entity setFlag (IZ)V
accessible method net/minecraft/entity/player/PlayerEntity canGlide ()Z