This commit is contained in:
retuci0 committed 2025-09-28 14:35:16 +02:00
1 parent e7d872d75e
commit e358b142c6
9 files changed
+185 -9

No files matched your search

+6 -3
View File
@@ -10,12 +10,14 @@ mod para Minecraft Fabric 1.21.6 que añade algunas cosas QOL, mayormente relaci
3. descargar el .jar
4. moverlo a tu directorio de mods (probablemente `%appdata%/.minecraft/mods`)
asegúrate de tener una version de Minecraft y Fabric compatibles con el mod
asegúrate de tener una version de Minecraft y Fabric compatibles con el mod (MC 1.21.6; Fabric 0.128.2)
es posible que hayan problemas al usarlo junto a otros mods, especialmente otros clientes, pues pueden conflictar
### para frikis de 200 de iq
1. clona el respositorio (`git clone https://github.com/retuci0/camera-tweaks`)
2. `gradlew build` para Windows o `chmod +x gradlew` + `./gradlew build` para Linux
3. el resultado estará en `/build/libs` (el que no lleva "sources" en el nombre)
2. entra al directorio del repositorio (`cd camera-tweaks`)
3. `gradlew build` para Windows o `chmod +x gradlew` + `./gradlew build` para Linux (Mac es Linux)
4. el resultado estará en `/build/libs/camtweaks-X.X.jar` (el que no lleva "sources" en el nombre)
## uso
@@ -48,6 +50,7 @@ algunos módulos tienen teclas asignadas por defecto, asígnales `ESC` para desa
<img src="screenshots/chatplus.png" alt="chatplus y capturas en uso">
<img src="screenshots/crits.png" alt="críticos">
<img src="screenshots/fullbright.png" alt="fullbright en modo gamma cambiando el color de los shaders">
<img src="screenshots/hud.png" alt="HUD">
## contibuciones
+6 -1
View File
@@ -7,6 +7,7 @@
- barra de búsqueda: filtra los ajustes de todos los paneles de ajustes, por nombre y descripción
- barra de deslizamiento
- módulo de jugador falso: invoca una entidad de jugador falsa, por motivos de testeo
- HUD: mostrar información adicional en pantalla (ej.: hora, fps, coordenadas, ...)
### arreglos / mejoras
@@ -15,9 +16,13 @@
- ahora solo se puede seleccionar un objeto de la interfaz a la vez
- cambiada la posición de los títulos de los marcos
- ahora los módulos están ordenados por orden alfabético
- ahora nametags también tiene en cuenta la absorción de un jugador al mostrar su vida
- el color del prefijo de las notificaciones por chat ahora depende de los ajustes de color
- ya no se muestra el prefijo equivocado en notificaciones por chat al meterse a un mundo por primera vez
## problemas reconocidos
- ...
- muchos, pero repórtalos en la página de problemas si quieres para que queden bien registrados
+1 -1
View File
@@ -10,7 +10,7 @@ loader_version=0.17.2
loom_version=1.11-SNAPSHOT
# Mod Properties
mod_version=1.2
mod_version=1.3
maven_group=me.retucio
archives_base_name=camtweaks
Binary file not shown.

After

Width:  |  Height:  |  Size: 469 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 616 KiB

After

Width:  |  Height:  |  Size: 691 KiB

