Files
sputnik/src/main/java/me/retucio/camtweaks/module/modules/LogoutSpots.java
T
2025-12-14 21:31:58 +01:00

116 lines
4.4 KiB
Java

package me.retucio.camtweaks.module.modules;
import me.retucio.camtweaks.event.SubscribeEvent;
import me.retucio.camtweaks.event.events.RenderWorldEvent;
import me.retucio.camtweaks.event.events.camtweaks.AddEntityEvent;
import me.retucio.camtweaks.event.events.camtweaks.RemoveEntityEvent;
import me.retucio.camtweaks.module.Module;
import me.retucio.camtweaks.module.ModuleManager;
import me.retucio.camtweaks.module.settings.BooleanSetting;
import me.retucio.camtweaks.module.settings.NumberSetting;
import me.retucio.camtweaks.util.render.RenderUtil;
import net.minecraft.client.network.OtherClientPlayerEntity;
import net.minecraft.client.render.*;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import org.joml.*;
import java.awt.*;
import java.time.Instant;
import java.time.LocalTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
public class LogoutSpots extends Module {
public BooleanSetting filledBox = addSetting(new BooleanSetting("caja rellena", "rellenar caja", true));
public BooleanSetting outlineBox = addSetting(new BooleanSetting("caja de esquinas", "contorno de caja", true));
public NumberSetting red = addSetting(new NumberSetting("rojo", "cantidad de rojo", 200, 0, 255, 1));
public NumberSetting green = addSetting(new NumberSetting("verde", "cantidad de verde", 90, 0, 255, 1));
public NumberSetting blue = addSetting(new NumberSetting("azul", "cantidad de azul", 255, 0, 255, 1));
public NumberSetting alpha = addSetting(new NumberSetting("opacidad", "antitransparencia", 50, 0, 255, 1));
public NumberSetting lineWidth = addSetting(new NumberSetting("grosor", "grosor de las líneas a dibujar",
2, 1, 10, 0.5f));
private final List<LogoutBox> boxes = new ArrayList<>();
public LogoutSpots() {
super("puntos de desconexión", "te muestra los puntos donde se desconectan los jugadores");
}
@SubscribeEvent
public void onWorldRender(RenderWorldEvent event) {
if (mc.player == null || mc.world == null) return;
int r = red.getIntValue();
int g = green.getIntValue();
int b = blue.getIntValue();
int a = alpha.getIntValue();
MatrixStack matrices = event.getMatrices();
for (LogoutBox box : boxes) {
if (filledBox.isEnabled())
RenderUtil.drawFilledBox(matrices, box.dummy.getBoundingBox(), new Color(r, g, b, a));
if (outlineBox.isEnabled())
RenderUtil.drawOutlineBox(matrices, box.dummy.getBoundingBox(), new Color(r, g, b, a), lineWidth.getFloatValue());
}
}
@SubscribeEvent
public void onEntityRemoved(RemoveEntityEvent event) {
if (event.getEntity() instanceof PlayerEntity player && player != mc.player) {
if (mc.world != null && mc.world.hasEntity(player)) return; // asegurarse de que salirse de la distancia de renderizado no cuenta como "desconectarse"
String playerName = player.getName().getString() + " (" + getLogoutTime(System.currentTimeMillis()) + ")";
boxes.add(new LogoutBox(
ModuleManager.INSTANCE.getModuleByClass(FakePlayer.class).addPlayer(player, playerName),
System.currentTimeMillis()
));
}
}
@SubscribeEvent
public void onEntityAdded(AddEntityEvent event) {
boxes.removeIf(box -> event.getEntity().getUuid().equals(box.dummy.getUuid()));
}
@Override
public void onDisable() {
boxes.forEach(box -> {
box.dummy.setRemoved(Entity.RemovalReason.KILLED);
box.dummy.onRemoved();
});
boxes.clear();
super.onDisable();
}
private String getLogoutTime(long logoutTimeMillis) {
HUD hud = ModuleManager.INSTANCE.getModuleByClass(HUD.class);
Instant instant = Instant.ofEpochMilli(logoutTimeMillis);
ZoneOffset offset = ZoneOffset.ofHours(hud.timezone.getIntValue());
LocalTime logoutTime = LocalTime.from(instant.atOffset(offset));
boolean is24 = hud.timeFormat.is(HUD.TimeFormat.TWENTY_FOUR_HOUR);
DateTimeFormatter format = DateTimeFormatter.ofPattern(is24 ? "HH:mm" : "hh:mm a");
return logoutTime.format(format);
}
public record LogoutBox(
OtherClientPlayerEntity dummy,
long logoutTime
) {}
}