Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9afaa4e0c8 | ||
|
|
f794457538 |
No files matched your search
@@ -25,7 +25,6 @@ dependencies {
|
|||||||
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
|
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
|
||||||
|
|
||||||
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}"
|
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}"
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
loom {
|
loom {
|
||||||
|
|||||||
+14
-5
@@ -1,18 +1,27 @@
|
|||||||
# v2.4
|
# v2.6
|
||||||
|
|
||||||
## novedades
|
## 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
|
|
||||||
|
|
||||||
### adiciones
|
### adiciones
|
||||||
|
|
||||||
|
- layouts de teclado (en_us y es_es) (fuck azerty)
|
||||||
|
- comando `$config` para abrir el marco de ajustes de un módulo
|
||||||
|
- elemento del hud que muestra la rotación de la cámara del jugador
|
||||||
|
|
||||||
#### módulos nuevos:
|
#### módulos nuevos:
|
||||||
|
|
||||||
- capas: cambia (solo visualmente, para ti) la capa que usas a una custom de las disponibles
|
- fuentes: cambia la tipografía que usa todo el juego a una custom
|
||||||
|
- escalones: actúa con la altura deseada como si se estuviesen subiendo escalones
|
||||||
|
- escalones inversos: escalones, pabajo
|
||||||
|
- partículas: genera particulas artificiales
|
||||||
|
|
||||||
### arreglos / mejoras
|
### arreglos / mejoras
|
||||||
|
|
||||||
- renombrado bien todo que lo hice con prisa
|
- ahora puedes cambiar el grosor de las líneas del contorno de los bloques
|
||||||
|
- arreglada la compatibilidad con meteor client
|
||||||
|
- optimizado y mejorado superposición de luz y resaltado de bloques
|
||||||
|
- ahora, en los marcos de seleccion única, en el tooltip de cada opción dice "seleccionar" en lugar de "incluir"
|
||||||
|
- ahora precoz también tiene una opción de reducir el cooldown al minar bloques
|
||||||
|
|
||||||
## problemas reconocidos
|
## problemas reconocidos
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -8,6 +8,6 @@ loom_version=1.13-SNAPSHOT
|
|||||||
|
|
||||||
fabric_api_version=0.140.2+1.21.11
|
fabric_api_version=0.140.2+1.21.11
|
||||||
|
|
||||||
mod_version=2.4
|
mod_version=2.6
|
||||||
maven_group=me.retucio
|
maven_group=me.retucio
|
||||||
archives_base_name=sputnik
|
archives_base_name=sputnik
|
||||||
@@ -29,6 +29,7 @@ import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
|
|||||||
import me.retucio.sputnik.ui.widgets.Button;
|
import me.retucio.sputnik.ui.widgets.Button;
|
||||||
|
|
||||||
import me.retucio.sputnik.util.*;
|
import me.retucio.sputnik.util.*;
|
||||||
|
import me.retucio.sputnik.util.KeyUtil;
|
||||||
import me.retucio.sputnik.util.render.DrawUtil;
|
import me.retucio.sputnik.util.render.DrawUtil;
|
||||||
import me.retucio.sputnik.util.render.RenderUtil;
|
import me.retucio.sputnik.util.render.RenderUtil;
|
||||||
|
|
||||||
@@ -69,6 +70,11 @@ public class Sputnik implements ClientModInitializer {
|
|||||||
private Screen prevScreen;
|
private Screen prevScreen;
|
||||||
public static boolean settingsApplied = false;
|
public static boolean settingsApplied = false;
|
||||||
|
|
||||||
|
static {
|
||||||
|
// puta vida
|
||||||
|
System.setProperty("java.awt.headless", "false");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onInitializeClient() {
|
public void onInitializeClient() {
|
||||||
mc = MinecraftClient.getInstance();
|
mc = MinecraftClient.getInstance();
|
||||||
@@ -120,7 +126,6 @@ public class Sputnik implements ClientModInitializer {
|
|||||||
// se ejecuta cada vez que se presiona una tecla
|
// se ejecuta cada vez que se presiona una tecla
|
||||||
public void onKey(int key, int action) {
|
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
|
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();
|
boolean anyFocused = isAnySettingButtonFocused() || ClickGUI.INSTANCE.getSearchBar().isFocused();
|
||||||
ClickGUI.INSTANCE.setAnyFocused(anyFocused);
|
ClickGUI.INSTANCE.setAnyFocused(anyFocused);
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ public class CommandManager {
|
|||||||
|
|
||||||
public static void registerCommands() {
|
public static void registerCommands() {
|
||||||
addCommand(new BindCommand());
|
addCommand(new BindCommand());
|
||||||
|
addCommand(new ConfigCommand());
|
||||||
addCommand(new CopyScreenshotCommand());
|
addCommand(new CopyScreenshotCommand());
|
||||||
addCommand(new EnderChestCommand());
|
addCommand(new EnderChestCommand());
|
||||||
addCommand(new GarbageCleanerCommand());
|
addCommand(new GarbageCleanerCommand());
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import com.mojang.brigadier.suggestion.Suggestions;
|
|||||||
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
|
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.ModuleManager;
|
import me.retucio.sputnik.module.ModuleManager;
|
||||||
|
import me.retucio.sputnik.util.MiscUtil;
|
||||||
import net.minecraft.command.CommandSource;
|
import net.minecraft.command.CommandSource;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
|
||||||
@@ -19,6 +20,7 @@ import java.util.concurrent.CompletableFuture;
|
|||||||
public class ModuleArgumentType implements ArgumentType<Module> {
|
public class ModuleArgumentType implements ArgumentType<Module> {
|
||||||
|
|
||||||
public static final ModuleArgumentType INSTANCE = new ModuleArgumentType();
|
public static final ModuleArgumentType INSTANCE = new ModuleArgumentType();
|
||||||
|
|
||||||
private static final DynamicCommandExceptionType UNKNOWN_MODULE = new DynamicCommandExceptionType(
|
private static final DynamicCommandExceptionType UNKNOWN_MODULE = new DynamicCommandExceptionType(
|
||||||
name -> Text.literal("módulo \"" + name + "\" no encontrado"));
|
name -> Text.literal("módulo \"" + name + "\" no encontrado"));
|
||||||
|
|
||||||
@@ -35,7 +37,8 @@ public class ModuleArgumentType implements ArgumentType<Module> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) {
|
public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) {
|
||||||
return CommandSource.suggestMatching(ModuleManager.INSTANCE.getModules().stream().map(module -> module.getName().replace(" ", "_")), builder);
|
return CommandSource.suggestMatching(ModuleManager.INSTANCE.getModules()
|
||||||
|
.stream().map(module -> MiscUtil.removeAccentMarks(module.getName().replace(" ", "_"))), builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
|||||||
import me.retucio.sputnik.command.Command;
|
import me.retucio.sputnik.command.Command;
|
||||||
import me.retucio.sputnik.command.args.ModuleArgumentType;
|
import me.retucio.sputnik.command.args.ModuleArgumentType;
|
||||||
import me.retucio.sputnik.module.Module;
|
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.ChatUtil;
|
||||||
import me.retucio.sputnik.util.KeyUtil;
|
import me.retucio.sputnik.util.KeyUtil;
|
||||||
import net.minecraft.command.CommandSource;
|
import net.minecraft.command.CommandSource;
|
||||||
|
|||||||
@@ -0,0 +1,67 @@
|
|||||||
|
package me.retucio.sputnik.command.commands;
|
||||||
|
|
||||||
|
import com.mojang.brigadier.arguments.IntegerArgumentType;
|
||||||
|
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
||||||
|
import com.mojang.brigadier.context.CommandContext;
|
||||||
|
import me.retucio.sputnik.command.Command;
|
||||||
|
import me.retucio.sputnik.command.args.ModuleArgumentType;
|
||||||
|
import me.retucio.sputnik.module.setting.Setting;
|
||||||
|
import me.retucio.sputnik.ui.screen.ClickGUI;
|
||||||
|
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
|
||||||
|
import net.minecraft.command.CommandSource;
|
||||||
|
import me.retucio.sputnik.module.Module;
|
||||||
|
|
||||||
|
public class ConfigCommand extends Command {
|
||||||
|
|
||||||
|
public ConfigCommand() {
|
||||||
|
super("config", "abre el marco de ajustes de un módulo", "ajustes", "settings");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void build(LiteralArgumentBuilder<CommandSource> builder) {
|
||||||
|
builder
|
||||||
|
.then(argument("módulo", ModuleArgumentType.INSTANCE)
|
||||||
|
.executes(ctx -> {
|
||||||
|
mc.execute(() -> openSf(ctx));
|
||||||
|
return SUCCESS;
|
||||||
|
})
|
||||||
|
.then(argument("x", IntegerArgumentType.integer())
|
||||||
|
.then(argument("y", IntegerArgumentType.integer())
|
||||||
|
.executes(ctx -> {
|
||||||
|
mc.execute(() -> openSfWithPos(ctx,
|
||||||
|
ctx.getArgument("x", Integer.class),
|
||||||
|
ctx.getArgument("y", Integer.class)));
|
||||||
|
return SUCCESS;
|
||||||
|
})
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void openSf(CommandContext<CommandSource> ctx) {
|
||||||
|
Module module = ctx.getArgument("módulo", Module.class);
|
||||||
|
mc.setScreen(ClickGUI.INSTANCE);
|
||||||
|
|
||||||
|
if (ClickGUI.INSTANCE.isSettingsFrameOpen(module)) return;
|
||||||
|
|
||||||
|
SettingsFrame sf = ClickGUI.INSTANCE.getSfOfModule(module);
|
||||||
|
int x = mc.getWindow().getScaledWidth() / 2 - sf.getW() / 2;
|
||||||
|
int y = 67;
|
||||||
|
|
||||||
|
ClickGUI.INSTANCE.openSettingsFrame(module, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void openSfWithPos(CommandContext<CommandSource> ctx, int x, int y) {
|
||||||
|
Module module = ctx.getArgument("módulo", Module.class);
|
||||||
|
mc.setScreen(ClickGUI.INSTANCE);
|
||||||
|
|
||||||
|
if (ClickGUI.INSTANCE.isSettingsFrameOpen(module)) {
|
||||||
|
SettingsFrame sf = ClickGUI.INSTANCE.getSfOfModule(module);
|
||||||
|
sf.setX(x);
|
||||||
|
sf.setY(y);
|
||||||
|
}
|
||||||
|
|
||||||
|
ClickGUI.INSTANCE.openSettingsFrame(module, x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@ package me.retucio.sputnik.config;
|
|||||||
|
|
||||||
import me.retucio.sputnik.event.SubscribeEvent;
|
import me.retucio.sputnik.event.SubscribeEvent;
|
||||||
import me.retucio.sputnik.event.events.sputnik.*;
|
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 me.retucio.sputnik.ui.screen.ClickGUI;
|
||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
@@ -78,13 +78,13 @@ public class ClientConfig {
|
|||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void onCloseSettingsFrame(SettingsFrameEvent.Close event) {
|
public void onCloseSettingsFrame(SettingsFrameEvent.Close event) {
|
||||||
settingsFrames.remove(event.getFrame().module.getName());
|
settingsFrames.remove(event.getFrame().getModule().getName());
|
||||||
ConfigManager.save();
|
ConfigManager.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void onMoveSettingsFrame(SettingsFrameEvent.Move event) {
|
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();
|
ConfigManager.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,20 +5,20 @@ import com.google.gson.GsonBuilder;
|
|||||||
import me.retucio.sputnik.Sputnik;
|
import me.retucio.sputnik.Sputnik;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.ModuleManager;
|
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.Frame;
|
||||||
import me.retucio.sputnik.ui.widgets.frames.ModuleFrame;
|
import me.retucio.sputnik.ui.widgets.frames.ModuleFrame;
|
||||||
import me.retucio.sputnik.ui.screen.ClickGUI;
|
import me.retucio.sputnik.ui.screen.ClickGUI;
|
||||||
import me.retucio.sputnik.ui.widgets.frames.settings.ClientSettingsFrame;
|
import me.retucio.sputnik.ui.widgets.frames.settings.ClientSettingsFrame;
|
||||||
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
|
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
|
||||||
import me.retucio.sputnik.util.ChatUtil;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
// se ocupa de guardar, cargar y aplicar ajustes
|
// se ocupa de guardar, cargar y aplicar ajustes
|
||||||
public class ConfigManager {
|
public class ConfigManager {
|
||||||
@@ -115,10 +115,10 @@ public class ConfigManager {
|
|||||||
|
|
||||||
public static void setFramePosition(SettingsFrame frame) {
|
public static void setFramePosition(SettingsFrame frame) {
|
||||||
ensureConfig();
|
ensureConfig();
|
||||||
if (!config.settingsFrames.containsKey(frame.module.getName()))
|
if (!config.settingsFrames.containsKey(frame.getModule().getName()))
|
||||||
config.settingsFrames.put(frame.module.getName(), new int[] {frame.getX(), frame.getY()});
|
config.settingsFrames.put(frame.getModule().getName(), new int[] {frame.getX(), frame.getY()});
|
||||||
else
|
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();
|
save();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,17 +140,6 @@ public class ConfigManager {
|
|||||||
save();
|
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) {
|
public static void setSearchBarPosition(int x, int y) {
|
||||||
ensureConfig();
|
ensureConfig();
|
||||||
config.searchBarPosition = new int[] {x, y};
|
config.searchBarPosition = new int[] {x, y};
|
||||||
@@ -200,8 +189,15 @@ public class ConfigManager {
|
|||||||
private static void applySettingsFrames() {
|
private static void applySettingsFrames() {
|
||||||
config.settingsFrames.forEach((moduleName, position) -> {
|
config.settingsFrames.forEach((moduleName, position) -> {
|
||||||
Module module = ModuleManager.INSTANCE.getModuleByName(moduleName);
|
Module module = ModuleManager.INSTANCE.getModuleByName(moduleName);
|
||||||
|
|
||||||
|
if (module == null) {
|
||||||
|
Sputnik.LOGGER.warn("\"null\" como módulo (\"{}\")", moduleName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ClickGUI.INSTANCE.openSettingsFrame(module, position[0], position[1]);
|
ClickGUI.INSTANCE.openSettingsFrame(module, position[0], position[1]);
|
||||||
});
|
});
|
||||||
|
|
||||||
Sputnik.LOGGER.info("estados de marcos de ajustes aplicados");
|
Sputnik.LOGGER.info("estados de marcos de ajustes aplicados");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -248,6 +244,7 @@ public class ConfigManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ajustes de módulos
|
// ajustes de módulos
|
||||||
|
|
||||||
private static void applyBooleanSetting(BooleanSetting setting, Object value) {
|
private static void applyBooleanSetting(BooleanSetting setting, Object value) {
|
||||||
@@ -306,8 +303,14 @@ public class ConfigManager {
|
|||||||
Number b = (Number) map.get("b");
|
Number b = (Number) map.get("b");
|
||||||
Number a = (Number) map.get("a");
|
Number a = (Number) map.get("a");
|
||||||
|
|
||||||
if (r != null && g != null && b != null && a != null)
|
if (r != null && g != null && b != null && a != null) {
|
||||||
setting.setRGB(r.intValue(), g.intValue(), b.intValue(), a.intValue());
|
setting.setRGB(
|
||||||
|
r.intValue(),
|
||||||
|
g.intValue(),
|
||||||
|
b.intValue(),
|
||||||
|
a.intValue()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
applyOptionalProperty(map, "rb", Boolean.class, setting::setRainbow);
|
applyOptionalProperty(map, "rb", Boolean.class, setting::setRainbow);
|
||||||
applyOptionalProperty(map, "rs", Number.class, val -> setting.setRainbowSpeed(val.intValue()));
|
applyOptionalProperty(map, "rs", Number.class, val -> setting.setRainbowSpeed(val.intValue()));
|
||||||
@@ -321,7 +324,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);
|
Object value = map.get(key);
|
||||||
if (type.isInstance(value)) {
|
if (type.isInstance(value)) {
|
||||||
setter.accept(type.cast(value));
|
setter.accept(type.cast(value));
|
||||||
@@ -340,7 +343,7 @@ public class ConfigManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static String getSettingKey(Setting setting) {
|
private static String getSettingKey(Setting setting) {
|
||||||
return setting.getModule().getName() + ":" + setting.getName();
|
return setting.getSg().getModule().getName() + ":" + setting.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean hasLoaded() {
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-2
@@ -9,13 +9,13 @@ import net.minecraft.client.util.math.MatrixStack;
|
|||||||
/**
|
/**
|
||||||
* @see me.retucio.sputnik.mixin.WorldRendererMixin#render
|
* @see me.retucio.sputnik.mixin.WorldRendererMixin#render
|
||||||
*/
|
*/
|
||||||
public class RenderWorldEvent extends Event {
|
public class Render3DEvent extends Event {
|
||||||
|
|
||||||
private final MatrixStack matrices;
|
private final MatrixStack matrices;
|
||||||
private final RenderTickCounter tc;
|
private final RenderTickCounter tc;
|
||||||
private final Camera camera;
|
private final Camera camera;
|
||||||
|
|
||||||
public RenderWorldEvent(MatrixStack matrices, RenderTickCounter tc, Camera camera) {
|
public Render3DEvent(MatrixStack matrices, RenderTickCounter tc, Camera camera) {
|
||||||
this.matrices = matrices;
|
this.matrices = matrices;
|
||||||
this.tc = tc;
|
this.tc = tc;
|
||||||
this.camera = camera;
|
this.camera = camera;
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package me.retucio.sputnik.event.events.sputnik;
|
package me.retucio.sputnik.event.events.sputnik;
|
||||||
|
|
||||||
import me.retucio.sputnik.event.Event;
|
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
|
// se genera cada que se cambia el valor de un ajuste
|
||||||
public class UpdateSettingEvent extends Event {
|
public class UpdateSettingEvent extends Event {
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ import java.util.Iterator;
|
|||||||
|
|
||||||
import static me.retucio.sputnik.Sputnik.EVENT_BUS;
|
import static me.retucio.sputnik.Sputnik.EVENT_BUS;
|
||||||
|
|
||||||
@Mixin(BossBarHud.class)
|
|
||||||
|
@Mixin(value = BossBarHud.class)
|
||||||
public abstract class BossBarHudMixin {
|
public abstract class BossBarHudMixin {
|
||||||
|
|
||||||
@ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Ljava/util/Collection;iterator()Ljava/util/Iterator;"))
|
@ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Ljava/util/Collection;iterator()Ljava/util/Iterator;"))
|
||||||
@@ -30,7 +31,8 @@ public abstract class BossBarHudMixin {
|
|||||||
return event.getName();
|
return event.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ModifyConstant(method = "render", constant = @Constant(intValue = 9, ordinal = 1))
|
// require = 0 para meteor
|
||||||
|
@ModifyConstant(method = "render", constant = @Constant(intValue = 9, ordinal = 1), require = 0)
|
||||||
public int modifySpacingConstant(int constant) {
|
public int modifySpacingConstant(int constant) {
|
||||||
RenderBossbarEvent.BossSpacing event = EVENT_BUS.post(new RenderBossbarEvent.BossSpacing(constant));
|
RenderBossbarEvent.BossSpacing event = EVENT_BUS.post(new RenderBossbarEvent.BossSpacing(constant));
|
||||||
return event.getSpacing();
|
return event.getSpacing();
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import me.retucio.sputnik.event.events.InteractEntityEvent;
|
|||||||
import me.retucio.sputnik.event.events.PlaceBlockEvent;
|
import me.retucio.sputnik.event.events.PlaceBlockEvent;
|
||||||
import me.retucio.sputnik.module.ModuleManager;
|
import me.retucio.sputnik.module.ModuleManager;
|
||||||
import me.retucio.sputnik.module.modules.camera.Freecam;
|
import me.retucio.sputnik.module.modules.camera.Freecam;
|
||||||
|
import me.retucio.sputnik.module.modules.player.FastUse;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.network.ClientPlayNetworkHandler;
|
import net.minecraft.client.network.ClientPlayNetworkHandler;
|
||||||
import net.minecraft.client.network.ClientPlayerEntity;
|
import net.minecraft.client.network.ClientPlayerEntity;
|
||||||
@@ -16,6 +17,8 @@ import net.minecraft.util.ActionResult;
|
|||||||
import net.minecraft.util.Hand;
|
import net.minecraft.util.Hand;
|
||||||
import net.minecraft.util.hit.BlockHitResult;
|
import net.minecraft.util.hit.BlockHitResult;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
|
import org.objectweb.asm.Opcodes;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
@@ -31,8 +34,8 @@ import static me.retucio.sputnik.Sputnik.mc;
|
|||||||
@Mixin(ClientPlayerInteractionManager.class)
|
@Mixin(ClientPlayerInteractionManager.class)
|
||||||
public abstract class ClientPlayerInteractionManagerMixin {
|
public abstract class ClientPlayerInteractionManagerMixin {
|
||||||
|
|
||||||
@Shadow @Final
|
@Shadow
|
||||||
private MinecraftClient client;
|
private int blockBreakingCooldown;
|
||||||
|
|
||||||
@Unique
|
@Unique
|
||||||
Freecam freecam;
|
Freecam freecam;
|
||||||
@@ -69,4 +72,13 @@ public abstract class ClientPlayerInteractionManagerMixin {
|
|||||||
AttackEntityEvent event = EVENT_BUS.post(new AttackEntityEvent(target));
|
AttackEntityEvent event = EVENT_BUS.post(new AttackEntityEvent(target));
|
||||||
if (event.isCancelled()) ci.cancel();
|
if (event.isCancelled()) ci.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Inject(method = "updateBlockBreakingProgress", at = @At(value = "FIELD", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;blockBreakingCooldown:I"))
|
||||||
|
private void modifyBlockBreakingCooldown(BlockPos pos, Direction direction, CallbackInfoReturnable<Boolean> cir) {
|
||||||
|
FastUse fastUse = ModuleManager.INSTANCE.getModuleByClass(FastUse.class);
|
||||||
|
if (!fastUse.isEnabled() || !fastUse.mining.isEnabled()) return;
|
||||||
|
blockBreakingCooldown = fastUse.miningCooldown.getIntValue();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package me.retucio.sputnik.mixin;
|
||||||
|
|
||||||
|
import me.retucio.sputnik.Sputnik;
|
||||||
|
|
||||||
|
import me.retucio.sputnik.module.ModuleManager;
|
||||||
|
import me.retucio.sputnik.module.modules.render.Fonts;
|
||||||
|
import net.minecraft.client.font.FontManager;
|
||||||
|
import net.minecraft.client.font.FontStorage;
|
||||||
|
import net.minecraft.text.StyleSpriteSource;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
|
|
||||||
|
@Mixin(FontManager.class)
|
||||||
|
public abstract class FontManagerMixin {
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
public abstract FontStorage getStorageInternal(Identifier id);
|
||||||
|
|
||||||
|
@Inject(method = "getStorageInternal", at = @At("HEAD"), cancellable = true)
|
||||||
|
private void onGetStorageInternal(Identifier id, CallbackInfoReturnable<FontStorage> cir) {
|
||||||
|
Fonts fonts = ModuleManager.INSTANCE.getModuleByClass(Fonts.class);
|
||||||
|
if (!fonts.isEnabled()) return;
|
||||||
|
|
||||||
|
if (id.equals(StyleSpriteSource.Font.DEFAULT.id())) {
|
||||||
|
cir.setReturnValue(getStorageInternal(
|
||||||
|
Identifier.of(
|
||||||
|
Sputnik.MOD_ID,
|
||||||
|
fonts.font.getValue())
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
package me.retucio.sputnik.mixin;
|
package me.retucio.sputnik.mixin;
|
||||||
|
|
||||||
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
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.ModuleManager;
|
||||||
import me.retucio.sputnik.module.modules.misc.ChatPlus;
|
import me.retucio.sputnik.module.modules.misc.ChatPlus;
|
||||||
import me.retucio.sputnik.module.modules.camera.Freecam;
|
import me.retucio.sputnik.module.modules.camera.Freecam;
|
||||||
@@ -28,6 +30,11 @@ public abstract class InGameHudMixin {
|
|||||||
noRender = ModuleManager.INSTANCE.getModuleByClass(NoRender.class);
|
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
|
// norender
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package me.retucio.sputnik.mixin;
|
|||||||
|
|
||||||
import me.retucio.sputnik.module.ModuleManager;
|
import me.retucio.sputnik.module.ModuleManager;
|
||||||
import me.retucio.sputnik.module.modules.player.ElytraBounce;
|
import me.retucio.sputnik.module.modules.player.ElytraBounce;
|
||||||
|
import me.retucio.sputnik.module.modules.player.Step;
|
||||||
import net.minecraft.client.network.ClientPlayerEntity;
|
import net.minecraft.client.network.ClientPlayerEntity;
|
||||||
import net.minecraft.entity.LivingEntity;
|
import net.minecraft.entity.LivingEntity;
|
||||||
import net.minecraft.sound.SoundCategory;
|
import net.minecraft.sound.SoundCategory;
|
||||||
@@ -12,6 +13,7 @@ import org.spongepowered.asm.mixin.Unique;
|
|||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
import static me.retucio.sputnik.Sputnik.mc;
|
import static me.retucio.sputnik.Sputnik.mc;
|
||||||
|
|
||||||
@@ -26,7 +28,7 @@ public abstract class LivingEntityMixin {
|
|||||||
|
|
||||||
@SuppressWarnings("ConstantConditions")
|
@SuppressWarnings("ConstantConditions")
|
||||||
@Inject(method = "tickMovement", at = @At("TAIL"))
|
@Inject(method = "tickMovement", at = @At("TAIL"))
|
||||||
public void recastIfLanded(CallbackInfo ci) {
|
private void recastIfLanded(CallbackInfo ci) {
|
||||||
ElytraBounce bounce = ModuleManager.INSTANCE.getModuleByClass(ElytraBounce.class);
|
ElytraBounce bounce = ModuleManager.INSTANCE.getModuleByClass(ElytraBounce.class);
|
||||||
|
|
||||||
if (!((Object) this instanceof ClientPlayerEntity)
|
if (!((Object) this instanceof ClientPlayerEntity)
|
||||||
@@ -47,4 +49,11 @@ public abstract class LivingEntityMixin {
|
|||||||
|
|
||||||
prevElytra = elytra;
|
prevElytra = elytra;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Inject(method = "getStepHeight", at = @At("RETURN"), cancellable = true)
|
||||||
|
private void step(CallbackInfoReturnable<Float> cir) {
|
||||||
|
Step step = ModuleManager.INSTANCE.getModuleByClass(Step.class);
|
||||||
|
if (step.isEnabled()) cir.setReturnValue(step.height.getFloatValue());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -14,10 +14,9 @@ import net.minecraft.client.gui.screen.Screen;
|
|||||||
import net.minecraft.client.world.ClientWorld;
|
import net.minecraft.client.world.ClientWorld;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.Hand;
|
import net.minecraft.util.Hand;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.objectweb.asm.Opcodes;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.*;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.*;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
@@ -28,6 +27,12 @@ public abstract class MinecraftClientMixin {
|
|||||||
@Shadow
|
@Shadow
|
||||||
private int itemUseCooldown;
|
private int itemUseCooldown;
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
public int attackCooldown;
|
||||||
|
|
||||||
|
|
||||||
|
// eventos
|
||||||
|
|
||||||
@Inject(method = "tick", at = @At("HEAD"))
|
@Inject(method = "tick", at = @At("HEAD"))
|
||||||
private void onTickPre(CallbackInfo ci) {
|
private void onTickPre(CallbackInfo ci) {
|
||||||
Sputnik.INSTANCE.onTick();
|
Sputnik.INSTANCE.onTick();
|
||||||
@@ -50,9 +55,10 @@ public abstract class MinecraftClientMixin {
|
|||||||
if (event.isCancelled()) ci.cancel();
|
if (event.isCancelled()) ci.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "isTelemetryEnabledByApi", at = @At("RETURN"), cancellable = true)
|
@Inject(method = "joinWorld", at = @At("HEAD"), cancellable = true)
|
||||||
private void disableMicropenisTelemetryShi(CallbackInfoReturnable<Boolean> cir) {
|
private void onJoinWorld(ClientWorld world, CallbackInfo ci) {
|
||||||
cir.setReturnValue(false);
|
JoinWorldEvent event = Sputnik.EVENT_BUS.post(new JoinWorldEvent(world));
|
||||||
|
if (event.isCancelled()) ci.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "doItemUse", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getStackInHand(Lnet/minecraft/util/Hand;)Lnet/minecraft/item/ItemStack;"), cancellable = true)
|
@Inject(method = "doItemUse", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getStackInHand(Lnet/minecraft/util/Hand;)Lnet/minecraft/item/ItemStack;"), cancellable = true)
|
||||||
@@ -62,16 +68,21 @@ public abstract class MinecraftClientMixin {
|
|||||||
if (event.isCancelled()) ci.cancel();
|
if (event.isCancelled()) ci.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// telemetría
|
||||||
|
|
||||||
|
@Inject(method = "isTelemetryEnabledByApi", at = @At("RETURN"), cancellable = true)
|
||||||
|
private void disableMicropenisTelemetryShi(CallbackInfoReturnable<Boolean> cir) {
|
||||||
|
cir.setReturnValue(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// precoz
|
||||||
|
|
||||||
@Inject(method = "doItemUse", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isItemEnabled(Lnet/minecraft/resource/featuretoggle/FeatureSet;)Z"))
|
@Inject(method = "doItemUse", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isItemEnabled(Lnet/minecraft/resource/featuretoggle/FeatureSet;)Z"))
|
||||||
private void modifyItemUseCooldown(CallbackInfo ci, @Local ItemStack stack) {
|
private void modifyItemUseCooldown(CallbackInfo ci, @Local ItemStack stack) {
|
||||||
FastUse fastUse = ModuleManager.INSTANCE.getModuleByClass(FastUse.class);
|
FastUse fastUse = ModuleManager.INSTANCE.getModuleByClass(FastUse.class);
|
||||||
if (!fastUse.isEnabled()) return;
|
if (!fastUse.isEnabled()) return;
|
||||||
itemUseCooldown = fastUse.getCooldown(stack);
|
itemUseCooldown = fastUse.getCooldown(stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "joinWorld", at = @At("HEAD"), cancellable = true)
|
|
||||||
private void onJoinWorld(ClientWorld world, CallbackInfo ci) {
|
|
||||||
JoinWorldEvent event = Sputnik.EVENT_BUS.post(new JoinWorldEvent(world));
|
|
||||||
if (event.isCancelled()) ci.cancel();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
package me.retucio.sputnik.mixin;
|
package me.retucio.sputnik.mixin;
|
||||||
|
|
||||||
|
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
||||||
import com.llamalad7.mixinextras.sugar.Local;
|
import com.llamalad7.mixinextras.sugar.Local;
|
||||||
import com.mojang.blaze3d.buffers.GpuBufferSlice;
|
import com.mojang.blaze3d.buffers.GpuBufferSlice;
|
||||||
import me.retucio.sputnik.Sputnik;
|
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.ModuleManager;
|
||||||
import me.retucio.sputnik.module.modules.render.BlockOutline;
|
import me.retucio.sputnik.module.modules.render.BlockOutline;
|
||||||
import me.retucio.sputnik.module.modules.camera.Freecam;
|
import me.retucio.sputnik.module.modules.camera.Freecam;
|
||||||
@@ -18,13 +19,12 @@ import net.minecraft.util.profiler.Profiler;
|
|||||||
import org.joml.Matrix4f;
|
import org.joml.Matrix4f;
|
||||||
import org.joml.Vector4f;
|
import org.joml.Vector4f;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.*;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.ModifyArg;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
import static me.retucio.sputnik.Sputnik.EVENT_BUS;
|
import static me.retucio.sputnik.Sputnik.EVENT_BUS;
|
||||||
import static me.retucio.sputnik.Sputnik.mc;
|
import static me.retucio.sputnik.Sputnik.mc;
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ public abstract class WorldRendererMixin {
|
|||||||
matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(camera.getYaw() + 180f));
|
matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(camera.getYaw() + 180f));
|
||||||
|
|
||||||
profiler.push(Sputnik.MOD_ID + "-3d");
|
profiler.push(Sputnik.MOD_ID + "-3d");
|
||||||
EVENT_BUS.post(new RenderWorldEvent(matrices, tickCounter, camera));
|
EVENT_BUS.post(new Render3DEvent(matrices, tickCounter, camera));
|
||||||
|
|
||||||
profiler.pop();
|
profiler.pop();
|
||||||
matrices.pop();
|
matrices.pop();
|
||||||
@@ -66,11 +66,18 @@ public abstract class WorldRendererMixin {
|
|||||||
if (!noRender.blindnessEffect.isEnabled() || !noRender.darknessEffect.isEnabled()) cir.setReturnValue(null);
|
if (!noRender.blindnessEffect.isEnabled() || !noRender.darknessEffect.isEnabled()) cir.setReturnValue(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Redirect(method = "renderTargetBlockOutline", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/ColorHelper;toAlpha(I)I"))
|
|
||||||
private int modifyBlockOutlineColor(int alpha) {
|
|
||||||
BlockOutline outline = ModuleManager.INSTANCE.getModuleByClass(BlockOutline.class);
|
|
||||||
if (!outline.isEnabled()) return ColorHelper.toAlpha(alpha);
|
|
||||||
|
|
||||||
|
@ModifyArg(method = "renderTargetBlockOutline", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;drawBlockOutline(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;DDDLnet/minecraft/client/render/state/OutlineRenderState;IF)V"))
|
||||||
|
private int modifyBlockOutlineColor(int original) {
|
||||||
|
BlockOutline outline = ModuleManager.INSTANCE.getModuleByClass(BlockOutline.class);
|
||||||
|
if (!outline.isEnabled()) return original;
|
||||||
return outline.color.getRGB();
|
return outline.color.getRGB();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ModifyArg(method = "renderTargetBlockOutline", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;drawBlockOutline(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;DDDLnet/minecraft/client/render/state/OutlineRenderState;IF)V"))
|
||||||
|
private float modifyBlockOutlineLineWidth(float original) {
|
||||||
|
BlockOutline outline = ModuleManager.INSTANCE.getModuleByClass(BlockOutline.class);
|
||||||
|
if (!outline.isEnabled()) return original;
|
||||||
|
return outline.lineWidth.getFloatValue();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -4,10 +4,11 @@ import me.retucio.sputnik.Sputnik;
|
|||||||
import me.retucio.sputnik.config.ConfigManager;
|
import me.retucio.sputnik.config.ConfigManager;
|
||||||
import me.retucio.sputnik.event.SubscribeEvent;
|
import me.retucio.sputnik.event.SubscribeEvent;
|
||||||
import me.retucio.sputnik.event.events.sputnik.ToggleModuleEvent;
|
import me.retucio.sputnik.event.events.sputnik.ToggleModuleEvent;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||||
import me.retucio.sputnik.module.settings.EnumSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.KeySetting;
|
import me.retucio.sputnik.module.setting.settings.EnumSetting;
|
||||||
import me.retucio.sputnik.module.settings.Setting;
|
import me.retucio.sputnik.module.setting.settings.KeySetting;
|
||||||
|
import me.retucio.sputnik.module.setting.Setting;
|
||||||
import me.retucio.sputnik.util.ChatUtil;
|
import me.retucio.sputnik.util.ChatUtil;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
@@ -15,6 +16,7 @@ import org.lwjgl.glfw.GLFW;
|
|||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
// clase base para los módulos
|
// clase base para los módulos
|
||||||
public class Module {
|
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 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);
|
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();
|
protected MinecraftClient mc = MinecraftClient.getInstance();
|
||||||
|
|
||||||
|
|
||||||
public Module(String name, String description, Category category) {
|
public Module(String name, String description, Category category) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.description = description;
|
this.description = description;
|
||||||
this.category = category;
|
this.category = category;
|
||||||
addSettings(bind, keyMode, notify);
|
sgGeneral.addAll(bind, keyMode, notify);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Module(String name, String description, Category category, int key) {
|
public Module(String name, String description, Category category, int key) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.description = description;
|
this.description = description;
|
||||||
this.category = category;
|
this.category = category;
|
||||||
addSettings(bind, keyMode, notify);
|
sgGeneral.addAll(bind, keyMode, notify);
|
||||||
this.bind.setDefaultKey(key);
|
this.bind.setDefaultKey(key);
|
||||||
|
|
||||||
// puto marcos
|
// puto marcos
|
||||||
@@ -57,22 +61,34 @@ public class Module {
|
|||||||
this.bind.setKey(key);
|
this.bind.setKey(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ajustes
|
// 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() {
|
public List<Setting> getSettings() {
|
||||||
|
List<Setting> settings = new ArrayList<>();
|
||||||
|
sgs.forEach(sg -> sg.forEach(settings::add));
|
||||||
return settings;
|
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
|
// encendido y apagado del módulo
|
||||||
public void toggle() {
|
public void toggle() {
|
||||||
@@ -100,9 +116,8 @@ public class Module {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// otros métodos
|
// tick (ejecutado 20 veces por segundo)
|
||||||
public void onTick() {}
|
public void onTick() {}
|
||||||
public void onKey(int key, int action) {}
|
|
||||||
|
|
||||||
// getters y setters
|
// getters y setters
|
||||||
public String getName() {
|
public String getName() {
|
||||||
|
|||||||
@@ -2,14 +2,15 @@ package me.retucio.sputnik.module;
|
|||||||
|
|
||||||
import me.retucio.sputnik.Sputnik;
|
import me.retucio.sputnik.Sputnik;
|
||||||
import me.retucio.sputnik.event.SubscribeEvent;
|
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.client.HUD;
|
||||||
|
import me.retucio.sputnik.module.modules.camera.*;
|
||||||
import me.retucio.sputnik.module.modules.misc.*;
|
import me.retucio.sputnik.module.modules.misc.*;
|
||||||
import me.retucio.sputnik.module.modules.network.*;
|
import me.retucio.sputnik.module.modules.network.*;
|
||||||
import me.retucio.sputnik.module.modules.player.*;
|
import me.retucio.sputnik.module.modules.player.*;
|
||||||
import me.retucio.sputnik.module.modules.render.*;
|
import me.retucio.sputnik.module.modules.render.*;
|
||||||
import me.retucio.sputnik.module.modules.render.CritsPlus;
|
import me.retucio.sputnik.module.modules.render.CritsPlus;
|
||||||
import me.retucio.sputnik.module.modules.world.*;
|
import me.retucio.sputnik.module.modules.world.*;
|
||||||
|
import me.retucio.sputnik.util.MiscUtil;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -47,6 +48,7 @@ public class ModuleManager {
|
|||||||
modules.add(new ElytraBounce());
|
modules.add(new ElytraBounce());
|
||||||
modules.add(new FakePlayer());
|
modules.add(new FakePlayer());
|
||||||
modules.add(new FastUse());
|
modules.add(new FastUse());
|
||||||
|
modules.add(new Fonts());
|
||||||
modules.add(new Freecam());
|
modules.add(new Freecam());
|
||||||
modules.add(new Freelook());
|
modules.add(new Freelook());
|
||||||
modules.add(new Fullbright());
|
modules.add(new Fullbright());
|
||||||
@@ -62,15 +64,18 @@ public class ModuleManager {
|
|||||||
modules.add(new NoRender());
|
modules.add(new NoRender());
|
||||||
modules.add(new Offhand());
|
modules.add(new Offhand());
|
||||||
modules.add(new PacketDelay());
|
modules.add(new PacketDelay());
|
||||||
|
modules.add(new Particles());
|
||||||
modules.add(new PerspectivePlus());
|
modules.add(new PerspectivePlus());
|
||||||
modules.add(new PortalGUI());
|
modules.add(new PortalGUI());
|
||||||
modules.add(new Racist());
|
modules.add(new Racist());
|
||||||
modules.add(new Reconnect());
|
modules.add(new Reconnect());
|
||||||
|
modules.add(new ReverseStep());
|
||||||
modules.add(new Rotations());
|
modules.add(new Rotations());
|
||||||
modules.add(new RPackBypass());
|
modules.add(new RPackBypass());
|
||||||
modules.add(new SafeWalk());
|
modules.add(new SafeWalk());
|
||||||
modules.add(new ScreenshotPlus());
|
modules.add(new ScreenshotPlus());
|
||||||
modules.add(new ShulkerPeek());
|
modules.add(new ShulkerPeek());
|
||||||
|
modules.add(new Step());
|
||||||
modules.add(new TimeChanger());
|
modules.add(new TimeChanger());
|
||||||
modules.add(new UIMove());
|
modules.add(new UIMove());
|
||||||
modules.add(new WarnLowDurability());
|
modules.add(new WarnLowDurability());
|
||||||
@@ -105,7 +110,8 @@ public class ModuleManager {
|
|||||||
|
|
||||||
public Module getModuleByName(String name) {
|
public Module getModuleByName(String name) {
|
||||||
for (Module module : modules)
|
for (Module module : modules)
|
||||||
if (module.getName().equalsIgnoreCase(name)) return module;
|
if (MiscUtil.removeAccentMarks(module.getName()).equalsIgnoreCase(name))
|
||||||
|
return module;
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,9 +5,10 @@ import me.retucio.sputnik.event.SubscribeEvent;
|
|||||||
import me.retucio.sputnik.event.events.*;
|
import me.retucio.sputnik.event.events.*;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||||
import me.retucio.sputnik.module.settings.KeySetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.NumberSetting;
|
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.ChatUtil;
|
||||||
import me.retucio.sputnik.util.KeyUtil;
|
import me.retucio.sputnik.util.KeyUtil;
|
||||||
import me.retucio.sputnik.util.MiscUtil;
|
import me.retucio.sputnik.util.MiscUtil;
|
||||||
@@ -41,21 +42,22 @@ import org.lwjgl.glfw.GLFW;
|
|||||||
public class Freecam extends Module {
|
public class Freecam extends Module {
|
||||||
|
|
||||||
// ajustes
|
// 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 toggleOnDamage = sgGeneral.add(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 reloadChunks = sgGeneral.add(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 renderHands = sgGeneral.add(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 stayCrouching = sgGeneral.add(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 staticView = sgGeneral.add(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 cancelActionPackets = sgGeneral.add(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 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",
|
"velocidad", "velocidad de movimiento de la cámara",
|
||||||
1, 0, 10, 0.2));
|
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 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 = addSetting(new NumberSetting(
|
public NumberSetting scrollSens = sgSpeed.add(new NumberSetting(
|
||||||
"sensibilidad del scroll", "sensibilidad de la rueda del ratón para modificar la velocidad, 0 para desactivar",
|
"sensibilidad del scroll", "sensibilidad de la rueda del ratón para modificar la velocidad, 0 para desactivar",
|
||||||
1, 0, 2, 0.1));
|
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.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.EnumSetting;
|
import me.retucio.sputnik.module.setting.settings.EnumSetting;
|
||||||
import me.retucio.sputnik.module.settings.NumberSetting;
|
import me.retucio.sputnik.module.setting.settings.NumberSetting;
|
||||||
import me.retucio.sputnik.util.KeyUtil;
|
import me.retucio.sputnik.util.KeyUtil;
|
||||||
import net.minecraft.client.option.Perspective;
|
import net.minecraft.client.option.Perspective;
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
@@ -16,13 +16,13 @@ import org.lwjgl.glfw.GLFW;
|
|||||||
|
|
||||||
public class Freelook extends Module {
|
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));
|
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));
|
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));
|
0.1, 0, 2, 0.05));
|
||||||
|
|
||||||
private float yaw;
|
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.mixin.accessor.StatusEffectInstanceAccessor;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.ColorSetting;
|
import me.retucio.sputnik.module.setting.settings.ColorSetting;
|
||||||
import me.retucio.sputnik.module.settings.EnumSetting;
|
import me.retucio.sputnik.module.setting.settings.EnumSetting;
|
||||||
import net.minecraft.entity.effect.StatusEffectInstance;
|
import net.minecraft.entity.effect.StatusEffectInstance;
|
||||||
import net.minecraft.entity.effect.StatusEffects;
|
import net.minecraft.entity.effect.StatusEffects;
|
||||||
import net.minecraft.registry.Registries;
|
import net.minecraft.registry.Registries;
|
||||||
@@ -18,9 +18,9 @@ import java.awt.*;
|
|||||||
|
|
||||||
public class Fullbright extends Module {
|
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() {
|
public Fullbright() {
|
||||||
super("brilli brilli",
|
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.event.events.PerspectiveChangeEvent;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
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 me.retucio.sputnik.util.KeyUtil;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
// continúa en CameraMixin
|
// continúa en CameraMixin
|
||||||
public class PerspectivePlus extends Module {
|
public class PerspectivePlus extends Module {
|
||||||
|
|
||||||
private double distance;
|
|
||||||
|
|
||||||
// ajustes
|
// 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));
|
"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",
|
"distancia", "distancia a la que está la cámara del jugador por defecto",
|
||||||
4, 1, 20, 0.2));
|
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)",
|
"sensibilidad del scroll", "sensibilidad de la rueda del ratón (0 para desactivar)",
|
||||||
1, 0, 8, 0.1));
|
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() {
|
public PerspectivePlus() {
|
||||||
super("perspectiva plus",
|
super("perspectiva plus",
|
||||||
|
|||||||
@@ -4,17 +4,17 @@ import me.retucio.sputnik.event.SubscribeEvent;
|
|||||||
import me.retucio.sputnik.event.events.ChangeRotationEvent;
|
import me.retucio.sputnik.event.events.ChangeRotationEvent;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.NumberSetting;
|
import me.retucio.sputnik.module.setting.settings.NumberSetting;
|
||||||
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket;
|
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket;
|
||||||
|
|
||||||
public class Rotations extends Module {
|
public class Rotations extends Module {
|
||||||
|
|
||||||
public NumberSetting yaw = addSetting(new NumberSetting("guiñada", "eje vertical - giro horizontal (yaw)", 0, -180, 180, 1));
|
public NumberSetting yaw = sgGeneral.add(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 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 smooth = sgGeneral.add(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 serverSide = sgGeneral.add(new BooleanSetting("serverside", "espamea paquetes de rotación al servidor", false));
|
||||||
|
|
||||||
public Rotations() {
|
public Rotations() {
|
||||||
super("rotaciones",
|
super("rotaciones",
|
||||||
|
|||||||
@@ -5,30 +5,34 @@ import me.retucio.sputnik.event.events.GetFOVEvent;
|
|||||||
import me.retucio.sputnik.event.events.MouseScrollEvent;
|
import me.retucio.sputnik.event.events.MouseScrollEvent;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||||
import me.retucio.sputnik.module.settings.KeySetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.NumberSetting;
|
import me.retucio.sputnik.module.setting.settings.KeySetting;
|
||||||
|
import me.retucio.sputnik.module.setting.settings.NumberSetting;
|
||||||
import me.retucio.sputnik.util.KeyUtil;
|
import me.retucio.sputnik.util.KeyUtil;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
// continúa en GameRendererMixin
|
// continúa en GameRendererMixin
|
||||||
public class Zoom extends Module {
|
public class Zoom extends Module {
|
||||||
|
|
||||||
public BooleanSetting showHands = addSetting(new BooleanSetting("mostrar manos", "esconde o muestra las manos al hacer zoom", true));
|
SettingGroup sgVisual = addSg(new SettingGroup("visual", true));
|
||||||
public BooleanSetting showHUD = addSetting(new BooleanSetting("mostrar HUD", "esconde o muestra los indicadores en pantalla", 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)",
|
public NumberSetting defaultZoom = sgGeneral.add(new NumberSetting("zoom", "cantidad de zoom",
|
||||||
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",
|
|
||||||
6, 1, 10, 0.1));
|
6, 1, 10, 0.1));
|
||||||
|
|
||||||
public NumberSetting mouseSensMultiplier = addSetting(new NumberSetting("sensibilidad", "multiplicador de la sensibilidad del ratón",
|
public BooleanSetting showHands = sgVisual.add(new BooleanSetting("mostrar manos", "esconde o muestra las manos al hacer zoom", true));
|
||||||
0.4, 0, 1, 0.05));
|
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 boolean prevSmoothCam;
|
||||||
private double prevMouseSens;
|
private double prevMouseSens;
|
||||||
|
|||||||
@@ -9,10 +9,11 @@ import me.retucio.sputnik.module.Category;
|
|||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.ModuleManager;
|
import me.retucio.sputnik.module.ModuleManager;
|
||||||
import me.retucio.sputnik.module.modules.misc.ChatPlus;
|
import me.retucio.sputnik.module.modules.misc.ChatPlus;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||||
import me.retucio.sputnik.module.settings.ColorSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.NumberSetting;
|
import me.retucio.sputnik.module.setting.settings.ColorSetting;
|
||||||
import me.retucio.sputnik.module.settings.StringSetting;
|
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.ChatUtil;
|
||||||
import me.retucio.sputnik.util.Colors;
|
import me.retucio.sputnik.util.Colors;
|
||||||
import org.lwjgl.glfw.GLFW;
|
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)
|
// módulo no visible solo para los ajustes de la interfaz (y del cliente en general)
|
||||||
public class GUI extends Module {
|
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));
|
new Color(70, 20, 210, 230), false));
|
||||||
|
|
||||||
// números negativos para deslizamiento inverso, 0 para desactivar
|
// 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));
|
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 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 = addSetting(new BooleanSetting("distinguir mayúsculas", "la búsqueda es sensible a mayúsculas y minúsculas", false));
|
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
|
// ^^^ 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 BooleanSetting blur = sgUi.add(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 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 commandPrefix = sgChat.add(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 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() {
|
public GUI() {
|
||||||
super("interfaz",
|
super("interfaz",
|
||||||
|
|||||||
@@ -2,7 +2,8 @@ package me.retucio.sputnik.module.modules.client;
|
|||||||
|
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
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.HudElement;
|
||||||
import me.retucio.sputnik.ui.hud.HudRenderer;
|
import me.retucio.sputnik.ui.hud.HudRenderer;
|
||||||
import me.retucio.sputnik.ui.hud.HudEditorScreen;
|
import me.retucio.sputnik.ui.hud.HudEditorScreen;
|
||||||
@@ -19,21 +20,25 @@ import java.awt.*;
|
|||||||
|
|
||||||
public class HUD extends Module {
|
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
|
// 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
|
// 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));
|
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 shadow = sgDisplay.add(new BooleanSetting("sombra", "texto con sombra", true));
|
||||||
public BooleanSetting showOnChat = addSetting(new BooleanSetting("mostrar en chat", "renderizar HUD en la pantalla del chat", false));
|
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 = sgElements.add(new NumberSetting("zona horaria", "zona horaria en UTC+n", 1, -6, 6, 1));
|
||||||
public NumberSetting timezone = addSetting(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 EnumSetting<TimeFormat> timeFormat = addSetting(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 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 = sgElements.add(new EnumSetting<>("modo de coordenadas", "qué coordenadas mostrar", CoordsMode.class, CoordsMode.OVERWORLD));
|
||||||
public EnumSetting<CoordsMode> coordsMode = addSetting(new EnumSetting<>("modo de coordenadas", "qué coordenadas mostrar", CoordsMode.class, CoordsMode.OVERWORLD));
|
public EnumSetting<Dynosaurs> dyno = sgElements.add(new EnumSetting<>("dinosaurio", "qué dinosaurio mostrar",
|
||||||
public EnumSetting<Dynosaurs> dyno = addSetting(new EnumSetting<>("dinosaurio", "qué dinosaurio mostrar",
|
|
||||||
Dynosaurs.class, Dynosaurs.SPINOSAURUS));
|
Dynosaurs.class, Dynosaurs.SPINOSAURUS));
|
||||||
|
|
||||||
public HUD() {
|
public HUD() {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package me.retucio.sputnik.module.modules.misc;
|
|||||||
import me.retucio.sputnik.mixin.accessor.AnvilScreenAccessor;
|
import me.retucio.sputnik.mixin.accessor.AnvilScreenAccessor;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
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.screen.ingame.AnvilScreen;
|
||||||
import net.minecraft.client.gui.widget.TextFieldWidget;
|
import net.minecraft.client.gui.widget.TextFieldWidget;
|
||||||
|
|
||||||
@@ -17,7 +17,7 @@ import java.util.Map;
|
|||||||
|
|
||||||
public class AnvilFont extends Module {
|
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));
|
FontMode.class, FontMode.NORMAL));
|
||||||
|
|
||||||
String text;
|
String text;
|
||||||
|
|||||||
@@ -4,21 +4,41 @@ import me.retucio.sputnik.event.events.RenderBossbarEvent;
|
|||||||
import me.retucio.sputnik.event.SubscribeEvent;
|
import me.retucio.sputnik.event.SubscribeEvent;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||||
import me.retucio.sputnik.module.settings.NumberSetting;
|
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 net.minecraft.client.gui.hud.ClientBossBar;
|
import net.minecraft.client.gui.hud.ClientBossBar;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.util.Formatting;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.WeakHashMap;
|
import java.util.WeakHashMap;
|
||||||
|
|
||||||
public class BossbarStack extends Module {
|
public class BossbarStack extends Module {
|
||||||
|
|
||||||
public BooleanSetting stackBars = addSetting(new BooleanSetting("apilar barras", "apilar las bossbars", true));
|
public BooleanSetting stackBars = sgGeneral.add(new BooleanSetting(
|
||||||
public BooleanSetting hideNames = addSetting(new BooleanSetting("esconder nombres", "no renderiza el nombre de los bosses", false));
|
"apilar barras", "apilar las bossbars",
|
||||||
public NumberSetting spaceReduction = addSetting(new NumberSetting("reducción de espacio", "cuánto reducir el espacio entre bossbars",
|
true
|
||||||
0, 0, 10, 0.1));
|
));
|
||||||
|
|
||||||
|
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<>();
|
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.event.events.SendMessageEvent;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||||
import me.retucio.sputnik.module.settings.NumberSetting;
|
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.ChatUtil;
|
||||||
import me.retucio.sputnik.util.interfaces.IChatHudLine;
|
import me.retucio.sputnik.util.interfaces.IChatHudLine;
|
||||||
import me.retucio.sputnik.util.interfaces.IChatHudLineVisible;
|
import me.retucio.sputnik.util.interfaces.IChatHudLineVisible;
|
||||||
@@ -43,15 +44,17 @@ import java.util.regex.Pattern;
|
|||||||
public class ChatPlus extends Module {
|
public class ChatPlus extends Module {
|
||||||
|
|
||||||
// ajustes
|
// ajustes
|
||||||
public BooleanSetting timestamps = addSetting(new BooleanSetting("sello de tiempo", "muestra a qué hora se ha enviado un mensaje", true));
|
SettingGroup sgChat = addSg(new SettingGroup("funcionamiento del chat", 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));
|
|
||||||
|
|
||||||
public BooleanSetting keepHistory = addSetting(new BooleanSetting("no borrar chat", "no borrar el chat tras desconectarse", true));
|
public BooleanSetting timestamps = sgGeneral.add(new BooleanSetting("sello de tiempo", "muestra a qué hora se ha enviado un mensaje", true));
|
||||||
public BooleanSetting logger = addSetting(new BooleanSetting("registro", "evita que se borre el chat de un server", true));
|
public BooleanSetting timestampSecs = sgGeneral.add(new BooleanSetting("mostrar segundos", "muestra segundos también en el sello de tiempo", false));
|
||||||
public BooleanSetting noCharLimit = addSetting(new BooleanSetting("quitar límite de caracteres", "te deja escribir mensajes tan largos como desees", false));
|
public BooleanSetting showHeads = sgGeneral.add(new BooleanSetting("cabezas", "muestra la cabeza del jugador junto a su mensaje", true));
|
||||||
public NumberSetting chatHistoryExtraLength = addSetting(new NumberSetting("expandir chat", "cuántas líneas añadir al historial del chat",
|
|
||||||
|
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));
|
0, 0, 1000, 1));
|
||||||
|
|
||||||
public ChatPlus() {
|
public ChatPlus() {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package me.retucio.sputnik.module.modules.misc;
|
|||||||
import com.mojang.authlib.GameProfile;
|
import com.mojang.authlib.GameProfile;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
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.client.network.OtherClientPlayerEntity;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
@@ -12,7 +12,7 @@ import java.util.UUID;
|
|||||||
|
|
||||||
public class FakePlayer extends Module {
|
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;
|
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.event.events.ClientClickEvent;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||||
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.ChatUtil;
|
import me.retucio.sputnik.util.ChatUtil;
|
||||||
import net.minecraft.client.texture.NativeImage;
|
import net.minecraft.client.texture.NativeImage;
|
||||||
import net.minecraft.text.ClickEvent;
|
import net.minecraft.text.ClickEvent;
|
||||||
@@ -30,14 +31,16 @@ import java.io.IOException;
|
|||||||
|
|
||||||
public class ScreenshotPlus extends Module {
|
public class ScreenshotPlus extends Module {
|
||||||
|
|
||||||
public BooleanSetting saveButton = addSetting(new BooleanSetting("botón de guardar", "mostrar botón para guardar la captura localmente", true));
|
SettingGroup sgButtons = addSg(new SettingGroup("botones", 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));
|
|
||||||
|
|
||||||
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));
|
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 NativeImage screenshot;
|
||||||
private File screenshotFile;
|
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.mixin.accessor.HandledScreenAccessor;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.KeySetting;
|
import me.retucio.sputnik.module.setting.settings.KeySetting;
|
||||||
import me.retucio.sputnik.ui.screen.PreviewScreen;
|
import me.retucio.sputnik.ui.screen.PreviewScreen;
|
||||||
import me.retucio.sputnik.util.ChatUtil;
|
import me.retucio.sputnik.util.ChatUtil;
|
||||||
import me.retucio.sputnik.util.Colors;
|
import me.retucio.sputnik.util.Colors;
|
||||||
@@ -29,8 +29,8 @@ import java.util.HashMap;
|
|||||||
|
|
||||||
public class ShulkerPeek extends Module {
|
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 KeySetting previewKey = sgGeneral.add(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 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<>();
|
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.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
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;
|
import me.retucio.sputnik.util.ChatUtil;
|
||||||
|
|
||||||
public class BungeecordSpoofer extends Module {
|
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() {
|
public BungeecordSpoofer() {
|
||||||
super("spoofer de bungeecord",
|
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.SubscribeEvent;
|
||||||
import me.retucio.sputnik.event.events.AddEntityEvent;
|
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.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.ModuleManager;
|
import me.retucio.sputnik.module.ModuleManager;
|
||||||
import me.retucio.sputnik.module.modules.misc.FakePlayer;
|
import me.retucio.sputnik.module.modules.misc.FakePlayer;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||||
import me.retucio.sputnik.module.settings.ColorSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.NumberSetting;
|
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.MiscUtil;
|
||||||
import me.retucio.sputnik.util.render.RenderUtil;
|
import me.retucio.sputnik.util.render.RenderUtil;
|
||||||
import net.minecraft.client.network.OtherClientPlayerEntity;
|
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
|
// lógica sutilmente robada de MeteorClient porque la mía era una mierda
|
||||||
public class LogoutSpots extends Module {
|
public class LogoutSpots extends Module {
|
||||||
|
|
||||||
public BooleanSetting outlines = addSetting(new BooleanSetting("contorno", "renderizar contorno de la caja (lados)", true));
|
SettingGroup sgOutlines = addSg(new SettingGroup("contorno", true));
|
||||||
public ColorSetting outlineColor = addSetting(new ColorSetting("color del contorno", "Color de las líneas", new Color(255, 0, 0, 230), false));
|
SettingGroup sgFilling = addSg(new SettingGroup("relleno", true));
|
||||||
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 sgMisc = addSg(new SettingGroup("misc.", true));
|
||||||
|
|
||||||
public BooleanSetting filling = addSetting(new BooleanSetting("relleno", "renderizar relleno de la caja (caras)", true));
|
public BooleanSetting outlines = sgOutlines.add(new BooleanSetting("contorno", "renderizar contorno de la caja (lados)", true));
|
||||||
public ColorSetting fillingColor = addSetting(new ColorSetting("color del relleno", "Color de los lados", new Color(230, 0, 0, 55), false));
|
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<LogoutEntry> players = new ArrayList<>();
|
||||||
private final List<PlayerListEntry> lastPlayerList = new ArrayList<>();
|
private final List<PlayerListEntry> lastPlayerList = new ArrayList<>();
|
||||||
@@ -165,7 +170,7 @@ public class LogoutSpots extends Module {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void onWorldRender(RenderWorldEvent event) {
|
public void onWorldRender(Render3DEvent event) {
|
||||||
if (mc.player == null || mc.world == null) return;
|
if (mc.player == null || mc.world == null) return;
|
||||||
|
|
||||||
for (LogoutEntry entry : players)
|
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.event.events.PacketEvent;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.EnumSetting;
|
import me.retucio.sputnik.module.setting.settings.EnumSetting;
|
||||||
import me.retucio.sputnik.module.settings.NumberSetting;
|
import me.retucio.sputnik.module.setting.settings.NumberSetting;
|
||||||
import me.retucio.sputnik.util.ChatUtil;
|
import me.retucio.sputnik.util.ChatUtil;
|
||||||
import me.retucio.sputnik.util.NetworkUtil;
|
import me.retucio.sputnik.util.NetworkUtil;
|
||||||
|
|
||||||
@@ -22,10 +22,10 @@ import java.util.concurrent.CopyOnWriteArrayList;
|
|||||||
|
|
||||||
public class PacketDelay extends Module {
|
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 NumberSetting delay = sgGeneral.add(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 EnumSetting<Directions> directions = sgGeneral.add(new EnumSetting<>("dirección", "dirección de los paquetes a los que añadir delay",
|
||||||
Directions.class, Directions.BOTH));
|
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));
|
Packets.class, Packets.ALL));
|
||||||
|
|
||||||
private final List<DelayedPacket> delayedPackets = new CopyOnWriteArrayList<>();
|
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.event.events.AttackEntityEvent;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.NumberSetting;
|
import me.retucio.sputnik.module.setting.settings.NumberSetting;
|
||||||
|
|
||||||
public class AttributeSwapper extends Module {
|
public class AttributeSwapper extends Module {
|
||||||
|
|
||||||
public NumberSetting slot = addSetting(new NumberSetting("slot", "slot al que cambiar", 1, 1, 9, 1));
|
public NumberSetting slot = sgGeneral.add(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 BooleanSetting swap = sgGeneral.add(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 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 delay = 0;
|
||||||
private int prevSlot = -1;
|
private int prevSlot = -1;
|
||||||
|
|||||||
@@ -4,11 +4,11 @@ import me.retucio.sputnik.cape.Cape;
|
|||||||
import me.retucio.sputnik.cape.CapeManager;
|
import me.retucio.sputnik.cape.CapeManager;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
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 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")));
|
CapeManager.INSTANCE.getCapes(), CapeManager.INSTANCE.getCape("hollow-knight")));
|
||||||
|
|
||||||
public Capes() {
|
public Capes() {
|
||||||
|
|||||||
@@ -2,23 +2,64 @@ package me.retucio.sputnik.module.modules.player;
|
|||||||
|
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.NumberSetting;
|
import me.retucio.sputnik.module.setting.settings.NumberSetting;
|
||||||
import net.minecraft.item.BlockItem;
|
import net.minecraft.item.BlockItem;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
public class FastUse extends Module {
|
public class FastUse extends Module {
|
||||||
|
|
||||||
public BooleanSetting items = addSetting(new BooleanSetting("items", "usar items precozmente", true));
|
public BooleanSetting items = sgGeneral.add(new BooleanSetting(
|
||||||
public NumberSetting itemCooldown = addSetting(new NumberSetting("cooldown de items", "cooldown para usar items en ticks", 0, 0, 4, 1));
|
"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 = 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 BooleanSetting mining = sgGeneral.add(new BooleanSetting(
|
||||||
|
"minar",
|
||||||
|
"minar precozmente",
|
||||||
|
true
|
||||||
|
));
|
||||||
|
|
||||||
|
public NumberSetting miningCooldown = sgGeneral.add(new NumberSetting(
|
||||||
|
"cooldown al minar",
|
||||||
|
"cooldown entre rotura de bloques en ticks",
|
||||||
|
5, 0, 20, 1
|
||||||
|
));
|
||||||
|
|
||||||
public BooleanSetting blocks = addSetting(new BooleanSetting("bloques", "colocar bloques precozmente", true));
|
|
||||||
public NumberSetting blockCooldown = addSetting(new NumberSetting("cooldown de bloques", "cooldown para colocar bloques en ticks", 0, 0, 4, 1));
|
|
||||||
|
|
||||||
public FastUse() {
|
public FastUse() {
|
||||||
super("precoz",
|
super("precoz",
|
||||||
"hace cosas como usar items o colocar bloques más rápido",
|
"hace cosas como usar items o colocar bloques más rápido",
|
||||||
Category.PLAYER);
|
Category.PLAYER,
|
||||||
|
GLFW.GLFW_KEY_F6);
|
||||||
|
|
||||||
items.onUpdate(v -> itemCooldown.setVisible(v));
|
items.onUpdate(v -> itemCooldown.setVisible(v));
|
||||||
blocks.onUpdate(v -> blockCooldown.setVisible(v));
|
blocks.onUpdate(v -> blockCooldown.setVisible(v));
|
||||||
|
|||||||
@@ -5,8 +5,9 @@ import me.retucio.sputnik.event.events.RenderHeldItemEvent;
|
|||||||
import me.retucio.sputnik.event.events.RenderArmEvent;
|
import me.retucio.sputnik.event.events.RenderArmEvent;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||||
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.util.math.MatrixStack;
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
import net.minecraft.util.Hand;
|
import net.minecraft.util.Hand;
|
||||||
import net.minecraft.util.math.RotationAxis;
|
import net.minecraft.util.math.RotationAxis;
|
||||||
@@ -18,75 +19,80 @@ import org.joml.Vector3d;
|
|||||||
|
|
||||||
public class HandView extends Module {
|
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
|
// ajustes de animaciones
|
||||||
public BooleanSetting oldAnimations = addSetting(new BooleanSetting("animaciones viejas", "como las de la 1.8, al pegar", false));
|
public BooleanSetting oldAnimations = sgAnimations.add(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 skipSwapping = sgAnimations.add(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 noFood = sgAnimations.add(new BooleanSetting("no comer", "no renderiza la animación de comer", false));
|
||||||
|
|
||||||
// ajustes de mano principal
|
// 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));
|
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));
|
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));
|
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));
|
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));
|
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));
|
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));
|
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));
|
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));
|
0, -180, 180, 1));
|
||||||
|
|
||||||
// ajustes de mano secundaria
|
// 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));
|
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));
|
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));
|
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));
|
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));
|
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));
|
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));
|
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));
|
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));
|
0, -180, 180, 1));
|
||||||
|
|
||||||
// brazo
|
// 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));
|
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));
|
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));
|
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));
|
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));
|
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));
|
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));
|
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));
|
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));
|
0, -180, 180, 1));
|
||||||
|
|
||||||
public HandView() {
|
public HandView() {
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ package me.retucio.sputnik.module.modules.player;
|
|||||||
|
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
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 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() {
|
public Headhitters() {
|
||||||
super("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.mixin.accessor.HandledScreenAccessor;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
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.InventoryUtil;
|
||||||
import me.retucio.sputnik.util.KeyUtil;
|
import me.retucio.sputnik.util.KeyUtil;
|
||||||
import net.minecraft.client.gui.screen.ingame.HandledScreen;
|
import net.minecraft.client.gui.screen.ingame.HandledScreen;
|
||||||
@@ -16,9 +16,9 @@ import org.lwjgl.glfw.GLFW;
|
|||||||
|
|
||||||
public class InventoryPlus extends Module {
|
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 row1key = sgGeneral.add(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 row2key = sgGeneral.add(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 row3key = sgGeneral.add(new KeySetting("fila 3", "tecla para mover items a la tercera fila", GLFW.GLFW_KEY_D));
|
||||||
|
|
||||||
public InventoryPlus() {
|
public InventoryPlus() {
|
||||||
super("inventario plus",
|
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.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.NumberSetting;
|
import me.retucio.sputnik.module.setting.settings.NumberSetting;
|
||||||
import me.retucio.sputnik.module.settings.OptionSetting;
|
import me.retucio.sputnik.module.setting.settings.OptionSetting;
|
||||||
import me.retucio.sputnik.util.Lists;
|
import me.retucio.sputnik.util.Lists;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.Items;
|
import net.minecraft.item.Items;
|
||||||
@@ -16,10 +16,10 @@ import net.minecraft.util.math.Direction;
|
|||||||
|
|
||||||
public class Offhand extends Module {
|
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));
|
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 NumberSetting delaySetting = sgGeneral.add(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 BooleanSetting override = sgGeneral.add(new BooleanSetting("anular", "ignora que ya haya un ítem en la mano secundaria", true));
|
||||||
|
|
||||||
|
|
||||||
private int delay;
|
private int delay;
|
||||||
|
|||||||
@@ -0,0 +1,85 @@
|
|||||||
|
package me.retucio.sputnik.module.modules.player;
|
||||||
|
|
||||||
|
import me.retucio.sputnik.module.Category;
|
||||||
|
import me.retucio.sputnik.module.Module;
|
||||||
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
|
import me.retucio.sputnik.module.setting.settings.NumberSetting;
|
||||||
|
import me.retucio.sputnik.util.ChatUtil;
|
||||||
|
import net.minecraft.util.hit.HitResult;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
import net.minecraft.world.RaycastContext;
|
||||||
|
|
||||||
|
public class ReverseStep extends Module {
|
||||||
|
|
||||||
|
public NumberSetting height = sgGeneral.add(new NumberSetting(
|
||||||
|
"altura", "altura máxima a bajar",
|
||||||
|
1, 0, 20, 0.1
|
||||||
|
));
|
||||||
|
|
||||||
|
public NumberSetting velocity = sgGeneral.add(new NumberSetting(
|
||||||
|
"velocidad", "velocidad a la que caer en bps",
|
||||||
|
1, 0, 10, 0.1
|
||||||
|
));
|
||||||
|
|
||||||
|
public BooleanSetting jumping = sgGeneral.add(new BooleanSetting(
|
||||||
|
"saltar", "permitir saltar",
|
||||||
|
true
|
||||||
|
));
|
||||||
|
|
||||||
|
public BooleanSetting disableInWater = sgGeneral.add(new BooleanSetting(
|
||||||
|
"desactivar en agua", ".",
|
||||||
|
true
|
||||||
|
));
|
||||||
|
|
||||||
|
public ReverseStep() {
|
||||||
|
super("escalones inversos",
|
||||||
|
"escalones pero pabajo",
|
||||||
|
Category.PLAYER
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTick() {
|
||||||
|
if (mc.player == null || mc.world == null) return;
|
||||||
|
|
||||||
|
if (!mc.player.isOnGround()) {
|
||||||
|
if (jumping.isEnabled()) return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((mc.player.isTouchingWater() || mc.player.isInLava())) {
|
||||||
|
if (disableInWater.isEnabled()) return;
|
||||||
|
}
|
||||||
|
|
||||||
|
double dropHeight = getHeight();
|
||||||
|
if (dropHeight > 0 && dropHeight <= height.getValue()) {
|
||||||
|
mc.player.addVelocity(0, -height.getValue() + mc.player.getVelocity().getY(), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private double getHeight() {
|
||||||
|
Vec3d start = new Vec3d(mc.player.getX(), mc.player.getY() - 0.1, mc.player.getZ());
|
||||||
|
Vec3d end = new Vec3d(mc.player.getX(), mc.player.getY() - height.getValue() - 1, mc.player.getZ());
|
||||||
|
|
||||||
|
RaycastContext context = new RaycastContext(
|
||||||
|
start, end,
|
||||||
|
RaycastContext.ShapeType.COLLIDER,
|
||||||
|
RaycastContext.FluidHandling.ANY,
|
||||||
|
mc.player
|
||||||
|
);
|
||||||
|
|
||||||
|
HitResult hit = mc.world.raycast(context);
|
||||||
|
|
||||||
|
if (hit != null && hit.getType() == HitResult.Type.BLOCK) {
|
||||||
|
BlockPos hitPos = new BlockPos(
|
||||||
|
(int) hit.getPos().x,
|
||||||
|
(int) hit.getPos().y,
|
||||||
|
(int) hit.getPos().z
|
||||||
|
);
|
||||||
|
|
||||||
|
return mc.player.getY() - (hitPos.getY());
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,7 +4,7 @@ import me.retucio.sputnik.event.SubscribeEvent;
|
|||||||
import me.retucio.sputnik.event.events.ClipAtLedgeEvent;
|
import me.retucio.sputnik.event.events.ClipAtLedgeEvent;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
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.BlockHitResult;
|
||||||
import net.minecraft.util.hit.HitResult;
|
import net.minecraft.util.hit.HitResult;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
@@ -13,7 +13,7 @@ import net.minecraft.world.RaycastContext;
|
|||||||
|
|
||||||
public class SafeWalk extends Module {
|
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() {
|
public SafeWalk() {
|
||||||
super("muletas",
|
super("muletas",
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package me.retucio.sputnik.module.modules.player;
|
||||||
|
|
||||||
|
import me.retucio.sputnik.module.Category;
|
||||||
|
import me.retucio.sputnik.module.Module;
|
||||||
|
import me.retucio.sputnik.module.setting.settings.NumberSetting;
|
||||||
|
|
||||||
|
public class Step extends Module {
|
||||||
|
|
||||||
|
public NumberSetting height = sgGeneral.add(new NumberSetting(
|
||||||
|
"altura", "altura máxima a subir",
|
||||||
|
1, 0, 3, 0.1
|
||||||
|
));
|
||||||
|
|
||||||
|
public Step() {
|
||||||
|
super("escalones", "hace que el bloque de subida de escalón sea la distancia deseada", Category.PLAYER);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,7 +3,7 @@ package me.retucio.sputnik.module.modules.player;
|
|||||||
import me.retucio.sputnik.mixin.accessor.KeyBindingAccessor;
|
import me.retucio.sputnik.mixin.accessor.KeyBindingAccessor;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
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.ui.screen.ClickGUI;
|
||||||
import me.retucio.sputnik.util.KeyUtil;
|
import me.retucio.sputnik.util.KeyUtil;
|
||||||
import me.retucio.sputnik.util.Lists;
|
import me.retucio.sputnik.util.Lists;
|
||||||
@@ -19,7 +19,7 @@ import java.util.List;
|
|||||||
|
|
||||||
public class UIMove extends Module {
|
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));
|
Lists.screenList, Lists.allTrue(Lists.screenList), Lists.screenNames));
|
||||||
|
|
||||||
private List<KeyBinding> movementKeys;
|
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.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||||
import me.retucio.sputnik.module.settings.NumberSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.OptionSetting;
|
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.ChatUtil;
|
||||||
import me.retucio.sputnik.util.Lists;
|
import me.retucio.sputnik.util.Lists;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
@@ -21,16 +22,19 @@ import java.util.List;
|
|||||||
|
|
||||||
public class WarnLowDurability extends Module {
|
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));
|
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 = sgSound.add(new OptionSetting<>("sonido", "qué sonido reproducir",
|
||||||
public OptionSetting<SoundEvent> sound = addSetting(new OptionSetting<>("sonido", "qué sonido reproducir",
|
|
||||||
Lists.soundList, SoundEvents.BLOCK_NOTE_BLOCK_BELL.value(), Lists.soundNames));
|
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 volume = sgSound.add(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 pitch = sgSound.add(new NumberSetting("frecuencia", "altura del sonido", 70, 0, 125, 1));
|
||||||
|
|
||||||
private final List<ItemStack> warned = new ArrayList<>();
|
private final List<ItemStack> warned = new ArrayList<>();
|
||||||
private float prevPercentage = -1;
|
private float prevPercentage = -1;
|
||||||
|
|||||||
@@ -1,39 +1,109 @@
|
|||||||
package me.retucio.sputnik.module.modules.render;
|
package me.retucio.sputnik.module.modules.render;
|
||||||
|
|
||||||
import me.retucio.sputnik.event.SubscribeEvent;
|
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.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||||
import me.retucio.sputnik.module.settings.ColorSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.ListSetting;
|
import me.retucio.sputnik.module.setting.settings.ColorSetting;
|
||||||
import me.retucio.sputnik.module.settings.NumberSetting;
|
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.Colors;
|
||||||
import me.retucio.sputnik.util.Lists;
|
import me.retucio.sputnik.util.Lists;
|
||||||
import me.retucio.sputnik.util.render.RenderUtil;
|
import me.retucio.sputnik.util.render.RenderUtil;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Vec3i;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.util.shape.VoxelShape;
|
import net.minecraft.util.shape.VoxelShape;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.List;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
|
||||||
public class BlockESP extends Module {
|
public class BlockESP extends Module {
|
||||||
|
|
||||||
public ListSetting<Block> blocks = addSetting(new ListSetting<>("bloques", "bloques a resaltar",
|
SettingGroup sgSearch = addSg(new SettingGroup("búsqueda", true));
|
||||||
Lists.blockList, Lists.allFalse(Lists.blockList), Lists.blockNames));
|
SettingGroup sgOulines = addSg(new SettingGroup("contorno", true));
|
||||||
|
SettingGroup sgFilling = addSg(new SettingGroup("relleno", true));
|
||||||
|
|
||||||
public NumberSetting radius = addSetting(new NumberSetting("radio", "radio de búsqueda de bloques", 24, 2, 128, 1));
|
|
||||||
|
|
||||||
public BooleanSetting outlines = addSetting(new BooleanSetting("contorno", "renderizar contorno de bloques", true));
|
// bloques
|
||||||
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 ListSetting<Block> blocks = sgGeneral.add(new ListSetting<>(
|
||||||
public ColorSetting fillingColor = addSetting(new ColorSetting("color del relleno", "color del relleno", new Color(57, 177, 215, 67), false));
|
"bloques", "bloques a resaltar",
|
||||||
|
Lists.blockList,
|
||||||
|
Lists.allFalse(Lists.blockList),
|
||||||
|
Lists.blockNames
|
||||||
|
));
|
||||||
|
|
||||||
|
public NumberSetting maxBlocks = sgGeneral.add(new NumberSetting(
|
||||||
|
"máx. bloques", "número máximo de bloques a resaltar",
|
||||||
|
500, 1, 2000, 1
|
||||||
|
));
|
||||||
|
|
||||||
|
|
||||||
|
// búsqueda
|
||||||
|
|
||||||
|
public NumberSetting radius = sgSearch.add(new NumberSetting(
|
||||||
|
"radio", "radio de búsqueda de bloques",
|
||||||
|
24, 2, 128, 1
|
||||||
|
));
|
||||||
|
|
||||||
|
public NumberSetting searchInterval = sgSearch.add(new NumberSetting(
|
||||||
|
"intervalo", "intervalo de búsqueda en ticks",
|
||||||
|
10, 1, 40, 1
|
||||||
|
));
|
||||||
|
|
||||||
|
public BooleanSetting asyncSearch = sgSearch.add(new BooleanSetting(
|
||||||
|
"búsqueda asíncrona", "busca los bloques en un hilo separado (optimización)",
|
||||||
|
true
|
||||||
|
));
|
||||||
|
|
||||||
|
public NumberSetting distanceToMove = sgSearch.add(new NumberSetting(
|
||||||
|
"distancia a moverse", "distancia a moverse antes de actualizar los bloques",
|
||||||
|
3, 0, 10, 0.1
|
||||||
|
));
|
||||||
|
|
||||||
|
|
||||||
|
// contorno
|
||||||
|
|
||||||
|
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
|
||||||
|
));
|
||||||
|
|
||||||
|
|
||||||
|
// relleno
|
||||||
|
|
||||||
|
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
|
||||||
|
));
|
||||||
|
|
||||||
|
// caché
|
||||||
|
private final Map<BlockPos, VoxelShape> cachedBlocks = new ConcurrentHashMap<>();
|
||||||
|
private final Set<Block> enabledBlocks = Collections.newSetFromMap(new ConcurrentHashMap<>());
|
||||||
|
private BlockPos lastPlayerPos = null;
|
||||||
|
private int lastRadius = -1;
|
||||||
|
private int searchTimer = 0;
|
||||||
|
private boolean isSearching = false;
|
||||||
|
|
||||||
|
|
||||||
public BlockESP() {
|
public BlockESP() {
|
||||||
@@ -41,61 +111,166 @@ public class BlockESP extends Module {
|
|||||||
"te muestra la posición de cierto tipo de bloque renderizando una caja con su forma",
|
"te muestra la posición de cierto tipo de bloque renderizando una caja con su forma",
|
||||||
Category.RENDER);
|
Category.RENDER);
|
||||||
|
|
||||||
|
blocks.onUpdate(v ->
|
||||||
|
updateEnabledBlocks()
|
||||||
|
);
|
||||||
|
|
||||||
outlines.onUpdate(v -> {
|
outlines.onUpdate(v -> {
|
||||||
outlineColor.setVisible(v);
|
outlineColor.setVisible(v);
|
||||||
lineWidth.setVisible(v);
|
lineWidth.setVisible(v);
|
||||||
});
|
});
|
||||||
|
|
||||||
fillings.onUpdate(v -> fillingColor.setVisible(v));
|
fillings.onUpdate(v ->
|
||||||
|
fillingColor.setVisible(v)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable() {
|
||||||
|
cachedBlocks.clear();
|
||||||
|
enabledBlocks.clear();
|
||||||
|
updateEnabledBlocks();
|
||||||
|
searchTimer = 0;
|
||||||
|
|
||||||
|
super.onEnable();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisable() {
|
||||||
|
cachedBlocks.clear();
|
||||||
|
enabledBlocks.clear();
|
||||||
|
|
||||||
|
super.onDisable();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void onRenderWorld(RenderWorldEvent event) {
|
public void onRenderWorld(Render3DEvent event) {
|
||||||
if (mc.player == null || mc.world == null) return;
|
if (mc.player == null || mc.world == null) return;
|
||||||
|
|
||||||
for (Block block : blocks.getOptions()) {
|
// aplicar el intervalo
|
||||||
if (blocks.isEnabled(block)) {
|
if (searchTimer++ >= searchInterval.getIntValue()) {
|
||||||
List<BlockPos> blocksToHighlight = getNearbyBlocks(block);
|
searchTimer = 0;
|
||||||
for (BlockPos pos : blocksToHighlight) {
|
searchBlocks();
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec3d cameraPos = mc.gameRenderer.getCamera().getCameraPos();
|
||||||
|
|
||||||
|
int rendered = 0;
|
||||||
|
Iterator<Map.Entry<BlockPos, VoxelShape>> iterator = cachedBlocks.entrySet().iterator();
|
||||||
|
|
||||||
|
while (iterator.hasNext() && rendered < maxBlocks.getIntValue()) {
|
||||||
|
Map.Entry<BlockPos, VoxelShape> entry = iterator.next();
|
||||||
|
BlockPos pos = entry.getKey();
|
||||||
|
VoxelShape shape = entry.getValue();
|
||||||
|
|
||||||
|
if (!isValidBlock(pos)) {
|
||||||
|
iterator.remove();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// validación de distancia
|
||||||
|
double distance = Math.sqrt(pos.getSquaredDistance(cameraPos));
|
||||||
|
if (distance > radius.getIntValue()) {
|
||||||
|
iterator.remove();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// renderizado
|
||||||
if (outlines.isEnabled()) {
|
if (outlines.isEnabled()) {
|
||||||
|
Color color = outlineColor.getColor();
|
||||||
RenderUtil.drawVoxelShapeOutline(
|
RenderUtil.drawVoxelShapeOutline(
|
||||||
event.getMatrices(),
|
event.getMatrices(),
|
||||||
getVoxelShape(pos),
|
shape,
|
||||||
pos,
|
pos,
|
||||||
outlineColor.getColor(),
|
color,
|
||||||
lineWidth.getFloatValue(),
|
lineWidth.getFloatValue(),
|
||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fillings.isEnabled()) {
|
if (fillings.isEnabled()) {
|
||||||
|
Color color = fillingColor.getColor();
|
||||||
RenderUtil.drawVoxelShapeFilled(
|
RenderUtil.drawVoxelShapeFilled(
|
||||||
event.getMatrices(),
|
event.getMatrices(),
|
||||||
getVoxelShape(pos),
|
shape,
|
||||||
pos,
|
pos,
|
||||||
fillingColor.getColor(),
|
color,
|
||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rendered++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateEnabledBlocks() {
|
||||||
|
enabledBlocks.clear();
|
||||||
|
enabledBlocks.addAll(blocks.getEnabledOptions());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void searchBlocks() {
|
||||||
|
if (mc.player == null || mc.world == null || enabledBlocks.isEmpty()) return;
|
||||||
|
|
||||||
|
BlockPos playerPos = mc.player.getBlockPos();
|
||||||
|
int currentRadius = radius.getIntValue();
|
||||||
|
|
||||||
|
// si el jugador no se ha movido mucho, omitir la búsqueda
|
||||||
|
if (lastPlayerPos != null && lastRadius == currentRadius &&
|
||||||
|
playerPos.getSquaredDistance(lastPlayerPos) < (distanceToMove.getValue() * distanceToMove.getIntValue())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastPlayerPos = playerPos;
|
||||||
|
lastRadius = currentRadius;
|
||||||
|
|
||||||
|
// multithreading
|
||||||
|
if (asyncSearch.isEnabled()) {
|
||||||
|
if (isSearching) return;
|
||||||
|
|
||||||
|
isSearching = true;
|
||||||
|
new Thread(() -> {
|
||||||
|
try {
|
||||||
|
performBlockSearch(playerPos, currentRadius);
|
||||||
|
} finally {
|
||||||
|
isSearching = false;
|
||||||
|
}
|
||||||
|
}, "sputnik-blockESP-search").start();
|
||||||
|
} else {
|
||||||
|
performBlockSearch(playerPos, currentRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// buscar los bloques
|
||||||
|
private void performBlockSearch(BlockPos center, int radius) {
|
||||||
|
Map<BlockPos, VoxelShape> newBlocks = new HashMap<>();
|
||||||
|
int radiusSq = radius * radius;
|
||||||
|
|
||||||
|
for (int x = -radius; x <= radius; x++) {
|
||||||
|
for (int y = -radius; y <= radius; y++) {
|
||||||
|
for (int z = -radius; z <= radius; z++) {
|
||||||
|
if (x*x + y*y + z*z > radiusSq) continue;
|
||||||
|
|
||||||
|
BlockPos pos = center.add(x, y, z);
|
||||||
|
Block block = mc.world.getBlockState(pos).getBlock();
|
||||||
|
|
||||||
|
if (enabledBlocks.contains(block)) {
|
||||||
|
VoxelShape shape = mc.world.getBlockState(pos).getOutlineShape(mc.world, pos);
|
||||||
|
if (!shape.isEmpty()) {
|
||||||
|
newBlocks.put(pos.toImmutable(), shape);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<BlockPos> getNearbyBlocks(Block block) {
|
// actualizar caché
|
||||||
List<BlockPos> blockPosList = new ArrayList<>();
|
cachedBlocks.keySet().retainAll(newBlocks.keySet());
|
||||||
|
cachedBlocks.putAll(newBlocks);
|
||||||
for (int i = -radius.getIntValue(); i < radius.getIntValue(); i++) {
|
|
||||||
for (int j = -radius.getIntValue(); j < radius.getIntValue(); j++) {
|
|
||||||
for (int k = -radius.getIntValue(); k < radius.getIntValue(); k++) {
|
|
||||||
BlockPos pos = mc.player.getBlockPos().add(new Vec3i(i, j, k));
|
|
||||||
if (mc.world.getBlockState(pos).getBlock() == block) {
|
|
||||||
blockPosList.add(pos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return blockPosList;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private VoxelShape getVoxelShape(BlockPos pos) {
|
// verificar que el bloque sea válido
|
||||||
return mc.world.getBlockState(pos).getOutlineShape(mc.world, pos);
|
@SuppressWarnings("deprecation")
|
||||||
|
private boolean isValidBlock(BlockPos pos) {
|
||||||
|
if (mc.world == null || !mc.world.isChunkLoaded(pos)) return false;
|
||||||
|
Block block = mc.world.getBlockState(pos).getBlock();
|
||||||
|
return enabledBlocks.contains(block);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,9 @@ package me.retucio.sputnik.module.modules.render;
|
|||||||
|
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.ColorSetting;
|
import me.retucio.sputnik.module.setting.settings.ColorSetting;
|
||||||
|
import me.retucio.sputnik.module.setting.settings.NumberSetting;
|
||||||
|
import me.retucio.sputnik.util.Colors;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
|
||||||
@@ -12,8 +14,21 @@ import java.awt.*;
|
|||||||
|
|
||||||
public class BlockOutline extends Module {
|
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(
|
||||||
new Color(0, 0, 0, 102), true));
|
"color",
|
||||||
|
"color del contorno de los bloques",
|
||||||
|
Colors.mainColor,
|
||||||
|
true)
|
||||||
|
);
|
||||||
|
|
||||||
|
public NumberSetting lineWidth = sgGeneral.add(new NumberSetting(
|
||||||
|
"grosor",
|
||||||
|
"grosor de las líneas",
|
||||||
|
0.5,
|
||||||
|
0.1,
|
||||||
|
10,
|
||||||
|
0.1
|
||||||
|
));
|
||||||
|
|
||||||
public BlockOutline() {
|
public BlockOutline() {
|
||||||
super("contorno",
|
super("contorno",
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
package me.retucio.sputnik.module.modules.render;
|
package me.retucio.sputnik.module.modules.render;
|
||||||
|
|
||||||
import me.retucio.sputnik.event.SubscribeEvent;
|
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.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||||
import me.retucio.sputnik.module.settings.ColorSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.EnumSetting;
|
import me.retucio.sputnik.module.setting.settings.ColorSetting;
|
||||||
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.render.RenderUtil;
|
import me.retucio.sputnik.util.render.RenderUtil;
|
||||||
import net.minecraft.util.hit.BlockHitResult;
|
import net.minecraft.util.hit.BlockHitResult;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
@@ -18,18 +19,22 @@ import java.awt.*;
|
|||||||
|
|
||||||
public class BreakingProgress extends Module {
|
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));
|
BreakMode.class, BreakMode.INWARDS));
|
||||||
|
|
||||||
public BooleanSetting outlines = addSetting(new BooleanSetting("contorno", "renderizar contorno", true));
|
public BooleanSetting outlines = sgOulines.add(new BooleanSetting("contorno", "renderizar contorno", true));
|
||||||
public ColorSetting outlineColor = addSetting(new ColorSetting("color del contorno", "color del contorno",
|
public ColorSetting outlineColor = sgOulines.add(new ColorSetting("color del contorno", "color del contorno",
|
||||||
new Color(0, 255, 0, 200), false));
|
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 BooleanSetting fillings = sgFilling.add(new BooleanSetting("relleno", "renderizar relleno", true));
|
||||||
public ColorSetting fillingColor = addSetting(new ColorSetting("color del relleno", "color del relleno",
|
public ColorSetting fillingColor = sgFilling.add(new ColorSetting("color del relleno", "color del relleno",
|
||||||
new Color(0, 255, 0, 60), false));
|
new Color(0, 255, 0, 60), false));
|
||||||
|
|
||||||
|
|
||||||
public BreakingProgress() {
|
public BreakingProgress() {
|
||||||
super("progreso de minado",
|
super("progreso de minado",
|
||||||
"te muestra el progreso de minado de un bloque de manera más visible",
|
"te muestra el progreso de minado de un bloque de manera más visible",
|
||||||
@@ -37,7 +42,7 @@ public class BreakingProgress extends Module {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void onRenderWorld(RenderWorldEvent event) {
|
public void onRenderWorld(Render3DEvent event) {
|
||||||
if (mc.interactionManager == null || mc.world == null) return;
|
if (mc.interactionManager == null || mc.world == null) return;
|
||||||
if (!(mc.crosshairTarget instanceof BlockHitResult hitResult)) return;
|
if (!(mc.crosshairTarget instanceof BlockHitResult hitResult)) return;
|
||||||
BlockPos pos = hitResult.getBlockPos();
|
BlockPos pos = hitResult.getBlockPos();
|
||||||
|
|||||||
@@ -2,9 +2,11 @@ package me.retucio.sputnik.module.modules.render;
|
|||||||
|
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||||
import me.retucio.sputnik.module.settings.ColorSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.NumberSetting;
|
import me.retucio.sputnik.module.setting.settings.ColorSetting;
|
||||||
|
import me.retucio.sputnik.module.setting.settings.NumberSetting;
|
||||||
|
import me.retucio.sputnik.util.Colors;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
|
||||||
@@ -15,14 +17,17 @@ import java.awt.*;
|
|||||||
|
|
||||||
public class CritsPlus extends Module {
|
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 ColorSetting color = sgAppearance.add(new ColorSetting("color", "color de las partículas", Colors.mainColor, false));
|
||||||
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 scale = sgAppearance.add(new NumberSetting("escala", "tamaño", 1, 0, 2, 0.05));
|
||||||
public NumberSetting velocityMultipler = addSetting(new NumberSetting("dispersión", "multiplicador de la velocidad de dispersión", 1, 0, 10, 0.1));
|
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 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 NumberSetting velocityMultipler = sgBehaviour.add(new NumberSetting("dispersión", "multiplicador de la velocidad de dispersión", 1, 0, 10, 0.1));
|
||||||
public BooleanSetting collide = addSetting(new BooleanSetting("colisionar", "colisionar con bloques", false));
|
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() {
|
public CritsPlus() {
|
||||||
super("críticos",
|
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.mixin.accessor.OverlayTextureAccessor;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
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.NativeImage;
|
||||||
import net.minecraft.client.texture.NativeImageBackedTexture;
|
import net.minecraft.client.texture.NativeImageBackedTexture;
|
||||||
@@ -16,7 +16,7 @@ import java.awt.*;
|
|||||||
|
|
||||||
public class DamageOverlay extends Module {
|
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;
|
private NativeImageBackedTexture texture = null;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
package me.retucio.sputnik.module.modules.render;
|
||||||
|
|
||||||
|
import me.retucio.sputnik.module.Category;
|
||||||
|
import me.retucio.sputnik.module.Module;
|
||||||
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
|
import me.retucio.sputnik.module.setting.settings.OptionSetting;
|
||||||
|
import me.retucio.sputnik.util.Lists;
|
||||||
|
|
||||||
|
|
||||||
|
public class Fonts extends Module {
|
||||||
|
|
||||||
|
public OptionSetting<String> font = sgGeneral.add(new OptionSetting<>(
|
||||||
|
"fuente", "fuente a emplear",
|
||||||
|
Lists.fontList, "ubuntu")
|
||||||
|
);
|
||||||
|
|
||||||
|
public BooleanSetting reload = sgGeneral.add(new BooleanSetting(
|
||||||
|
"recargar", "recargar automáticamente",
|
||||||
|
false
|
||||||
|
));
|
||||||
|
|
||||||
|
public Fonts() {
|
||||||
|
super("fuentes",
|
||||||
|
"modifica el tipo de letra utilizado al renderizar texto",
|
||||||
|
Category.RENDER);
|
||||||
|
|
||||||
|
font.onUpdate(v -> reload());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable() {
|
||||||
|
reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisable() {
|
||||||
|
reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void reload() {
|
||||||
|
if (mc.getResourceManager() != null && reload.isEnabled()) {
|
||||||
|
mc.reloadResources();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,8 +2,9 @@ package me.retucio.sputnik.module.modules.render;
|
|||||||
|
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.EnumSetting;
|
import me.retucio.sputnik.module.setting.settings.EnumSetting;
|
||||||
|
import me.retucio.sputnik.module.setting.settings.NumberSetting;
|
||||||
import me.retucio.sputnik.util.render.GlintRenderLayer;
|
import me.retucio.sputnik.util.render.GlintRenderLayer;
|
||||||
import net.minecraft.client.render.RenderLayer;
|
import net.minecraft.client.render.RenderLayer;
|
||||||
import net.minecraft.client.render.RenderLayers;
|
import net.minecraft.client.render.RenderLayers;
|
||||||
@@ -17,9 +18,24 @@ import net.minecraft.util.DyeColor;
|
|||||||
|
|
||||||
public class GlintPlus extends Module {
|
public class GlintPlus extends Module {
|
||||||
|
|
||||||
public BooleanSetting items = addSetting(new BooleanSetting("items", "modificar el destello de encantamiento de los items", true));
|
public BooleanSetting items = sgGeneral.add(new BooleanSetting(
|
||||||
public BooleanSetting armor = addSetting(new BooleanSetting("armadura", "modificar el destello de encantamiento de la armadura", true));
|
"items",
|
||||||
public EnumSetting<GlintColors> glintColor = addSetting(new EnumSetting<>("colores", "color del glint", GlintColors.class, GlintColors.PURPLE));
|
"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() {
|
public GlintPlus() {
|
||||||
super("destello de enchants.",
|
super("destello de enchants.",
|
||||||
|
|||||||
@@ -4,9 +4,10 @@ import com.google.gson.JsonObject;
|
|||||||
import com.google.gson.JsonParser;
|
import com.google.gson.JsonParser;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||||
import me.retucio.sputnik.module.settings.EnumSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.ListSetting;
|
import me.retucio.sputnik.module.setting.settings.EnumSetting;
|
||||||
|
import me.retucio.sputnik.module.setting.settings.ListSetting;
|
||||||
import me.retucio.sputnik.util.Lists;
|
import me.retucio.sputnik.util.Lists;
|
||||||
import net.minecraft.enchantment.EnchantmentHelper;
|
import net.minecraft.enchantment.EnchantmentHelper;
|
||||||
import net.minecraft.entity.EntityType;
|
import net.minecraft.entity.EntityType;
|
||||||
@@ -38,22 +39,25 @@ import java.util.concurrent.Executors;
|
|||||||
|
|
||||||
public class Nametags extends Module {
|
public class Nametags extends Module {
|
||||||
|
|
||||||
|
SettingGroup sgInfo = addSg(new SettingGroup("info. adicional", true));
|
||||||
|
|
||||||
Map<EntityType<?>, Boolean> defaultEntities = Lists.allFalse(Lists.entityList);
|
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));
|
Lists.entityList, defaultEntities, Lists.entityNames));
|
||||||
|
public ListSetting<Item> items = sgGeneral.add(new ListSetting<>("items", "te permite elegir cuáles items tienen su nombre visible",
|
||||||
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",
|
|
||||||
Lists.itemList, Lists.allTrue(Lists.itemList), Lists.itemNames));
|
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 health = sgGeneral.add(new BooleanSetting("mostrar vida", "muestra la vida de una entidad en su nametag", true));
|
||||||
public BooleanSetting distinguishBabies = addSetting(new BooleanSetting("distinguir bebés", "cambia el nametag cuando una entidad está en su fase bebé", false));
|
public EnumSetting<HealthMode> healthMode = sgGeneral.add(new EnumSetting<>("mostrar vida en", "de qué manera mostrar la vida", HealthMode.class, HealthMode.POINTS));
|
||||||
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 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 final Map<UUID, String> cache = new ConcurrentHashMap<>();
|
||||||
private static final ExecutorService executor = Executors.newCachedThreadPool();
|
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.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||||
import me.retucio.sputnik.module.settings.EnumSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.ListSetting;
|
import me.retucio.sputnik.module.setting.settings.EnumSetting;
|
||||||
|
import me.retucio.sputnik.module.setting.settings.ListSetting;
|
||||||
import me.retucio.sputnik.util.Lists;
|
import me.retucio.sputnik.util.Lists;
|
||||||
import net.minecraft.particle.ParticleType;
|
import net.minecraft.particle.ParticleType;
|
||||||
import net.minecraft.util.Formatting;
|
import net.minecraft.util.Formatting;
|
||||||
@@ -24,35 +25,41 @@ import net.minecraft.util.Formatting;
|
|||||||
|
|
||||||
public class NoRender extends Module {
|
public class NoRender extends Module {
|
||||||
|
|
||||||
public BooleanSetting spyglassOverlay = addSetting(new BooleanSetting("catalejo", "renderizar overlay del catalejo", false));
|
SettingGroup sgOverlays = addSg(new SettingGroup("overlays", true));
|
||||||
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));
|
SettingGroup sgAmbient = addSg(new SettingGroup("ambiente", true));
|
||||||
public BooleanSetting pumpkinOverlay = addSetting(new BooleanSetting("calabaza", "renderiza el overlay de la calabaza tallada", false));
|
SettingGroup sgEffects = addSg(new SettingGroup("efectos", true));
|
||||||
public BooleanSetting fireOverlay = addSetting(new BooleanSetting("fuego", "renderizar llamas sobre la cámara", false));
|
SettingGroup sgUi = addSg(new SettingGroup("interfaz", true));
|
||||||
public BooleanSetting portalOverlay = addSetting(new BooleanSetting("portal", "renderizar el overlay del portal del nether", false));
|
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 spyglassOverlay = sgOverlays.add(new BooleanSetting("catalejo", "renderizar overlay del catalejo", false));
|
||||||
public BooleanSetting snow = addSetting(new BooleanSetting("nieve", "n i e v e", true));
|
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 endFlashes = addSetting(new BooleanSetting("flashes del end", "renderizar los recientemente añadidos flashes en el end", true));
|
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));
|
Lists.particleList, Lists.allTrue(Lists.particleList), Lists.particleNames));
|
||||||
|
|
||||||
public BooleanSetting nauseaEffect = addSetting(new BooleanSetting("náusea", "renderizar borrachera", false));
|
public BooleanSetting nauseaEffect = sgEffects.add(new BooleanSetting("náusea", "renderizar borrachera", false));
|
||||||
public BooleanSetting blindnessEffect = addSetting(new BooleanSetting("ceguera", "renderizar miopía", false));
|
public BooleanSetting blindnessEffect = sgEffects.add(new BooleanSetting("ceguera", "renderizar miopía", false));
|
||||||
public BooleanSetting darknessEffect = addSetting(new BooleanSetting("oscuridad", "renderizar miedo a la oscuridad", 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 scoreboard = sgUi.add(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 titles = sgUi.add(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 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 = sgText.add(new BooleanSetting("negrita", "letra pero §lgorda", true));
|
||||||
|
|
||||||
public BooleanSetting bold = addSetting(new BooleanSetting("negrita", "letra pero §lgorda", true));
|
|
||||||
// public BooleanSetting italics = addSetting(new BooleanSetting("cursiva", "letra pero §otorcida", 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 underlined = sgText.add(new BooleanSetting("subrayado", "letra pero §nen el suelo", true));
|
||||||
public BooleanSetting strikethrough = addSetting(new BooleanSetting("tachado", "letra pero §mdiscriminada", true));
|
public BooleanSetting strikethrough = sgText.add(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 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 = addSetting(new BooleanSetting("garabato", "engarabatar texto (o como se diga) (§kasí§r)", false));
|
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() {
|
public NoRender() {
|
||||||
super("no render",
|
super("no render",
|
||||||
|
|||||||
@@ -0,0 +1,189 @@
|
|||||||
|
package me.retucio.sputnik.module.modules.render;
|
||||||
|
|
||||||
|
import me.retucio.sputnik.module.Category;
|
||||||
|
import me.retucio.sputnik.module.Module;
|
||||||
|
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||||
|
import me.retucio.sputnik.module.setting.settings.ListSetting;
|
||||||
|
import me.retucio.sputnik.module.setting.settings.NumberSetting;
|
||||||
|
import me.retucio.sputnik.util.Lists;
|
||||||
|
import net.minecraft.particle.SimpleParticleType;
|
||||||
|
import net.minecraft.registry.Registries;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class Particles extends Module {
|
||||||
|
|
||||||
|
SettingGroup sgDispersion = addSg(new SettingGroup("dispersión", true));
|
||||||
|
SettingGroup sgOffset = addSg(new SettingGroup("desplazamiento", true));
|
||||||
|
|
||||||
|
List<SimpleParticleType> particleList = Lists.particleList.stream()
|
||||||
|
.filter(particleType -> particleType instanceof SimpleParticleType)
|
||||||
|
.map(particleType -> (SimpleParticleType) particleType)
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
Map<SimpleParticleType, String> particleNames = Lists.getMapOfLists(particleList,
|
||||||
|
particleList.stream().map(particle -> Text.translatable(
|
||||||
|
Registries.PARTICLE_TYPE.getId(particle).toShortTranslationKey()).getString()
|
||||||
|
).toList());
|
||||||
|
|
||||||
|
public ListSetting<SimpleParticleType> particles = sgGeneral.add(new ListSetting<>(
|
||||||
|
"partículas",
|
||||||
|
"partículas a generar",
|
||||||
|
particleList,
|
||||||
|
Lists.allFalse(particleList),
|
||||||
|
particleNames
|
||||||
|
));
|
||||||
|
|
||||||
|
public NumberSetting spawnInterval = sgGeneral.add(new NumberSetting(
|
||||||
|
"intervalo",
|
||||||
|
"intervalo entre generaciones (en ticks)",
|
||||||
|
4, 1, 100, 1
|
||||||
|
));
|
||||||
|
|
||||||
|
public NumberSetting particleCount = sgGeneral.add(new NumberSetting(
|
||||||
|
"cantidad",
|
||||||
|
"partículas por generación",
|
||||||
|
10, 1, 100, 1
|
||||||
|
));
|
||||||
|
|
||||||
|
|
||||||
|
public NumberSetting velocity = sgDispersion.add(new NumberSetting(
|
||||||
|
"velocidad",
|
||||||
|
"multiplicador de la velocidad de dispersión",
|
||||||
|
0.2, 0, 2, 0.05
|
||||||
|
));
|
||||||
|
|
||||||
|
public NumberSetting spreadX = sgDispersion.add(new NumberSetting(
|
||||||
|
"dispersión X",
|
||||||
|
"dispersión horizontal de posición",
|
||||||
|
0.5, 0, 5, 0.1
|
||||||
|
));
|
||||||
|
|
||||||
|
public NumberSetting spreadY = sgDispersion.add(new NumberSetting(
|
||||||
|
"dispersión Y",
|
||||||
|
"dispersión vertical de posición",
|
||||||
|
0.5, 0, 5, 0.1
|
||||||
|
));
|
||||||
|
|
||||||
|
public NumberSetting spreadZ = sgDispersion.add(new NumberSetting(
|
||||||
|
"dispersión Z",
|
||||||
|
"dispersión de profundidad de posición",
|
||||||
|
0.5, 0, 5, 0.1
|
||||||
|
));
|
||||||
|
|
||||||
|
public NumberSetting velocityRandomness = sgDispersion.add(new NumberSetting(
|
||||||
|
"aleatoriedad velocidad",
|
||||||
|
"variación aleatoria en la velocidad",
|
||||||
|
0.3, 0, 1, 0.05
|
||||||
|
));
|
||||||
|
|
||||||
|
public NumberSetting positionRandomness = sgDispersion.add(new NumberSetting(
|
||||||
|
"aleatoriedad posición",
|
||||||
|
"variación aleatoria en la posición",
|
||||||
|
0.2, 0, 1, 0.05
|
||||||
|
));
|
||||||
|
|
||||||
|
|
||||||
|
public NumberSetting offsetX = sgOffset.add(new NumberSetting(
|
||||||
|
"desplazamiento pos. X",
|
||||||
|
"desplazamiento en el eje X respecto al jugador",
|
||||||
|
0, -1, 1, 0.01
|
||||||
|
));
|
||||||
|
|
||||||
|
public NumberSetting offsetY = sgOffset.add(new NumberSetting(
|
||||||
|
"desplazamiento pos. Y",
|
||||||
|
"desplazamiento en el eje Y respecto al jugador",
|
||||||
|
0, -1, 1, 0.01
|
||||||
|
));
|
||||||
|
|
||||||
|
public NumberSetting offsetZ = sgOffset.add(new NumberSetting(
|
||||||
|
"desplazamiento pos. Z",
|
||||||
|
"desplazamiento en el eje Z respecto al jugador",
|
||||||
|
-0.8, -1, 1, 0.01
|
||||||
|
));
|
||||||
|
|
||||||
|
|
||||||
|
private final Random random = new Random();
|
||||||
|
private int tickCounter = 0;
|
||||||
|
|
||||||
|
|
||||||
|
public Particles() {
|
||||||
|
super("partículas", "emite particulas artificiales", Category.RENDER);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable() {
|
||||||
|
tickCounter = 0;
|
||||||
|
super.onEnable();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTick() {
|
||||||
|
if (mc.player == null || mc.world == null) return;
|
||||||
|
|
||||||
|
tickCounter++;
|
||||||
|
if (tickCounter < spawnInterval.getIntValue()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tickCounter = 0;
|
||||||
|
|
||||||
|
List<SimpleParticleType> enabledParticles = particles.getEnabledOptions();
|
||||||
|
if (enabledParticles.isEmpty()) return;
|
||||||
|
|
||||||
|
Vec3d basePos = new Vec3d(
|
||||||
|
mc.player.getX(),
|
||||||
|
mc.player.getY() + mc.player.getEyeHeight(mc.player.getPose()),
|
||||||
|
mc.player.getZ()
|
||||||
|
);
|
||||||
|
|
||||||
|
for (int i = 0; i < particleCount.getIntValue(); i++) {
|
||||||
|
SimpleParticleType particle = enabledParticles.get(
|
||||||
|
random.nextInt(enabledParticles.size())
|
||||||
|
);
|
||||||
|
|
||||||
|
Vec3d pos = getPos(basePos);
|
||||||
|
Vec3d vel = getVel();
|
||||||
|
|
||||||
|
double yaw = Math.toRadians(mc.player.getYaw());
|
||||||
|
double offX = offsetX.getValue() * Math.cos(yaw) - offsetZ.getValue() * Math.sin(yaw);
|
||||||
|
double offZ = offsetX.getValue() * Math.sin(yaw) + offsetZ.getValue() * Math.cos(yaw);
|
||||||
|
|
||||||
|
mc.world.addParticleClient(
|
||||||
|
particle,
|
||||||
|
pos.x + offX,
|
||||||
|
pos.y + offsetY.getValue(),
|
||||||
|
pos.z + offZ,
|
||||||
|
vel.x, vel.y, vel.z
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vec3d getPos(Vec3d basePos) {
|
||||||
|
double randX = (random.nextDouble() - 0.5) * 2 * positionRandomness.getValue();
|
||||||
|
double randY = (random.nextDouble() - 0.5) * 2 * positionRandomness.getValue();
|
||||||
|
double randZ = (random.nextDouble() - 0.5) * 2 * positionRandomness.getValue();
|
||||||
|
|
||||||
|
return new Vec3d(
|
||||||
|
basePos.x + (random.nextDouble() - 0.5) * spreadX.getValue() + randX,
|
||||||
|
basePos.y + (random.nextDouble() - 0.5) * spreadY.getValue() + randY,
|
||||||
|
basePos.z + (random.nextDouble() - 0.5) * spreadZ.getValue() + randZ
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vec3d getVel() {
|
||||||
|
double randX = (random.nextDouble() - 0.5) * 2 * velocityRandomness.getValue();
|
||||||
|
double randY = (random.nextDouble() - 0.5) * 2 * velocityRandomness.getValue();
|
||||||
|
double randZ = (random.nextDouble() - 0.5) * 2 * velocityRandomness.getValue();
|
||||||
|
|
||||||
|
return new Vec3d(
|
||||||
|
(random.nextDouble() - 0.5) * velocity.getValue() + randX,
|
||||||
|
(random.nextDouble() - 0.5) * velocity.getValue() + randY,
|
||||||
|
(random.nextDouble() - 0.5) * velocity.getValue() + randZ
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,12 +4,12 @@ import me.retucio.sputnik.event.SubscribeEvent;
|
|||||||
import me.retucio.sputnik.event.events.PacketEvent;
|
import me.retucio.sputnik.event.events.PacketEvent;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
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;
|
import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket;
|
||||||
|
|
||||||
public class ColoredSigns extends Module {
|
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() {
|
public ColoredSigns() {
|
||||||
super("carteles gays",
|
super("carteles gays",
|
||||||
|
|||||||
@@ -1,142 +1,359 @@
|
|||||||
package me.retucio.sputnik.module.modules.world;
|
package me.retucio.sputnik.module.modules.world;
|
||||||
|
|
||||||
import me.retucio.sputnik.event.SubscribeEvent;
|
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.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||||
import me.retucio.sputnik.module.settings.ColorSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.NumberSetting;
|
import me.retucio.sputnik.module.setting.settings.ColorSetting;
|
||||||
|
import me.retucio.sputnik.module.setting.settings.NumberSetting;
|
||||||
import me.retucio.sputnik.util.render.RenderUtil;
|
import me.retucio.sputnik.util.render.RenderUtil;
|
||||||
import net.minecraft.block.*;
|
import net.minecraft.block.*;
|
||||||
import net.minecraft.block.Blocks;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Direction;
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
import net.minecraft.world.Heightmap;
|
||||||
import net.minecraft.world.LightType;
|
import net.minecraft.world.LightType;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.List;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
public class LightOverlay extends Module {
|
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));
|
||||||
|
SettingGroup sgOptimization = addSg(new SettingGroup("optimización", true));
|
||||||
|
|
||||||
|
// detección
|
||||||
|
public NumberSetting radius = sgDetection.add(new NumberSetting(
|
||||||
|
"radio",
|
||||||
|
"radio a tener en cuenta al renderizar superposición",
|
||||||
16, 5, 128, 1));
|
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));
|
4, 1, 16, 1));
|
||||||
|
|
||||||
public NumberSetting interval = addSetting(new NumberSetting("intervalo", "cada cuántos ticks comprobar el nivel de 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));
|
||||||
|
|
||||||
|
|
||||||
|
// optimización, porque iba como la mierda
|
||||||
|
public NumberSetting updateInterval = sgOptimization.add(new NumberSetting(
|
||||||
|
"intervalo de búsqueda",
|
||||||
|
"cada cuántos ticks actualizar la búsqueda de bloques",
|
||||||
10, 1, 80, 1));
|
10, 1, 80, 1));
|
||||||
|
|
||||||
public ColorSetting lightColor = addSetting(new ColorSetting("color de la luz", "color de los bloques con luz",
|
public NumberSetting movementThreshold = sgOptimization.add(new NumberSetting(
|
||||||
|
"umbral de movimiento",
|
||||||
|
"distancia que debe moverse el jugador antes de forzar una actualización",
|
||||||
|
3.0, 0.5, 10.0, 0.5));
|
||||||
|
|
||||||
|
public BooleanSetting asyncSearch = sgOptimization.add(new BooleanSetting(
|
||||||
|
"búsqueda asíncrona",
|
||||||
|
"buscar bloques en un hilo separado (reduce lag)",
|
||||||
|
true));
|
||||||
|
|
||||||
|
public BooleanSetting incrementalUpdates = sgOptimization.add(new BooleanSetting(
|
||||||
|
"actualizaciones incrementales",
|
||||||
|
"actualizar solo los bloques nuevos / eliminados en lugar de recalcular todo",
|
||||||
|
true));
|
||||||
|
|
||||||
|
// colores
|
||||||
|
public ColorSetting lightColor = sgColors.add(new ColorSetting(
|
||||||
|
"color de la luz",
|
||||||
|
"color de los bloques con luz",
|
||||||
new Color(0, 255, 0, 67), false));
|
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));
|
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<>();
|
// caché y estado
|
||||||
|
private final Set<BlockPos> cachedBlocks = Collections.newSetFromMap(new ConcurrentHashMap<>());
|
||||||
|
private final Set<BlockPos> blocksToRender = Collections.newSetFromMap(new ConcurrentHashMap<>());
|
||||||
|
private BlockPos lastPlayerPos = null;
|
||||||
|
private int lastRadius = -1;
|
||||||
|
private int lastYRadius = -1;
|
||||||
|
private int updateTimer = 0;
|
||||||
|
private boolean isSearching = false;
|
||||||
|
|
||||||
|
// para actualizaciones incrementales
|
||||||
|
private int incrementalLayer = 0;
|
||||||
|
private boolean fullRescanNeeded = false;
|
||||||
|
|
||||||
public LightOverlay() {
|
public LightOverlay() {
|
||||||
super("superposición de luz",
|
super("superposición de luz",
|
||||||
"te muestra el nivel de luz en bloques, para prevenir mob spawns",
|
"te muestra el nivel de luz en bloques, para prevenir mob spawns",
|
||||||
Category.WORLD);
|
Category.WORLD);
|
||||||
|
|
||||||
|
onWater.onUpdate(v -> dontCullWater.setVisible(v));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable() {
|
||||||
|
cachedBlocks.clear();
|
||||||
|
blocksToRender.clear();
|
||||||
|
lastPlayerPos = null;
|
||||||
|
lastRadius = -1;
|
||||||
|
lastYRadius = -1;
|
||||||
|
updateTimer = 0;
|
||||||
|
incrementalLayer = 0;
|
||||||
|
fullRescanNeeded = true;
|
||||||
|
|
||||||
|
super.onEnable();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisable() {
|
||||||
|
cachedBlocks.clear();
|
||||||
|
blocksToRender.clear();
|
||||||
|
|
||||||
|
super.onDisable();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void onRenderWorld(RenderWorldEvent event) {
|
@SuppressWarnings("deprecation")
|
||||||
|
public void onRenderWorld(Render3DEvent event) {
|
||||||
if (mc.player == null || mc.world == null) return;
|
if (mc.player == null || mc.world == null) return;
|
||||||
if (mc.player.age % interval.getIntValue() == 0) {
|
|
||||||
blocks = findExposedBlocks(
|
// actualización periódica
|
||||||
radius.getIntValue(),
|
if (updateTimer++ >= updateInterval.getIntValue()) {
|
||||||
yRadius.getIntValue()
|
updateTimer = 0;
|
||||||
|
updateBlocks();
|
||||||
|
}
|
||||||
|
|
||||||
|
// renderizado
|
||||||
|
Vec3d cameraPos = mc.gameRenderer.getCamera().getCameraPos();
|
||||||
|
int radiusValue = radius.getIntValue();
|
||||||
|
double radiusSq = radiusValue * radiusValue;
|
||||||
|
|
||||||
|
// actualizar lista de renderizado basado en distancia
|
||||||
|
blocksToRender.clear();
|
||||||
|
for (BlockPos pos : cachedBlocks) {
|
||||||
|
double distanceSq = pos.getSquaredDistance(cameraPos);
|
||||||
|
if (distanceSq <= radiusSq) {
|
||||||
|
blocksToRender.add(pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// renderizar bloques visibles
|
||||||
|
for (BlockPos block : blocksToRender) {
|
||||||
|
if (!mc.world.isChunkLoaded(block)) continue;
|
||||||
|
|
||||||
|
BlockState state = mc.world.getBlockState(block);
|
||||||
|
BlockState aboveState = mc.world.getBlockState(block.up());
|
||||||
|
|
||||||
|
if (!isValidSpawnSurface(block, state, aboveState)) continue;
|
||||||
|
|
||||||
|
// nivel de luz
|
||||||
|
int light = mc.world.getLightLevel(LightType.BLOCK, block.up());
|
||||||
|
|
||||||
|
// color
|
||||||
|
Color color;
|
||||||
|
if (light == 0) {
|
||||||
|
color = darknessColor.getColor();
|
||||||
|
} else {
|
||||||
|
float ratio = light / 15.0f;
|
||||||
|
color = new Color(
|
||||||
|
(int)(lightColor.getR() * ratio),
|
||||||
|
(int)(lightColor.getG() * ratio),
|
||||||
|
(int)(lightColor.getB() * ratio),
|
||||||
|
lightColor.getA()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (BlockPos block : blocks) {
|
// renderizar
|
||||||
if (mc.world.getBlockState(block).isAir() || !canSpawnOn(block)) continue;
|
boolean shouldCull = !(onWater.isEnabled() && aboveState.isOf(Blocks.WATER) && dontCullWater.isEnabled());
|
||||||
if (!mc.world.getBlockState(block).isOpaque()) continue;
|
RenderUtil.drawBlockFaceFilled(event.getMatrices(), block, Direction.UP, color, 0.001f, shouldCull);
|
||||||
int light = mc.world.getLightLevel(LightType.BLOCK, block.up());
|
|
||||||
|
|
||||||
Color color = light == 0 ? darknessColor.getColor()
|
|
||||||
: new Color(
|
|
||||||
(lightColor.getR() / 15) * light,
|
|
||||||
(lightColor.getG() / 15) * light,
|
|
||||||
(lightColor.getB() / 15) * light,
|
|
||||||
lightColor.getA());
|
|
||||||
|
|
||||||
RenderUtil.drawBlockFaceFilled(event.getMatrices(), block, Direction.UP, color, 0.001f, true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<BlockPos> findExposedBlocks(int radius, int yRadius) {
|
private void updateBlocks() {
|
||||||
List<BlockPos> results = new ArrayList<>();
|
if (mc.player == null || mc.world == null) return;
|
||||||
|
|
||||||
BlockPos pos = mc.player.getBlockPos();
|
BlockPos playerPos = mc.player.getBlockPos();
|
||||||
|
int currentRadius = radius.getIntValue();
|
||||||
|
int currentYRadius = yRadius.getIntValue();
|
||||||
|
|
||||||
int minX = pos.getX() - radius;
|
// verificar si hace falta actualizar
|
||||||
int maxX = pos.getX() + radius;
|
boolean needsUpdate = fullRescanNeeded ||
|
||||||
int minY = Math.max(mc.world.getDimension().minY(), pos.getY() - yRadius);
|
lastRadius != currentRadius ||
|
||||||
int maxY = Math.min(mc.world.getDimension().height() - 1, pos.getY() + yRadius);
|
lastYRadius != currentYRadius ||
|
||||||
int minZ = pos.getZ() - radius;
|
(lastPlayerPos != null &&
|
||||||
int maxZ = pos.getZ() + radius;
|
playerPos.getSquaredDistance(lastPlayerPos) > (movementThreshold.getValue() * movementThreshold.getValue()));
|
||||||
|
|
||||||
maxY = Math.min(maxY, mc.world.getDimension().height() - 2);
|
if (!needsUpdate && incrementalUpdates.isEnabled() && incrementalLayer >= 0) {
|
||||||
|
// actualización incremental de una sola capa
|
||||||
|
performIncrementalUpdate(playerPos, currentRadius, currentYRadius);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!needsUpdate) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastPlayerPos = playerPos;
|
||||||
|
lastRadius = currentRadius;
|
||||||
|
lastYRadius = currentYRadius;
|
||||||
|
fullRescanNeeded = false;
|
||||||
|
incrementalLayer = 0;
|
||||||
|
|
||||||
|
// búsqueda
|
||||||
|
if (asyncSearch.isEnabled()) {
|
||||||
|
if (isSearching) return;
|
||||||
|
|
||||||
|
isSearching = true;
|
||||||
|
new Thread(() -> {
|
||||||
|
try {
|
||||||
|
performFullBlockSearch(playerPos, currentRadius, currentYRadius);
|
||||||
|
} finally {
|
||||||
|
isSearching = false;
|
||||||
|
}
|
||||||
|
}, "sputnik-lightoverlay-search").start();
|
||||||
|
} else {
|
||||||
|
performFullBlockSearch(playerPos, currentRadius, currentYRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
private void performFullBlockSearch(BlockPos center, int radius, int yRadius) {
|
||||||
|
Set<BlockPos> newBlocks = new HashSet<>();
|
||||||
|
int radiusSq = radius * radius;
|
||||||
|
|
||||||
|
int minY = Math.max(mc.world.getBottomY(), center.getY() - yRadius);
|
||||||
|
int maxY = Math.min(mc.world.getTopY(Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, mc.player.getBlockPos()) - 1, center.getY() + yRadius);
|
||||||
|
|
||||||
|
for (int x = -radius; x <= radius; x++) {
|
||||||
|
for (int z = -radius; z <= radius; z++) {
|
||||||
|
if (x*x + z*z > radiusSq) continue;
|
||||||
|
|
||||||
for (int x = minX; x <= maxX; x++) {
|
|
||||||
for (int z = minZ; z <= maxZ; z++) {
|
|
||||||
for (int y = minY; y <= maxY; y++) {
|
for (int y = minY; y <= maxY; y++) {
|
||||||
BlockPos current = new BlockPos(x, y, z);
|
BlockPos pos = center.add(x, y - center.getY(), z);
|
||||||
|
|
||||||
if (!mc.world.isAir(current) && canSpawnOn(current))
|
// nuh uh si el chunk no está cargado
|
||||||
results.add(current);
|
if (!mc.world.isChunkLoaded(pos)) continue;
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return results;
|
BlockState state = mc.world.getBlockState(pos);
|
||||||
}
|
|
||||||
|
|
||||||
private boolean canSpawnOn(BlockPos pos) {
|
|
||||||
BlockState aboveState = mc.world.getBlockState(pos.up());
|
BlockState aboveState = mc.world.getBlockState(pos.up());
|
||||||
|
|
||||||
|
if (isValidSpawnSurface(pos, state, aboveState)) {
|
||||||
|
newBlocks.add(pos.toImmutable());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// actualizar caché
|
||||||
|
cachedBlocks.clear();
|
||||||
|
cachedBlocks.addAll(newBlocks);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
private void performIncrementalUpdate(BlockPos center, int radius, int yRadius) {
|
||||||
|
if (incrementalLayer > radius * 2) {
|
||||||
|
incrementalLayer = -radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
int currentX = center.getX() - radius + incrementalLayer;
|
||||||
|
int radiusSq = radius * radius;
|
||||||
|
int minY = Math.max(mc.world.getBottomY(), center.getY() - yRadius);
|
||||||
|
int maxY = Math.min(mc.world.getTopY(Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, mc.player.getBlockPos()) - 1, center.getY() + yRadius);
|
||||||
|
|
||||||
|
// buscar en una columna específica (x fijo, variar z)
|
||||||
|
for (int z = -radius; z <= radius; z++) {
|
||||||
|
int xDist = incrementalLayer;
|
||||||
|
if (xDist*xDist + z*z > radiusSq) continue;
|
||||||
|
|
||||||
|
for (int y = minY; y <= maxY; y++) {
|
||||||
|
BlockPos pos = new BlockPos(currentX, y, center.getZ() + z);
|
||||||
|
|
||||||
|
if (!mc.world.isChunkLoaded(pos)) continue;
|
||||||
|
|
||||||
|
BlockState state = mc.world.getBlockState(pos);
|
||||||
|
BlockState aboveState = mc.world.getBlockState(pos.up());
|
||||||
|
|
||||||
|
boolean isValid = isValidSpawnSurface(pos, state, aboveState);
|
||||||
|
|
||||||
|
if (isValid) {
|
||||||
|
cachedBlocks.add(pos.toImmutable());
|
||||||
|
} else {
|
||||||
|
cachedBlocks.remove(pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
incrementalLayer++;
|
||||||
|
|
||||||
|
// cada 10 actualizaciones incrementales, hacer una limpieza de bloques lejanos
|
||||||
|
if (incrementalLayer % 10 == 0) {
|
||||||
|
cleanupDistantBlocks(center, radius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void cleanupDistantBlocks(BlockPos center, int radius) {
|
||||||
|
int radiusSq = radius * radius * 2;
|
||||||
|
Iterator<BlockPos> iterator = cachedBlocks.iterator();
|
||||||
|
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
BlockPos pos = iterator.next();
|
||||||
|
int dx = pos.getX() - center.getX();
|
||||||
|
int dz = pos.getZ() - center.getZ();
|
||||||
|
|
||||||
|
if (dx * dx + dz * dz > radiusSq) {
|
||||||
|
iterator.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isValidSpawnSurface(BlockPos pos, BlockState state, BlockState aboveState) {
|
||||||
|
if (state.isAir() || !state.isOpaque() || !state.isFullCube(mc.world, pos)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Block aboveBlock = aboveState.getBlock();
|
Block aboveBlock = aboveState.getBlock();
|
||||||
|
|
||||||
if (aboveState.isAir()) return true;
|
if (aboveState.isAir()) return true;
|
||||||
if (aboveBlock == Blocks.WATER && onWater.isEnabled()) return true;
|
if (aboveBlock == Blocks.WATER && onWater.isEnabled()) return true;
|
||||||
|
|
||||||
if (aboveBlock instanceof PlantBlock) return true;
|
if (aboveBlock instanceof PlantBlock) return true;
|
||||||
|
|
||||||
if (!aboveState.isOpaque() && !aboveState.isFullCube(mc.world, pos.up())) {
|
if (aboveBlock instanceof SlabBlock ||
|
||||||
|
aboveBlock instanceof StairsBlock ||
|
||||||
if (aboveBlock instanceof SlabBlock
|
aboveBlock instanceof ButtonBlock ||
|
||||||
|| aboveBlock instanceof StairsBlock
|
aboveBlock instanceof CarpetBlock ||
|
||||||
|| aboveBlock instanceof ButtonBlock
|
aboveBlock instanceof PressurePlateBlock ||
|
||||||
|| aboveBlock instanceof CarpetBlock
|
aboveBlock instanceof PaneBlock ||
|
||||||
|| aboveBlock instanceof PressurePlateBlock
|
aboveBlock instanceof TrapdoorBlock ||
|
||||||
|| aboveBlock instanceof PaneBlock
|
aboveBlock instanceof FenceBlock ||
|
||||||
|| aboveBlock instanceof TrapdoorBlock
|
aboveBlock instanceof WallBlock ||
|
||||||
|| aboveBlock instanceof FenceBlock
|
aboveBlock instanceof AnvilBlock ||
|
||||||
|| aboveBlock instanceof WallBlock
|
aboveBlock instanceof BedBlock) {
|
||||||
|| aboveBlock instanceof AnvilBlock
|
|
||||||
|| aboveBlock instanceof BedBlock) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (aboveBlock == Blocks.CHEST ||
|
if (aboveBlock == Blocks.CHEST ||
|
||||||
aboveBlock == Blocks.ENDER_CHEST ||
|
aboveBlock == Blocks.ENDER_CHEST ||
|
||||||
aboveBlock == Blocks.BARREL ||
|
aboveBlock == Blocks.BARREL ||
|
||||||
aboveBlock == Blocks.TRAPPED_CHEST) {
|
aboveBlock == Blocks.TRAPPED_CHEST ||
|
||||||
|
aboveBlock == Blocks.ENCHANTING_TABLE ||
|
||||||
|
aboveBlock == Blocks.GRINDSTONE ||
|
||||||
|
aboveBlock == Blocks.STONECUTTER ||
|
||||||
|
aboveBlock == Blocks.LOOM ||
|
||||||
|
aboveBlock == Blocks.COMPOSTER ||
|
||||||
|
aboveBlock == Blocks.CAKE) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return aboveBlock != Blocks.ENCHANTING_TABLE
|
return !aboveState.isOpaque() || !aboveState.isFullCube(mc.world, pos.up());
|
||||||
&& aboveBlock != Blocks.GRINDSTONE
|
|
||||||
&& aboveBlock != Blocks.STONECUTTER
|
|
||||||
&& aboveBlock != Blocks.LOOM
|
|
||||||
&& aboveBlock != Blocks.COMPOSTER
|
|
||||||
&& aboveBlock != Blocks.CAKE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,8 +2,8 @@ package me.retucio.sputnik.module.modules.world;
|
|||||||
|
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.ListSetting;
|
import me.retucio.sputnik.module.setting.settings.ListSetting;
|
||||||
import me.retucio.sputnik.util.Lists;
|
import me.retucio.sputnik.util.Lists;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.EntityType;
|
import net.minecraft.entity.EntityType;
|
||||||
@@ -11,8 +11,8 @@ import net.minecraft.registry.tag.ItemTags;
|
|||||||
|
|
||||||
public class NoMiningInterruptions extends Module {
|
public class NoMiningInterruptions extends Module {
|
||||||
|
|
||||||
public BooleanSetting withPickaxeOnly = addSetting(new BooleanSetting("solo con pico", "ignorar entidades solamente cuando se sujeta un pico", false));
|
public BooleanSetting withPickaxeOnly = sgGeneral.add(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 ListSetting<EntityType<?>> entities = sgGeneral.add(new ListSetting<>("entidades", "entidades a ignorar",
|
||||||
Lists.entityList, Lists.allTrue(Lists.entityList), Lists.entityNames));
|
Lists.entityList, Lists.allTrue(Lists.entityList), Lists.entityNames));
|
||||||
|
|
||||||
public NoMiningInterruptions() {
|
public NoMiningInterruptions() {
|
||||||
|
|||||||
@@ -4,20 +4,24 @@ import me.retucio.sputnik.event.SubscribeEvent;
|
|||||||
import me.retucio.sputnik.event.events.PacketEvent;
|
import me.retucio.sputnik.event.events.PacketEvent;
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||||
import me.retucio.sputnik.module.settings.EnumSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.NumberSetting;
|
import me.retucio.sputnik.module.setting.settings.EnumSetting;
|
||||||
|
import me.retucio.sputnik.module.setting.settings.NumberSetting;
|
||||||
import net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket;
|
import net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket;
|
||||||
|
|
||||||
// continúa en ClientWorldPropertiesMixin, DimensionTypeMixin,
|
// continúa en ClientWorldPropertiesMixin, DimensionTypeMixin,
|
||||||
public class TimeChanger extends Module {
|
public class TimeChanger extends Module {
|
||||||
|
|
||||||
public BooleanSetting renderSun = addSetting(new BooleanSetting("sol", "que haya sol o no", true));
|
SettingGroup sgCelestialBodies = addSg(new SettingGroup("cuerpos celeste", false));
|
||||||
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));
|
|
||||||
|
|
||||||
public EnumSetting<MoonPhases> moonPhase = addSetting(new EnumSetting<>("fase lunar", "fase lunar actual", MoonPhases.class, MoonPhases.DEFAULT));
|
public NumberSetting time = sgGeneral.add(new NumberSetting("hora", "hora del juego", 0, -20000, 20000, 1));
|
||||||
public NumberSetting time = addSetting(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() {
|
public TimeChanger() {
|
||||||
super("cielo custom",
|
super("cielo custom",
|
||||||
|
|||||||
+13
-7
@@ -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.Sputnik;
|
||||||
import me.retucio.sputnik.event.events.sputnik.UpdateSettingEvent;
|
import me.retucio.sputnik.event.events.sputnik.UpdateSettingEvent;
|
||||||
@@ -13,7 +13,7 @@ public abstract class Setting {
|
|||||||
private boolean visible = true;
|
private boolean visible = true;
|
||||||
private boolean searchMatch = true;
|
private boolean searchMatch = true;
|
||||||
|
|
||||||
private Module module;
|
private SettingGroup sg;
|
||||||
|
|
||||||
protected Setting(String name, String description) {
|
protected Setting(String name, String description) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
@@ -44,15 +44,21 @@ public abstract class Setting {
|
|||||||
return description;
|
return description;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Module getModule() {
|
public SettingGroup getSg() {
|
||||||
return module;
|
return sg;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setModule(Module module) {
|
public void setSg(SettingGroup sg) {
|
||||||
this.module = module;
|
this.sg = sg;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void fireUpdateEvent() {
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
+3
-1
@@ -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;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
+2
-1
@@ -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 me.retucio.sputnik.util.Colors;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
|
||||||
+3
-1
@@ -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.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
+2
-1
@@ -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.Module;
|
||||||
import me.retucio.sputnik.module.ModuleManager;
|
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.ui.widgets.frames.settings.ClientSettingsFrame;
|
||||||
import me.retucio.sputnik.util.ChatUtil;
|
import me.retucio.sputnik.util.ChatUtil;
|
||||||
import me.retucio.sputnik.util.KeyUtil;
|
import me.retucio.sputnik.util.KeyUtil;
|
||||||
+13
-1
@@ -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.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -103,6 +105,16 @@ public class ListSetting<T> extends Setting {
|
|||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<T> getEnabledOptions() {
|
||||||
|
List<T> enabledOptions = new ArrayList<>();
|
||||||
|
for (T option : options) {
|
||||||
|
if (isEnabled(option)) {
|
||||||
|
enabledOptions.add(option);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return enabledOptions;
|
||||||
|
}
|
||||||
|
|
||||||
public Map<T, String> getDisplayNames() {
|
public Map<T, String> getDisplayNames() {
|
||||||
return displayNames;
|
return displayNames;
|
||||||
}
|
}
|
||||||
+3
-1
@@ -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;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
+3
-1
@@ -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.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
+3
-1
@@ -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;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
@@ -36,6 +36,7 @@ public class HudRenderer {
|
|||||||
addElement(new CustomTextElement(), positions, visibilities);
|
addElement(new CustomTextElement(), positions, visibilities);
|
||||||
addElement(new TimeElement(), positions, visibilities);
|
addElement(new TimeElement(), positions, visibilities);
|
||||||
addElement(new PingElement(), positions, visibilities);
|
addElement(new PingElement(), positions, visibilities);
|
||||||
|
addElement(new RotationElement(), positions, visibilities);
|
||||||
|
|
||||||
addElement(new DynoElement(), positions, visibilities);
|
addElement(new DynoElement(), positions, visibilities);
|
||||||
addElement(new EchestElement(), positions, visibilities);
|
addElement(new EchestElement(), positions, visibilities);
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package me.retucio.sputnik.ui.hud.elements;
|
||||||
|
|
||||||
|
import me.retucio.sputnik.module.ModuleManager;
|
||||||
|
import me.retucio.sputnik.module.modules.client.HUD;
|
||||||
|
import me.retucio.sputnik.ui.hud.TextHudElement;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class RotationElement extends TextHudElement {
|
||||||
|
|
||||||
|
public RotationElement() {
|
||||||
|
super("rotation", mc.getWindow().getScaledWidth() - mc.textRenderer.getWidth("180º 180º (N)"), mc.getWindow().getScaledHeight() - mc.textRenderer.fontHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getText(float delta, HUD hud) {
|
||||||
|
if (mc.player == null) return getPreviewText();
|
||||||
|
return String.format("%.2f", mc.player.getYaw()) + "º " + String.format("%.2f", mc.player.getPitch()) + "º (" + getDirection() + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPreviewText() {
|
||||||
|
if (mc.player == null)
|
||||||
|
return "69º 69º (W)";
|
||||||
|
return getText(mc.getRenderTickCounter().getDynamicDeltaTicks(), ModuleManager.INSTANCE.getModuleByClass(HUD.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Text> getTooltip() {
|
||||||
|
return List.of();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getDirection() {
|
||||||
|
return switch (mc.player.getHorizontalFacing()) {
|
||||||
|
case NORTH -> "N";
|
||||||
|
case SOUTH -> "S";
|
||||||
|
case EAST -> "E";
|
||||||
|
case WEST -> "O";
|
||||||
|
default -> "?";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,8 +7,8 @@ import me.retucio.sputnik.event.events.MouseClickEvent;
|
|||||||
import me.retucio.sputnik.event.events.MouseScrollEvent;
|
import me.retucio.sputnik.event.events.MouseScrollEvent;
|
||||||
import me.retucio.sputnik.event.events.sputnik.SettingsFrameEvent;
|
import me.retucio.sputnik.event.events.sputnik.SettingsFrameEvent;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.Setting;
|
import me.retucio.sputnik.module.setting.Setting;
|
||||||
import me.retucio.sputnik.module.settings.ColorSetting;
|
import me.retucio.sputnik.module.setting.settings.ColorSetting;
|
||||||
import me.retucio.sputnik.ui.widgets.buttons.settings.ListButton;
|
import me.retucio.sputnik.ui.widgets.buttons.settings.ListButton;
|
||||||
import me.retucio.sputnik.ui.widgets.buttons.ModuleButton;
|
import me.retucio.sputnik.ui.widgets.buttons.ModuleButton;
|
||||||
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
|
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
|
||||||
@@ -35,6 +35,7 @@ import org.lwjgl.glfw.GLFW;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
import static me.retucio.sputnik.ui.widgets.frames.settings.ClientSettingsFrame.guiSettings;
|
import static me.retucio.sputnik.ui.widgets.frames.settings.ClientSettingsFrame.guiSettings;
|
||||||
|
|
||||||
@@ -233,28 +234,36 @@ public class ClickGUI extends Screen {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
String name = setting.getName();
|
String name = MiscUtil.removeAccentMarks(setting.getName());
|
||||||
String description = setting.getDescription();
|
String description = MiscUtil.removeAccentMarks(setting.getDescription());
|
||||||
|
String sgName = MiscUtil.removeAccentMarks(setting.getSg().getName());
|
||||||
|
|
||||||
if (!guiSettings.matchCase.isEnabled()) {
|
if (!guiSettings.matchCase.isEnabled()) {
|
||||||
name = name.toLowerCase();
|
name = name.toLowerCase();
|
||||||
description = description.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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SettingsFrame getSfOfModule(Module module) {
|
||||||
|
Optional<SettingsFrame> frame = settingsFrames.stream()
|
||||||
|
.filter(sf -> sf.getModule().equals(module))
|
||||||
|
.findFirst();
|
||||||
|
|
||||||
|
return frame.orElseGet(() ->
|
||||||
|
new SettingsFrame(module, 0, 0, 100, 20)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// abrir un marco donde se encuentran los ajustes del módulo deseado
|
// abrir un marco donde se encuentran los ajustes del módulo deseado
|
||||||
public void openSettingsFrame(Module module, int x, int y) {
|
public void openSettingsFrame(Module module, int x, int y) {
|
||||||
for (SettingsFrame frame : settingsFrames) {
|
// asegurarse de que no se sale de la pantalla
|
||||||
if (frame.module == module) {
|
x = Math.clamp(x, 0, mc.getWindow().getScaledWidth() - 80);
|
||||||
frame.setX(x);
|
y = Math.clamp(y, 0, mc.getWindow().getScaledHeight() - 120);
|
||||||
frame.setY(y);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SettingsFrame frame = new SettingsFrame(module, x, y, 100, 20);
|
SettingsFrame frame = new SettingsFrame(module, x, y, 100, 20);
|
||||||
settingsFrames.add(frame);
|
settingsFrames.add(frame);
|
||||||
@@ -275,7 +284,7 @@ public class ClickGUI extends Screen {
|
|||||||
List<SettingsFrame> toRemove = new ArrayList<>();
|
List<SettingsFrame> toRemove = new ArrayList<>();
|
||||||
for (SettingsFrame sf : settingsFrames) {
|
for (SettingsFrame sf : settingsFrames) {
|
||||||
if ((sf instanceof ColorPickerFrame cpf && cpf.dummyModule == module) // para los selectores de colores
|
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);
|
toRemove.add(sf);
|
||||||
Sputnik.EVENT_BUS.post(new SettingsFrameEvent.Close(sf));
|
Sputnik.EVENT_BUS.post(new SettingsFrameEvent.Close(sf));
|
||||||
unselect(sf);
|
unselect(sf);
|
||||||
@@ -287,8 +296,8 @@ public class ClickGUI extends Screen {
|
|||||||
|
|
||||||
// verificar si un módulo tiene su marco de ajustes abierto
|
// verificar si un módulo tiene su marco de ajustes abierto
|
||||||
public boolean isSettingsFrameOpen(Module module) {
|
public boolean isSettingsFrameOpen(Module module) {
|
||||||
return settingsFrames.stream()
|
return settingsFrames.stream().anyMatch(
|
||||||
.anyMatch(sf -> sf.module.getName().equals(module.getName()));
|
sf -> sf.getModule().equals(module));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isColorPickerFrameOpen(ColorSetting setting) {
|
public boolean isColorPickerFrameOpen(ColorSetting setting) {
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public class ModuleButton extends Button {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void mouseClicked(int mouseX, int mouseY, int button) {
|
public void mouseClicked(int mouseX, int mouseY, int button) {
|
||||||
if (isHovered((int) mouseX, (int) mouseY) && ClickGUI.INSTANCE.trySelect(this)) {
|
if (isHovered(mouseX, mouseY) && ClickGUI.INSTANCE.trySelect(this)) {
|
||||||
if (button == 0) { // clic izquierdo para activar / desactivar el módulo
|
if (button == 0) { // clic izquierdo para activar / desactivar el módulo
|
||||||
module.toggle();
|
module.toggle();
|
||||||
} else if (button == 1) { // clic derecho para el marco de ajustes (también lo cierra si está abierto)
|
} else if (button == 1) { // clic derecho para el marco de ajustes (también lo cierra si está abierto)
|
||||||
@@ -56,12 +56,6 @@ public class ModuleButton extends Button {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void mouseDragged(int mouseX, int mouseY) {}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onKey(int key, int action) {}
|
|
||||||
|
|
||||||
// verifica si el puntero del ratón se encuentra sobre el botón del módulo
|
// verifica si el puntero del ratón se encuentra sobre el botón del módulo
|
||||||
@Override
|
@Override
|
||||||
public boolean isHovered(int mouseX, int mouseY) {
|
public boolean isHovered(int mouseX, int mouseY) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package me.retucio.sputnik.ui.widgets.buttons;
|
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.frames.SettingsFrame;
|
||||||
import me.retucio.sputnik.ui.widgets.Button;
|
import me.retucio.sputnik.ui.widgets.Button;
|
||||||
import net.minecraft.client.gui.DrawContext;
|
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);
|
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() {
|
public S getSetting() {
|
||||||
return setting;
|
return setting;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package me.retucio.sputnik.ui.widgets.buttons.settings;
|
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.widgets.buttons.SettingButton;
|
||||||
import me.retucio.sputnik.ui.screen.ClickGUI;
|
import me.retucio.sputnik.ui.screen.ClickGUI;
|
||||||
import me.retucio.sputnik.ui.widgets.frames.settings.ClientSettingsFrame;
|
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.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.OptionSetting;
|
import me.retucio.sputnik.module.setting.settings.OptionSetting;
|
||||||
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
|
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
|
||||||
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
|
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
|
||||||
import me.retucio.sputnik.ui.screen.ClickGUI;
|
import me.retucio.sputnik.ui.screen.ClickGUI;
|
||||||
@@ -81,7 +81,7 @@ public class ChooseButton<T> extends SettingButton<OptionSetting<T>> {
|
|||||||
String displayName = setting.getDisplayName(option);
|
String displayName = setting.getDisplayName(option);
|
||||||
BooleanSetting b = new BooleanSetting(
|
BooleanSetting b = new BooleanSetting(
|
||||||
displayName,
|
displayName,
|
||||||
"incluir " + displayName,
|
"seleccionar " + displayName,
|
||||||
setting.is(option)
|
setting.is(option)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@ public class ChooseButton<T> extends SettingButton<OptionSetting<T>> {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
dummy.addSetting(b);
|
dummy.getSg("general").add(b);
|
||||||
optionButtons.put(option, b);
|
optionButtons.put(option, b);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package me.retucio.sputnik.ui.widgets.buttons.settings;
|
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.widgets.buttons.SettingButton;
|
||||||
import me.retucio.sputnik.ui.screen.ClickGUI;
|
import me.retucio.sputnik.ui.screen.ClickGUI;
|
||||||
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
|
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
|
||||||
@@ -28,6 +28,7 @@ public class ColorButton extends SettingButton<ColorSetting> {
|
|||||||
Color bgColor = isHovered(mouseX, mouseY)
|
Color bgColor = isHovered(mouseX, mouseY)
|
||||||
? Colors.buttonColor.brighter()
|
? Colors.buttonColor.brighter()
|
||||||
: Colors.buttonColor;
|
: Colors.buttonColor;
|
||||||
|
|
||||||
ctx.fill(x, y, x + w, y + h, bgColor.getRGB());
|
ctx.fill(x, y, x + w, y + h, bgColor.getRGB());
|
||||||
|
|
||||||
// prev. del color
|
// prev. del color
|
||||||
@@ -55,7 +56,7 @@ public class ColorButton extends SettingButton<ColorSetting> {
|
|||||||
if (button == 0) {
|
if (button == 0) {
|
||||||
// clic izq.: abrir selector de colores
|
// clic izq.: abrir selector de colores
|
||||||
ClickGUI.INSTANCE.openColorPickerFrame(
|
ClickGUI.INSTANCE.openColorPickerFrame(
|
||||||
setting.getModule(), setting,
|
setting.getSg().getModule(), setting,
|
||||||
parent.getX() + parent.getW() + 120,
|
parent.getX() + parent.getW() + 120,
|
||||||
parent.getRenderY() + offset);
|
parent.getRenderY() + offset);
|
||||||
} else if (button == 1 && KeyUtil.isShiftDown()) {
|
} else if (button == 1 && KeyUtil.isShiftDown()) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package me.retucio.sputnik.ui.widgets.buttons.settings;
|
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.screen.ClickGUI;
|
||||||
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
|
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
|
||||||
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
|
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
|
||||||
|
|||||||
@@ -2,11 +2,12 @@ package me.retucio.sputnik.ui.widgets.buttons.settings;
|
|||||||
|
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.ListSetting;
|
import me.retucio.sputnik.module.setting.settings.ListSetting;
|
||||||
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
|
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
|
||||||
import me.retucio.sputnik.ui.screen.ClickGUI;
|
import me.retucio.sputnik.ui.screen.ClickGUI;
|
||||||
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
|
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
|
||||||
|
import me.retucio.sputnik.util.ChatUtil;
|
||||||
import me.retucio.sputnik.util.Colors;
|
import me.retucio.sputnik.util.Colors;
|
||||||
import me.retucio.sputnik.util.KeyUtil;
|
import me.retucio.sputnik.util.KeyUtil;
|
||||||
import net.minecraft.client.gui.DrawContext;
|
import net.minecraft.client.gui.DrawContext;
|
||||||
@@ -90,7 +91,7 @@ public class ListButton<T> extends SettingButton<ListSetting<T>> {
|
|||||||
.sorted(Comparator.comparing(setting::getDisplayName, String.CASE_INSENSITIVE_ORDER))
|
.sorted(Comparator.comparing(setting::getDisplayName, String.CASE_INSENSITIVE_ORDER))
|
||||||
.forEach(option -> {
|
.forEach(option -> {
|
||||||
String displayName = setting.getDisplayName(option);
|
String displayName = setting.getDisplayName(option);
|
||||||
BooleanSetting b = dummy.addSetting(new BooleanSetting(
|
BooleanSetting b = dummy.getSg("general").add(new BooleanSetting(
|
||||||
displayName,
|
displayName,
|
||||||
"incluir " + displayName,
|
"incluir " + displayName,
|
||||||
setting.isEnabled(option)
|
setting.isEnabled(option)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package me.retucio.sputnik.ui.widgets.buttons.settings;
|
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.screen.ClickGUI;
|
||||||
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
|
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
|
||||||
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
|
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package me.retucio.sputnik.ui.widgets.buttons.settings;
|
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.widgets.buttons.SettingButton;
|
||||||
import me.retucio.sputnik.ui.screen.ClickGUI;
|
import me.retucio.sputnik.ui.screen.ClickGUI;
|
||||||
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
|
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package me.retucio.sputnik.ui.widgets.buttons.settings;
|
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.widgets.buttons.SettingButton;
|
||||||
import me.retucio.sputnik.ui.screen.ClickGUI;
|
import me.retucio.sputnik.ui.screen.ClickGUI;
|
||||||
import me.retucio.sputnik.ui.widgets.frames.SettingsFrame;
|
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.Sputnik;
|
||||||
import me.retucio.sputnik.event.events.sputnik.SettingsFrameEvent;
|
import me.retucio.sputnik.event.events.sputnik.SettingsFrameEvent;
|
||||||
import me.retucio.sputnik.module.Module;
|
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.widgets.buttons.settings.*;
|
||||||
import me.retucio.sputnik.ui.screen.ClickGUI;
|
import me.retucio.sputnik.ui.screen.ClickGUI;
|
||||||
import me.retucio.sputnik.ui.widgets.buttons.*;
|
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
|
// marco para los botones de los ajustes de cada módulo
|
||||||
public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
|
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) {
|
public SettingsFrame(Module module, int x, int y, int w, int h) {
|
||||||
super("ajustes de " + module.getName(), x, y, w, h);
|
super("ajustes de " + module.getName(), x, y, w, h);
|
||||||
this.module = module;
|
this.module = module;
|
||||||
|
this.settingGroups = module.getSgs();
|
||||||
|
|
||||||
// asegurarse de que no se sale de la pantalla
|
addButtonsByGroups();
|
||||||
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();
|
|
||||||
|
|
||||||
visibleButtons = buttons.stream()
|
visibleButtons = buttons.stream()
|
||||||
.filter(sb -> sb.getSetting().isVisible())
|
.filter(sb -> sb.getSetting().isVisible())
|
||||||
@@ -46,7 +44,7 @@ public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
|
|||||||
// cabezal
|
// cabezal
|
||||||
int centerX = x + w / 2;
|
int centerX = x + w / 2;
|
||||||
int centerY = renderY + h / 2;
|
int centerY = renderY + h / 2;
|
||||||
int titleX = x + 8;
|
int titleX = x + 2 * PADDING;
|
||||||
int titleY = centerY - mc.textRenderer.fontHeight / 2;
|
int titleY = centerY - mc.textRenderer.fontHeight / 2;
|
||||||
|
|
||||||
int headerColor = module.isEnabled()
|
int headerColor = module.isEnabled()
|
||||||
@@ -57,31 +55,96 @@ public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
|
|||||||
? Color.RED.getRGB()
|
? Color.RED.getRGB()
|
||||||
: -1;
|
: -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.fill(x, renderY, x + w, renderY + h, headerColor);
|
||||||
ctx.drawText(mc.textRenderer, title, titleX, titleY, -1, true);
|
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()
|
visibleButtons = buttons.stream()
|
||||||
.filter(sb -> sb.getSetting().isVisible() && sb.getSetting().isSearchMatch())
|
.filter(sb -> sb.getSetting().isVisible() && sb.getSetting().isSearchMatch())
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
// descripción
|
// descripción
|
||||||
List<String> descLines = wrapDescription(module.getDescription(), w - 8);
|
List<String> descLines = wrapDescription(module.getDescription(), w - 2 * PADDING);
|
||||||
int lineSpacing = 2;
|
int lineSpacing = 2;
|
||||||
|
|
||||||
int descHeight = descLines.size() * mc.textRenderer.fontHeight + (descLines.size() - 1) * lineSpacing;
|
int descHeight = descLines.size() * mc.textRenderer.fontHeight + (descLines.size() - 1) * lineSpacing;
|
||||||
int descBoxTop = renderY + h + 5;
|
int descBoxTop = renderY + h + PADDING;
|
||||||
int descBoxBottom = descBoxTop + descHeight + 8;
|
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());
|
// obtener valores de altura y tal
|
||||||
ctx.fill(x + 4, descBoxTop, x + w - 4, descBoxBottom, Colors.buttonColor.getRGB());
|
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;
|
int firstLineY = descBoxTop + ((descBoxBottom - descBoxTop) - descHeight) / 2;
|
||||||
for (int i = 0; i < descLines.size(); i++) {
|
for (int i = 0; i < descLines.size(); i++) {
|
||||||
String line = descLines.get(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);
|
int lineY = firstLineY + i * (mc.textRenderer.fontHeight + lineSpacing);
|
||||||
ctx.drawText(mc.textRenderer, line, lineX, lineY, -1, true);
|
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
|
@Override
|
||||||
@@ -113,7 +166,8 @@ public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
|
|||||||
if (isCloseButtonHovered(mouseX, mouseY)) {
|
if (isCloseButtonHovered(mouseX, mouseY)) {
|
||||||
ClickGUI.INSTANCE.closeSettingsFrame(this.module);
|
ClickGUI.INSTANCE.closeSettingsFrame(this.module);
|
||||||
return;
|
return;
|
||||||
} if (button == 0) {
|
}
|
||||||
|
if (button == 0) {
|
||||||
dragging = true;
|
dragging = true;
|
||||||
dragX = mouseX - x;
|
dragX = mouseX - x;
|
||||||
dragY = mouseY - y;
|
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);
|
sb.mouseClicked(mouseX, mouseY, button);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void mouseReleased(int mouseX, int mouseY, int button) {
|
public void mouseReleased(int mouseX, int mouseY, int button) {
|
||||||
@@ -132,9 +197,10 @@ public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
|
|||||||
if (button == 0) {
|
if (button == 0) {
|
||||||
dragging = false;
|
dragging = false;
|
||||||
|
|
||||||
if (isHovered(mouseX, mouseY))
|
if (isHovered(mouseX, mouseY)) {
|
||||||
Sputnik.EVENT_BUS.post(new SettingsFrameEvent.Move(this));
|
Sputnik.EVENT_BUS.post(new SettingsFrameEvent.Move(this));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (SettingButton<?> sb : visibleButtons)
|
for (SettingButton<?> sb : visibleButtons)
|
||||||
sb.mouseReleased(mouseX, mouseY, button);
|
sb.mouseReleased(mouseX, mouseY, button);
|
||||||
@@ -166,6 +232,12 @@ public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
|
|||||||
int textWidth = mc.textRenderer.getWidth(text);
|
int textWidth = mc.textRenderer.getWidth(text);
|
||||||
maxWidth = Math.max(maxWidth, textWidth);
|
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;
|
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) {
|
private List<String> wrapDescription(String text, int maxWidth) {
|
||||||
List<String> lines = new ArrayList<>();
|
List<String> lines = new ArrayList<>();
|
||||||
@@ -186,7 +361,7 @@ public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
|
|||||||
|
|
||||||
for (String word : words) {
|
for (String word : words) {
|
||||||
String testLine = line.isEmpty() ? word : line + " " + word;
|
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());
|
if (!line.isEmpty()) lines.add(line.toString());
|
||||||
line = new StringBuilder(word);
|
line = new StringBuilder(word);
|
||||||
} else {
|
} else {
|
||||||
@@ -197,56 +372,29 @@ public class SettingsFrame extends Frame<SettingButton<? extends Setting>> {
|
|||||||
return lines;
|
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) {
|
public void addButton(SettingButton<?> button) {
|
||||||
buttons.add(button);
|
buttons.add(button);
|
||||||
updateWidth(); // actualizar anchura del frame tras cada iteración
|
updateWidth(); // actualizar anchura del frame tras cada iteración
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean isCloseButtonHovered(double mouseX, double mouseY) {
|
protected boolean isCloseButtonHovered(double mouseX, double mouseY) {
|
||||||
return mouseX > x + w - mc.textRenderer.getWidth("×") - 12 && mouseX < x + w - 4
|
return mouseX > x + w - mc.textRenderer.getWidth("×") - 3 * PADDING && mouseX < x + w - PADDING
|
||||||
&& mouseY > renderY + 4 && mouseY < renderY + h - 4;
|
&& 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+23
-22
@@ -3,6 +3,7 @@ package me.retucio.sputnik.ui.widgets.frames.settings;
|
|||||||
import me.retucio.sputnik.Sputnik;
|
import me.retucio.sputnik.Sputnik;
|
||||||
import me.retucio.sputnik.event.events.sputnik.GUISettingsFrameEvent;
|
import me.retucio.sputnik.event.events.sputnik.GUISettingsFrameEvent;
|
||||||
import me.retucio.sputnik.module.modules.client.GUI;
|
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.widgets.frames.SettingsFrame;
|
||||||
import me.retucio.sputnik.ui.screen.ClickGUI;
|
import me.retucio.sputnik.ui.screen.ClickGUI;
|
||||||
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
|
import me.retucio.sputnik.ui.widgets.buttons.SettingButton;
|
||||||
@@ -24,6 +25,13 @@ public class ClientSettingsFrame extends SettingsFrame {
|
|||||||
@Override
|
@Override
|
||||||
public void render(DrawContext ctx, int mouseX, int mouseY, float delta) {
|
public void render(DrawContext ctx, int mouseX, int mouseY, float delta) {
|
||||||
updateWidth();
|
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.fill(x, renderY, x + w, renderY + h, Colors.mainColor.getRGB());
|
||||||
|
|
||||||
ctx.drawText(mc.textRenderer, title,
|
ctx.drawText(mc.textRenderer, title,
|
||||||
@@ -36,25 +44,6 @@ public class ClientSettingsFrame extends SettingsFrame {
|
|||||||
renderY + (h / 2) - (mc.textRenderer.fontHeight / 2),
|
renderY + (h / 2) - (mc.textRenderer.fontHeight / 2),
|
||||||
-1, true);
|
-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
|
@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
|
// solo dejar clicar en los ajustes si el marco está extendido
|
||||||
for (SettingButton<?> settingButton : buttons)
|
if (!extended) return;
|
||||||
settingButton.mouseClicked(mouseX, mouseY, button);
|
|
||||||
|
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
|
@Override
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ package me.retucio.sputnik.ui.widgets.frames.settings;
|
|||||||
|
|
||||||
import me.retucio.sputnik.module.Category;
|
import me.retucio.sputnik.module.Category;
|
||||||
import me.retucio.sputnik.module.Module;
|
import me.retucio.sputnik.module.Module;
|
||||||
import me.retucio.sputnik.module.settings.Setting;
|
import me.retucio.sputnik.module.setting.Setting;
|
||||||
import me.retucio.sputnik.module.settings.BooleanSetting;
|
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||||
import me.retucio.sputnik.module.settings.ColorSetting;
|
import me.retucio.sputnik.module.setting.settings.ColorSetting;
|
||||||
import me.retucio.sputnik.module.settings.NumberSetting;
|
import me.retucio.sputnik.module.setting.settings.NumberSetting;
|
||||||
import me.retucio.sputnik.ui.widgets.buttons.*;
|
import me.retucio.sputnik.ui.widgets.buttons.*;
|
||||||
import me.retucio.sputnik.ui.widgets.buttons.settings.SliderButton;
|
import me.retucio.sputnik.ui.widgets.buttons.settings.SliderButton;
|
||||||
import me.retucio.sputnik.ui.widgets.buttons.settings.ToggleButton;
|
import me.retucio.sputnik.ui.widgets.buttons.settings.ToggleButton;
|
||||||
@@ -75,7 +75,7 @@ public class ColorPickerFrame extends SettingsFrame {
|
|||||||
brightnessSetting.setDefaultValue(colorSetting.getDefaultBrightness());
|
brightnessSetting.setDefaultValue(colorSetting.getDefaultBrightness());
|
||||||
|
|
||||||
// añadir ajustes y tal
|
// 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()) {
|
for (Setting setting : dummyModule.getSettings()) {
|
||||||
if (setting instanceof NumberSetting n) n.onUpdate(v -> updateColorFromSettings());
|
if (setting instanceof NumberSetting n) n.onUpdate(v -> updateColorFromSettings());
|
||||||
if (setting instanceof BooleanSetting b) b.onUpdate(v -> updateColorFromSettings());
|
if (setting instanceof BooleanSetting b) b.onUpdate(v -> updateColorFromSettings());
|
||||||
@@ -92,8 +92,8 @@ public class ColorPickerFrame extends SettingsFrame {
|
|||||||
|
|
||||||
buttons.clear();
|
buttons.clear();
|
||||||
|
|
||||||
Module originalModule = this.module;
|
Module originalModule = this.getModule();
|
||||||
this.module = dummyModule;
|
this.setModule(dummyModule);
|
||||||
|
|
||||||
// añadir botones
|
// añadir botones
|
||||||
int offset = h;
|
int offset = h;
|
||||||
@@ -111,7 +111,7 @@ public class ColorPickerFrame extends SettingsFrame {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.module = originalModule;
|
this.setModule(originalModule);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,11 @@ import net.minecraft.client.input.KeyInput;
|
|||||||
import net.minecraft.client.option.KeyBinding;
|
import net.minecraft.client.option.KeyBinding;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.event.KeyEvent;
|
||||||
|
import java.awt.im.InputContext;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
import static me.retucio.sputnik.Sputnik.mc;
|
import static me.retucio.sputnik.Sputnik.mc;
|
||||||
|
|
||||||
// cosas útiles relacionadas a las teclas
|
// cosas útiles relacionadas a las teclas
|
||||||
@@ -28,6 +33,11 @@ public class KeyUtil {
|
|||||||
|| isKeyDown(GLFW.GLFW_KEY_RIGHT_SHIFT);
|
|| isKeyDown(GLFW.GLFW_KEY_RIGHT_SHIFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static boolean isCapsLockOn() throws HeadlessException {
|
||||||
|
return Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK);
|
||||||
|
}
|
||||||
|
|
||||||
public static void pressKey(int key, int action) {
|
public static void pressKey(int key, int action) {
|
||||||
pressKey(key, action, 0, 0);
|
pressKey(key, action, 0, 0);
|
||||||
}
|
}
|
||||||
@@ -36,7 +46,12 @@ public class KeyUtil {
|
|||||||
mc.keyboard.onKey(
|
mc.keyboard.onKey(
|
||||||
mc.getWindow().getHandle(),
|
mc.getWindow().getHandle(),
|
||||||
action,
|
action,
|
||||||
new KeyInput(key, scancode, modifiers));
|
new KeyInput(
|
||||||
|
key,
|
||||||
|
scancode,
|
||||||
|
modifiers
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getKeyName(int key) {
|
public static String getKeyName(int key) {
|
||||||
@@ -72,8 +87,16 @@ public class KeyUtil {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// quizás debería de añadir layouts...
|
|
||||||
public static String shiftKey(String c) {
|
public static String shiftKey(String c) {
|
||||||
|
return shiftKey(c, getLayout());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String shiftKey(String c, KeyboardLayout layout) {
|
||||||
|
String uppercase = isCapsLockOn() ? c.toLowerCase() : c.toUpperCase();
|
||||||
|
|
||||||
|
switch (layout) {
|
||||||
|
case EN_US -> {
|
||||||
return switch (c) {
|
return switch (c) {
|
||||||
case "`" -> "~";
|
case "`" -> "~";
|
||||||
case "1" -> "!";
|
case "1" -> "!";
|
||||||
@@ -96,7 +119,61 @@ public class KeyUtil {
|
|||||||
case "," -> "<";
|
case "," -> "<";
|
||||||
case "." -> ">";
|
case "." -> ">";
|
||||||
case "/" -> "?";
|
case "/" -> "?";
|
||||||
default -> c.toUpperCase();
|
default -> uppercase;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
case ES_ES -> {
|
||||||
|
return switch (c) {
|
||||||
|
case "º" -> "ª";
|
||||||
|
case "1" -> "!";
|
||||||
|
case "2" -> "\"";
|
||||||
|
case "3" -> "·";
|
||||||
|
case "4" -> "$";
|
||||||
|
case "5" -> "%";
|
||||||
|
case "6" -> "&";
|
||||||
|
case "7" -> "/";
|
||||||
|
case "8" -> "(";
|
||||||
|
case "9" -> ")";
|
||||||
|
case "0" -> "=";
|
||||||
|
case "'" -> "?";
|
||||||
|
case "¡" -> "¿";
|
||||||
|
case "`" -> "^";
|
||||||
|
case "+" -> "*";
|
||||||
|
case "´" -> "¨";
|
||||||
|
case "," -> ";";
|
||||||
|
case "." -> ":";
|
||||||
|
case "-" -> "_";
|
||||||
|
case "<" -> ">";
|
||||||
|
default -> uppercase;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static KeyboardLayout getLayout() {
|
||||||
|
Locale locale = InputContext.getInstance().getLocale();
|
||||||
|
if (locale == null) locale = Locale.getDefault();
|
||||||
|
|
||||||
|
String country = locale.getCountry();
|
||||||
|
String lang = locale.getLanguage();
|
||||||
|
|
||||||
|
if (country.equals("US") && lang.equals("en")) {
|
||||||
|
return KeyboardLayout.EN_US;
|
||||||
|
} else if (country.equals("ES") && lang.equals("es")) {
|
||||||
|
return KeyboardLayout.ES_ES;
|
||||||
|
}
|
||||||
|
|
||||||
|
// fallback
|
||||||
|
return KeyboardLayout.EN_US;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum KeyboardLayout {
|
||||||
|
EN_US,
|
||||||
|
ES_ES;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -36,6 +36,7 @@ public class Lists {
|
|||||||
public static Map<ScreenHandlerType<?>, String> screenNames;
|
public static Map<ScreenHandlerType<?>, String> screenNames;
|
||||||
|
|
||||||
public static final List<Color> colorList = new ArrayList<>();
|
public static final List<Color> colorList = new ArrayList<>();
|
||||||
|
public static final List<String> fontList = new ArrayList<>();
|
||||||
|
|
||||||
// intentar traducir nombres y fallar miserablemente
|
// intentar traducir nombres y fallar miserablemente
|
||||||
public static void init() {
|
public static void init() {
|
||||||
@@ -68,7 +69,16 @@ public class Lists {
|
|||||||
).toList());
|
).toList());
|
||||||
|
|
||||||
colorList.addAll(Arrays.asList(
|
colorList.addAll(Arrays.asList(
|
||||||
RED, ORANGE, YELLOW, LIME, GREEN, CYAN, CELESTE, BLUE, PURPLE, MAGENTA, PINK, LAVENDER, WHITE, SILVER, GRAY, BLACK, BROWN));
|
RED, ORANGE, YELLOW, LIME, GREEN, CYAN,
|
||||||
|
CELESTE, BLUE, PURPLE, MAGENTA, PINK,
|
||||||
|
LAVENDER, WHITE, SILVER, GRAY, BLACK, BROWN
|
||||||
|
));
|
||||||
|
|
||||||
|
fontList.addAll(List.of(
|
||||||
|
"bahnschrift", "calibri", "cantarell", "comic-sans-ms",
|
||||||
|
"deja-vu-sans-mono", "new-times-roman", "roboto", "segoe-ui",
|
||||||
|
"ubuntu"
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> Map<T, Boolean> allTrue(List<T> options) {
|
public static <T> Map<T, Boolean> allTrue(List<T> options) {
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ public class Layers {
|
|||||||
private static final RenderLayer QUADS;
|
private static final RenderLayer QUADS;
|
||||||
private static final RenderLayer QUADS_CULL;
|
private static final RenderLayer QUADS_CULL;
|
||||||
|
|
||||||
|
private static final RenderLayer TEXT;
|
||||||
|
|
||||||
|
|
||||||
public static RenderLayer lines() {
|
public static RenderLayer lines() {
|
||||||
return LINES;
|
return LINES;
|
||||||
@@ -31,12 +33,18 @@ public class Layers {
|
|||||||
return QUADS_CULL;
|
return QUADS_CULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static RenderLayer text() {
|
||||||
|
return TEXT;
|
||||||
|
}
|
||||||
|
|
||||||
static {
|
static {
|
||||||
LINES = RenderLayer.of(Sputnik.MOD_ID + "_lines", RenderSetup.builder(LINES_PIPELINE).build());
|
LINES = RenderLayer.of(Sputnik.MOD_ID + "_lines", RenderSetup.builder(LINES_PIPELINE).build());
|
||||||
LINES_CULL = RenderLayer.of(Sputnik.MOD_ID + "_lines_cull", RenderSetup.builder(LINES_CULL_PIPELINE).build());
|
LINES_CULL = RenderLayer.of(Sputnik.MOD_ID + "_lines_cull", RenderSetup.builder(LINES_CULL_PIPELINE).build());
|
||||||
|
|
||||||
QUADS = RenderLayer.of(Sputnik.MOD_ID + "_quads", RenderSetup.builder(QUADS_PIPELINE).build());
|
QUADS = RenderLayer.of(Sputnik.MOD_ID + "_quads", RenderSetup.builder(QUADS_PIPELINE).build());
|
||||||
QUADS_CULL = RenderLayer.of(Sputnik.MOD_ID + "quads_cull", RenderSetup.builder(QUADS_CULL_PIPELINE).build());
|
QUADS_CULL = RenderLayer.of(Sputnik.MOD_ID + "_quads_cull", RenderSetup.builder(QUADS_CULL_PIPELINE).build());
|
||||||
|
|
||||||
|
TEXT = RenderLayer.of(Sputnik.MOD_ID + "_text", RenderSetup.builder(TEXT_PIPELINE).build());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -6,12 +6,18 @@ import com.mojang.blaze3d.platform.DepthTestFunction;
|
|||||||
import com.mojang.blaze3d.vertex.VertexFormat;
|
import com.mojang.blaze3d.vertex.VertexFormat;
|
||||||
import me.retucio.sputnik.Sputnik;
|
import me.retucio.sputnik.Sputnik;
|
||||||
import net.minecraft.client.gl.RenderPipelines;
|
import net.minecraft.client.gl.RenderPipelines;
|
||||||
|
import net.minecraft.client.gl.UniformType;
|
||||||
import net.minecraft.client.render.VertexFormats;
|
import net.minecraft.client.render.VertexFormats;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
|
|
||||||
public class Pipelines {
|
public class Pipelines {
|
||||||
|
|
||||||
|
static final RenderPipeline.Snippet MESH_UNIFORMS = RenderPipeline.builder()
|
||||||
|
.withUniform("MeshData",UniformType.UNIFORM_BUFFER)
|
||||||
|
.buildSnippet();
|
||||||
|
|
||||||
|
|
||||||
static final RenderPipeline LINES_PIPELINE = RenderPipeline.builder(RenderPipelines.RENDERTYPE_LINES_SNIPPET)
|
static final RenderPipeline LINES_PIPELINE = RenderPipeline.builder(RenderPipelines.RENDERTYPE_LINES_SNIPPET)
|
||||||
.withLocation(Identifier.of(Sputnik.MOD_ID, "pipeline/lines"))
|
.withLocation(Identifier.of(Sputnik.MOD_ID, "pipeline/lines"))
|
||||||
.withVertexFormat(VertexFormats.POSITION_COLOR_NORMAL_LINE_WIDTH, VertexFormat.DrawMode.LINES)
|
.withVertexFormat(VertexFormats.POSITION_COLOR_NORMAL_LINE_WIDTH, VertexFormat.DrawMode.LINES)
|
||||||
@@ -45,4 +51,16 @@ public class Pipelines {
|
|||||||
.withDepthWrite(false)
|
.withDepthWrite(false)
|
||||||
.withCull(false)
|
.withCull(false)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
public static final RenderPipeline TEXT_PIPELINE = RenderPipeline.builder(RenderPipelines.POSITION_TEX_COLOR_SNIPPET)
|
||||||
|
.withLocation(Identifier.of(Sputnik.MOD_ID, "pipeline/text"))
|
||||||
|
.withVertexFormat(VertexFormats.POSITION_TEXTURE_COLOR, VertexFormat.DrawMode.TRIANGLES)
|
||||||
|
.withVertexShader(Identifier.of(Sputnik.MOD_ID, "shaders/text.vert"))
|
||||||
|
.withFragmentShader(Identifier.of(Sputnik.MOD_ID,"shaders/text.frag"))
|
||||||
|
.withSampler("u_Texture")
|
||||||
|
.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST)
|
||||||
|
.withDepthWrite(false)
|
||||||
|
.withBlend(BlendFunction.TRANSLUCENT)
|
||||||
|
.withCull(false)
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
package me.retucio.sputnik.util.render;
|
||||||
|
|
||||||
|
import com.mojang.blaze3d.platform.TextureUtil;
|
||||||
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
|
import com.mojang.blaze3d.textures.AddressMode;
|
||||||
|
import com.mojang.blaze3d.textures.FilterMode;
|
||||||
|
import com.mojang.blaze3d.textures.TextureFormat;
|
||||||
|
import net.minecraft.client.texture.AbstractTexture;
|
||||||
|
import net.minecraft.client.texture.NativeImage;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.lwjgl.BufferUtils;
|
||||||
|
import org.lwjgl.stb.STBImage;
|
||||||
|
import org.lwjgl.system.MemoryStack;
|
||||||
|
import org.lwjgl.system.MemoryUtil;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.IntBuffer;
|
||||||
|
|
||||||
|
public class Texture extends AbstractTexture {
|
||||||
|
public Texture(int width, int height, TextureFormat format, FilterMode min, FilterMode mag) {
|
||||||
|
glTexture = RenderSystem.getDevice().createTexture("", 15, format, width, height, 1, 1);
|
||||||
|
sampler = RenderSystem.getSamplerCache().get(AddressMode.REPEAT, AddressMode.REPEAT, min, mag, false);
|
||||||
|
|
||||||
|
glTextureView = RenderSystem.getDevice().createTextureView(glTexture);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getWidth() {
|
||||||
|
return getGlTexture().getWidth(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getHeight() {
|
||||||
|
return getGlTexture().getHeight(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void upload(byte[] bytes) {
|
||||||
|
upload(BufferUtils.createByteBuffer(bytes.length).put(bytes));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void upload(ByteBuffer buffer) {
|
||||||
|
NativeImage image = getImage();
|
||||||
|
|
||||||
|
buffer.rewind();
|
||||||
|
MemoryUtil.memCopy(MemoryUtil.memAddress(buffer), image.imageId(), buffer.remaining());
|
||||||
|
|
||||||
|
RenderSystem.getDevice().createCommandEncoder().writeToTexture(glTexture, image);
|
||||||
|
|
||||||
|
image.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private @NotNull NativeImage getImage() {
|
||||||
|
NativeImage.Format imageFormat = switch (glTexture.getFormat()) {
|
||||||
|
case RGBA8 -> NativeImage.Format.RGBA;
|
||||||
|
case RED8 -> NativeImage.Format.LUMINANCE;
|
||||||
|
default -> throw new IllegalArgumentException();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Workaround for writeToTexture(IntBuffer) overload comparing width * height to the size of the int buffer.
|
||||||
|
// And since we are working with pixels which are only one byte in size, the sizes don't match
|
||||||
|
return new NativeImage(imageFormat, getWidth(), getHeight(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Texture readResource(String path, boolean flipY, FilterMode filter) {
|
||||||
|
try (var in = Texture.class.getResourceAsStream(path)) {
|
||||||
|
if (in == null) return null;
|
||||||
|
|
||||||
|
var data = TextureUtil.readResource(in).rewind();
|
||||||
|
|
||||||
|
try (MemoryStack stack = MemoryStack.stackPush()) {
|
||||||
|
IntBuffer width = stack.mallocInt(1);
|
||||||
|
IntBuffer height = stack.mallocInt(1);
|
||||||
|
IntBuffer comp = stack.mallocInt(1);
|
||||||
|
|
||||||
|
STBImage.stbi_set_flip_vertically_on_load(flipY);
|
||||||
|
ByteBuffer image = STBImage.stbi_load_from_memory(data, width, height, comp, 4);
|
||||||
|
|
||||||
|
var texture = new Texture(width.get(0), height.get(0), TextureFormat.RGBA8, filter, filter);
|
||||||
|
texture.upload(image);
|
||||||
|
|
||||||
|
STBImage.stbi_image_free(image);
|
||||||
|
STBImage.stbi_set_flip_vertically_on_load(false);
|
||||||
|
|
||||||
|
return texture;
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"providers": [
|
||||||
|
{
|
||||||
|
"type": "ttf",
|
||||||
|
"file": "sputnik:bahnschrift.ttf",
|
||||||
|
"size": 10.0,
|
||||||
|
"oversample": 2.0,
|
||||||
|
"shift": [0.0, 0.0],
|
||||||
|
"range": "0x0000-0x00FF"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Binary file not shown.
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"providers": [
|
||||||
|
{
|
||||||
|
"type": "ttf",
|
||||||
|
"file": "sputnik:calibri.ttf",
|
||||||
|
"size": 10.0,
|
||||||
|
"oversample": 2.0,
|
||||||
|
"shift": [0.0, 0.0],
|
||||||
|
"range": "0x0000-0x00FF"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Binary file not shown.
Loaded 100 of 118 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user