diff --git a/src/main/java/top/fpsmaster/features/impl/interfaces/ClockDisplay.java b/src/main/java/top/fpsmaster/features/impl/interfaces/ClockDisplay.java new file mode 100644 index 00000000..0a86240e --- /dev/null +++ b/src/main/java/top/fpsmaster/features/impl/interfaces/ClockDisplay.java @@ -0,0 +1,22 @@ +package top.fpsmaster.features.impl.interfaces; + +import top.fpsmaster.features.impl.InterfaceModule; +import top.fpsmaster.features.manager.Category; +import top.fpsmaster.features.settings.impl.BooleanSetting; +import top.fpsmaster.features.settings.impl.ColorSetting; +import top.fpsmaster.features.settings.impl.TextSetting; + +import java.awt.Color; + +public class ClockDisplay extends InterfaceModule { + public final BooleanSetting showSeconds = new BooleanSetting("ShowSeconds", true); + public final BooleanSetting hour24Mode = new BooleanSetting("Hour24", true); + public final TextSetting label = new TextSetting("Label", ""); + public final ColorSetting textColor = new ColorSetting("TextColor", new Color(255, 255, 255, 255)); + + public ClockDisplay() { + super("ClockDisplay", Category.Interface); + backgroundColor.setColor(new Color(18, 20, 26, 160)); + addSettings(showSeconds, hour24Mode, label, textColor, betterFont, fontShadow, bg, rounded, roundRadius, backgroundColor); + } +} diff --git a/src/main/java/top/fpsmaster/features/impl/interfaces/ServerAddressDisplay.java b/src/main/java/top/fpsmaster/features/impl/interfaces/ServerAddressDisplay.java new file mode 100644 index 00000000..3b7d52a8 --- /dev/null +++ b/src/main/java/top/fpsmaster/features/impl/interfaces/ServerAddressDisplay.java @@ -0,0 +1,19 @@ +package top.fpsmaster.features.impl.interfaces; + +import top.fpsmaster.features.impl.InterfaceModule; +import top.fpsmaster.features.manager.Category; +import top.fpsmaster.features.settings.impl.ColorSetting; +import top.fpsmaster.features.settings.impl.TextSetting; + +import java.awt.Color; + +public class ServerAddressDisplay extends InterfaceModule { + public final TextSetting label = new TextSetting("Label", ""); + public final ColorSetting textColor = new ColorSetting("TextColor", new Color(255, 255, 255, 255)); + + public ServerAddressDisplay() { + super("ServerAddressDisplay", Category.Interface); + backgroundColor.setColor(new Color(18, 20, 26, 160)); + addSettings(label, textColor, betterFont, fontShadow, bg, rounded, roundRadius, backgroundColor); + } +} diff --git a/src/main/java/top/fpsmaster/features/impl/utility/ToggleSneak.java b/src/main/java/top/fpsmaster/features/impl/utility/ToggleSneak.java new file mode 100644 index 00000000..03220e47 --- /dev/null +++ b/src/main/java/top/fpsmaster/features/impl/utility/ToggleSneak.java @@ -0,0 +1,59 @@ +package top.fpsmaster.features.impl.utility; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.settings.KeyBinding; +import top.fpsmaster.event.Subscribe; +import top.fpsmaster.event.events.EventKey; +import top.fpsmaster.event.events.EventUpdate; +import top.fpsmaster.features.impl.InterfaceModule; +import top.fpsmaster.features.manager.Category; +import top.fpsmaster.features.settings.impl.BindSetting; +import top.fpsmaster.features.settings.impl.BooleanSetting; + +public class ToggleSneak extends InterfaceModule { + private final BooleanSetting toggleSneak = new BooleanSetting("ToggleSneak", true); + private final BindSetting toggleKey = new BindSetting("ToggleKey", Minecraft.getMinecraft().gameSettings.keyBindSneak.getKeyCode()); + public static boolean using = false; + public static boolean sneak = false; + + public ToggleSneak() { + super("ToggleSneak", Category.Utility); + addSettings(toggleSneak, toggleKey, betterFont); + } + + @Override + public void onEnable() { + super.onEnable(); + using = true; + } + + @Subscribe + public void onUpdate(EventUpdate e) { + if (!toggleSneak.getValue()) { + sneak = false; + } + } + + @Subscribe + public void onKey(EventKey e) { + if (toggleSneak.getValue() && e.key == toggleKey.getValue()) { + sneak = !sneak; + if (!sneak) { + if (Minecraft.getMinecraft().thePlayer != null) { + Minecraft.getMinecraft().thePlayer.setSneaking(false); + } + } + } + } + + @Override + public void onDisable() { + super.onDisable(); + KeyBinding.setKeyBindState(Minecraft.getMinecraft().gameSettings.keyBindSneak.getKeyCode(), false); + if (Minecraft.getMinecraft().thePlayer != null) { + Minecraft.getMinecraft().thePlayer.setSneaking(false); + } + using = false; + sneak = false; + } +} diff --git a/src/main/java/top/fpsmaster/features/manager/ModuleManager.java b/src/main/java/top/fpsmaster/features/manager/ModuleManager.java index b26afdfe..ae5b47a2 100644 --- a/src/main/java/top/fpsmaster/features/manager/ModuleManager.java +++ b/src/main/java/top/fpsmaster/features/manager/ModuleManager.java @@ -81,6 +81,7 @@ public void init() { modules.add(new ClientSettings()); modules.add(new BetterScreen()); modules.add(new Sprint()); + modules.add(new ToggleSneak()); modules.add(new Performance()); modules.add(new MotionBlur()); modules.add(new SmoothZoom()); @@ -93,6 +94,8 @@ public void init() { modules.add(new ArmorDisplay()); modules.add(new BetterChat()); modules.add(new BlockIndicator()); + modules.add(new ClockDisplay()); + modules.add(new ServerAddressDisplay()); modules.add(new PlayTime()); modules.add(new BetterFishingRod()); modules.add(new ComboDisplay()); diff --git a/src/main/java/top/fpsmaster/forge/mixin/MixinKeybinding.java b/src/main/java/top/fpsmaster/forge/mixin/MixinKeybinding.java index 2e8b3bcd..ed1d4b42 100644 --- a/src/main/java/top/fpsmaster/forge/mixin/MixinKeybinding.java +++ b/src/main/java/top/fpsmaster/forge/mixin/MixinKeybinding.java @@ -9,6 +9,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import top.fpsmaster.features.impl.utility.Sprint; +import top.fpsmaster.features.impl.utility.ToggleSneak; import top.fpsmaster.forge.api.IKeyBinding; @Mixin(KeyBinding.class) @@ -29,6 +30,8 @@ public void setPressed(boolean pressed) { public void keyDown(CallbackInfoReturnable cir) { if (Sprint.using && keyCode == net.minecraft.client.Minecraft.getMinecraft().gameSettings.keyBindSprint.getKeyCode()) cir.setReturnValue(Sprint.sprint); + if (ToggleSneak.using && keyCode == net.minecraft.client.Minecraft.getMinecraft().gameSettings.keyBindSneak.getKeyCode()) + cir.setReturnValue(ToggleSneak.sneak); } } diff --git a/src/main/java/top/fpsmaster/ui/custom/ComponentsManager.java b/src/main/java/top/fpsmaster/ui/custom/ComponentsManager.java index 4fcb421d..354e22c1 100644 --- a/src/main/java/top/fpsmaster/ui/custom/ComponentsManager.java +++ b/src/main/java/top/fpsmaster/ui/custom/ComponentsManager.java @@ -35,8 +35,11 @@ public void init() { addComponentSafely("ModsListComponent", ModsListComponent::new); addComponentSafely("MiniMapComponent", MiniMapComponent::new); addComponentSafely("SprintComponent", SprintComponent::new); + addComponentSafely("ToggleSneakComponent", ToggleSneakComponent::new); addComponentSafely("BlockIndicatorComponent", BlockIndicatorComponent::new); addComponentSafely("PlayTimeComponent", PlayTimeComponent::new); + addComponentSafely("ClockDisplayComponent", ClockDisplayComponent::new); + addComponentSafely("ServerAddressDisplayComponent", ServerAddressDisplayComponent::new); addComponentSafely("ItemCountDisplayComponent", ItemCountDisplayComponent::new); } diff --git a/src/main/java/top/fpsmaster/ui/custom/impl/ClockDisplayComponent.java b/src/main/java/top/fpsmaster/ui/custom/impl/ClockDisplayComponent.java new file mode 100644 index 00000000..468f1c4b --- /dev/null +++ b/src/main/java/top/fpsmaster/ui/custom/impl/ClockDisplayComponent.java @@ -0,0 +1,59 @@ +package top.fpsmaster.ui.custom.impl; + +import top.fpsmaster.FPSMaster; +import top.fpsmaster.features.impl.interfaces.ClockDisplay; +import top.fpsmaster.ui.custom.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class ClockDisplayComponent extends Component { + public ClockDisplayComponent() { + super(ClockDisplay.class); + x = 0.60f; + y = 0.05f; + allowScale = true; + } + + @Override + public void draw(float x, float y) { + super.draw(x, y); + ClockDisplay module = getModule(); + + String pattern = module.hour24Mode.getValue() ? "HH:mm" : "hh:mm"; + if (module.showSeconds.getValue()) { + pattern += ":ss"; + } + if (!module.hour24Mode.getValue()) { + pattern += " a"; + } + + String timeStr = new SimpleDateFormat(pattern).format(new Date()); + String text = getLabel(module) + timeStr; + + width = getStringWidth(16, text) + 8; + height = 16f; + + drawRect(x - 2, y, width, height, mod.backgroundColor.getColor()); + drawString(16, text, x + 2, y + 3, module.textColor.getRGB()); + } + + private String getLabel(ClockDisplay module) { + String label = module.label.getValue(); + if (label == null || label.trim().isEmpty()) { + label = FPSMaster.i18n.get("clockdisplay.defaultlabel"); + if ("clockdisplay.defaultlabel".equals(label)) { + label = "Time: "; + } + module.label.setValue(label); + } + if (!label.endsWith(":") && !label.endsWith(":") && !label.endsWith(" ")) { + label += ": "; + } + return label; + } + + private ClockDisplay getModule() { + return (ClockDisplay) mod; + } +} diff --git a/src/main/java/top/fpsmaster/ui/custom/impl/ServerAddressDisplayComponent.java b/src/main/java/top/fpsmaster/ui/custom/impl/ServerAddressDisplayComponent.java new file mode 100644 index 00000000..93e28cdb --- /dev/null +++ b/src/main/java/top/fpsmaster/ui/custom/impl/ServerAddressDisplayComponent.java @@ -0,0 +1,74 @@ +package top.fpsmaster.ui.custom.impl; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ServerData; +import top.fpsmaster.FPSMaster; +import top.fpsmaster.features.impl.interfaces.ServerAddressDisplay; +import top.fpsmaster.ui.custom.Component; + +public class ServerAddressDisplayComponent extends Component { + public ServerAddressDisplayComponent() { + super(ServerAddressDisplay.class); + x = 0.02f; + y = 0.05f; + allowScale = true; + } + + @Override + public void draw(float x, float y) { + super.draw(x, y); + ServerAddressDisplay module = getModule(); + + String address = getServerAddress(); + if (address == null) { + return; + } + + String text = getLabel(module) + address; + width = getStringWidth(16, text) + 8; + height = 16f; + + drawRect(x - 2, y, width, height, mod.backgroundColor.getColor()); + drawString(16, text, x + 2, y + 3, module.textColor.getRGB()); + } + + @Override + public boolean shouldDisplay() { + return mod.isEnabled() && getServerAddress() != null; + } + + private String getServerAddress() { + Minecraft mc = Minecraft.getMinecraft(); + if (mc == null) return null; + + if (mc.isIntegratedServerRunning()) { + return FPSMaster.i18n.get("serveraddressdisplay.singleplayer"); + } + + ServerData serverData = mc.getCurrentServerData(); + if (serverData != null && serverData.serverIP != null && !serverData.serverIP.isEmpty()) { + return serverData.serverIP; + } + + return null; + } + + private String getLabel(ServerAddressDisplay module) { + String label = module.label.getValue(); + if (label == null || label.trim().isEmpty()) { + label = FPSMaster.i18n.get("serveraddressdisplay.defaultlabel"); + if ("serveraddressdisplay.defaultlabel".equals(label)) { + label = "Server: "; + } + module.label.setValue(label); + } + if (!label.endsWith(":") && !label.endsWith(":") && !label.endsWith(" ")) { + label += ": "; + } + return label; + } + + private ServerAddressDisplay getModule() { + return (ServerAddressDisplay) mod; + } +} diff --git a/src/main/java/top/fpsmaster/ui/custom/impl/ToggleSneakComponent.java b/src/main/java/top/fpsmaster/ui/custom/impl/ToggleSneakComponent.java new file mode 100644 index 00000000..5c292fa7 --- /dev/null +++ b/src/main/java/top/fpsmaster/ui/custom/impl/ToggleSneakComponent.java @@ -0,0 +1,30 @@ +package top.fpsmaster.ui.custom.impl; + +import top.fpsmaster.features.impl.utility.ToggleSneak; +import top.fpsmaster.ui.custom.Component; + +import static top.fpsmaster.utils.core.Utility.mc; + +public class ToggleSneakComponent extends Component { + public ToggleSneakComponent() { + super(ToggleSneak.class); + allowScale = true; + } + + @Override + public void draw(float x, float y) { + super.draw(x, y); + String text; + if (ToggleSneak.sneak) { + text = "[Sneaking (Toggled)]"; + } else { + text = ""; + if (mc.thePlayer != null && mc.thePlayer.isSneaking()) { + text = "[Sneaking (Vanilla)]"; + } + } + drawString(16, text, x, y, -1); + this.width = getStringWidth(16, text); + this.height = 12; + } +} diff --git a/src/main/resources/assets/minecraft/client/lang/en_us.lang b/src/main/resources/assets/minecraft/client/lang/en_us.lang index ca092c04..a4103cb4 100644 --- a/src/main/resources/assets/minecraft/client/lang/en_us.lang +++ b/src/main/resources/assets/minecraft/client/lang/en_us.lang @@ -398,6 +398,12 @@ sprint.desc=Stay sprinting at all times sprint.togglesprint=Toggle Sprint sprint.betterfont=Clean Font +togglesneak=Toggle Sneak +togglesneak.desc=Press the toggle key once to keep sneaking +togglesneak.togglesneak=Toggle Sneak +togglesneak.togglekey=Toggle Key +togglesneak.betterfont=Clean Font + autogg=AutoGG autogg.desc=Automatically send a custom message after a game has ended. autogg.servers=Servers @@ -540,6 +546,33 @@ playtime.unit.seconds=s playtime.unit.minutes=min playtime.unit.hours=h +clockdisplay=Clock Display +clockdisplay.desc=Display the current system time on screen +clockdisplay.showseconds=Show Seconds +clockdisplay.hour24=24-Hour Format +clockdisplay.label=Display Text +clockdisplay.textcolor=Text Color +clockdisplay.betterfont=Better Font +clockdisplay.fontshadow=Font Shadow +clockdisplay.defaultlabel=Time: +clockdisplay.background=Show Background +clockdisplay.backgroundcolor=Background Color +clockdisplay.round=Rounded Corners +clockdisplay.roundradius=Corner Radius + +serveraddressdisplay=Server Address +serveraddressdisplay.desc=Display the current server IP or world name on screen +serveraddressdisplay.label=Display Text +serveraddressdisplay.textcolor=Text Color +serveraddressdisplay.betterfont=Better Font +serveraddressdisplay.fontshadow=Font Shadow +serveraddressdisplay.defaultlabel=Server: +serveraddressdisplay.singleplayer=Singleplayer +serveraddressdisplay.background=Show Background +serveraddressdisplay.backgroundcolor=Background Color +serveraddressdisplay.round=Rounded Corners +serveraddressdisplay.roundradius=Corner Radius + hitboxes=Hitboxes hitboxes.desc=Show hitboxes hitboxes.color=Color diff --git a/src/main/resources/assets/minecraft/client/lang/zh_cn.lang b/src/main/resources/assets/minecraft/client/lang/zh_cn.lang index 08f1f8fe..ae9f53a6 100644 --- a/src/main/resources/assets/minecraft/client/lang/zh_cn.lang +++ b/src/main/resources/assets/minecraft/client/lang/zh_cn.lang @@ -398,6 +398,12 @@ sprint.desc=保持疾跑 sprint.togglesprint=切换疾跑 sprint.betterfont=更好的字体 +togglesneak=切换潜行 +togglesneak.desc=按下切换键即可保持潜行 +togglesneak.togglesneak=切换潜行 +togglesneak.togglekey=切换按键 +togglesneak.betterfont=更好的字体 + autogg=自动GG autogg.desc=游戏结束后自动地在发送你自定义的消息 autogg.servers=服务器列表 @@ -540,6 +546,33 @@ playtime.unit.seconds=秒 playtime.unit.minutes=分钟 playtime.unit.hours=小时 +clockdisplay=时钟显示 +clockdisplay.desc=在屏幕上显示当前系统时间 +clockdisplay.showseconds=显示秒 +clockdisplay.hour24=24小时制 +clockdisplay.label=显示文本 +clockdisplay.textcolor=文字颜色 +clockdisplay.betterfont=更好的字体 +clockdisplay.fontshadow=字体阴影 +clockdisplay.defaultlabel=时间: +clockdisplay.background=背景 +clockdisplay.backgroundcolor=背景颜色 +clockdisplay.round=圆角 +clockdisplay.roundradius=圆角半径 + +serveraddressdisplay=服务器地址 +serveraddressdisplay.desc=在屏幕上显示当前服务器IP或存档名称 +serveraddressdisplay.label=显示文本 +serveraddressdisplay.textcolor=文字颜色 +serveraddressdisplay.betterfont=更好的字体 +serveraddressdisplay.fontshadow=字体阴影 +serveraddressdisplay.defaultlabel=服务器: +serveraddressdisplay.singleplayer=单人游戏 +serveraddressdisplay.background=背景 +serveraddressdisplay.backgroundcolor=背景颜色 +serveraddressdisplay.round=圆角 +serveraddressdisplay.roundradius=圆角半径 + hitboxes=碰撞箱 hitboxes.desc=显示碰撞箱 hitboxes.color=颜色