@@ -25,6 +25,7 @@ public abstract class PlayerEntityMixin extends LivingEntity {
if (!nametags.isEnabled() || !nametags.health.isEnabled()) return original;
float health = getHealth();
float absorption = getAbsorptionAmount();
Formatting color;
if (health < 5) color = Formatting.RED;
@@ -34,7 +35,18 @@ public abstract class PlayerEntityMixin extends LivingEntity {
// me gustaría también añadir un modo en el que se renderizan los corazones directamente en la nametag, pero no sé cómo hacer para las imágenes :'(
// ahora que lo pienso en la snapshot más reciente han metido iconos que se pueden usar en texto, y uno de ellos es un corazón :D
return original.copy().append(Text.literal(" [" + color + (nametags.healthMode.is(Nametags.HealthMode.HEARTS)
? String.format("%.2f", health / 2) : (int) health) + Formatting.RESET + "]"));
} // redondear a dos decimales
String text = " [" + color +
(nametags.healthMode.is(Nametags.HealthMode.HEARTS)
? String.format("%.2f", health / 2) // redondear a dos decimales
: (int) health) +
(absorption > 0 // tener absorción en cuenta
? Formatting.RESET + " + " + Formatting.GOLD +
(nametags.healthMode.is(Nametags.HealthMode.HEARTS)
? String.format("%.2f", absorption / 2)
: Integer.toString((int) absorption))
: "") +
Formatting.RESET + "]";
return original.copy().append(text);
}
}
@@ -6,6 +6,7 @@ import me.retucio.camtweaks.module.modules.*;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
@@ -35,6 +36,7 @@ public class ModuleManager {
modules.add(new Freelook());
modules.add(new Fullbright());
modules.add(new HandView());
modules.add(new HUD());
modules.add(new Nametags());
modules.add(new NoRender());
modules.add(new PerspectivePlus());
@@ -42,6 +44,8 @@ public class ModuleManager {
modules.add(new TimeChanger());
modules.add(new Zoom());
modules.sort(Comparator.comparing(module -> module.getName().toLowerCase()));
// registrar los "listeners" necesarios
for (Module module : getEnabledModules()) {
for (Method method : module.getClass().getDeclaredMethods()) {
@@ -0,0 +1,56 @@
package me.retucio.camtweaks.module.modules;
import me.retucio.camtweaks.module.Module;
import me.retucio.camtweaks.module.settings.BooleanSetting;
import me.retucio.camtweaks.module.settings.EnumSetting;
import me.retucio.camtweaks.module.settings.NumberSetting;
import me.retucio.camtweaks.module.settings.StringSetting;
public class HUD extends Module {
public NumberSetting red = addSetting(new NumberSetting("rojo", "cantidad de rojo", 255, 0, 255, 1));
public NumberSetting green = addSetting(new NumberSetting("verde", "cantidad de verde", 255, 0, 255, 1));
public NumberSetting blue = addSetting(new NumberSetting("azul", "cantidad de azul", 255, 0, 255, 1));
public BooleanSetting rainbow = addSetting(new BooleanSetting("arcoíris", "gay.", false));
public NumberSetting rainbowSpeed = addSetting(new NumberSetting("velocidad del arcoíris", "velocidad del arcoíris", 1000, 0, 10000, 2));
public NumberSetting alpha = addSetting(new NumberSetting("opacidad", "antitransparencia", 255, 0, 255, 1));
public BooleanSetting shadow = addSetting(new BooleanSetting("sombra", "texto con sombra", true));
public BooleanSetting dontOverride = addSetting(new BooleanSetting("no sobreescribir", "evita dibujar por encima de otros elementos de la interfaz", true));
public EnumSetting<TimeFormat> timeFormat = addSetting(new EnumSetting<>("formato de la hora", "12h o 24h", TimeFormat.class, TimeFormat.TWENTY_FOUR_HOUR));
public NumberSetting timezone = addSetting(new NumberSetting("zona horaria", "zona horaria en UTC+n", 1, -6, 6, 1));
public BooleanSetting coords = addSetting(new BooleanSetting("coordenadas", "mostrar coordenadas", true));
public StringSetting customText = addSetting(new StringSetting("texto custom", "marca de agua (dejar vacío para quitar)", "ESCROTO", 40));
public BooleanSetting fps = addSetting(new BooleanSetting("fps", "mostrar frames por segundo", true));
public BooleanSetting tps = addSetting(new BooleanSetting("tps", "mostrar tasa de ticks por segundo del server", true));
public BooleanSetting time = addSetting(new BooleanSetting("hora", "mostrar hora actual", true));
public HUD() {
super("HUD", "superposición de la pantalla con info. adicional");
rainbow.onUpdate(v -> {
rainbowSpeed.setVisible(v);
red.setVisible(!v);
green.setVisible(!v);
blue.setVisible(!v);
});
time.onUpdate(v -> {
timeFormat.setVisible(v);
timezone.setVisible(v);
});
}
public enum TimeFormat {
TWENTY_FOUR_HOUR("24h"),
TWELVE_HOUR("12h");
final String name;
TimeFormat(String name) { this.name = name; }
@Override public String toString() { return name; }
}
}
+97 -1
View File
@@ -1,8 +1,20 @@
package me.retucio.camtweaks.ui;
import me.retucio.camtweaks.event.SubscribeEvent;
import me.retucio.camtweaks.event.events.PacketEvent;
import me.retucio.camtweaks.module.ModuleManager;
import me.retucio.camtweaks.module.modules.Freecam;
import me.retucio.camtweaks.module.modules.HUD.TimeFormat;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.ChatScreen;
import net.minecraft.client.render.RenderTickCounter;
import net.minecraft.util.math.Vec3d;
import java.awt.Color;
import java.time.LocalTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
// en un principio esto iba a mostrar en pantalla los módulos activados, pero me parece innecesario. se queda aquí por si acaso
// igual lo uso para algo...
@@ -10,5 +22,89 @@ public class HUD {
private static final MinecraftClient mc = MinecraftClient.getInstance();
public static void render(DrawContext ctx, RenderTickCounter tc) {}
private long lastPacketTime = 0;
private static float estimatedTPS = 20f;
public static void render(DrawContext ctx, RenderTickCounter tc) {
if (ModuleManager.INSTANCE == null || mc.player == null || mc.cameraEntity == null) return;
me.retucio.camtweaks.module.modules.HUD hud = ModuleManager.INSTANCE.getModuleByClass(me.retucio.camtweaks.module.modules.HUD.class);
int width = mc.getWindow().getScaledWidth();
int height = mc.getWindow().getScaledHeight();
Color color;
if (hud.rainbow.isEnabled()) {
float speed = 10001 - hud.rainbowSpeed.getFloatValue();
float hue = (System.currentTimeMillis() % (int) speed) / speed;
Color gamning = Color.getHSBColor(hue, 1, 1);
color = new Color(gamning.getRed(), gamning.getGreen(), gamning.getBlue(), hud.alpha.getIntValue());
} else {
color = new Color(hud.red.getIntValue(), hud.green.getIntValue(), hud.blue.getIntValue(), hud.alpha.getIntValue());
}
boolean shadow = hud.shadow.isEnabled();
if (hud.isEnabled()) {
// coordenadas
if (hud.coords.isEnabled()) {
Vec3d coords;
Freecam freecam = ModuleManager.INSTANCE.getModuleByClass(Freecam.class);
if (freecam.isEnabled())
coords = new Vec3d(
freecam.getX(tc.getDynamicDeltaTicks()),
freecam.getY(tc.getDynamicDeltaTicks()),
freecam.getZ(tc.getDynamicDeltaTicks())
);
else
coords = mc.player.getPos();
String text = (int) coords.x + " " + (int) coords.y + " " + (int) coords.z;
ctx.drawText(mc.textRenderer, text,
width - mc.textRenderer.getWidth(text) - 2,
height - mc.textRenderer.fontHeight - 2,
color.getRGB(), shadow);
}
// fps y tps
if (hud.fps.isEnabled())
ctx.drawText(mc.textRenderer, "FPS: " + mc.getCurrentFps(), 2, 2, color.getRGB(), shadow);
if (hud.tps.isEnabled())
ctx.drawText(mc.textRenderer, "TPS: " + estimatedTPS, 2, 4 + mc.textRenderer.fontHeight, color.getRGB(), shadow);
// marca de agua
if (!hud.customText.getValue().isEmpty()) {
int y;
if (!mc.player.getActiveStatusEffects().isEmpty() && hud.dontOverride.isEnabled()) y = 26;
else y = 2;
ctx.drawText(mc.textRenderer, hud.customText.getValue(), width - mc.textRenderer.getWidth(hud.customText.getValue()) - 2, y, color.getRGB(), shadow);
}
// hora real
if (hud.time.isEnabled()) {
int y;
if (mc.currentScreen instanceof ChatScreen && hud.dontOverride.isEnabled()) y = height - mc.textRenderer.fontHeight - 14;
else y = height - mc.textRenderer.fontHeight - 2;
ZoneOffset offset = ZoneOffset.ofHours(hud.timezone.getIntValue());
LocalTime now = LocalTime.now(offset);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(hud.timeFormat.is(TimeFormat.TWENTY_FOUR_HOUR) ? "HH:mm" : "hh:mm a");
String time = now.format(formatter);
ctx.drawText(mc.textRenderer, time, 2, y, color.getRGB(), shadow);
}
}
}
@SubscribeEvent
public void onReceivePacket(PacketEvent.Receive event) {
// estimar el tps teniendo en cuenta el tiempo entre paquetes
long now = System.currentTimeMillis();
if (lastPacketTime > 0) {
long diff = now - lastPacketTime; // ms entre paquetes
float tps = 1000f / diff;
estimatedTPS = Math.min(20.0f, tps);
}
lastPacketTime = now;
}
}