diff --git a/src/main/java/cn/pupperclient/PupperClient.java b/src/main/java/cn/pupperclient/PupperClient.java index c17a29f..bed1503 100644 --- a/src/main/java/cn/pupperclient/PupperClient.java +++ b/src/main/java/cn/pupperclient/PupperClient.java @@ -16,9 +16,9 @@ import cn.pupperclient.management.profile.ProfileManager; import cn.pupperclient.management.websocket.WebSocketManager; import cn.pupperclient.skia.font.Fonts; -import cn.pupperclient.utils.ExternalToolManager; -import cn.pupperclient.utils.IMinecraft; -import cn.pupperclient.utils.Multithreading; +import cn.pupperclient.utils.system.ExternalToolManager; +import cn.pupperclient.utils.minecraft.interfaces.IMinecraft; +import cn.pupperclient.utils.thread.Multithreading; import cn.pupperclient.utils.file.FileLocation; import cn.pupperclient.utils.language.*; import com.viaversion.viafabricplus.ViaFabricPlus; @@ -73,6 +73,8 @@ public void onShutdown() { if (keybindManager != null) { keybindManager.cleanup(); } + cn.pupperclient.skia.Skia.getImageHelper().clear(); + cn.pupperclient.skia.font.FontHelper.clearCache(); Multithreading.shutdown(); } @@ -141,7 +143,7 @@ private void registerTermsScreenCheck() { ClientTickEvents.END_CLIENT_TICK.register(client -> { if (firstLaunch && client.world != null && !hasAcceptedTerms) { TermsScreen termsScreen = new TermsScreen(); - client.setScreen(termsScreen.build()); + client.setScreen(termsScreen); } }); } diff --git a/src/main/java/cn/pupperclient/PupperEventHandle.java b/src/main/java/cn/pupperclient/PupperEventHandle.java index fdf0c23..4e776d5 100644 --- a/src/main/java/cn/pupperclient/PupperEventHandle.java +++ b/src/main/java/cn/pupperclient/PupperEventHandle.java @@ -1,7 +1,6 @@ package cn.pupperclient; import java.util.List; -import java.util.Objects; import cn.pupperclient.event.EventBus; import cn.pupperclient.event.EventListener; @@ -9,19 +8,9 @@ import cn.pupperclient.event.client.*; import cn.pupperclient.event.server.impl.GameJoinEvent; import cn.pupperclient.management.profile.Profile; -import cn.pupperclient.utils.ChatUtils; -import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; import net.minecraft.client.MinecraftClient; public class PupperEventHandle { - - @EventListener - public void onMotion(EventMotion e) { - if (MinecraftClient.getInstance().player != null && e.getType() == EventType.PRE && MinecraftClient.getInstance().player.deathTime <= 1) { - EventBus.getInstance().post(new EventRespawn()); - } - } - public final EventBus.EventListener onClientTick = event -> { PupperClient.getInstance().getColorManager().onTick(); PupperClient.getInstance().getHypixelManager().update(); diff --git a/src/main/java/cn/pupperclient/event/EventBus.java b/src/main/java/cn/pupperclient/event/EventBus.java index 9432dc5..da0a806 100644 --- a/src/main/java/cn/pupperclient/event/EventBus.java +++ b/src/main/java/cn/pupperclient/event/EventBus.java @@ -110,6 +110,9 @@ public void post(T event) { if (listeners != null) { for (EventListener listener : listeners) { + if (event.isCancelled()) { + break; + } try { @SuppressWarnings("unchecked") EventListener castedListener = (EventListener) listener; @@ -178,7 +181,7 @@ private EventListener getEventHandler(final Object o, final Field field) { try { fieldSubscription = (EventListener) field.get(o); } catch (IllegalAccessException e) { - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("EventBus", "Failed to get event handler", e); } finally { field.setAccessible(accessible); } diff --git a/src/main/java/cn/pupperclient/event/client/EventAttackYaw.java b/src/main/java/cn/pupperclient/event/client/EventAttackYaw.java deleted file mode 100644 index 3ac57a2..0000000 --- a/src/main/java/cn/pupperclient/event/client/EventAttackYaw.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.pupperclient.event.client; - -import cn.pupperclient.event.Event; - -public class EventAttackYaw extends Event { - private float yaw; - - public float getYaw() { - return this.yaw; - } - - public void setYaw(float yaw) { - this.yaw = yaw; - } - - public EventAttackYaw(float yaw) { - this.yaw = yaw; - } -} diff --git a/src/main/java/cn/pupperclient/event/client/EventDisconnect.java b/src/main/java/cn/pupperclient/event/client/EventDisconnect.java deleted file mode 100644 index ce8117a..0000000 --- a/src/main/java/cn/pupperclient/event/client/EventDisconnect.java +++ /dev/null @@ -1,7 +0,0 @@ -package cn.pupperclient.event.client; - -import cn.pupperclient.event.Event; - -public class EventDisconnect extends Event { - -} diff --git a/src/main/java/cn/pupperclient/event/client/EventMotion.java b/src/main/java/cn/pupperclient/event/client/EventMotion.java deleted file mode 100644 index 4024c04..0000000 --- a/src/main/java/cn/pupperclient/event/client/EventMotion.java +++ /dev/null @@ -1,82 +0,0 @@ -package cn.pupperclient.event.client; - -import cn.pupperclient.event.Event; -import cn.pupperclient.event.EventType; - -public class EventMotion extends Event { - private final EventType type; - private double x; - private double y; - private double z; - private float yaw; - private float pitch; - private boolean onGround; - - public EventMotion(EventType type, float yaw, float pitch) { - this.type = type; - this.yaw = yaw; - this.pitch = pitch; - } - - public EventType getType() { - return this.type; - } - - public double getX() { - return this.x; - } - - public double getY() { - return this.y; - } - - public double getZ() { - return this.z; - } - - public float getYaw() { - return this.yaw; - } - - public float getPitch() { - return this.pitch; - } - - public boolean isOnGround() { - return this.onGround; - } - - public void setX(double x) { - this.x = x; - } - - public void setY(double y) { - this.y = y; - } - - public void setZ(double z) { - this.z = z; - } - - public void setYaw(float yaw) { - this.yaw = yaw; - } - - public void setPitch(float pitch) { - this.pitch = pitch; - } - - public void setOnGround(boolean onGround) { - this.onGround = onGround; - } - - public EventMotion(EventType type, double x, double y, double z, float yaw, float pitch, boolean onGround) { - this.type = type; - this.x = x; - this.y = y; - this.z = z; - this.yaw = yaw; - this.pitch = pitch; - this.onGround = onGround; - } -} diff --git a/src/main/java/cn/pupperclient/event/client/EventPositionItem.java b/src/main/java/cn/pupperclient/event/client/EventPositionItem.java deleted file mode 100644 index 7fb2421..0000000 --- a/src/main/java/cn/pupperclient/event/client/EventPositionItem.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.pupperclient.event.client; - -import cn.pupperclient.event.Event; -import net.minecraft.network.packet.Packet; - -public class EventPositionItem extends Event { - private Packet packet; - - public Packet getPacket() { - return this.packet; - } - - public void setPacket(Packet packet) { - this.packet = packet; - } - - public EventPositionItem(Packet packet) { - this.packet = packet; - } -} diff --git a/src/main/java/cn/pupperclient/event/client/EventRespawn.java b/src/main/java/cn/pupperclient/event/client/EventRespawn.java deleted file mode 100644 index baedb0f..0000000 --- a/src/main/java/cn/pupperclient/event/client/EventRespawn.java +++ /dev/null @@ -1,6 +0,0 @@ -package cn.pupperclient.event.client; - -import cn.pupperclient.event.Event; - -public class EventRespawn extends Event { -} diff --git a/src/main/java/cn/pupperclient/event/client/EventStrafe.java b/src/main/java/cn/pupperclient/event/client/EventStrafe.java deleted file mode 100644 index de2b82a..0000000 --- a/src/main/java/cn/pupperclient/event/client/EventStrafe.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.pupperclient.event.client; - -import cn.pupperclient.event.Event; - -public class EventStrafe extends Event { - private float yaw; - - public void setYaw(float yaw) { - this.yaw = yaw; - } - - public float getYaw() { - return this.yaw; - } - - public EventStrafe(float yaw) { - this.yaw = yaw; - } -} diff --git a/src/main/java/cn/pupperclient/event/client/EventUpdate.java b/src/main/java/cn/pupperclient/event/client/EventUpdate.java deleted file mode 100644 index c2dc408..0000000 --- a/src/main/java/cn/pupperclient/event/client/EventUpdate.java +++ /dev/null @@ -1,6 +0,0 @@ -package cn.pupperclient.event.client; - -import cn.pupperclient.event.Event; - -public class EventUpdate extends Event { -} diff --git a/src/main/java/cn/pupperclient/event/client/EventUseItemRayTrace.java b/src/main/java/cn/pupperclient/event/client/EventUseItemRayTrace.java deleted file mode 100644 index e27db26..0000000 --- a/src/main/java/cn/pupperclient/event/client/EventUseItemRayTrace.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.pupperclient.event.client; - -import cn.pupperclient.event.Event; - -public class EventUseItemRayTrace extends Event { - private float yaw; - private float pitch; - - public EventUseItemRayTrace(float yaw, float pitch) { - this.yaw = yaw; - this.pitch = pitch; - } - - public float getYaw() { - return this.yaw; - } - - public float getPitch() { - return this.pitch; - } - - public void setYaw(float yaw) { - this.yaw = yaw; - } - - public void setPitch(float pitch) { - this.pitch = pitch; - } - - @Override - public boolean equals(Object o) { - if (o == this) { - return true; - } else if (!(o instanceof EventUseItemRayTrace other)) { - return false; - } else if (!other.canEqual(this)) { - return false; - } else { - return Float.compare(this.getYaw(), other.getYaw()) == 0 && Float.compare(this.getPitch(), other.getPitch()) == 0; - } - } - - protected boolean canEqual(Object other) { - return other instanceof EventUseItemRayTrace; - } - - @Override - public int hashCode() { - int result = 1; - result = result * 59 + Float.floatToIntBits(this.getYaw()); - return result * 59 + Float.floatToIntBits(this.getPitch()); - } - - @Override - public String toString() { - return "EventUseItemRayTrace(yaw=" + this.getYaw() + ", pitch=" + this.getPitch() + ")"; - } -} diff --git a/src/main/java/cn/pupperclient/event/client/PlaySoundEvent.java b/src/main/java/cn/pupperclient/event/client/PlaySoundEvent.java deleted file mode 100644 index 1fb0f7e..0000000 --- a/src/main/java/cn/pupperclient/event/client/PlaySoundEvent.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.pupperclient.event.client; - -import cn.pupperclient.event.Event; -import net.minecraft.client.sound.SoundInstance; -import net.minecraft.entity.Entity; -import net.minecraft.sound.SoundCategory; - -public class PlaySoundEvent extends Event { - private final SoundInstance sound; - private final SoundCategory category; - private final String name; - private Entity sourceEntity; - - public PlaySoundEvent(SoundInstance sound) { - this.sound = sound; - this.category = sound.getCategory(); - this.name = sound.getId().toString(); - } - - - public String getName() { - return name; - } - - public void setSourceEntity(Entity soundSource) { - sourceEntity = soundSource; - } -} diff --git a/src/main/java/cn/pupperclient/event/client/TotemEvent.java b/src/main/java/cn/pupperclient/event/client/TotemEvent.java index 63d3429..5053d45 100644 --- a/src/main/java/cn/pupperclient/event/client/TotemEvent.java +++ b/src/main/java/cn/pupperclient/event/client/TotemEvent.java @@ -4,7 +4,7 @@ import net.minecraft.entity.player.PlayerEntity; public class TotemEvent extends Event { - private PlayerEntity player; + private final PlayerEntity player; public TotemEvent(PlayerEntity entity) { player = entity; diff --git a/src/main/java/cn/pupperclient/event/client/WorldChangeEvent.java b/src/main/java/cn/pupperclient/event/client/WorldChangeEvent.java deleted file mode 100644 index d4a195a..0000000 --- a/src/main/java/cn/pupperclient/event/client/WorldChangeEvent.java +++ /dev/null @@ -1,8 +0,0 @@ -package cn.pupperclient.event.client; - -import cn.pupperclient.event.Event; -import net.minecraft.client.world.ClientWorld; - -public class WorldChangeEvent extends Event { - public WorldChangeEvent(ClientWorld world) {} -} diff --git a/src/main/java/cn/pupperclient/gui/GuiResourcePackConvert.java b/src/main/java/cn/pupperclient/gui/GuiResourcePackConvert.java index 3c2ea75..31c83a2 100644 --- a/src/main/java/cn/pupperclient/gui/GuiResourcePackConvert.java +++ b/src/main/java/cn/pupperclient/gui/GuiResourcePackConvert.java @@ -15,8 +15,8 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import cn.pupperclient.libraries.resourcepack.ResourcePackConverter; -import cn.pupperclient.utils.JsonUtils; -import cn.pupperclient.utils.Multithreading; +import cn.pupperclient.utils.misc.JsonUtils; +import cn.pupperclient.utils.thread.Multithreading; import cn.pupperclient.utils.file.FileLocation; import it.unimi.dsi.fastutil.objects.ObjectObjectImmutablePair; @@ -65,7 +65,7 @@ private ResourcePackConverter createConverter() { try { Files.createDirectories(cacheDir.toPath()); } catch (IOException e) { - e.printStackTrace(); + PupperClient.LOGGER.error("Failed to create cache directory", e); } for(File f : detectPacks()) { @@ -80,7 +80,7 @@ private ResourcePackConverter createConverter() { packs.add(ObjectObjectImmutablePair.of(targetFile, outputFile)); } catch (Exception e) { - e.printStackTrace(); + PupperClient.LOGGER.error("Failed to move resource pack", e); } } @@ -121,7 +121,7 @@ private List detectPacks() { zipIn.closeEntry(); } } catch (IOException e) { - e.printStackTrace(); + PupperClient.LOGGER.error("Failed to detect resource packs", e); } } diff --git a/src/main/java/cn/pupperclient/gui/MainMenuGui.java b/src/main/java/cn/pupperclient/gui/MainMenuGui.java index 782cf27..971b9d4 100644 --- a/src/main/java/cn/pupperclient/gui/MainMenuGui.java +++ b/src/main/java/cn/pupperclient/gui/MainMenuGui.java @@ -8,11 +8,9 @@ import java.nio.file.StandardCopyOption; import cn.pupperclient.PupperClient; -import cn.pupperclient.management.mod.impl.settings.SystemSettings; import com.google.gson.JsonObject; import cn.pupperclient.animation.SimpleAnimation; import cn.pupperclient.gui.api.SimpleSoarGui; -import cn.pupperclient.management.Notification.NotificationManager; import cn.pupperclient.management.color.api.ColorPalette; import cn.pupperclient.management.config.ConfigType; import cn.pupperclient.management.mod.impl.settings.ModMenuSettings; @@ -25,13 +23,11 @@ import cn.pupperclient.ui.component.impl.Switch; import cn.pupperclient.ui.component.handler.impl.ButtonHandler; import cn.pupperclient.ui.component.handler.impl.SwitchHandler; -import cn.pupperclient.utils.ColorUtils; -import cn.pupperclient.utils.ExternalToolManager; -import cn.pupperclient.utils.ToolInstallCallback; +import cn.pupperclient.utils.color.ColorUtils; import cn.pupperclient.utils.language.I18n; import cn.pupperclient.utils.mouse.MouseUtils; -import cn.pupperclient.utils.Multithreading; -import cn.pupperclient.utils.file.dialog.SoarFileDialog; +import cn.pupperclient.utils.thread.Multithreading; +import cn.pupperclient.utils.file.FileDialog; import cn.pupperclient.utils.file.FileLocation; import cn.pupperclient.utils.mouse.ScrollHelper; import com.terraformersmc.modmenu.gui.ModsScreen; @@ -62,13 +58,9 @@ public class MainMenuGui extends SimpleSoarGui { private final ScrollHelper backgroundScrollHelper = new ScrollHelper(); private float parallaxX = 0; private float parallaxY = 0; - private final NotificationManager notificationManager; - private boolean toolsAvailable = false; - private boolean toolsChecked = false; public MainMenuGui() { super(false); - this.notificationManager = new NotificationManager(); } @Override @@ -76,87 +68,6 @@ public void init() { updateLayout(); loadBackgroundSettings(); initCustomizationComponents(); - -// if (!toolsChecked) { -// checkTools(); -// } - } - - private void checkTools() { - toolsChecked = true; - - if (!PupperClient.firstLaunch) { - toolsAvailable = true; - ExternalToolManager toolManager = PupperClient.getInstance().getToolManager(); - if (SystemSettings.getInstance().getFFmpegPath() == null || SystemSettings.getInstance().getYtdlpPath() == null) { - SystemSettings.getInstance().getFfmpegPathSetting().setFile(toolManager.getFfmpegPath()); - SystemSettings.getInstance().getYtdlpPathSetting().setFile(toolManager.getYtDlpPath()); - } - updateAllButtonStates(); - } - - PupperClient.LOGGER.info("开始检查工具..."); - Multithreading.runAsync(() -> { - try { - ExternalToolManager toolManager = PupperClient.getInstance().getToolManager(); - if (toolManager != null) { - toolManager.checkAndInstallTools(new ToolInstallCallback() { - @Override - public void onProgress(PupperClient.MusicToolStatus status, float progress, String message) { - Multithreading.runMainThread(() -> { - PupperClient.LOGGER.info("工具检查进度: {} - {}% - {}", status, progress * 100, message); - notificationManager.showToolCheckNotification(status, progress, message); - }); - } - - @Override - public void onComplete(boolean success) { - Multithreading.runMainThread(() -> { - PupperClient.LOGGER.info("工具检查完成: {}", success ? "成功" : "失败"); - toolsAvailable = success; - PupperClient.MusicToolStatus finalStatus = success ? PupperClient.MusicToolStatus.INSTALLED : PupperClient.MusicToolStatus.FAILED; - notificationManager.showToolCheckNotification(finalStatus, 1f, - success ? "工具安装完成" : "工具安装失败"); - - if (success){ - SystemSettings.getInstance().getFfmpegPathSetting().setFile(toolManager.getFfmpegPath()); - SystemSettings.getInstance().getYtdlpPathSetting().setFile(toolManager.getYtDlpPath()); - } - - updateAllButtonStates(); - }); - } - }); - } else { - PupperClient.LOGGER.warn("工具管理器为空"); - Multithreading.runMainThread(() -> { - toolsAvailable = false; - updateAllButtonStates(); - }); - } - } catch (Exception e) { - PupperClient.LOGGER.error("工具检查失败: {}", e.getMessage()); - Multithreading.runMainThread(() -> { - notificationManager.showToolCheckNotification(PupperClient.MusicToolStatus.FAILED, 0f, "工具检查失败: " + e.getMessage()); - toolsAvailable = false; - updateAllButtonStates(); - }); - } - }); - } - - private void updateAllButtonStates() { - PupperClient.LOGGER.info("update: toolsAvailable = {}", toolsAvailable); - - for (MainMenuButton button : buttons) { - boolean isSettingsOrBackground = button == settingsButton || button == backgroundButton; - boolean shouldEnable = toolsAvailable || isSettingsOrBackground; - button.setEnabled(shouldEnable); - } - - if (client != null && client.currentScreen != null) { - client.currentScreen.init(client, client.getWindow().getWidth(), client.getWindow().getHeight()); - } } private void loadBackgroundSettings() { @@ -186,25 +97,24 @@ private void updateLayout() { float buttonWidth = 240 * scaleFactor; buttons.add(new MainMenuButton("menu.singleplayer", Icon.HOME, - centerX - buttonWidth / 2, centerY - (120 * scaleFactor), buttonWidth, scaleFactor, () -> client.setScreen(new SelectWorldScreen(this.build())))); + centerX - buttonWidth / 2, centerY - (120 * scaleFactor), buttonWidth, scaleFactor, () -> client.setScreen(new SelectWorldScreen(this)))); buttons.add(new MainMenuButton("menu.multiplayer", Icon.GROUPS, centerX - buttonWidth / 2, centerY - (60 * scaleFactor), buttonWidth, scaleFactor, () -> { - //client.setScreen(new MultiplayerGui().build()); - client.setScreen(new MultiplayerScreen(this.build())); + client.setScreen(new MultiplayerScreen(this)); })); buttons.add(new MainMenuButton("menu.realms", Icon.DNS, - centerX - buttonWidth / 2, centerY, buttonWidth, scaleFactor, () -> client.setScreen(new RealmsMainScreen(this.build())))); + centerX - buttonWidth / 2, centerY, buttonWidth, scaleFactor, () -> client.setScreen(new RealmsMainScreen(this)))); buttons.add(new MainMenuButton("menu.ias", Icon.ACCOUNT_BALANCE, - centerX - buttonWidth / 2, centerY + (60 * scaleFactor), buttonWidth, scaleFactor, () -> client.setScreen(new AccountScreen(this.build())))); + centerX - buttonWidth / 2, centerY + (60 * scaleFactor), buttonWidth, scaleFactor, () -> client.setScreen(new AccountScreen(this)))); buttons.add(new MainMenuButton("menu.modmenu", Icon.LIST, - centerX - buttonWidth / 2, centerY + (120 * scaleFactor), buttonWidth, scaleFactor, () -> client.setScreen(new ModsScreen(this.build())))); + centerX - buttonWidth / 2, centerY + (120 * scaleFactor), buttonWidth, scaleFactor, () -> client.setScreen(new ModsScreen(this)))); buttons.add(new MainMenuButton("menu.options", Icon.SETTINGS, - centerX - buttonWidth / 2, centerY + (180 * scaleFactor), buttonWidth, scaleFactor, () -> client.setScreen(new OptionsScreen(this.build(), client.options)))); + centerX - buttonWidth / 2, centerY + (180 * scaleFactor), buttonWidth, scaleFactor, () -> client.setScreen(new OptionsScreen(this, client.options)))); buttons.add(new MainMenuButton("menu.quit", Icon.CLOSE, centerX - buttonWidth / 2, centerY + (240 * scaleFactor), buttonWidth, scaleFactor, () -> client.scheduleStop())); @@ -224,8 +134,7 @@ private void updateLayout() { lastWindowHeight = client.getWindow().getHeight(); for (MainMenuButton button : buttons) { - boolean isSettingsOrBackground = button == settingsButton || button == backgroundButton; - button.setEnabled(toolsAvailable || isSettingsOrBackground); + button.setEnabled(true); } } @@ -278,7 +187,7 @@ public void onAction() { @Override public void onAction() { Multithreading.runAsync(() -> { - ObjectObjectImmutablePair result = SoarFileDialog.chooseFile("Select Background Image", "png", "jpg"); + ObjectObjectImmutablePair result = FileDialog.chooseFile("Select Background Image", "png", "jpg"); if (result.left()) { File selectedFile = result.right(); @@ -383,9 +292,6 @@ public void draw(double mouseX, double mouseY) { button.draw((int) mouseX, (int) mouseY); } - // 绘制通知 - notificationManager.draw(mouseX, mouseY); - backgroundButton.draw((int) mouseX, (int) mouseY); settingsButton.draw((int) mouseX, (int) mouseY); @@ -537,9 +443,9 @@ private void drawLogoIcon() { } @Override - public void mousePressed(double mouseX, double mouseY, int button) { + public boolean onMousePressed(double mouseX, double mouseY, int button) { if (isWindowMinimized()) { - return; + return false; } if (showBackgroundWindow) { @@ -569,13 +475,13 @@ public void mousePressed(double mouseX, double mouseY, int button) { break; } } - return; + return true; } if (showCustomizationWindow) { darkModeSwitch.mousePressed(mouseX, mouseY, button); exitCustomizationButton.mousePressed(mouseX, mouseY, button); - return; + return true; } for (MainMenuButton menuButton : buttons) { @@ -584,24 +490,25 @@ public void mousePressed(double mouseX, double mouseY, int button) { backgroundButton.mousePressed((int) mouseX, (int) mouseY, button); settingsButton.mousePressed((int) mouseX, (int) mouseY, button); + return true; } @Override - public void mouseReleased(double mouseX, double mouseY, int button) { + public boolean onMouseReleased(double mouseX, double mouseY, int button) { if (isWindowMinimized()) { - return; + return false; } if (showBackgroundWindow) { exitBackgroundButton.mouseReleased(mouseX, mouseY, button); addBackgroundButton.mouseReleased(mouseX, mouseY, button); - return; + return true; } if (showCustomizationWindow) { darkModeSwitch.mouseReleased(mouseX, mouseY, button); exitCustomizationButton.mouseReleased(mouseX, mouseY, button); - return; + return true; } for (MainMenuButton menuButton : buttons) { @@ -610,10 +517,11 @@ public void mouseReleased(double mouseX, double mouseY, int button) { backgroundButton.mouseReleased((int) mouseX, (int) mouseY, button); settingsButton.mouseReleased((int) mouseX, (int) mouseY, button); + return true; } @Override - public void charTyped(char chr, int modifiers) { + public boolean onCharTyped(char chr, int modifiers) { if (showBackgroundWindow) { exitBackgroundButton.charTyped(chr, modifiers); addBackgroundButton.charTyped(chr, modifiers); @@ -623,10 +531,11 @@ public void charTyped(char chr, int modifiers) { darkModeSwitch.charTyped(chr, modifiers); exitCustomizationButton.charTyped(chr, modifiers); } + return true; } @Override - public void keyPressed(int keyCode, int scanCode, int modifiers) { + public boolean onKeyPressed(int keyCode, int scanCode, int modifiers) { if (showBackgroundWindow) { exitBackgroundButton.keyPressed(keyCode, scanCode, modifiers); addBackgroundButton.keyPressed(keyCode, scanCode, modifiers); @@ -636,6 +545,7 @@ public void keyPressed(int keyCode, int scanCode, int modifiers) { darkModeSwitch.keyPressed(keyCode, scanCode, modifiers); exitCustomizationButton.keyPressed(keyCode, scanCode, modifiers); } + return super.onKeyPressed(keyCode, scanCode, modifiers); } static class BackgroundItem { @@ -692,7 +602,6 @@ public void draw(int mouseX, int mouseY) { float radius = 20 * scaleFactor; - // 根据启用状态调整颜色 java.awt.Color bgColor = enabled ? palette.getSurface() : ColorUtils.applyAlpha(palette.getSurface(), 0.5f); java.awt.Color textColor = enabled ? diff --git a/src/main/java/cn/pupperclient/gui/MusicPlayGui.java b/src/main/java/cn/pupperclient/gui/MusicPlayGui.java index 354d070..aafc59b 100644 --- a/src/main/java/cn/pupperclient/gui/MusicPlayGui.java +++ b/src/main/java/cn/pupperclient/gui/MusicPlayGui.java @@ -2,12 +2,10 @@ import cn.pupperclient.gui.api.SimpleSoarGui; import cn.pupperclient.skia.Skia; -import cn.pupperclient.skia.font.FontHelper; import cn.pupperclient.skia.font.Fonts; import cn.pupperclient.skia.font.Icon; import cn.pupperclient.utils.mouse.MouseUtils; import io.github.humbleui.types.Rect; -import net.minecraft.client.MinecraftClient; import java.awt.*; @@ -45,7 +43,7 @@ public void draw(double mouseX, double mouseY) { } @Override - public void mousePressed(double mouseX, double mouseY, int button) { + public boolean onMousePressed(double mouseX, double mouseY, int button) { int windowWidth = client.getWindow().getWidth(); int windowHeight = client.getWindow().getHeight(); @@ -67,5 +65,6 @@ public void mousePressed(double mouseX, double mouseY, int button) { } else if (MouseUtils.isInside(mouseX, mouseY, startX + 1285, startY + 19, icon_FULLSCREEN_rect.getWidth() + 1, icon_FULLSCREEN_rect.getHeight() + 1)) { isfullscreen = !isfullscreen; } + return true; } } diff --git a/src/main/java/cn/pupperclient/gui/api/SimpleSoarGui.java b/src/main/java/cn/pupperclient/gui/api/SimpleSoarGui.java index 33529a9..eb05431 100644 --- a/src/main/java/cn/pupperclient/gui/api/SimpleSoarGui.java +++ b/src/main/java/cn/pupperclient/gui/api/SimpleSoarGui.java @@ -8,107 +8,90 @@ import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.Text; -public class SimpleSoarGui { - public MinecraftClient client = MinecraftClient.getInstance(); - private final boolean mcScale; - - public SimpleSoarGui(boolean mcScale) { - this.mcScale = mcScale; - } - - public void init() { - } - - public void draw(double mouseX, double mouseY) { - } - - public void mousePressed(double mouseX, double mouseY, int button) { - } - - public void mouseReleased(double mouseX, double mouseY, int button) { - } - - public void mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { - } - - public void charTyped(char chr, int modifiers) { - } - - public void keyPressed(int keyCode, int scanCode, int modifiers) { - } - - public Screen build() { - return new Screen(Text.empty()) { - - @Override - public void init() { - SimpleSoarGui.this.init(); - } - - @Override - public void render(DrawContext context, int mouseX, int mouseY, float delta) { - - SkiaContext.draw((skiaContext) -> { - - Skia.save(); - - if (mcScale) { - if (client != null) { - Skia.scale((float) client.getWindow().getScaleFactor()); - } - } - - if (client != null) { - SimpleSoarGui.this.draw(mcScale ? mouseX : client.mouse.getX(), - mcScale ? mouseY : client.mouse.getY()); - } - Skia.restore(); - }); - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (client != null) { - SimpleSoarGui.this.mousePressed(mcScale ? mouseX : client.mouse.getX(), - mcScale ? mouseY : client.mouse.getY(), button); - } - return true; - } - - @Override - public boolean mouseReleased(double mouseX, double mouseY, int button) { - if (client != null) { - SimpleSoarGui.this.mouseReleased(mcScale ? mouseX : client.mouse.getX(), - mcScale ? mouseY : (int) client.mouse.getY(), button); - } - return true; - } - - @Override - public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { - if (client != null) { - SimpleSoarGui.this.mouseScrolled(mcScale ? mouseX : client.mouse.getX(), - mcScale ? mouseY : (int) client.mouse.getY(), horizontalAmount, verticalAmount); - } - return true; - } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - SimpleSoarGui.this.keyPressed(keyCode, scanCode, modifiers); - return true; - } - - @Override - public boolean charTyped(char chr, int modifiers) { - SimpleSoarGui.this.charTyped(chr, modifiers); - return true; - } - - @Override - public boolean shouldPause() { - return false; - } - }; - } +/** + * Base class for all PupperClient GUIs. + * Directly extends Minecraft's Screen to ensure better compatibility and standard lifecycle. + */ +public abstract class SimpleSoarGui extends Screen { + + protected final MinecraftClient client = MinecraftClient.getInstance(); + protected final boolean mcScale; + + protected SimpleSoarGui(boolean mcScale) { + super(Text.empty()); + this.mcScale = mcScale; + } + + @Override + protected void init() { + // Base init logic if any + } + + /** + * Custom draw logic using Skia. + */ + public abstract void draw(double mouseX, double mouseY); + + @Override + public void render(DrawContext context, int mouseX, int mouseY, float delta) { + SkiaContext.draw((skiaContext) -> { + Skia.save(); + + if (mcScale) { + Skia.scale((float) client.getWindow().getScaleFactor()); + } + + // Standardize mouse coordinates based on scaling + double finalMouseX = mcScale ? mouseX : client.mouse.getX(); + double finalMouseY = mcScale ? mouseY : client.mouse.getY(); + + draw(finalMouseX, finalMouseY); + + Skia.restore(); + }); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + double finalMouseX = mcScale ? mouseX : client.mouse.getX(); + double finalMouseY = mcScale ? mouseY : client.mouse.getY(); + return onMousePressed(finalMouseX, finalMouseY, button); + } + + @Override + public boolean mouseReleased(double mouseX, double mouseY, int button) { + double finalMouseX = mcScale ? mouseX : client.mouse.getX(); + double finalMouseY = mcScale ? mouseY : client.mouse.getY(); + return onMouseReleased(finalMouseX, finalMouseY, button); + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { + double finalMouseX = mcScale ? mouseX : client.mouse.getX(); + double finalMouseY = mcScale ? mouseY : client.mouse.getY(); + return onMouseScrolled(finalMouseX, finalMouseY, horizontalAmount, verticalAmount); + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + return onKeyPressed(keyCode, scanCode, modifiers); + } + + @Override + public boolean charTyped(char chr, int modifiers) { + return onCharTyped(chr, modifiers); + } + + // Abstract or hook methods for subclasses to implement without overriding Screen methods directly + + public boolean onMousePressed(double mouseX, double mouseY, int button) { return false; } + public boolean onMouseReleased(double mouseX, double mouseY, int button) { return false; } + public boolean onMouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { return false; } + public boolean onKeyPressed(int keyCode, int scanCode, int modifiers) { return super.keyPressed(keyCode, scanCode, modifiers); } + public boolean onCharTyped(char chr, int modifiers) { return super.charTyped(chr, modifiers); } + + @Override + public boolean shouldPause() { + return false; + } } diff --git a/src/main/java/cn/pupperclient/gui/api/SoarGui.java b/src/main/java/cn/pupperclient/gui/api/SoarGui.java index dee4203..6127782 100644 --- a/src/main/java/cn/pupperclient/gui/api/SoarGui.java +++ b/src/main/java/cn/pupperclient/gui/api/SoarGui.java @@ -17,7 +17,6 @@ import cn.pupperclient.management.mod.impl.settings.ModMenuSettings; import cn.pupperclient.skia.Skia; import cn.pupperclient.ui.component.Component; -import cn.pupperclient.utils.Multithreading; import io.github.humbleui.skija.SurfaceOrigin; import net.minecraft.client.gui.screen.Screen; @@ -126,7 +125,7 @@ public void draw(double mouseX, double mouseY) { } @Override - public void mousePressed(double mouseX, double mouseY, int button) { + public boolean onMousePressed(double mouseX, double mouseY, int button) { if (currentPage != null) { currentPage.mousePressed(mouseX, mouseY, button); @@ -135,10 +134,11 @@ public void mousePressed(double mouseX, double mouseY, int button) { for (Component c : components) { c.mousePressed(mouseX, mouseY, button); } + return true; } @Override - public void mouseReleased(double mouseX, double mouseY, int button) { + public boolean onMouseReleased(double mouseX, double mouseY, int button) { if (currentPage != null) { currentPage.mouseReleased(mouseX, mouseY, button); @@ -147,17 +147,19 @@ public void mouseReleased(double mouseX, double mouseY, int button) { for (Component c : components) { c.mouseReleased(mouseX, mouseY, button); } + return true; } @Override - public void mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { + public boolean onMouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { if (currentPage != null) { currentPage.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount); } + return true; } @Override - public void charTyped(char chr, int modifiers) { + public boolean onCharTyped(char chr, int modifiers) { if (currentPage != null) { currentPage.charTyped(chr, modifiers); @@ -166,13 +168,15 @@ public void charTyped(char chr, int modifiers) { for (Component c : components) { c.charTyped(chr, modifiers); } + return true; } @Override - public void keyPressed(int keyCode, int scanCode, int modifiers) { + public boolean onKeyPressed(int keyCode, int scanCode, int modifiers) { if (keyCode == GLFW.GLFW_KEY_ESCAPE && inOutAnimation.getEnd() == 1 && closable) { close(); + return true; } if (currentPage != null) { @@ -182,6 +186,7 @@ public void keyPressed(int keyCode, int scanCode, int modifiers) { for (Component c : components) { c.keyPressed(keyCode, scanCode, modifiers); } + return true; } public void close(Screen nextScreen) { diff --git a/src/main/java/cn/pupperclient/gui/api/page/impl/api/SimpleSoarGui.java b/src/main/java/cn/pupperclient/gui/api/page/impl/api/SimpleSoarGui.java deleted file mode 100644 index 92ecb06..0000000 --- a/src/main/java/cn/pupperclient/gui/api/page/impl/api/SimpleSoarGui.java +++ /dev/null @@ -1,113 +0,0 @@ -package cn.pupperclient.gui.api.page.impl.api; - -import cn.pupperclient.skia.Skia; -import cn.pupperclient.skia.context.SkiaContext; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.text.Text; - -public class SimpleSoarGui { - public MinecraftClient client = MinecraftClient.getInstance(); - private final boolean mcScale; - - public SimpleSoarGui(boolean mcScale) { - this.mcScale = mcScale; - } - - public void init() { - } - - public void draw(double mouseX, double mouseY) { - } - - public void mousePressed(double mouseX, double mouseY, int button) { - } - - public void mouseReleased(double mouseX, double mouseY, int button) { - } - - public void mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { - } - - public void charTyped(char chr, int modifiers) { - } - - public void keyPressed(int keyCode, int scanCode, int modifiers) { - } - - public Screen build() { - return new Screen(Text.empty()) { - - @Override - public void init() { - SimpleSoarGui.this.init(); - } - - @Override - public void render(DrawContext context, int mouseX, int mouseY, float delta) { - - SkiaContext.draw((skiaContext) -> { - - Skia.save(); - - if (mcScale) { - if (client != null) { - Skia.scale((float) client.getWindow().getScaleFactor()); - } - } - - if (client != null) { - SimpleSoarGui.this.draw(mcScale ? mouseX : client.mouse.getX(), - mcScale ? mouseY : client.mouse.getY()); - } - Skia.restore(); - }); - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (client != null) { - SimpleSoarGui.this.mousePressed(mcScale ? mouseX : client.mouse.getX(), - mcScale ? mouseY : client.mouse.getY(), button); - } - return true; - } - - @Override - public boolean mouseReleased(double mouseX, double mouseY, int button) { - if (client != null) { - SimpleSoarGui.this.mouseReleased(mcScale ? mouseX : client.mouse.getX(), - mcScale ? mouseY : (int) client.mouse.getY(), button); - } - return true; - } - - @Override - public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { - if (client != null) { - SimpleSoarGui.this.mouseScrolled(mcScale ? mouseX : client.mouse.getX(), - mcScale ? mouseY : (int) client.mouse.getY(), horizontalAmount, verticalAmount); - } - return true; - } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - SimpleSoarGui.this.keyPressed(keyCode, scanCode, modifiers); - return true; - } - - @Override - public boolean charTyped(char chr, int modifiers) { - SimpleSoarGui.this.charTyped(chr, modifiers); - return true; - } - - @Override - public boolean shouldPause() { - return false; - } - }; - } -} diff --git a/src/main/java/cn/pupperclient/gui/api/page/impl/api/SoarGui.java b/src/main/java/cn/pupperclient/gui/api/page/impl/api/SoarGui.java deleted file mode 100644 index 921024e..0000000 --- a/src/main/java/cn/pupperclient/gui/api/page/impl/api/SoarGui.java +++ /dev/null @@ -1,264 +0,0 @@ -package cn.pupperclient.gui.api.page.impl.api; - -import cn.pupperclient.PupperClient; -import cn.pupperclient.animation.Animation; -import cn.pupperclient.animation.Duration; -import cn.pupperclient.animation.cubicbezier.impl.EaseEmphasizedDecelerate; -import cn.pupperclient.gui.api.page.impl.api.page.GuiTransition; -import cn.pupperclient.gui.api.page.impl.api.page.SimplePage; -import cn.pupperclient.management.color.api.ColorPalette; -import cn.pupperclient.management.config.ConfigType; -import cn.pupperclient.management.mod.impl.settings.ModMenuSettings; -import cn.pupperclient.shader.impl.Kawaseblur; -import cn.pupperclient.skia.Skia; -import cn.pupperclient.ui.component.Component; -import cn.pupperclient.utils.Multithreading; -import io.github.humbleui.skija.SurfaceOrigin; -import net.minecraft.client.gui.screen.Screen; -import org.lwjgl.glfw.GLFW; - -import java.util.ArrayList; -import java.util.List; - -public abstract class SoarGui extends SimpleSoarGui { - - protected List components = new ArrayList<>(); - protected List pages; - - protected SimplePage currentPage; - protected SimplePage lastPage; - - private Animation inOutAnimation; - private boolean closable; - private Screen nextScreen; - - public SoarGui(boolean mcScale) { - super(mcScale); - - this.pages = createPages(); - - if (!pages.isEmpty()) { - this.currentPage = pages.getFirst(); - } - } - - @Override - public void init() { - setPageSize(currentPage); - inOutAnimation = new EaseEmphasizedDecelerate(Duration.EXTRA_LONG_1, 0, 1); - closable = true; - currentPage.init(); - } - - public void setPageSize(SimplePage p) { - p.setX(getX()); - p.setY(getY()); - p.setWidth(getWidth()); - p.setHeight(getHeight()); - } - - @Override - public void draw(double mouseX, double mouseY) { - - ColorPalette palette = PupperClient.getInstance().getColorManager().getPalette(); - - if (ModMenuSettings.getInstance().getBlurSetting().isEnabled()) { - Skia.drawImage(Kawaseblur.GUI_BLUR.getTexture(), 0, 0, client.getWindow().getWidth(), - client.getWindow().getHeight(), inOutAnimation.getValue(), SurfaceOrigin.BOTTOM_LEFT); - } - - Skia.save(); - Skia.setAlpha((int) (inOutAnimation.getValue() * 255)); - Skia.scale(getX(), getY(), getWidth(), getHeight(), 2 - inOutAnimation.getValue()); - - Skia.clip(getX(), getY(), getWidth(), getHeight(), 35); - Skia.drawRoundedRect(getX(), getY(), getWidth(), getHeight(), 35, palette.getSurfaceContainer()); - - if (currentPage != null && lastPage == null) { - currentPage.draw(mouseX, mouseY); - } - - if (lastPage != null) { - - GuiTransition transition = lastPage.getTransition(); - - if (currentPage.getTransition().isConsecutive()) { - - Skia.save(); - - if (transition != null) { - float[] result = transition.onTransition(lastPage.getAnimation()); - Skia.translate(result[0] * getWidth(), result[1] * getHeight()); - } - - lastPage.draw(mouseX, mouseY); - Skia.restore(); - } - - Skia.save(); - transition = currentPage.getTransition(); - - if (transition != null) { - float[] result = transition.onTransition(currentPage.getAnimation()); - Skia.translate(result[0] * getWidth(), result[1] * getHeight()); - } - - currentPage.draw(mouseX, mouseY); - Skia.restore(); - - if (lastPage.getAnimation().isFinished()) { - lastPage = null; - } - } - - for (Component c : components) { - c.draw(mouseX, mouseY); - } - - Skia.restore(); - - if (inOutAnimation.getEnd() == 0 && inOutAnimation.isFinished()) { - client.setScreen(nextScreen); - nextScreen = null; - } - } - - @Override - public void mousePressed(double mouseX, double mouseY, int button) { - - if (currentPage != null) { - currentPage.mousePressed(mouseX, mouseY, button); - } - - for (Component c : components) { - c.mousePressed(mouseX, mouseY, button); - } - } - - @Override - public void mouseReleased(double mouseX, double mouseY, int button) { - - if (currentPage != null) { - currentPage.mouseReleased(mouseX, mouseY, button); - } - - for (Component c : components) { - c.mouseReleased(mouseX, mouseY, button); - } - } - - @Override - public void mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { - if (currentPage != null) { - currentPage.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount); - } - } - - @Override - public void charTyped(char chr, int modifiers) { - - if (currentPage != null) { - currentPage.charTyped(chr, modifiers); - } - - for (Component c : components) { - c.charTyped(chr, modifiers); - } - } - - @Override - public void keyPressed(int keyCode, int scanCode, int modifiers) { - - if (keyCode == GLFW.GLFW_KEY_ESCAPE && inOutAnimation.getEnd() == 1 && closable) { - close(); - } - - if (currentPage != null) { - currentPage.keyPressed(keyCode, scanCode, modifiers); - } - - for (Component c : components) { - c.keyPressed(keyCode, scanCode, modifiers); - } - } - - public void close(Screen nextScreen) { - if (inOutAnimation.getEnd() == 1) { - this.nextScreen = nextScreen; - inOutAnimation = new EaseEmphasizedDecelerate(Duration.EXTRA_LONG_1, 1, 0); - client.execute(() -> { - PupperClient.getInstance().getConfigManager().save(ConfigType.MOD); - }); - } - } - - public void close() { - close(null); - } - - public SimplePage getCurrentPage() { - return currentPage; - } - - public void setCurrentPage(SimplePage page) { - - if (currentPage != null) { - lastPage = currentPage; - currentPage.onClosed(); - } - - this.currentPage = page; - currentPage.setAnimation(new EaseEmphasizedDecelerate(Duration.MEDIUM_1, 0, 1)); - lastPage.setAnimation(new EaseEmphasizedDecelerate(Duration.MEDIUM_1, 1, 0)); - - if (currentPage != null) { - setPageSize(currentPage); - currentPage.init(); - } - } - - public void setCurrentPage(Class clazz) { - - SimplePage page = getPage(clazz); - - if (page != null) { - setCurrentPage(page); - } - } - - public SimplePage getPage(Class clazz) { - - SimplePage page = null; - - for (SimplePage p : pages) { - if (p.getClass().equals(clazz)) { - page = p; - break; - } - } - - return page; - } - - public List getPages() { - return pages; - } - - public boolean isClosable() { - return closable; - } - - public void setClosable(boolean closable) { - this.closable = closable; - } - - public abstract List createPages(); - - public abstract float getX(); - - public abstract float getY(); - - public abstract float getWidth(); - - public abstract float getHeight(); -} diff --git a/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/GuiTransition.java b/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/GuiTransition.java deleted file mode 100644 index f56b2e9..0000000 --- a/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/GuiTransition.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.pupperclient.gui.api.page.impl.api.page; - -import cn.pupperclient.animation.Animation; - -public abstract class GuiTransition { - - private final boolean consecutive; - - public GuiTransition(boolean consecutive) { - this.consecutive = consecutive; - } - - public abstract float[] onTransition(Animation animation); - - public boolean isConsecutive() { - return consecutive; - } -} diff --git a/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/Page.java b/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/Page.java deleted file mode 100644 index 31fffc0..0000000 --- a/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/Page.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.pupperclient.gui.api.page.impl.api.page; - -import cn.pupperclient.gui.api.page.impl.api.SoarGui; -import cn.pupperclient.skia.Skia; -import cn.pupperclient.ui.component.impl.text.SearchBar; -import cn.pupperclient.utils.mouse.ScrollHelper; - -public class Page extends SimplePage { - - protected ScrollHelper scrollHelper = new ScrollHelper(); - protected SearchBar searchBar; - - public Page(SoarGui parent, String title, String icon, GuiTransition transition) { - super(parent, title, icon, transition); - } - - @Override - public void init() { - - String text = ""; - - if (searchBar != null) { - text = searchBar.getText(); - } - - searchBar = new SearchBar(x + width - 260 - 32, y + 32, 260, text, () -> { - scrollHelper.reset(); - }); - } - - @Override - public void draw(double mouseX, double mouseY) { - - scrollHelper.onUpdate(); - - Skia.save(); - Skia.translate(0, scrollHelper.getValue()); - - mouseY = (int) (mouseY - scrollHelper.getValue()); - searchBar.draw(mouseX, mouseY); - - Skia.restore(); - } - - @Override - public void mousePressed(double mouseX, double mouseY, int button) { - mouseY = mouseY - scrollHelper.getValue(); - searchBar.mousePressed(mouseX, mouseY, button); - } - - @Override - public void mouseReleased(double mouseX, double mouseY, int button) { - mouseY = mouseY - scrollHelper.getValue(); - searchBar.mouseReleased(mouseX, mouseY, button); - } - - @Override - public void charTyped(char chr, int modifiers) { - searchBar.charTyped(chr, modifiers); - } - - @Override - public void keyPressed(int keyCode, int scanCode, int modifiers) { - searchBar.keyPressed(keyCode, scanCode, modifiers); - } - - @Override - public void mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { - scrollHelper.onScroll(verticalAmount); - } -} diff --git a/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/SimplePage.java b/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/SimplePage.java deleted file mode 100644 index b0ce1d6..0000000 --- a/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/SimplePage.java +++ /dev/null @@ -1,110 +0,0 @@ -package cn.pupperclient.gui.api.page.impl.api.page; - -import cn.pupperclient.animation.Animation; -import cn.pupperclient.animation.other.DummyAnimation; -import cn.pupperclient.gui.api.page.impl.api.SoarGui; - -public class SimplePage { - - protected float x, y, width, height; - private String title, icon; - protected SoarGui parent; - private Animation animation; - private GuiTransition transition; - - public SimplePage(SoarGui parent, String title, String icon, GuiTransition transition) { - this.parent = parent; - this.title = title; - this.icon = icon; - this.x = 0; - this.y = 0; - this.width = 0; - this.height = 0; - this.transition = transition; - this.animation = new DummyAnimation(1); - } - - public void init() { - } - - public void draw(double mouseX, double mouseY) { - } - - public void mousePressed(double mouseX, double mouseY, int button) { - } - - public void mouseReleased(double mouseX, double mouseY, int button) { - } - - public void mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { - } - - public void charTyped(char chr, int modifiers) { - } - - public void keyPressed(int keyCode, int scanCode, int modifiers) { - } - - public void onClosed() { - } - - public float getX() { - return x; - } - - public void setX(float x) { - this.x = x; - } - - public float getY() { - return y; - } - - public void setY(float y) { - this.y = y; - } - - public float getWidth() { - return width; - } - - public void setWidth(float width) { - this.width = width; - } - - public float getHeight() { - return height; - } - - public void setHeight(float height) { - this.height = height; - } - - public String getTitle() { - return title; - } - - public String getIcon() { - return icon; - } - - public GuiTransition getTransition() { - return transition; - } - - public void setTransition(GuiTransition transition) { - this.transition = transition; - } - - public Animation getAnimation() { - return animation; - } - - public void setAnimation(Animation animation) { - this.animation = animation; - } - - public SoarGui getParent() { - return parent; - } -} diff --git a/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/impl/LeftRightTransition.java b/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/impl/LeftRightTransition.java deleted file mode 100644 index b082c09..0000000 --- a/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/impl/LeftRightTransition.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.pupperclient.gui.api.page.impl.api.page.impl; - -import cn.pupperclient.animation.Animation; -import cn.pupperclient.gui.api.page.impl.api.page.GuiTransition; - -public class LeftRightTransition extends GuiTransition { - - public LeftRightTransition(boolean consecutive) { - super(consecutive); - } - - @Override - public float[] onTransition(Animation animation) { - - float progress = animation.getValue(); - float x = 0; - - if (animation.getEnd() == 1) { - x = -1 + progress; - } else { - x = -1 + progress; - } - - return new float[] { x, 0 }; - } -} diff --git a/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/impl/LeftTransition.java b/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/impl/LeftTransition.java deleted file mode 100644 index 8042623..0000000 --- a/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/impl/LeftTransition.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.pupperclient.gui.api.page.impl.api.page.impl; - -import cn.pupperclient.animation.Animation; -import cn.pupperclient.gui.api.page.impl.api.page.GuiTransition; - -public class LeftTransition extends GuiTransition { - - public LeftTransition(boolean consecutive) { - super(consecutive); - } - - @Override - public float[] onTransition(Animation animation) { - - float progress = animation.getValue(); - float x = 0; - - if (animation.getEnd() == 1) { - x = -1 + progress; - } else { - x = -1 + progress; - } - - return new float[] { x, 0 }; - } -} diff --git a/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/impl/RightLeftTransition.java b/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/impl/RightLeftTransition.java deleted file mode 100644 index 9c3efc7..0000000 --- a/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/impl/RightLeftTransition.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.pupperclient.gui.api.page.impl.api.page.impl; - -import cn.pupperclient.animation.Animation; -import cn.pupperclient.gui.api.page.impl.api.page.GuiTransition; - -public class RightLeftTransition extends GuiTransition { - - public RightLeftTransition(boolean consecutive) { - super(consecutive); - } - - @Override - public float[] onTransition(Animation animation) { - - float progress = animation.getValue(); - float x = 0; - - if (animation.getEnd() == 1) { - x = 1 - progress; - } else { - x = -1 + progress; - } - - return new float[] { x, 0 }; - } -} diff --git a/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/impl/RightTransition.java b/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/impl/RightTransition.java deleted file mode 100644 index 38d9164..0000000 --- a/src/main/java/cn/pupperclient/gui/api/page/impl/api/page/impl/RightTransition.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.pupperclient.gui.api.page.impl.api.page.impl; - -import cn.pupperclient.animation.Animation; -import cn.pupperclient.gui.api.page.impl.api.page.GuiTransition; - -public class RightTransition extends GuiTransition { - - public RightTransition(boolean consecutive) { - super(consecutive); - } - - @Override - public float[] onTransition(Animation animation) { - - float progress = animation.getValue(); - float x = 0; - - if (animation.getEnd() == 1) { - x = 1 - progress; - } else { - x = 1 + -progress; - } - - return new float[] { x, 0 }; - } -} diff --git a/src/main/java/cn/pupperclient/gui/edithud/GuiEditHUD.java b/src/main/java/cn/pupperclient/gui/edithud/GuiEditHUD.java index 545fdc0..264d461 100644 --- a/src/main/java/cn/pupperclient/gui/edithud/GuiEditHUD.java +++ b/src/main/java/cn/pupperclient/gui/edithud/GuiEditHUD.java @@ -52,10 +52,11 @@ public void draw(double mouseX, double mouseY) { } @Override - public void mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { + public boolean onMouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { if (selectedMod.isEmpty()) { handleMouseWheel(mouseX, mouseY, verticalAmount); } + return true; } private void updateModPosition(ObjectObjectImmutablePair mod, double mouseX, double mouseY) { @@ -80,7 +81,7 @@ private float calculateNewScale(float currentScale, double wheelDelta) { } @Override - public void mousePressed(double mouseX, double mouseY, int button) { + public boolean onMousePressed(double mouseX, double mouseY, int button) { getHoveredMod(mouseX, mouseY).ifPresent(mod -> { if (button == GLFW.GLFW_MOUSE_BUTTON_MIDDLE) { mod.getPosition().setScale(1.0F); @@ -93,19 +94,23 @@ public void mousePressed(double mouseX, double mouseY, int button) { snapping = button == 0; }); + return true; } @Override - public void mouseReleased(double mouseX, double mouseY, int button) { + public boolean onMouseReleased(double mouseX, double mouseY, int button) { selectedMod = Optional.empty(); + return true; } @Override - public void keyPressed(int keyCode, int scanCode, int modifiers) { + public boolean onKeyPressed(int keyCode, int scanCode, int modifiers) { if (keyCode == GLFW.GLFW_KEY_ESCAPE) { HUDCore.isEditing = false; client.setScreen(prevScreen); + return true; } + return super.onKeyPressed(keyCode, scanCode, modifiers); } private Optional getHoveredMod(double mouseX, double mouseY) { diff --git a/src/main/java/cn/pupperclient/gui/modmenu/component/MusicControlBar.java b/src/main/java/cn/pupperclient/gui/modmenu/component/MusicControlBar.java index f41be93..b00a12d 100644 --- a/src/main/java/cn/pupperclient/gui/modmenu/component/MusicControlBar.java +++ b/src/main/java/cn/pupperclient/gui/modmenu/component/MusicControlBar.java @@ -21,7 +21,7 @@ import cn.pupperclient.ui.component.handler.impl.ButtonHandler; import cn.pupperclient.ui.component.impl.IconButton; import cn.pupperclient.ui.component.impl.text.TextField; -import cn.pupperclient.utils.Multithreading; +import cn.pupperclient.utils.thread.Multithreading; import cn.pupperclient.utils.mouse.MouseUtils; public class MusicControlBar extends Component { @@ -96,7 +96,7 @@ public void onAction() { try { PupperClient.getInstance().getMusicManager().load(); } catch (Exception e) { - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("MusicControlBar", "Failed to reload music list", e); } } }); diff --git a/src/main/java/cn/pupperclient/gui/modmenu/component/NavigationRail.java b/src/main/java/cn/pupperclient/gui/modmenu/component/NavigationRail.java index b4aa942..3893287 100644 --- a/src/main/java/cn/pupperclient/gui/modmenu/component/NavigationRail.java +++ b/src/main/java/cn/pupperclient/gui/modmenu/component/NavigationRail.java @@ -24,7 +24,7 @@ import cn.pupperclient.ui.component.Component; import cn.pupperclient.ui.component.handler.impl.ButtonHandler; import cn.pupperclient.ui.component.impl.IconButton; -import cn.pupperclient.utils.ColorUtils; +import cn.pupperclient.utils.color.ColorUtils; import cn.pupperclient.utils.language.I18n; import cn.pupperclient.utils.mouse.MouseUtils; @@ -63,7 +63,7 @@ public NavigationRail(SoarGui parent, float x, float y, float width, float heigh editButton.setHandler(new ButtonHandler() { @Override public void onAction() { - parent.close(new GuiEditHUD(ModMenuSettings.getInstance().getModMenu()).build()); + parent.close(new GuiEditHUD(ModMenuSettings.getInstance().getModMenu())); } }); } diff --git a/src/main/java/cn/pupperclient/gui/modmenu/pages/CosmeticsPage.java b/src/main/java/cn/pupperclient/gui/modmenu/pages/CosmeticsPage.java index 20e167e..0634dad 100644 --- a/src/main/java/cn/pupperclient/gui/modmenu/pages/CosmeticsPage.java +++ b/src/main/java/cn/pupperclient/gui/modmenu/pages/CosmeticsPage.java @@ -14,10 +14,10 @@ import cn.pupperclient.ui.component.Component; import cn.pupperclient.ui.component.handler.impl.ButtonHandler; import cn.pupperclient.ui.component.impl.IconButton; -import cn.pupperclient.utils.ColorUtils; -import cn.pupperclient.utils.Multithreading; +import cn.pupperclient.utils.color.ColorUtils; +import cn.pupperclient.utils.thread.Multithreading; import cn.pupperclient.utils.file.FileLocation; -import cn.pupperclient.utils.file.dialog.SoarFileDialog; +import cn.pupperclient.utils.file.FileDialog; import cn.pupperclient.utils.language.I18n; import cn.pupperclient.utils.mouse.MouseUtils; import net.minecraft.util.Identifier; @@ -87,7 +87,7 @@ private void loadExistingCapes() { byte[] capeData = Files.readAllBytes(capeFile.toPath()); PupperClient.getInstance().getCapeManager().loadCape(capeId, capeData); } catch (IOException e) { - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("CosmeticsPage", "Failed to load existing cape", e); } } } @@ -96,7 +96,7 @@ private void loadExistingCapes() { private void uploadCape() { Multithreading.runAsync(() -> { - var result = SoarFileDialog.chooseFile("Select Cape", "png"); + var result = FileDialog.chooseFile("Select Cape", "png"); if (result.left()) { File selectedFile = result.right(); @@ -114,7 +114,7 @@ private void uploadCape() { Files.copy(selectedFile.toPath(), targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING); loadExistingCapes(); } catch (IOException e) { - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("CosmeticsPage", "Failed to copy uploaded cape", e); } } else { System.out.println("Invalid cape format!"); @@ -231,7 +231,7 @@ private void drawMd3Style(double mouseX, double mouseY) { } else { // 如果纹理尚未加载,显示加载状态或占位符 Skia.drawRoundedRect(itemX + 5, itemY + 5, itemWidth - 10, itemHeight - 10, 8, - ColorUtils.withAlpha(palette.getSurfaceVariant(), 0.5f)); + ColorUtils.applyAlpha(palette.getSurfaceVariant(), 0.5f)); // 可以添加加载中的文字提示 String loadingText = "Loading..."; float textWidth = Skia.getTextBounds(loadingText, Fonts.getRegular(12)).getWidth(); diff --git a/src/main/java/cn/pupperclient/gui/modmenu/pages/ModsPage.java b/src/main/java/cn/pupperclient/gui/modmenu/pages/ModsPage.java index cfc26eb..4e4a06c 100644 --- a/src/main/java/cn/pupperclient/gui/modmenu/pages/ModsPage.java +++ b/src/main/java/cn/pupperclient/gui/modmenu/pages/ModsPage.java @@ -19,8 +19,8 @@ import cn.pupperclient.skia.font.Fonts; import cn.pupperclient.skia.font.Icon; import cn.pupperclient.ui.component.api.PressAnimation; -import cn.pupperclient.utils.ColorUtils; -import cn.pupperclient.utils.SearchUtils; +import cn.pupperclient.utils.color.ColorUtils; +import cn.pupperclient.utils.misc.SearchUtils; import cn.pupperclient.utils.language.I18n; import cn.pupperclient.utils.mouse.MouseUtils; diff --git a/src/main/java/cn/pupperclient/gui/modmenu/pages/MusicPage.java b/src/main/java/cn/pupperclient/gui/modmenu/pages/MusicPage.java index 91445bd..6eea4e3 100644 --- a/src/main/java/cn/pupperclient/gui/modmenu/pages/MusicPage.java +++ b/src/main/java/cn/pupperclient/gui/modmenu/pages/MusicPage.java @@ -6,6 +6,7 @@ import java.util.List; import cn.pupperclient.PupperClient; +import cn.pupperclient.utils.thread.Multithreading; import org.lwjgl.glfw.GLFW; import cn.pupperclient.animation.SimpleAnimation; @@ -19,9 +20,9 @@ import cn.pupperclient.skia.Skia; import cn.pupperclient.skia.font.Fonts; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.ChatUtils; -import cn.pupperclient.utils.ColorUtils; -import cn.pupperclient.utils.SearchUtils; +import cn.pupperclient.utils.chat.ChatUtils; +import cn.pupperclient.utils.color.ColorUtils; +import cn.pupperclient.utils.misc.SearchUtils; import cn.pupperclient.utils.mouse.MouseUtils; import io.github.humbleui.skija.ClipMode; @@ -170,7 +171,7 @@ private void drawRefreshButton(double mouseX, double mouseY, ColorPalette palett // 绘制按钮背景 float hoverValue = refreshButtonAnimation.getValue(); - Color backgroundColor = ColorUtils.interpolateColor( + Color backgroundColor = ColorUtils.interpolate( palette.getSurfaceContainer(), palette.getSurfaceContainerHigh(), hoverValue @@ -270,14 +271,14 @@ private void refreshMusicList() { PupperClient.getInstance().getMusicManager().load(); // 在主线程中更新UI - cn.pupperclient.utils.Multithreading.runMainThread(() -> { + Multithreading.runMainThread(() -> { this.init(); isRefreshing = false; ChatUtils.addChatMessage("§a音乐列表已刷新!"); }); } catch (Exception e) { - cn.pupperclient.utils.Multithreading.runMainThread(() -> { + Multithreading.runMainThread(() -> { isRefreshing = false; ChatUtils.addChatMessage("§c刷新失败: " + e.getMessage()); PupperClient.LOGGER.error("刷新音乐列表失败: {}", e.getMessage(), e); diff --git a/src/main/java/cn/pupperclient/gui/modmenu/pages/ProfilePage.java b/src/main/java/cn/pupperclient/gui/modmenu/pages/ProfilePage.java index 1524e0c..ba35670 100644 --- a/src/main/java/cn/pupperclient/gui/modmenu/pages/ProfilePage.java +++ b/src/main/java/cn/pupperclient/gui/modmenu/pages/ProfilePage.java @@ -21,7 +21,7 @@ import cn.pupperclient.skia.font.Icon; import cn.pupperclient.ui.component.handler.impl.ButtonHandler; import cn.pupperclient.ui.component.impl.IconButton; -import cn.pupperclient.utils.SearchUtils; +import cn.pupperclient.utils.misc.SearchUtils; import cn.pupperclient.utils.mouse.MouseUtils; public class ProfilePage extends Page { diff --git a/src/main/java/cn/pupperclient/gui/modmenu/pages/SettingsImplPage.java b/src/main/java/cn/pupperclient/gui/modmenu/pages/SettingsImplPage.java index 30f1f6c..4dfb9a9 100644 --- a/src/main/java/cn/pupperclient/gui/modmenu/pages/SettingsImplPage.java +++ b/src/main/java/cn/pupperclient/gui/modmenu/pages/SettingsImplPage.java @@ -9,7 +9,7 @@ import cn.pupperclient.management.mod.settings.Setting; import cn.pupperclient.skia.Skia; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.SearchUtils; +import cn.pupperclient.utils.misc.SearchUtils; import cn.pupperclient.utils.language.I18n; import org.lwjgl.glfw.GLFW; diff --git a/src/main/java/cn/pupperclient/gui/modmenu/pages/SettingsPage.java b/src/main/java/cn/pupperclient/gui/modmenu/pages/SettingsPage.java index e2a20a6..3e1822d 100644 --- a/src/main/java/cn/pupperclient/gui/modmenu/pages/SettingsPage.java +++ b/src/main/java/cn/pupperclient/gui/modmenu/pages/SettingsPage.java @@ -16,7 +16,7 @@ import cn.pupperclient.skia.Skia; import cn.pupperclient.skia.font.Fonts; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.SearchUtils; +import cn.pupperclient.utils.misc.SearchUtils; import cn.pupperclient.utils.language.I18n; import cn.pupperclient.utils.mouse.MouseUtils; diff --git a/src/main/java/cn/pupperclient/gui/modmenu/pages/profile/ProfileAddPage.java b/src/main/java/cn/pupperclient/gui/modmenu/pages/profile/ProfileAddPage.java index 99042d5..602e1c5 100644 --- a/src/main/java/cn/pupperclient/gui/modmenu/pages/profile/ProfileAddPage.java +++ b/src/main/java/cn/pupperclient/gui/modmenu/pages/profile/ProfileAddPage.java @@ -21,8 +21,8 @@ import cn.pupperclient.ui.component.handler.impl.ButtonHandler; import cn.pupperclient.ui.component.impl.Button; import cn.pupperclient.ui.component.impl.text.TextField; -import cn.pupperclient.utils.Multithreading; -import cn.pupperclient.utils.file.dialog.SoarFileDialog; +import cn.pupperclient.utils.thread.Multithreading; +import cn.pupperclient.utils.file.FileDialog; import cn.pupperclient.utils.language.I18n; import cn.pupperclient.utils.mouse.MouseUtils; @@ -159,7 +159,7 @@ public void mouseReleased(double mouseX, double mouseY, int button) { Multithreading.runAsync(() -> { - ObjectObjectImmutablePair chooseFile = SoarFileDialog.chooseFile("Select icon", "png"); + ObjectObjectImmutablePair chooseFile = FileDialog.chooseFile("Select icon", "png"); if(chooseFile.left()) { currentIcon = chooseFile.right(); diff --git a/src/main/java/cn/pupperclient/gui/welcomegui/SetCustomColorScreen.java b/src/main/java/cn/pupperclient/gui/welcomegui/SetCustomColorScreen.java deleted file mode 100644 index 74ef6d4..0000000 --- a/src/main/java/cn/pupperclient/gui/welcomegui/SetCustomColorScreen.java +++ /dev/null @@ -1,9 +0,0 @@ -package cn.pupperclient.gui.welcomegui; - -import cn.pupperclient.gui.api.SimpleSoarGui; - -public class SetCustomColorScreen extends SimpleSoarGui{ - public SetCustomColorScreen() { - super(false); - } -} diff --git a/src/main/java/cn/pupperclient/gui/welcomegui/TermsScreen.java b/src/main/java/cn/pupperclient/gui/welcomegui/TermsScreen.java index 8e2d04e..f53d30e 100644 --- a/src/main/java/cn/pupperclient/gui/welcomegui/TermsScreen.java +++ b/src/main/java/cn/pupperclient/gui/welcomegui/TermsScreen.java @@ -107,15 +107,17 @@ private void renderSkijaWelcome(double mouseX, double mouseY) { } @Override - public void mousePressed(double mouseX, double mouseY, int button) { + public boolean onMousePressed(double mouseX, double mouseY, int button) { acceptButton.mousePressed(mouseX, mouseY, button); declineButton.mousePressed(mouseX, mouseY, button); + return true; } @Override - public void mouseReleased(double mouseX, double mouseY, int button) { + public boolean onMouseReleased(double mouseX, double mouseY, int button) { acceptButton.mouseReleased(mouseX, mouseY, button); declineButton.mouseReleased(mouseX, mouseY, button); + return true; } // 添加一个方法来检查是否已经接受条款 diff --git a/src/main/java/cn/pupperclient/libraries/browser/JCefBrowser.java b/src/main/java/cn/pupperclient/libraries/browser/JCefBrowser.java index 4756451..bbcbac9 100644 --- a/src/main/java/cn/pupperclient/libraries/browser/JCefBrowser.java +++ b/src/main/java/cn/pupperclient/libraries/browser/JCefBrowser.java @@ -5,7 +5,7 @@ import java.io.InputStreamReader; import cn.pupperclient.PupperLogger; -import cn.pupperclient.utils.Multithreading; +import cn.pupperclient.utils.thread.Multithreading; import net.ccbluex.liquidbounce.mcef.MCEF; import net.ccbluex.liquidbounce.mcef.MCEFDownloadManager; @@ -84,12 +84,12 @@ public static void download() { try { resourceManager.downloadJcef(); } catch (IOException e) { - e.printStackTrace(); + PupperLogger.error("JCEF", "Failed to download JCEF", e); } }); } } catch (IOException e) { - e.printStackTrace(); + PupperLogger.error("JCEF", "Failed to initialize resource manager", e); } } diff --git a/src/main/java/cn/pupperclient/libraries/material3/Material3.java b/src/main/java/cn/pupperclient/libraries/material3/Material3.java index 58f4818..47102dc 100644 --- a/src/main/java/cn/pupperclient/libraries/material3/Material3.java +++ b/src/main/java/cn/pupperclient/libraries/material3/Material3.java @@ -13,7 +13,7 @@ import cn.pupperclient.libraries.material3.quantize.QuantizerCelebi; import cn.pupperclient.libraries.material3.scheme.SchemeTonalSpot; import cn.pupperclient.libraries.material3.score.Score; -import cn.pupperclient.utils.ImageUtils; +import cn.pupperclient.utils.render.ImageUtils; public class Material3 { diff --git a/src/main/java/cn/pupperclient/management/Notification/Notification.java b/src/main/java/cn/pupperclient/management/Notification/Notification.java deleted file mode 100644 index f0491c5..0000000 --- a/src/main/java/cn/pupperclient/management/Notification/Notification.java +++ /dev/null @@ -1,251 +0,0 @@ -package cn.pupperclient.management.Notification; - -import cn.pupperclient.PupperClient; -import cn.pupperclient.animation.SimpleAnimation; -import cn.pupperclient.management.color.api.ColorPalette; -import cn.pupperclient.skia.Skia; -import cn.pupperclient.skia.font.Fonts; -import cn.pupperclient.utils.ColorUtils; -import cn.pupperclient.utils.ExternalToolManager; - -public class Notification { - String message; - String icon; - PupperClient.MusicToolStatus status; - float progress; - SimpleAnimation animation = new SimpleAnimation(); - long createTime; - long updateTime; - boolean removing = false; - - // 多进度支持 - private boolean showMultiProgress = false; - private float ytDlpProgress = 0f; - private float ffmpegProgress = 0f; - private String currentDownload = ""; - - public Notification(String message, String icon, PupperClient.MusicToolStatus status, float progress) { - this.message = message; - this.icon = icon; - this.status = status; - this.progress = progress; - this.createTime = System.currentTimeMillis(); - this.updateTime = this.createTime; - this.animation.setValue(0); - } - - /** - * 设置多进度显示模式 - */ - public void setMultiProgressMode(boolean enabled) { - this.showMultiProgress = enabled; - } - - /** - * 更新多进度信息 - */ - public void updateMultiProgress(float ytDlpProgress, float ffmpegProgress, String currentDownload) { - this.ytDlpProgress = ytDlpProgress; - this.ffmpegProgress = ffmpegProgress; - this.currentDownload = currentDownload; - this.updateTime = System.currentTimeMillis(); - } - - private java.awt.Color getIconColor() { - ColorPalette palette = PupperClient.getInstance().getColorManager().getPalette(); - return switch (status) { - case INSTALLED, DONE -> new java.awt.Color(76, 175, 80); - case FAILED -> palette.getError(); - case CHECKING, DOWNLOADING -> palette.getWarning(); - }; - } - - private java.awt.Color getProgressColor() { - ColorPalette palette = PupperClient.getInstance().getColorManager().getPalette(); - return switch (status) { - case INSTALLED, DONE -> new java.awt.Color(76, 175, 80); // 绿色 - case FAILED -> palette.getError(); - default -> palette.getPrimary(); - }; - } - - public void draw(float x, float y, float width, float height) { - // 更新动画 - if (!removing) { - animation.onTick(1, 20); - - // 只有安装完成或失败的状态才自动移除 - long displayTime = System.currentTimeMillis() - createTime; - if ((status == PupperClient.MusicToolStatus.INSTALLED || status == PupperClient.MusicToolStatus.DONE) && displayTime > 3000) { - removing = true; - } else if (status == PupperClient.MusicToolStatus.FAILED && displayTime > 5000) { - removing = true; - } - } else { - animation.onTick(0, 20); - } - - if (animation.getValue() <= 0.01f) { - return; - } - - ColorPalette palette = PupperClient.getInstance().getColorManager().getPalette(); - - // 背景 - java.awt.Color bgColor = ColorUtils.applyAlpha(palette.getSurfaceContainer(), - animation.getValue() * 0.95f); - Skia.drawRoundedRect(x, y, width, height, 12, bgColor); - - // 图标 - float iconSize = 28; - float iconX = x + 20; - float iconY = y + (height - iconSize) / 2; - - java.awt.Color iconColor = getIconColor(); - Skia.drawFullCenteredText(icon, iconX + iconSize/2, iconY + iconSize/2, iconColor, Fonts.getIcon(iconSize)); - - // 文本 - float textX = iconX + iconSize + 15; - float textY = y + 25; - java.awt.Color textColor = ColorUtils.applyAlpha(palette.getOnSurface(), animation.getValue()); - Skia.drawText(message, textX, textY, textColor, Fonts.getRegular(14)); - - if (showMultiProgress) { - // 多进度显示模式 - drawMultiProgressBars(x, y, width, height); - } else { - // 单进度显示模式 - drawSingleProgress(x, y, width, height); - } - } - - /** - * 绘制单进度条 - */ - private void drawSingleProgress(float x, float y, float width, float height) { - ColorPalette palette = PupperClient.getInstance().getColorManager().getPalette(); - - float textX = x + 75; - float textY = y + 25; - - // 进度文本 - if (status == PupperClient.MusicToolStatus.DOWNLOADING) { - String progressText = String.format("%.0f%%", progress * 100); - Skia.drawText(progressText, textX, textY + 18, - ColorUtils.applyAlpha(palette.getOnSurface(), animation.getValue()), - Fonts.getRegular(12)); - } - - // 进度条 - drawProgressBar(x, y, width, height, progress, false); - } - - /** - * 绘制多进度条 - */ - private void drawMultiProgressBars(float x, float y, float width, float height) { - ColorPalette palette = PupperClient.getInstance().getColorManager().getPalette(); - java.awt.Color textColor = ColorUtils.applyAlpha(palette.getOnSurface(), animation.getValue()); - - float textX = x + 75; - float textY = y + 25; - - // YT-DLP 进度 - String ytDlpText = String.format("YT-DLP: %.0f%%", ytDlpProgress * 100); - Skia.drawText(ytDlpText, textX, textY + 18, textColor, Fonts.getRegular(11)); - - // FFmpeg 进度 - String ffmpegText = String.format("FFmpeg: %.0f%%", ffmpegProgress * 100); - Skia.drawText(ffmpegText, textX, textY + 32, textColor, Fonts.getRegular(11)); - - // 当前下载项 - if (!currentDownload.isEmpty()) { - String currentText = "当前: " + currentDownload; - Skia.drawText(currentText, textX, textY + 46, textColor, Fonts.getRegular(10)); - } - - // 双进度条 - drawDoubleProgressBar(x, y, width, height); - } - - /** - * 绘制双进度条 - */ - private void drawDoubleProgressBar(float x, float y, float width, float height) { - ColorPalette palette = PupperClient.getInstance().getColorManager().getPalette(); - - float barHeight = 3; - float barSpacing = 2; - float barY = y + height - 20; - float barWidth = width - 40; - float barX = x + 20; - - // YT-DLP 进度条背景 - Skia.drawRoundedRect(barX, barY, barWidth, barHeight, 1, - ColorUtils.applyAlpha(palette.getSurface(), 0.3f)); - - // YT-DLP 进度条 - if (ytDlpProgress > 0) { - float progressWidth = barWidth * ytDlpProgress; - java.awt.Color progressColor = getProgressColor(); - Skia.drawRoundedRect(barX, barY, progressWidth, barHeight, 1, progressColor); - } - - // FFmpeg 进度条背景 - float ffmpegBarY = barY + barHeight + barSpacing; - Skia.drawRoundedRect(barX, ffmpegBarY, barWidth, barHeight, 1, - ColorUtils.applyAlpha(palette.getSurface(), 0.3f)); - - // FFmpeg 进度条 - if (ffmpegProgress > 0) { - float progressWidth = barWidth * ffmpegProgress; - java.awt.Color progressColor = new java.awt.Color(33, 150, 243); // 蓝色 - Skia.drawRoundedRect(barX, ffmpegBarY, progressWidth, barHeight, 1, progressColor); - } - - // 加载动画(用于 CHECKING 状态) - if (status == PupperClient.MusicToolStatus.CHECKING) { - drawLoadingAnimation(barX, barY, barWidth, barHeight * 2 + barSpacing); - } - } - - private void drawProgressBar(float x, float y, float width, float height, float progress, boolean isMulti) { - ColorPalette palette = PupperClient.getInstance().getColorManager().getPalette(); - - float barHeight = isMulti ? 3 : 4; - float barY = y + height - (isMulti ? 20 : 15); - float barWidth = width - 40; - float barX = x + 20; - - // 背景条 - Skia.drawRoundedRect(barX, barY, barWidth, barHeight, 2, - ColorUtils.applyAlpha(palette.getSurface(), 0.3f)); - - // 进度条 - if (progress > 0) { - float progressWidth = barWidth * progress; - java.awt.Color progressColor = getProgressColor(); - Skia.drawRoundedRect(barX, barY, progressWidth, barHeight, 2, progressColor); - } - - // 加载动画(用于 CHECKING 状态) - if (status == PupperClient.MusicToolStatus.CHECKING) { - drawLoadingAnimation(barX, barY, barWidth, barHeight); - } - } - - private void drawLoadingAnimation(float x, float y, float width, float height) { - ColorPalette palette = PupperClient.getInstance().getColorManager().getPalette(); - - long time = System.currentTimeMillis(); - float phase = (time % 1000) / 1000.0f; - float pulse = (float) (0.5 + 0.5 * Math.sin(phase * Math.PI * 2)); - - java.awt.Color pulseColor = ColorUtils.applyAlpha(palette.getPrimary(), pulse * 0.8f); - Skia.drawRoundedRect(x, y, width, height, 2, pulseColor); - } - - public boolean shouldRemove() { - return removing && animation.getValue() <= 0.01f; - } -} diff --git a/src/main/java/cn/pupperclient/management/Notification/NotificationManager.java b/src/main/java/cn/pupperclient/management/Notification/NotificationManager.java deleted file mode 100644 index 77fd07b..0000000 --- a/src/main/java/cn/pupperclient/management/Notification/NotificationManager.java +++ /dev/null @@ -1,123 +0,0 @@ -package cn.pupperclient.management.Notification; - -import cn.pupperclient.PupperClient; -import cn.pupperclient.animation.SimpleAnimation; -import cn.pupperclient.management.color.api.ColorPalette; -import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.ExternalToolManager; -import cn.pupperclient.utils.language.I18n; - -import java.util.ArrayList; -import java.util.List; - -public class NotificationManager { - private final List notifications = new ArrayList<>(); - private final SimpleAnimation globalAnimation = new SimpleAnimation(); - private PupperClient.MusicToolStatus lastDisplayedStatus = null; - private boolean multiProgressMode = false; - - public void showToolCheckNotification(PupperClient.MusicToolStatus status, float progress, String message) { - // 当切换到下载状态时,启用多进度模式 - if (status == PupperClient.MusicToolStatus.DOWNLOADING && !multiProgressMode) { - multiProgressMode = true; - // 移除旧通知 - notifications.clear(); - lastDisplayedStatus = status; - - Notification notification = new Notification(message, getIconForStatus(status), status, progress); - notification.setMultiProgressMode(true); - notifications.add(notification); - - globalAnimation.setValue(0); - return; - } - - // 只有当状态改变时才创建新通知 - if (status == lastDisplayedStatus && !notifications.isEmpty()) { - // 更新现有通知 - Notification existing = notifications.get(0); - existing.progress = progress; - existing.updateTime = System.currentTimeMillis(); - - // 如果是多进度模式,更新进度信息 - if (multiProgressMode) { - existing.updateMultiProgress( - ExternalToolManager.getYtDlpProgress(), - ExternalToolManager.getFfmpegProgress(), - ExternalToolManager.getCurrentDownload() - ); - } - return; - } - - // 移除旧通知 - notifications.clear(); - multiProgressMode = false; - lastDisplayedStatus = status; - - String finalMessage = message != null ? message : getMessageForStatus(status); - String icon = getIconForStatus(status); - - Notification notification = new Notification(finalMessage, icon, status, progress); - notifications.add(notification); - - globalAnimation.setValue(0); - } - - private String getMessageForStatus(PupperClient.MusicToolStatus status) { - return switch (status) { - case CHECKING -> I18n.get("musictool.name.check"); - case INSTALLED -> I18n.get("musictool.name.installed"); - case DOWNLOADING -> I18n.get("musictool.name.downloading"); - case FAILED -> I18n.get("musictool.name.failed"); - case DONE -> I18n.get("musictool.name.done"); - }; - } - - private String getIconForStatus(PupperClient.MusicToolStatus status) { - return switch (status) { - case CHECKING -> Icon.AUTORENEW; - case INSTALLED, DONE -> Icon.CHECK; - case DOWNLOADING -> Icon.DOWNLOAD; - case FAILED -> Icon.ERROR; - default -> Icon.INFO; - }; - } - - public void draw(double mouseX, double mouseY) { - // 更新全局动画 - globalAnimation.onTick(notifications.isEmpty() ? 0 : 1, 15); - - if (globalAnimation.getValue() <= 0.01f) { - return; - } - - // 绘制通知 - ColorPalette palette = PupperClient.getInstance().getColorManager().getPalette(); - float windowWidth = cn.pupperclient.utils.IMinecraft.mc.getWindow().getWidth(); - - float notificationWidth = 350; // 稍微加宽以容纳双进度信息 - float notificationHeight = multiProgressMode ? 90 : 70; // 多进度模式更高 - float margin = 20; - float x = windowWidth - notificationWidth - margin; - float y = margin + 80; - - // 应用全局动画(从右侧滑入) - x += (1 - globalAnimation.getValue()) * (notificationWidth + margin); - - for (int i = 0; i < notifications.size(); i++) { - Notification notification = notifications.get(i); - float notificationY = y + (i * (notificationHeight + 10)); - notification.draw(x, notificationY, notificationWidth, notificationHeight); - - // 检查通知是否应该移除(只有成功或失败状态才自动移除) - if (notification.shouldRemove()) { - notifications.remove(i); - lastDisplayedStatus = null; - multiProgressMode = false; - ExternalToolManager.resetProgress(); // 重置进度 - i--; - } - } - } -} diff --git a/src/main/java/cn/pupperclient/management/color/AccentColor.java b/src/main/java/cn/pupperclient/management/color/AccentColor.java index 78e3042..582c57a 100644 --- a/src/main/java/cn/pupperclient/management/color/AccentColor.java +++ b/src/main/java/cn/pupperclient/management/color/AccentColor.java @@ -1,7 +1,7 @@ package cn.pupperclient.management.color; import cn.pupperclient.animation.SimpleAnimation; -import cn.pupperclient.utils.ColorUtils; +import cn.pupperclient.utils.color.ColorUtils; import java.awt.Color; @@ -33,11 +33,11 @@ public Color getColor2() { } public Color getInterpolateColor() { - return ColorUtils.interpolateColors(15, 0, color1, color2); + return ColorUtils.oscillate(color1, color2, 15, 0); } public Color getInterpolateColor(int index) { - return ColorUtils.interpolateColors(15, index, color1, color2); + return ColorUtils.oscillate(color1, color2, 15, index); } public SimpleAnimation getAnimation() { diff --git a/src/main/java/cn/pupperclient/management/command/PupperCommand.java b/src/main/java/cn/pupperclient/management/command/PupperCommand.java index 633da69..18a33a7 100644 --- a/src/main/java/cn/pupperclient/management/command/PupperCommand.java +++ b/src/main/java/cn/pupperclient/management/command/PupperCommand.java @@ -4,8 +4,8 @@ import cn.pupperclient.management.command.impl.*; import cn.pupperclient.management.mod.Mod; import cn.pupperclient.management.mod.ModManager; -import cn.pupperclient.utils.ChatUtils; -import cn.pupperclient.utils.IMinecraft; +import cn.pupperclient.utils.chat.ChatUtils; +import cn.pupperclient.utils.minecraft.interfaces.IMinecraft; import cn.pupperclient.utils.language.I18n; import net.fabricmc.fabric.api.client.message.v1.ClientSendMessageEvents; import net.minecraft.text.ClickEvent; diff --git a/src/main/java/cn/pupperclient/management/command/impl/BindCommand.java b/src/main/java/cn/pupperclient/management/command/impl/BindCommand.java index 9345a74..d3ae292 100644 --- a/src/main/java/cn/pupperclient/management/command/impl/BindCommand.java +++ b/src/main/java/cn/pupperclient/management/command/impl/BindCommand.java @@ -7,7 +7,7 @@ import cn.pupperclient.management.keybind.KeybindManager; import cn.pupperclient.management.mod.Mod; import cn.pupperclient.management.mod.ModManager; -import cn.pupperclient.utils.ChatUtils; +import cn.pupperclient.utils.chat.ChatUtils; import cn.pupperclient.utils.language.I18n; import net.minecraft.text.ClickEvent; import net.minecraft.text.HoverEvent; diff --git a/src/main/java/cn/pupperclient/management/command/impl/IRCCommand.java b/src/main/java/cn/pupperclient/management/command/impl/IRCCommand.java index 8a74e80..dbdb2ec 100644 --- a/src/main/java/cn/pupperclient/management/command/impl/IRCCommand.java +++ b/src/main/java/cn/pupperclient/management/command/impl/IRCCommand.java @@ -2,7 +2,7 @@ import cn.pupperclient.PupperClient; import cn.pupperclient.management.mod.impl.misc.IRCChatMod; -import cn.pupperclient.utils.IMinecraft; +import cn.pupperclient.utils.minecraft.interfaces.IMinecraft; import net.minecraft.text.Text; public class IRCCommand implements IMinecraft { diff --git a/src/main/java/cn/pupperclient/management/command/impl/LoginCommand.java b/src/main/java/cn/pupperclient/management/command/impl/LoginCommand.java index 79cf759..e955d57 100644 --- a/src/main/java/cn/pupperclient/management/command/impl/LoginCommand.java +++ b/src/main/java/cn/pupperclient/management/command/impl/LoginCommand.java @@ -2,8 +2,8 @@ import cn.pupperclient.PupperClient; import cn.pupperclient.PupperLogger; -import cn.pupperclient.utils.ChatUtils; -import cn.pupperclient.utils.Multithreading; +import cn.pupperclient.utils.chat.ChatUtils; +import cn.pupperclient.utils.thread.Multithreading; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import net.minecraft.text.ClickEvent; diff --git a/src/main/java/cn/pupperclient/management/command/impl/MusicCommand.java b/src/main/java/cn/pupperclient/management/command/impl/MusicCommand.java index 38301c8..46efbda 100644 --- a/src/main/java/cn/pupperclient/management/command/impl/MusicCommand.java +++ b/src/main/java/cn/pupperclient/management/command/impl/MusicCommand.java @@ -5,8 +5,8 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import cn.pupperclient.PupperClient; -import cn.pupperclient.utils.ChatUtils; -import cn.pupperclient.utils.Multithreading; +import cn.pupperclient.utils.chat.ChatUtils; +import cn.pupperclient.utils.thread.Multithreading; import net.minecraft.text.ClickEvent; import net.minecraft.text.HoverEvent; import net.minecraft.text.MutableText; diff --git a/src/main/java/cn/pupperclient/management/config/ConfigManager.java b/src/main/java/cn/pupperclient/management/config/ConfigManager.java index 3a40b70..5f141f2 100644 --- a/src/main/java/cn/pupperclient/management/config/ConfigManager.java +++ b/src/main/java/cn/pupperclient/management/config/ConfigManager.java @@ -1,11 +1,15 @@ package cn.pupperclient.management.config; +import java.io.File; import java.io.FileReader; import java.io.FileWriter; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.List; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import cn.pupperclient.PupperClient; import cn.pupperclient.management.config.impl.KeyConfig; @@ -16,6 +20,7 @@ public class ConfigManager { private final List configs = new ArrayList<>(); + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); public ConfigManager() { configs.add(new ModConfig()); @@ -26,37 +31,63 @@ public ConfigManager() { public void save(ConfigType type) { Config config = getConfig(type); - Gson gson = new Gson(); if (config == null || config.getFile() == null) { return; } - FileUtils.createFile(config.getFile()); + File targetFile = config.getFile(); + File tempFile = new File(targetFile.getAbsolutePath() + ".tmp"); + File backupFile = new File(targetFile.getAbsolutePath() + ".bak"); + + FileUtils.createFile(tempFile); if (config.getJsonObject() == null) { config.setJsonObject(new JsonObject()); } - try (FileWriter writer = new FileWriter(config.getFile())) { + try (FileWriter writer = new FileWriter(tempFile)) { config.onSave(); - gson.toJson(config.getJsonObject(), writer); + GSON.toJson(config.getJsonObject(), writer); + writer.flush(); + writer.close(); // Close before moving + + // Atomic move/replace + if (targetFile.exists()) { + Files.copy(targetFile.toPath(), backupFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + } + Files.move(tempFile.toPath(), targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); } catch (Exception e) { PupperClient.LOGGER.error("Failed to save config: {}", config.getType(), e); + } finally { + if (tempFile.exists()) { + tempFile.delete(); + } } } public void load(ConfigType type) { Config config = getConfig(type); - Gson gson = new Gson(); - if (config.getFile() == null || !config.getFile().exists()) { + if (config.getFile() == null) { config.setJsonObject(new JsonObject()); return; } - try (FileReader reader = new FileReader(config.getFile())) { - JsonObject loadedJson = gson.fromJson(reader, JsonObject.class); + File file = config.getFile(); + if (!file.exists()) { + File backup = new File(file.getAbsolutePath() + ".bak"); + if (backup.exists()) { + PupperClient.LOGGER.warn("Config file {} missing, using backup", type); + file = backup; + } else { + config.setJsonObject(new JsonObject()); + return; + } + } + + try (FileReader reader = new FileReader(file)) { + JsonObject loadedJson = GSON.fromJson(reader, JsonObject.class); config.setJsonObject(loadedJson != null ? loadedJson : new JsonObject()); config.onLoad(); @@ -64,8 +95,22 @@ public void load(ConfigType type) { KeybindManager.getInstance().refreshKeybinds(); } } catch (Exception e) { - PupperClient.LOGGER.error("Failed to load config: {}", config.getType(), e); - config.setJsonObject(new JsonObject()); + PupperClient.LOGGER.error("Failed to load config: {}, trying backup", config.getType(), e); + + // Try backup if main file fails + File backup = new File(config.getFile().getAbsolutePath() + ".bak"); + if (backup.exists() && !file.equals(backup)) { + try (FileReader reader = new FileReader(backup)) { + JsonObject loadedJson = GSON.fromJson(reader, JsonObject.class); + config.setJsonObject(loadedJson != null ? loadedJson : new JsonObject()); + config.onLoad(); + } catch (Exception ex) { + PupperClient.LOGGER.error("Backup also failed for config: {}", type, ex); + config.setJsonObject(new JsonObject()); + } + } else { + config.setJsonObject(new JsonObject()); + } } } diff --git a/src/main/java/cn/pupperclient/management/config/impl/ModConfig.java b/src/main/java/cn/pupperclient/management/config/impl/ModConfig.java index 1865af8..9784179 100644 --- a/src/main/java/cn/pupperclient/management/config/impl/ModConfig.java +++ b/src/main/java/cn/pupperclient/management/config/impl/ModConfig.java @@ -16,8 +16,8 @@ import cn.pupperclient.management.mod.api.hud.HUDMod; import cn.pupperclient.management.mod.settings.Setting; import cn.pupperclient.management.mod.settings.impl.*; -import cn.pupperclient.utils.ColorUtils; -import cn.pupperclient.utils.JsonUtils; +import cn.pupperclient.utils.color.ColorUtils; +import cn.pupperclient.utils.misc.JsonUtils; import net.minecraft.client.util.InputUtil; diff --git a/src/main/java/cn/pupperclient/management/hypixel/HypixelManager.java b/src/main/java/cn/pupperclient/management/hypixel/HypixelManager.java index e106b03..27bbcbc 100644 --- a/src/main/java/cn/pupperclient/management/hypixel/HypixelManager.java +++ b/src/main/java/cn/pupperclient/management/hypixel/HypixelManager.java @@ -9,7 +9,7 @@ import cn.pupperclient.PupperClient; import cn.pupperclient.management.hypixel.api.HypixelUser; import cn.pupperclient.management.websocket.packet.impl.SC_HypixelStatsPacket; -import cn.pupperclient.utils.TimerUtils; +import cn.pupperclient.utils.time.TimerUtils; import cn.pupperclient.utils.server.Server; import cn.pupperclient.utils.server.ServerUtils; diff --git a/src/main/java/cn/pupperclient/management/irc/client/IRCTransport.java b/src/main/java/cn/pupperclient/management/irc/client/IRCTransport.java index 09b1297..b0730b5 100644 --- a/src/main/java/cn/pupperclient/management/irc/client/IRCTransport.java +++ b/src/main/java/cn/pupperclient/management/irc/client/IRCTransport.java @@ -4,7 +4,7 @@ import cn.pupperclient.management.irc.client.packet.implemention.clientbound.*; import cn.pupperclient.management.irc.client.packet.implemention.serverbound.*; import cn.pupperclient.management.irc.client.processor.IRCProtocol; -import cn.pupperclient.utils.ChatUtils; +import cn.pupperclient.utils.chat.ChatUtils; import org.smartboot.socket.MessageProcessor; import org.smartboot.socket.transport.AioQuickClient; import org.smartboot.socket.transport.AioSession; diff --git a/src/main/java/cn/pupperclient/management/irc/client/processor/IRCProtocol.java b/src/main/java/cn/pupperclient/management/irc/client/processor/IRCProtocol.java index 8bb7af6..b7c9afb 100644 --- a/src/main/java/cn/pupperclient/management/irc/client/processor/IRCProtocol.java +++ b/src/main/java/cn/pupperclient/management/irc/client/processor/IRCProtocol.java @@ -41,7 +41,7 @@ public IRCPacket decode(ByteBuffer readBuffer, AioSession session) { JsonObject object = JsonParser.parseString(text).getAsJsonObject(); return packetManager.readPacket(object); }catch (Exception e){ - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("IRC", "Failed to decode IRC packet", e); session.close(); return null; } diff --git a/src/main/java/cn/pupperclient/management/keybind/KeybindManager.java b/src/main/java/cn/pupperclient/management/keybind/KeybindManager.java index c55068d..3045dec 100644 --- a/src/main/java/cn/pupperclient/management/keybind/KeybindManager.java +++ b/src/main/java/cn/pupperclient/management/keybind/KeybindManager.java @@ -5,7 +5,7 @@ import cn.pupperclient.event.client.KeyEvent; import cn.pupperclient.management.mod.Mod; import cn.pupperclient.management.mod.ModManager; -import cn.pupperclient.utils.IMinecraft; +import cn.pupperclient.utils.minecraft.interfaces.IMinecraft; import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; diff --git a/src/main/java/cn/pupperclient/management/mod/Mod.java b/src/main/java/cn/pupperclient/management/mod/Mod.java index e9b9b88..d6a2914 100644 --- a/src/main/java/cn/pupperclient/management/mod/Mod.java +++ b/src/main/java/cn/pupperclient/management/mod/Mod.java @@ -5,7 +5,7 @@ import cn.pupperclient.event.mod.ModStateChangeEvent; import cn.pupperclient.management.keybind.KeybindManager; -import cn.pupperclient.utils.IMinecraft; +import cn.pupperclient.utils.minecraft.interfaces.IMinecraft; import cn.pupperclient.utils.language.I18n; public class Mod implements IMinecraft { diff --git a/src/main/java/cn/pupperclient/management/mod/api/hud/design/impl/MaterialYouDesign.java b/src/main/java/cn/pupperclient/management/mod/api/hud/design/impl/MaterialYouDesign.java index 781946a..e42864c 100644 --- a/src/main/java/cn/pupperclient/management/mod/api/hud/design/impl/MaterialYouDesign.java +++ b/src/main/java/cn/pupperclient/management/mod/api/hud/design/impl/MaterialYouDesign.java @@ -6,7 +6,7 @@ import cn.pupperclient.management.color.api.ColorPalette; import cn.pupperclient.management.mod.api.hud.design.HUDDesign; import cn.pupperclient.skia.Skia; -import cn.pupperclient.utils.ColorUtils; +import cn.pupperclient.utils.color.ColorUtils; import io.github.humbleui.skija.Font; diff --git a/src/main/java/cn/pupperclient/management/mod/impl/fun/HeypixelMod.java b/src/main/java/cn/pupperclient/management/mod/impl/fun/HeypixelMod.java index 9102eb9..ac82b86 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/fun/HeypixelMod.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/fun/HeypixelMod.java @@ -8,7 +8,7 @@ import cn.pupperclient.management.mod.ModCategory; import cn.pupperclient.management.mod.settings.impl.BooleanSetting; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.ChatUtils; +import cn.pupperclient.utils.chat.ChatUtils; import net.minecraft.client.MinecraftClient; public class HeypixelMod extends Mod { diff --git a/src/main/java/cn/pupperclient/management/mod/impl/fun/TotemTracker.java b/src/main/java/cn/pupperclient/management/mod/impl/fun/TotemTracker.java index 997c5ab..b8a3b29 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/fun/TotemTracker.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/fun/TotemTracker.java @@ -7,7 +7,7 @@ import cn.pupperclient.management.mod.Mod; import cn.pupperclient.management.mod.ModCategory; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.ChatUtils; +import cn.pupperclient.utils.chat.ChatUtils; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityStatuses; import net.minecraft.entity.player.PlayerEntity; diff --git a/src/main/java/cn/pupperclient/management/mod/impl/hud/BedwarsStatsOverlayMod.java b/src/main/java/cn/pupperclient/management/mod/impl/hud/BedwarsStatsOverlayMod.java index 66f3383..2f0e437 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/hud/BedwarsStatsOverlayMod.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/hud/BedwarsStatsOverlayMod.java @@ -11,7 +11,7 @@ import cn.pupperclient.skia.Skia; import cn.pupperclient.skia.font.Fonts; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.SkinUtils; +import cn.pupperclient.utils.minecraft.player.SkinUtils; import cn.pupperclient.utils.server.Server; import cn.pupperclient.utils.server.ServerUtils; diff --git a/src/main/java/cn/pupperclient/management/mod/impl/hud/CloudMusicHudMod.java b/src/main/java/cn/pupperclient/management/mod/impl/hud/CloudMusicHudMod.java index bdf7b66..e6db92a 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/hud/CloudMusicHudMod.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/hud/CloudMusicHudMod.java @@ -7,7 +7,7 @@ import cn.pupperclient.skia.Skia; import cn.pupperclient.skia.font.Fonts; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.JNAWindowChecker; +import cn.pupperclient.utils.system.JNAWindowChecker; import io.github.humbleui.skija.FontMetrics; import io.github.humbleui.types.Rect; diff --git a/src/main/java/cn/pupperclient/management/mod/impl/hud/DynamicIsland.java b/src/main/java/cn/pupperclient/management/mod/impl/hud/DynamicIsland.java index 626afe2..b001f60 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/hud/DynamicIsland.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/hud/DynamicIsland.java @@ -10,7 +10,7 @@ import cn.pupperclient.skia.Skia; import cn.pupperclient.skia.font.Fonts; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.IMinecraft; +import cn.pupperclient.utils.minecraft.interfaces.IMinecraft; import io.github.humbleui.skija.FontMetrics; import io.github.humbleui.types.Rect; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/cn/pupperclient/management/mod/impl/hud/KeystrokesMod.java b/src/main/java/cn/pupperclient/management/mod/impl/hud/KeystrokesMod.java index 0c1e690..ee4a86e 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/hud/KeystrokesMod.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/hud/KeystrokesMod.java @@ -16,7 +16,7 @@ import cn.pupperclient.skia.Skia; import cn.pupperclient.skia.font.Fonts; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.ColorUtils; +import cn.pupperclient.utils.color.ColorUtils; import net.minecraft.client.option.KeyBinding; diff --git a/src/main/java/cn/pupperclient/management/mod/impl/hud/MusicInfoMod.java b/src/main/java/cn/pupperclient/management/mod/impl/hud/MusicInfoMod.java index f47556f..8ab5e75 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/hud/MusicInfoMod.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/hud/MusicInfoMod.java @@ -24,8 +24,8 @@ import cn.pupperclient.skia.Skia; import cn.pupperclient.skia.font.Fonts; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.ColorUtils; -import cn.pupperclient.utils.TimerUtils; +import cn.pupperclient.utils.color.ColorUtils; +import cn.pupperclient.utils.time.TimerUtils; import io.github.humbleui.skija.Bitmap; import io.github.humbleui.skija.FilterTileMode; diff --git a/src/main/java/cn/pupperclient/management/mod/impl/hud/PingDisplayMod.java b/src/main/java/cn/pupperclient/management/mod/impl/hud/PingDisplayMod.java index 9e6b4b4..70fdb24 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/hud/PingDisplayMod.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/hud/PingDisplayMod.java @@ -5,8 +5,8 @@ import cn.pupperclient.management.mod.api.hud.SimpleHUDMod; import cn.pupperclient.management.mod.settings.impl.NumberSetting; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.Multithreading; -import cn.pupperclient.utils.TimerUtils; +import cn.pupperclient.utils.thread.Multithreading; +import cn.pupperclient.utils.time.TimerUtils; import cn.pupperclient.utils.server.ServerUtils; import net.lenni0451.mcping.MCPing; diff --git a/src/main/java/cn/pupperclient/management/mod/impl/hud/PotionHudMod.java b/src/main/java/cn/pupperclient/management/mod/impl/hud/PotionHudMod.java index ae0d2a1..ee8b89b 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/hud/PotionHudMod.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/hud/PotionHudMod.java @@ -9,7 +9,7 @@ import cn.pupperclient.skia.Skia; import cn.pupperclient.skia.font.Fonts; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.RomanConverter; +import cn.pupperclient.utils.misc.RomanConverter; import net.minecraft.client.MinecraftClient; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffectInstance; diff --git a/src/main/java/cn/pupperclient/management/mod/impl/hud/StopwatchMod.java b/src/main/java/cn/pupperclient/management/mod/impl/hud/StopwatchMod.java index a096e62..762618f 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/hud/StopwatchMod.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/hud/StopwatchMod.java @@ -10,7 +10,7 @@ import cn.pupperclient.management.mod.api.hud.SimpleHUDMod; import cn.pupperclient.management.mod.settings.impl.KeybindSetting; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.TimerUtils; +import cn.pupperclient.utils.time.TimerUtils; import net.minecraft.client.util.InputUtil; diff --git a/src/main/java/cn/pupperclient/management/mod/impl/hud/TargetHUDMod.java b/src/main/java/cn/pupperclient/management/mod/impl/hud/TargetHUDMod.java index a1b6835..a038a02 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/hud/TargetHUDMod.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/hud/TargetHUDMod.java @@ -16,8 +16,8 @@ import cn.pupperclient.skia.Skia; import cn.pupperclient.skia.font.Fonts; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.HealthUtils; -import cn.pupperclient.utils.SkinUtils; +import cn.pupperclient.utils.minecraft.player.HealthUtils; +import cn.pupperclient.utils.minecraft.player.SkinUtils; import net.fabricmc.fabric.api.event.player.AttackEntityCallback; import net.minecraft.client.MinecraftClient; diff --git a/src/main/java/cn/pupperclient/management/mod/impl/hud/WatermarkMod.java b/src/main/java/cn/pupperclient/management/mod/impl/hud/WatermarkMod.java index 8a7c49f..cecd4eb 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/hud/WatermarkMod.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/hud/WatermarkMod.java @@ -15,7 +15,7 @@ import cn.pupperclient.skia.Skia; import cn.pupperclient.skia.font.Fonts; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.ColorUtils; +import cn.pupperclient.utils.color.ColorUtils; import io.github.humbleui.skija.FontMetrics; import io.github.humbleui.skija.Image; diff --git a/src/main/java/cn/pupperclient/management/mod/impl/misc/DiscordRPCMod.java b/src/main/java/cn/pupperclient/management/mod/impl/misc/DiscordRPCMod.java index d7f16b6..52814c5 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/misc/DiscordRPCMod.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/misc/DiscordRPCMod.java @@ -74,7 +74,7 @@ public void onDisconnect(IPCClient client, Throwable t) { try { client.connect(); } catch (NoDiscordClientException e) { - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("DiscordRPC", "Failed to connect to Discord IPC", e); } } diff --git a/src/main/java/cn/pupperclient/management/mod/impl/misc/HypixelMod.java b/src/main/java/cn/pupperclient/management/mod/impl/misc/HypixelMod.java index d7c4411..6b980f9 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/misc/HypixelMod.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/misc/HypixelMod.java @@ -6,7 +6,7 @@ import cn.pupperclient.management.mod.ModCategory; import cn.pupperclient.management.mod.settings.impl.BooleanSetting; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.TimerUtils; +import cn.pupperclient.utils.time.TimerUtils; import cn.pupperclient.utils.server.Server; import cn.pupperclient.utils.server.ServerUtils; diff --git a/src/main/java/cn/pupperclient/management/mod/impl/misc/IRCChatMod.java b/src/main/java/cn/pupperclient/management/mod/impl/misc/IRCChatMod.java index 91843c1..8f79c46 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/misc/IRCChatMod.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/misc/IRCChatMod.java @@ -11,7 +11,7 @@ import cn.pupperclient.management.mod.settings.impl.NumberSetting; import cn.pupperclient.management.mod.settings.impl.StringSetting; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.IMinecraft; +import cn.pupperclient.utils.minecraft.interfaces.IMinecraft; import net.minecraft.text.Text; import java.io.IOException; diff --git a/src/main/java/cn/pupperclient/management/mod/impl/player/AutoGGMod.java b/src/main/java/cn/pupperclient/management/mod/impl/player/AutoGGMod.java index 10433fd..cb02e6d 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/player/AutoGGMod.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/player/AutoGGMod.java @@ -14,7 +14,7 @@ import cn.pupperclient.management.mod.settings.impl.NumberSetting; import cn.pupperclient.management.mod.settings.impl.StringSetting; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.Multithreading; +import cn.pupperclient.utils.thread.Multithreading; import cn.pupperclient.utils.server.Server; import cn.pupperclient.utils.server.ServerUtils; diff --git a/src/main/java/cn/pupperclient/management/mod/impl/render/ClickEffectMod.java b/src/main/java/cn/pupperclient/management/mod/impl/render/ClickEffectMod.java index 46b412c..c874ac5 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/render/ClickEffectMod.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/render/ClickEffectMod.java @@ -9,7 +9,7 @@ import cn.pupperclient.management.mod.settings.impl.ColorSetting; import cn.pupperclient.management.mod.settings.impl.NumberSetting; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.RippleEffect; +import cn.pupperclient.utils.render.RippleEffect; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.TitleScreen; import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; diff --git a/src/main/java/cn/pupperclient/management/mod/impl/render/MusicWaveformMod.java b/src/main/java/cn/pupperclient/management/mod/impl/render/MusicWaveformMod.java index 582d5d0..4f364d7 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/render/MusicWaveformMod.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/render/MusicWaveformMod.java @@ -10,7 +10,7 @@ import cn.pupperclient.management.music.MusicPlayer; import cn.pupperclient.skia.Skia; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.ColorUtils; +import cn.pupperclient.utils.color.ColorUtils; public class MusicWaveformMod extends Mod { diff --git a/src/main/java/cn/pupperclient/management/mod/impl/settings/ModMenuSettings.java b/src/main/java/cn/pupperclient/management/mod/impl/settings/ModMenuSettings.java index fb741bc..30d8722 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/settings/ModMenuSettings.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/settings/ModMenuSettings.java @@ -97,10 +97,11 @@ private Language getLanguageEnumFromOption(String option) { } if (keybindSetting.isPressed()) { - mc.setScreen(new GuiModMenu().build()); + mc.setScreen(new GuiModMenu()); } + if (keybindSetting_music.isPressed()) { - mc.setScreen(new MusicPlayGui().build()); + mc.setScreen(new MusicPlayGui()); } handleLanguageChange(); diff --git a/src/main/java/cn/pupperclient/management/mod/impl/settings/SystemSettings.java b/src/main/java/cn/pupperclient/management/mod/impl/settings/SystemSettings.java index b398cdc..f349e59 100644 --- a/src/main/java/cn/pupperclient/management/mod/impl/settings/SystemSettings.java +++ b/src/main/java/cn/pupperclient/management/mod/impl/settings/SystemSettings.java @@ -9,7 +9,7 @@ import cn.pupperclient.management.mod.settings.impl.FileSetting; import cn.pupperclient.management.mod.settings.impl.StringSetting; import cn.pupperclient.skia.font.Icon; -import cn.pupperclient.utils.OS; +import cn.pupperclient.utils.system.OS; public class SystemSettings extends Mod { diff --git a/src/main/java/cn/pupperclient/management/mod/settings/impl/ColorSetting.java b/src/main/java/cn/pupperclient/management/mod/settings/impl/ColorSetting.java index 1d96b69..3aa79ba 100644 --- a/src/main/java/cn/pupperclient/management/mod/settings/impl/ColorSetting.java +++ b/src/main/java/cn/pupperclient/management/mod/settings/impl/ColorSetting.java @@ -5,7 +5,7 @@ import cn.pupperclient.PupperClient; import cn.pupperclient.management.mod.Mod; import cn.pupperclient.management.mod.settings.Setting; -import cn.pupperclient.utils.ColorUtils; +import cn.pupperclient.utils.color.ColorUtils; public class ColorSetting extends Setting { diff --git a/src/main/java/cn/pupperclient/management/mod/settings/impl/NumberSetting.java b/src/main/java/cn/pupperclient/management/mod/settings/impl/NumberSetting.java index a396849..f6cc53a 100644 --- a/src/main/java/cn/pupperclient/management/mod/settings/impl/NumberSetting.java +++ b/src/main/java/cn/pupperclient/management/mod/settings/impl/NumberSetting.java @@ -3,7 +3,7 @@ import cn.pupperclient.PupperClient; import cn.pupperclient.management.mod.Mod; import cn.pupperclient.management.mod.settings.Setting; -import cn.pupperclient.utils.MathUtils; +import cn.pupperclient.utils.math.MathUtils; public class NumberSetting extends Setting { diff --git a/src/main/java/cn/pupperclient/management/music/MusicManager.java b/src/main/java/cn/pupperclient/management/music/MusicManager.java index 36ecad4..bea4fe5 100644 --- a/src/main/java/cn/pupperclient/management/music/MusicManager.java +++ b/src/main/java/cn/pupperclient/management/music/MusicManager.java @@ -16,8 +16,8 @@ import cn.pupperclient.libraries.flac.metadata.Metadata; import cn.pupperclient.libraries.flac.metadata.Picture; import cn.pupperclient.libraries.flac.metadata.VorbisComment; -import cn.pupperclient.utils.ImageUtils; -import cn.pupperclient.utils.RandomUtils; +import cn.pupperclient.utils.render.ImageUtils; +import cn.pupperclient.utils.math.MathUtils; import cn.pupperclient.utils.file.FileLocation; import cn.pupperclient.utils.file.FileUtils; @@ -35,7 +35,7 @@ public MusicManager() { try { load(); } catch (Exception e) { - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("MusicManager", "Failed to load music", e); } this.musicPlayer = new MusicPlayer(() -> { @@ -45,7 +45,7 @@ public MusicManager() { if (repeat) { nextMusic = currentMusic; } else if (shuffle) { - nextMusic = musics.get(RandomUtils.getRandomInt(0, musics.size() - 1)); + nextMusic = musics.get(MathUtils.getRandomInt(0, musics.size() - 1)); } else { nextMusic = null; } @@ -65,8 +65,10 @@ public MusicManager() { public void run() { while (true) { try { - Thread.sleep(0); + Thread.sleep(10); } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; } musicPlayer.run(); } @@ -172,7 +174,7 @@ private void loadMp3File(File f) throws Exception { artist = id3v1Tag.getArtist(); } } catch (Exception e) { - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("MusicManager", "Failed to load MP3 tags", e); } String fileHash = FileUtils.getMd5Checksum(f); diff --git a/src/main/java/cn/pupperclient/management/music/MusicPlayer.java b/src/main/java/cn/pupperclient/management/music/MusicPlayer.java index cfc5df6..e8ad48d 100644 --- a/src/main/java/cn/pupperclient/management/music/MusicPlayer.java +++ b/src/main/java/cn/pupperclient/management/music/MusicPlayer.java @@ -38,6 +38,7 @@ public class MusicPlayer implements Runnable { private static final int FFT_SIZE = 1024; private float[] fftBuffer = new float[FFT_SIZE]; private float[] magnitudes = new float[SPECTRUM_BANDS]; + private byte[] mp3Buffer = new byte[8192]; // Reuse buffer for MP3 private Runnable runnable; @@ -83,8 +84,8 @@ public void run() { } private void playFlacFile() { - try { - decoder = new FLACDecoder(new FileInputStream(currentMusic.getAudio())); + try (FileInputStream fis = new FileInputStream(currentMusic.getAudio())) { + decoder = new FLACDecoder(fis); streamInfo = decoder.readStreamInfo(); audioFormat = new AudioFormat(streamInfo.getSampleRate(), streamInfo.getBitsPerSample() == 24 ? 16 : streamInfo.getBitsPerSample(), @@ -106,7 +107,7 @@ private void playFlacFile() { } ByteData pcm = decoder.decodeFrame(frame, byteData); - updateSpectrum(pcm.getData()); + updateSpectrum(pcm.getData(), pcm.getLen()); sourceDataLine.write(pcm.getData(), 0, pcm.getLen()); } @@ -117,14 +118,13 @@ private void playFlacFile() { sourceDataLine.drain(); sourceDataLine.close(); } catch (Exception e) { - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("MusicPlayer", "Failed to play FLAC file", e); } } private void playMp3File() { - try { - FileInputStream fis = new FileInputStream(currentMusic.getAudio()); - BufferedInputStream bis = new BufferedInputStream(fis); + try (FileInputStream fis = new FileInputStream(currentMusic.getAudio()); + BufferedInputStream bis = new BufferedInputStream(fis)) { calculateMp3Duration(currentMusic.getAudio()); @@ -152,9 +152,11 @@ private void playMp3File() { SampleBuffer output = (SampleBuffer) mp3Decoder.decodeFrame(mp3Header, bitstream); if (output != null) { - byte[] buffer = toByteArray(output.getBuffer(), output.getBufferLength()); - updateSpectrum(buffer); - sourceDataLine.write(buffer, 0, buffer.length); + int length = output.getBufferLength(); + ensureMp3Buffer(length * 2); + fillMp3Buffer(output.getBuffer(), length); + updateSpectrum(mp3Buffer, length * 2); + sourceDataLine.write(mp3Buffer, 0, length * 2); } bitstream.closeFrame(); @@ -169,10 +171,22 @@ private void playMp3File() { sourceDataLine.drain(); sourceDataLine.close(); bitstream.close(); - fis.close(); } catch (Exception e) { - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("MusicPlayer", "Failed to play MP3 file", e); + } + } + + private void ensureMp3Buffer(int length) { + if (mp3Buffer.length < length) { + mp3Buffer = new byte[length]; + } + } + + private void fillMp3Buffer(short[] samples, int length) { + for (int i = 0; i < length; i++) { + mp3Buffer[i * 2] = (byte) (samples[i] & 0xFF); + mp3Buffer[i * 2 + 1] = (byte) ((samples[i] >> 8) & 0xFF); } } @@ -181,35 +195,24 @@ private void calculateMp3Duration(File mp3File) { com.mpatric.mp3agic.Mp3File mp3 = new com.mpatric.mp3agic.Mp3File(mp3File); mp3Duration = (float) mp3.getLengthInSeconds(); } catch (Exception e) { - try { - AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(mp3File); + try (AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(mp3File)) { AudioFormat format = audioInputStream.getFormat(); long frames = audioInputStream.getFrameLength(); mp3Duration = (float) (frames / format.getFrameRate()); - audioInputStream.close(); } catch (Exception ex) { mp3Duration = 0; - ex.printStackTrace(); + cn.pupperclient.PupperLogger.error("MusicPlayer", "Failed to calculate MP3 duration", ex); } } } - private byte[] toByteArray(short[] samples, int length) { - byte[] buffer = new byte[length * 2]; - for (int i = 0; i < length; i++) { - buffer[i * 2] = (byte) (samples[i] & 0xFF); - buffer[i * 2 + 1] = (byte) ((samples[i] >> 8) & 0xFF); - } - return buffer; - } - private void updateSpectrum(byte[] audioData) { + private void updateSpectrum(byte[] audioData, int length) { - for (int i = 0; i < Math.min(audioData.length / 2, FFT_SIZE); i++) { + int samples = Math.min(length / 2, FFT_SIZE); + for (int i = 0; i < samples; i++) { int index = i * 2; - if (index + 1 < audioData.length) { - short sample = (short) ((audioData[index + 1] << 8) | (audioData[index] & 0xFF)); - fftBuffer[i] = sample / 32768.0f; - } + short sample = (short) ((audioData[index + 1] << 8) | (audioData[index] & 0xFF)); + fftBuffer[i] = sample / 32768.0f; } for (int i = 0; i < SPECTRUM_BANDS; i++) { diff --git a/src/main/java/cn/pupperclient/management/music/ytdlp/Ytdlp.java b/src/main/java/cn/pupperclient/management/music/ytdlp/Ytdlp.java index 2554e8a..7a76528 100644 --- a/src/main/java/cn/pupperclient/management/music/ytdlp/Ytdlp.java +++ b/src/main/java/cn/pupperclient/management/music/ytdlp/Ytdlp.java @@ -53,7 +53,7 @@ public boolean download(String url, String format) { return false; } } catch (Exception e) { - e.printStackTrace(); + PupperLogger.error("YTDLP", "Download failed", e); return false; } } diff --git a/src/main/java/cn/pupperclient/management/profile/ProfileManager.java b/src/main/java/cn/pupperclient/management/profile/ProfileManager.java index 269be45..93c8211 100644 --- a/src/main/java/cn/pupperclient/management/profile/ProfileManager.java +++ b/src/main/java/cn/pupperclient/management/profile/ProfileManager.java @@ -15,7 +15,7 @@ import cn.pupperclient.management.config.Config; import cn.pupperclient.management.config.ConfigManager; import cn.pupperclient.management.config.ConfigType; -import cn.pupperclient.utils.JsonUtils; +import cn.pupperclient.utils.misc.JsonUtils; import cn.pupperclient.utils.file.FileLocation; import it.unimi.dsi.fastutil.objects.ObjectObjectImmutablePair; @@ -49,14 +49,14 @@ public void save(String name, String author, String serverIp, Object icon, Confi try { Files.copy(((File) icon).toPath(), iconFile.toPath(), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("ProfileManager", "Failed to copy custom icon", e); } } try (FileWriter writer = new FileWriter(new File(profileDir, "info.json"))) { writer.write(infoJson.toString()); } catch (IOException e) { - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("ProfileManager", "Failed to save profile info", e); } // 保存各个配置 @@ -67,7 +67,7 @@ public void save(String name, String author, String serverIp, Object icon, Confi try (FileWriter writer = new FileWriter(new File(profileDir, t.getId() + ".json"))) { writer.write(c.getJsonObject().toString()); } catch (IOException e) { - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("ProfileManager", "Failed to save profile config: " + t.getId(), e); } } } @@ -126,7 +126,7 @@ public void readProfiles() { profiles.add(new Profile(name, author, configs, icon, serverIp)); } catch (IOException e) { - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("ProfileManager", "Failed to read profiles", e); } } } diff --git a/src/main/java/cn/pupperclient/management/websocket/WebSocketManager.java b/src/main/java/cn/pupperclient/management/websocket/WebSocketManager.java index b39980c..522584c 100644 --- a/src/main/java/cn/pupperclient/management/websocket/WebSocketManager.java +++ b/src/main/java/cn/pupperclient/management/websocket/WebSocketManager.java @@ -11,7 +11,7 @@ import com.mojang.authlib.GameProfile; import cn.pupperclient.management.websocket.client.SoarWebSocketClient; import cn.pupperclient.management.websocket.packet.SoarPacket; -import cn.pupperclient.utils.HttpUtils; +import cn.pupperclient.utils.http.HttpUtils; import net.minecraft.client.MinecraftClient; import net.minecraft.client.session.Session; diff --git a/src/main/java/cn/pupperclient/management/websocket/client/SoarWebSocketClient.java b/src/main/java/cn/pupperclient/management/websocket/client/SoarWebSocketClient.java index 874af3a..ff0782c 100644 --- a/src/main/java/cn/pupperclient/management/websocket/client/SoarWebSocketClient.java +++ b/src/main/java/cn/pupperclient/management/websocket/client/SoarWebSocketClient.java @@ -13,7 +13,7 @@ import com.google.gson.JsonObject; import cn.pupperclient.management.websocket.handler.WebSocketHandler; import cn.pupperclient.management.websocket.handler.impl.HypixelStatsHandler; -import cn.pupperclient.utils.JsonUtils; +import cn.pupperclient.utils.misc.JsonUtils; public class SoarWebSocketClient extends WebSocketClient { diff --git a/src/main/java/cn/pupperclient/management/websocket/handler/impl/HypixelStatsHandler.java b/src/main/java/cn/pupperclient/management/websocket/handler/impl/HypixelStatsHandler.java index e908872..f40d2c7 100644 --- a/src/main/java/cn/pupperclient/management/websocket/handler/impl/HypixelStatsHandler.java +++ b/src/main/java/cn/pupperclient/management/websocket/handler/impl/HypixelStatsHandler.java @@ -5,7 +5,7 @@ import cn.pupperclient.management.hypixel.HypixelManager; import cn.pupperclient.management.hypixel.api.HypixelUser; import cn.pupperclient.management.websocket.handler.WebSocketHandler; -import cn.pupperclient.utils.JsonUtils; +import cn.pupperclient.utils.misc.JsonUtils; public class HypixelStatsHandler extends WebSocketHandler { diff --git a/src/main/java/cn/pupperclient/mixin/mixins/minecraft/client/MixinMinecraftClient.java b/src/main/java/cn/pupperclient/mixin/mixins/minecraft/client/MixinMinecraftClient.java index fe989b8..f0c5a8c 100644 --- a/src/main/java/cn/pupperclient/mixin/mixins/minecraft/client/MixinMinecraftClient.java +++ b/src/main/java/cn/pupperclient/mixin/mixins/minecraft/client/MixinMinecraftClient.java @@ -3,7 +3,6 @@ import java.io.File; import java.io.IOException; -import cn.pupperclient.event.client.WorldChangeEvent; import cn.pupperclient.shader.impl.Kawaseblur; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.gui.screen.Screen; @@ -164,9 +163,4 @@ public void onResolutionChanged(CallbackInfo info) { public File getAssetDir() { return this.assetDir; } - - @Inject(method = "setWorld", at = @At("HEAD")) - private void hookWorldChangeEvent(ClientWorld world, CallbackInfo ci) { - EventBus.getInstance().post(new WorldChangeEvent(world)); - } } diff --git a/src/main/java/cn/pupperclient/mixin/mixins/minecraft/client/gui/MixinLanguageScreen.java b/src/main/java/cn/pupperclient/mixin/mixins/minecraft/client/gui/MixinLanguageScreen.java index c11ab7d..f1132de 100644 --- a/src/main/java/cn/pupperclient/mixin/mixins/minecraft/client/gui/MixinLanguageScreen.java +++ b/src/main/java/cn/pupperclient/mixin/mixins/minecraft/client/gui/MixinLanguageScreen.java @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import static cn.pupperclient.utils.IMinecraft.mc; +import static cn.pupperclient.utils.minecraft.interfaces.IMinecraft.mc; @Mixin(value = LanguageOptionsScreen.class, priority = 1001) public class MixinLanguageScreen extends Screen { diff --git a/src/main/java/cn/pupperclient/mixin/mixins/minecraft/client/gui/MixinTitleScreen.java b/src/main/java/cn/pupperclient/mixin/mixins/minecraft/client/gui/MixinTitleScreen.java index a1372a0..f66c398 100644 --- a/src/main/java/cn/pupperclient/mixin/mixins/minecraft/client/gui/MixinTitleScreen.java +++ b/src/main/java/cn/pupperclient/mixin/mixins/minecraft/client/gui/MixinTitleScreen.java @@ -20,7 +20,7 @@ protected MixinTitleScreen(Text title) { @Inject(method = "init()V", at = @At("HEAD"), cancellable = true) public void onInit(CallbackInfo ci) { - MinecraftClient.getInstance().setScreen(new MainMenuGui().build()); + MinecraftClient.getInstance().setScreen(new MainMenuGui()); ci.cancel(); } diff --git a/src/main/java/cn/pupperclient/mixin/mixins/minecraft/client/sound/MixinSoundSystem.java b/src/main/java/cn/pupperclient/mixin/mixins/minecraft/client/sound/MixinSoundSystem.java index d8d5867..32b2e0e 100644 --- a/src/main/java/cn/pupperclient/mixin/mixins/minecraft/client/sound/MixinSoundSystem.java +++ b/src/main/java/cn/pupperclient/mixin/mixins/minecraft/client/sound/MixinSoundSystem.java @@ -3,10 +3,6 @@ import java.util.Arrays; import java.util.List; -import cn.pupperclient.event.EventBus; -import cn.pupperclient.event.client.PlaySoundEvent; -import cn.pupperclient.utils.SoundEventHelper; -import net.minecraft.entity.Entity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -38,22 +34,4 @@ public class MixinSoundSystem { return; } } - - @Inject(method = "play*", at = @At("HEAD"), cancellable = true) - private void onPlaySound(SoundInstance soundInstance, CallbackInfo ci) { - PlaySoundEvent event = new PlaySoundEvent(soundInstance); - - Entity soundSource = SoundEventHelper.getLastSoundSource(); - if (soundSource != null && - soundInstance.getId().equals(SoundEventHelper.getLastSoundEvent().id())) { - event.setSourceEntity(soundSource); - SoundEventHelper.clearLastSound(); - } - - EventBus.getInstance().post(event); - - if (event.isCancelled()) { - ci.cancel(); - } - } } diff --git a/src/main/java/cn/pupperclient/mixin/mixins/minecraft/entity/MixinClientPlayerEntity.java b/src/main/java/cn/pupperclient/mixin/mixins/minecraft/entity/MixinClientPlayerEntity.java deleted file mode 100644 index 59ac483..0000000 --- a/src/main/java/cn/pupperclient/mixin/mixins/minecraft/entity/MixinClientPlayerEntity.java +++ /dev/null @@ -1,131 +0,0 @@ -package cn.pupperclient.mixin.mixins.minecraft.entity; - -import com.mojang.authlib.GameProfile; -import cn.pupperclient.event.EventBus; -import cn.pupperclient.event.EventType; -import cn.pupperclient.event.client.EventMotion; -import cn.pupperclient.event.client.EventUpdate; -import cn.pupperclient.utils.IMinecraft; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.network.ClientConnection; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(value = ClientPlayerEntity.class, priority = 1001) -public abstract class MixinClientPlayerEntity extends AbstractClientPlayerEntity implements IMinecraft { - @Unique - private boolean wasSprinting; - @Unique - @Final - public ClientConnection connection; - @Unique - private boolean wasShiftKeyDown; - @Unique - private double xLast; - @Unique - private double yLast1; - @Unique - private double zLast; - @Unique - private float yRotLast; - @Unique - private float xRotLast; - @Unique - private int positionReminder; - @Shadow - private boolean lastOnGround; - @Shadow - private boolean autoJumpEnabled; - - @Shadow - public boolean lastSneaking; - - @Shadow - public abstract void tick(); - - @Shadow - public abstract void sendSprintingPacket(); - - @Shadow - @Final - protected MinecraftClient client; - - public MixinClientPlayerEntity(ClientWorld world, GameProfile profile) { - super(world, profile); - } - - @Unique - protected abstract boolean isControlledCamera(); - @Unique - protected abstract void sendIsSprintingIfNeeded(); - - @Inject(method = "sendMovementPackets", at = @At("HEAD"), cancellable = true) - private void onSendMovementPacketsHead(CallbackInfo ci) { - ClientPlayerEntity self = (ClientPlayerEntity) (Object) this; - EventMotion eventPre = new EventMotion(EventType.PRE, self.getX(), self.getY(), self.getZ(), self.getYaw(), self.getPitch(), self.isOnGround()); - EventBus.getInstance().post(eventPre); - if (eventPre.isCancelled()) { - EventBus.getInstance().post(new EventMotion(EventType.POST, eventPre.getYaw(), eventPre.getPitch())); - ci.cancel(); - } - } - - @Redirect(method = "sendMovementPackets", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getX()D")) - private double redirectGetX(ClientPlayerEntity instance) { - EventMotion event = new EventMotion(EventType.PRE, instance.getX(), instance.getY(), instance.getZ(), instance.getYaw(), instance.getPitch(), instance.isOnGround()); - EventBus.getInstance().post(event); - return event.getX(); - } - - @Redirect(method = "sendMovementPackets", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getY()D")) - private double redirectGetY(ClientPlayerEntity instance) { - EventMotion event = new EventMotion(EventType.PRE, instance.getX(), instance.getY(), instance.getZ(), instance.getYaw(), instance.getPitch(), instance.isOnGround()); - EventBus.getInstance().post(event); - return event.getY(); - } - - @Redirect(method = "sendMovementPackets", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getZ()D")) - private double redirectGetZ(ClientPlayerEntity instance) { - EventMotion event = new EventMotion(EventType.PRE, instance.getX(), instance.getY(), instance.getZ(), instance.getYaw(), instance.getPitch(), instance.isOnGround()); - EventBus.getInstance().post(event); - return event.getZ(); - } - - @Redirect(method = "sendMovementPackets", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getYaw()F")) - private float redirectGetYaw(ClientPlayerEntity instance) { - EventMotion event = new EventMotion(EventType.PRE, instance.getX(), instance.getY(), instance.getZ(), instance.getYaw(), instance.getPitch(), instance.isOnGround()); - EventBus.getInstance().post(event); - return event.getYaw(); - } - - @Redirect(method = "sendMovementPackets", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isOnGround()Z")) - private boolean redirectIsOnGround(ClientPlayerEntity instance) { - EventMotion event = new EventMotion(EventType.PRE, instance.getX(), instance.getY(), instance.getZ(), instance.getYaw(), instance.getPitch(), instance.isOnGround()); - EventBus.getInstance().post(event); - return event.isOnGround(); - } - - @Inject(method = "sendMovementPackets", at = @At("TAIL")) - private void onSendMovementPacketsTail(CallbackInfo ci) { - ClientPlayerEntity self = (ClientPlayerEntity) (Object) this; - EventBus.getInstance().post(new EventMotion(EventType.POST, self.getYaw(), self.getPitch())); - } - - @Inject( - method = {"tick"}, - at = {@At( - value = "INVOKE", - target = "Lnet/minecraft/client/network/AbstractClientPlayerEntity;tick()V", - shift = At.Shift.BEFORE - )} - ) - public void injectUpdateEvent(CallbackInfo ci) { - EventBus.getInstance().post(new EventUpdate()); - } -} diff --git a/src/main/java/cn/pupperclient/mixin/mixins/minecraft/entity/MixinEntity.java b/src/main/java/cn/pupperclient/mixin/mixins/minecraft/entity/MixinEntity.java index 5d9d5c7..f4d8578 100644 --- a/src/main/java/cn/pupperclient/mixin/mixins/minecraft/entity/MixinEntity.java +++ b/src/main/java/cn/pupperclient/mixin/mixins/minecraft/entity/MixinEntity.java @@ -1,6 +1,6 @@ package cn.pupperclient.mixin.mixins.minecraft.entity; -import cn.pupperclient.utils.SoundEventHelper; +import cn.pupperclient.utils.misc.SoundEventHelper; import net.minecraft.nbt.NbtCompound; import net.minecraft.sound.SoundEvent; import net.minecraft.util.math.Vec3d; diff --git a/src/main/java/cn/pupperclient/mixin/mixins/minecraft/entity/MixinPlayerEntity.java b/src/main/java/cn/pupperclient/mixin/mixins/minecraft/entity/MixinPlayerEntity.java index aa5d1ee..7b0949f 100644 --- a/src/main/java/cn/pupperclient/mixin/mixins/minecraft/entity/MixinPlayerEntity.java +++ b/src/main/java/cn/pupperclient/mixin/mixins/minecraft/entity/MixinPlayerEntity.java @@ -1,11 +1,8 @@ package cn.pupperclient.mixin.mixins.minecraft.entity; -import cn.pupperclient.event.EventBus; -import cn.pupperclient.event.client.EventAttackYaw; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import cn.pupperclient.management.mod.impl.player.ForceMainHandMod; @@ -36,19 +33,4 @@ private void injectGetMainArm(CallbackInfoReturnable cir) { cir.setReturnValue(ForceMainHandMod.getInstance().isRightHand() ? Arm.RIGHT : Arm.LEFT); } } - - @Redirect( - method = {"attack"}, - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/entity/player/PlayerEntity;getYaw()F" - ) - ) - private float hookFixRotation(PlayerEntity instance) { - EventAttackYaw event = new EventAttackYaw(instance.getYaw()); - EventBus.getInstance().post(event); - return event.getYaw(); - } - - } diff --git a/src/main/java/cn/pupperclient/mixin/mixins/minecraft/network/MixinClientPlayerInteractionManager.java b/src/main/java/cn/pupperclient/mixin/mixins/minecraft/network/MixinClientPlayerInteractionManager.java deleted file mode 100644 index 1c07727..0000000 --- a/src/main/java/cn/pupperclient/mixin/mixins/minecraft/network/MixinClientPlayerInteractionManager.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.pupperclient.mixin.mixins.minecraft.network; - -import cn.pupperclient.event.EventBus; -import cn.pupperclient.event.client.EventPositionItem; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.network.ClientPlayerInteractionManager; -import net.minecraft.network.packet.Packet; -import net.minecraft.network.packet.c2s.play.PlayerInteractItemC2SPacket; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(ClientPlayerInteractionManager.class) -public class MixinClientPlayerInteractionManager { - @Redirect( - method = "sendSequencedPacket", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/network/ClientPlayNetworkHandler;sendPacket(Lnet/minecraft/network/packet/Packet;)V" - ) - ) - public void onSendSequencedPacket(ClientPlayNetworkHandler instance, Packet packet) { - if (packet instanceof PlayerInteractItemC2SPacket) { - EventPositionItem event = new EventPositionItem(packet); - EventBus.getInstance().post(event); - - if (!event.isCancelled()) { - instance.sendPacket(event.getPacket()); - } - } else { - instance.sendPacket(packet); - } - } -} diff --git a/src/main/java/cn/pupperclient/mixin/mixins/minecraft/world/MixinItem.java b/src/main/java/cn/pupperclient/mixin/mixins/minecraft/world/MixinItem.java deleted file mode 100644 index 7d8d890..0000000 --- a/src/main/java/cn/pupperclient/mixin/mixins/minecraft/world/MixinItem.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.pupperclient.mixin.mixins.minecraft.world; - -import cn.pupperclient.event.EventBus; -import cn.pupperclient.event.client.EventUseItemRayTrace; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(Item.class) -public class MixinItem { - @Redirect( - method = {"raycast"}, - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/entity/player/PlayerEntity;getYaw()F" - ) - ) - private static float hookRayTraceYRot(PlayerEntity instance) { - EventUseItemRayTrace event = new EventUseItemRayTrace(instance.getYaw(), instance.getPitch()); - EventBus.getInstance().post(event); - return event.getYaw(); - } -} diff --git a/src/main/java/cn/pupperclient/shader/Framebuffer.java b/src/main/java/cn/pupperclient/shader/Framebuffer.java index 503a07c..9a32327 100644 --- a/src/main/java/cn/pupperclient/shader/Framebuffer.java +++ b/src/main/java/cn/pupperclient/shader/Framebuffer.java @@ -6,9 +6,12 @@ import static org.lwjgl.opengl.GL30C.GL_FRAMEBUFFER; import static org.lwjgl.opengl.GL30C.glGenerateMipmap; +import java.nio.ByteBuffer; + import org.lwjgl.opengl.GL30C; import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.MinecraftClient; import net.minecraft.client.util.Window; @@ -40,17 +43,17 @@ private void init() { ShaderHelper.bindTexture(texture); ShaderHelper.defaultPixelStore(); - ShaderHelper.textureParam(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - ShaderHelper.textureParam(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + RenderSystem.texParameter(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + RenderSystem.texParameter(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - ShaderHelper.textureParam(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - ShaderHelper.textureParam(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + RenderSystem.texParameter(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + RenderSystem.texParameter(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); width = Math.max(1, (int) (window.getFramebufferWidth() * sizeMulti)); height = Math.max(1, (int) (window.getFramebufferHeight() * sizeMulti)); - ShaderHelper.textureImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, null); - ShaderHelper.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (ByteBuffer) null); + GlStateManager._glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); unbind(); } @@ -61,11 +64,11 @@ public void enableMipmap() { bind(); ShaderHelper.bindTexture(texture); - ShaderHelper.textureParam(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - ShaderHelper.textureParam(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + RenderSystem.texParameter(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + RenderSystem.texParameter(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - ShaderHelper.textureParam(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - ShaderHelper.textureParam(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + RenderSystem.texParameter(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + RenderSystem.texParameter(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); unbind(); } @@ -75,26 +78,36 @@ public void generateMipmap() { if (mipmapEnabled && sizeMulti < 1.0) { bind(); ShaderHelper.bindTexture(texture); - glGenerateMipmap(GL_TEXTURE_2D); + ShaderHelper.generateMipmap(GL_TEXTURE_2D); unbind(); } } public void bind() { - GlStateManager._glBindFramebuffer(GL30C.GL_FRAMEBUFFER, id); + GlStateManager._glBindFramebuffer(GL_FRAMEBUFFER, id); } public void setViewport() { - ShaderHelper.viewport(0, 0, width, height); + RenderSystem.viewport(0, 0, width, height); } public void unbind() { MinecraftClient.getInstance().getFramebuffer().beginWrite(false); } + public void delete() { + if (id != 0) { + GlStateManager._glDeleteFramebuffers(id); + id = 0; + } + if (texture != 0) { + GlStateManager._deleteTexture(texture); + texture = 0; + } + } + public void resize() { - GlStateManager._glDeleteFramebuffers(id); - GlStateManager._deleteTexture(texture); + delete(); init(); if (mipmapEnabled) { enableMipmap(); diff --git a/src/main/java/cn/pupperclient/shader/PostProcessRenderer.java b/src/main/java/cn/pupperclient/shader/PostProcessRenderer.java index a2a413b..e40bbc5 100644 --- a/src/main/java/cn/pupperclient/shader/PostProcessRenderer.java +++ b/src/main/java/cn/pupperclient/shader/PostProcessRenderer.java @@ -16,6 +16,7 @@ import org.lwjgl.opengl.GL32C; import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.util.math.MatrixStack; @@ -71,19 +72,20 @@ public Mesh() { indicesPointer = memAddress0(indices); vao = GlStateManager._glGenVertexArrays(); - ShaderHelper.bindVertexArray(vao); + GlStateManager._glBindVertexArray(vao); vbo = GlStateManager._glGenBuffers(); - GlStateManager._glBindBuffer(GL15C.GL_ARRAY_BUFFER, vbo); + GlStateManager._glBindBuffer(GL_ARRAY_BUFFER, vbo); ibo = GlStateManager._glGenBuffers(); - ShaderHelper.bindIndexBuffer(ibo); - GlStateManager._enableVertexAttribArray(0); + GlStateManager._glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); + + GlStateManager._enableVertexAttribArray(0); GlStateManager._vertexAttribPointer(0, 2, GL_FLOAT, false, stride, 0); - ShaderHelper.bindVertexArray(0); - GlStateManager._glBindBuffer(GL15C.GL_ARRAY_BUFFER, 0); - ShaderHelper.bindIndexBuffer(0); + GlStateManager._glBindVertexArray(0); + GlStateManager._glBindBuffer(GL_ARRAY_BUFFER, 0); + GlStateManager._glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } public void begin() { @@ -134,21 +136,20 @@ public void end() { } if (indicesCount > 0) { - GlStateManager._glBindBuffer(GL15C.GL_ARRAY_BUFFER, vbo); + GlStateManager._glBindBuffer(GL_ARRAY_BUFFER, vbo); GlStateManager._glBufferData(GL_ARRAY_BUFFER, vertices.limit(getVerticesOffset()), GL_DYNAMIC_DRAW); - GlStateManager._glBindBuffer(GL15C.GL_ARRAY_BUFFER, 0); + GlStateManager._glBindBuffer(GL_ARRAY_BUFFER, 0); - ShaderHelper.bindIndexBuffer(ibo); + GlStateManager._glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); GlStateManager._glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.limit(indicesCount * 4), GL_DYNAMIC_DRAW); - ShaderHelper.bindIndexBuffer(0); + GlStateManager._glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } building = false; } public void beginRender(MatrixStack matrices) { - ShaderHelper.disableCull(); - + RenderSystem.disableCull(); beganRendering = true; } @@ -163,10 +164,10 @@ public void render(MatrixStack matrices) { Shader.BOUND.setDefaults(); - ShaderHelper.bindVertexArray(vao); - GlStateManager._drawElements(GL32C.GL_TRIANGLES, indicesCount, GL_UNSIGNED_INT, 0); + GlStateManager._glBindVertexArray(vao); + RenderSystem.drawElements(GL32C.GL_TRIANGLES, indicesCount, GL_UNSIGNED_INT); - ShaderHelper.bindVertexArray(0); + GlStateManager._glBindVertexArray(0); if (!wasBeganRendering) endRender(); diff --git a/src/main/java/cn/pupperclient/shader/Shader.java b/src/main/java/cn/pupperclient/shader/Shader.java index ba9e22c..a2fc2e9 100644 --- a/src/main/java/cn/pupperclient/shader/Shader.java +++ b/src/main/java/cn/pupperclient/shader/Shader.java @@ -4,10 +4,15 @@ import static org.lwjgl.opengl.GL11C.GL_TRUE; import static org.lwjgl.opengl.GL20C.GL_FRAGMENT_SHADER; import static org.lwjgl.opengl.GL20C.GL_VERTEX_SHADER; +import static org.lwjgl.opengl.GL20C.glDeleteProgram; import java.io.IOException; import java.nio.FloatBuffer; import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.apache.commons.io.IOUtils; import org.joml.Matrix4f; @@ -16,46 +21,49 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; -import it.unimi.dsi.fastutil.objects.Object2IntMap; -import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import net.minecraft.client.MinecraftClient; import net.minecraft.util.Identifier; public class Shader { - private static final FloatBuffer MAT = BufferUtils.createFloatBuffer(4 * 4); - public static Shader BOUND; - private final int id; - private final Object2IntMap uniformLocations = new Object2IntOpenHashMap<>(); + private final Map locations = new HashMap<>(); + + private static final FloatBuffer MAT = BufferUtils.createFloatBuffer(16); public Shader(String vertPath, String fragPath) { - int vert = GlStateManager.glCreateShader(GL_VERTEX_SHADER); - GlStateManager.glShaderSource(vert, read(vertPath)); + int vertex = GlStateManager.glCreateShader(GL_VERTEX_SHADER); + int fragment = GlStateManager.glCreateShader(GL_FRAGMENT_SHADER); - String vertError = ShaderHelper.compileShader(vert); - if (vertError != null) { - throw new RuntimeException("Failed to compile vertex shader: " + vertError); - } + GlStateManager.glShaderSource(vertex, read(vertPath)); + GlStateManager.glShaderSource(fragment, read(fragPath)); - int frag = GlStateManager.glCreateShader(GL_FRAGMENT_SHADER); - GlStateManager.glShaderSource(frag, read(fragPath)); + String vertexLog = ShaderHelper.compileShader(vertex); + String fragmentLog = ShaderHelper.compileShader(fragment); - String fragError = ShaderHelper.compileShader(frag); - if (fragError != null) { - throw new RuntimeException("Failed to compile fragment shader: " + fragError); + if (vertexLog != null || fragmentLog != null) { + System.err.println("Vertex Log (" + vertPath + "): " + vertexLog); + System.err.println("Fragment Log (" + fragPath + "): " + fragmentLog); } - id = GlStateManager.glCreateProgram(); + this.id = GlStateManager.glCreateProgram(); + String programLog = ShaderHelper.linkProgram(id, vertex, fragment); - String programError = ShaderHelper.linkProgram(id, vert, frag); - if (programError != null) { - throw new RuntimeException("Failed to link program: " + programError); + if (programLog != null) { + System.err.println("Program Log (" + vertPath + ", " + fragPath + "): " + programLog); } - GlStateManager.glDeleteShader(vert); - GlStateManager.glDeleteShader(frag); + GlStateManager.glDeleteShader(vertex); + GlStateManager.glDeleteShader(fragment); + } + + public void set(String name, double v) { + set(name, (float) v); + } + + public void set(String name, double v1, double v2) { + set(name, (float) v1, (float) v2); } private String read(String path) { @@ -74,38 +82,57 @@ public void bind() { BOUND = this; } - private int getLocation(String name) { - if (uniformLocations.containsKey(name)) - return uniformLocations.getInt(name); + public int getLocation(String name) { + if (locations.containsKey(name)) { + return locations.get(name); + } int location = ShaderHelper.getUniformLocation(id, name); - uniformLocations.put(name, location); - return location; - } + locations.put(name, location); - public void set(String name, boolean v) { - ShaderHelper.uniformInt(getLocation(name), v ? GL_TRUE : GL_FALSE); + return location; } public void set(String name, int v) { ShaderHelper.uniformInt(getLocation(name), v); } - public void set(String name, double v) { - ShaderHelper.uniformFloat(getLocation(name), (float) v); + public void set(String name, float v) { + ShaderHelper.uniformFloat(getLocation(name), v); } - public void set(String name, double v1, double v2) { - ShaderHelper.uniformFloat2(getLocation(name), (float) v1, (float) v2); + public void set(String name, float v1, float v2) { + ShaderHelper.uniformFloat2(getLocation(name), v1, v2); + } + + public void set(String name, float v1, float v2, float v3) { + ShaderHelper.uniformFloat3(getLocation(name), v1, v2, v3); + } + + public void set(String name, float v1, float v2, float v3, float v4) { + ShaderHelper.uniformFloat4(getLocation(name), v1, v2, v3, v4); + } + + public void set(String name, float[] v) { + ShaderHelper.uniformFloat3Array(getLocation(name), v); } public void set(String name, Matrix4f mat) { mat.get(MAT); - GlStateManager._glUniformMatrix4(getLocation(name), false, MAT); + ShaderHelper.uniformMatrix4(getLocation(name), false, MAT); } public void setDefaults() { set("u_Proj", RenderSystem.getProjectionMatrix()); - set("u_ModelView", RenderSystem.getModelViewStack()); + // Modern approach: use RenderSystem matrices directly or pass from context + } + + public void unbind() { + ShaderHelper.useProgram(0); + BOUND = null; + } + + public void delete() { + org.lwjgl.opengl.GL20C.glDeleteProgram(id); } } diff --git a/src/main/java/cn/pupperclient/shader/ShaderHelper.java b/src/main/java/cn/pupperclient/shader/ShaderHelper.java index 6868632..e7504ba 100644 --- a/src/main/java/cn/pupperclient/shader/ShaderHelper.java +++ b/src/main/java/cn/pupperclient/shader/ShaderHelper.java @@ -18,31 +18,25 @@ import static org.lwjgl.opengl.GL12C.GL_UNPACK_SKIP_IMAGES; import static org.lwjgl.opengl.GL13C.GL_TEXTURE0; import static org.lwjgl.opengl.GL15C.GL_ELEMENT_ARRAY_BUFFER; -import static org.lwjgl.opengl.GL20C.GL_COMPILE_STATUS; -import static org.lwjgl.opengl.GL20C.GL_LINK_STATUS; -import static org.lwjgl.opengl.GL20C.glUniform1f; -import static org.lwjgl.opengl.GL20C.glUniform2f; -import static org.lwjgl.opengl.GL20C.glUniform3f; -import static org.lwjgl.opengl.GL20C.glUniform3fv; -import static org.lwjgl.opengl.GL20C.glUniform4f; -import static org.lwjgl.opengl.GL30C.glGenerateMipmap; +import static org.lwjgl.opengl.GL20C.*; +import static org.lwjgl.opengl.GL30C.*; import java.nio.ByteBuffer; +import java.nio.FloatBuffer; import com.mojang.blaze3d.platform.GlStateManager; import cn.pupperclient.mixin.mixins.minecraft.client.render.BufferRendererAccessor; +import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.MinecraftClient; import net.minecraft.client.texture.AbstractTexture; import net.minecraft.util.Identifier; public class ShaderHelper { - public static int CURRENT_IBO; private static int prevIbo; - private ShaderHelper() { - } + private ShaderHelper() {} public static void bindVertexArray(int vao) { GlStateManager._glBindVertexArray(vao); @@ -52,7 +46,7 @@ public static void bindVertexArray(int vao) { public static void bindIndexBuffer(int ibo) { if (ibo != 0) prevIbo = CURRENT_IBO; - GlStateManager._glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo != 0 ? ibo : prevIbo); + GlStateManager._glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo != 0 ? ibo : prevIbo); } public static String compileShader(int shader) { @@ -78,11 +72,12 @@ public static String linkProgram(int program, int vertShader, int fragShader) { } public static void useProgram(int program) { + RenderSystem.setShaderGameTime(System.currentTimeMillis(), 0); GlStateManager._glUseProgram(program); } public static void viewport(int x, int y, int width, int height) { - GlStateManager._viewport(x, y, width, height); + RenderSystem.viewport(x, y, width, height); } public static int getUniformLocation(int program, String name) { @@ -90,35 +85,44 @@ public static int getUniformLocation(int program, String name) { } public static void uniformInt(int location, int v) { - GlStateManager._glUniform1i(location, v); + // No direct RenderSystem wrapper for uniform1i by location, use GlStateManager if available or native + // GlStateManager doesn't have uniform1i usually, RenderSystem has it for ShaderInstance but not raw programs + // For raw programs, we might need native or a helper. + // Actually, GlStateManager often has _glUniform1i but let's check. + // If not, we stay with native for uniforms if no wrapper exists. + org.lwjgl.opengl.GL20C.glUniform1i(location, v); } public static void uniformFloat(int location, float v) { - glUniform1f(location, v); + org.lwjgl.opengl.GL20C.glUniform1f(location, v); } public static void uniformFloat2(int location, float v1, float v2) { - glUniform2f(location, v1, v2); + org.lwjgl.opengl.GL20C.glUniform2f(location, v1, v2); } public static void uniformFloat3(int location, float v1, float v2, float v3) { - glUniform3f(location, v1, v2, v3); + org.lwjgl.opengl.GL20C.glUniform3f(location, v1, v2, v3); } public static void uniformFloat4(int location, float v1, float v2, float v3, float v4) { - glUniform4f(location, v1, v2, v3, v4); + org.lwjgl.opengl.GL20C.glUniform4f(location, v1, v2, v3, v4); } public static void uniformFloat3Array(int location, float[] v) { - glUniform3fv(location, v); + org.lwjgl.opengl.GL20C.glUniform3fv(location, v); } + public static void uniformMatrix4(int location, boolean transpose, FloatBuffer matrices) { + org.lwjgl.opengl.GL20C.glUniformMatrix4fv(location, transpose, matrices); + } + public static void pixelStore(int name, int param) { - GlStateManager._pixelStore(name, param); + RenderSystem.pixelStore(name, param); } public static void textureParam(int target, int name, int param) { - GlStateManager._texParameter(target, name, param); + RenderSystem.texParameter(target, name, param); } public static void textureImage2D(int target, int level, int internalFormat, int width, int height, int border, @@ -142,28 +146,28 @@ public static void framebufferTexture2D(int target, int attachment, int textureT } public static void enableDepth() { - GlStateManager._enableDepthTest(); + RenderSystem.enableDepthTest(); } public static void disableDepth() { - GlStateManager._disableDepthTest(); + RenderSystem.disableDepthTest(); } public static void enableBlend() { - GlStateManager._enableBlend(); - GlStateManager._blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + RenderSystem.enableBlend(); + RenderSystem.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } public static void disableBlend() { - GlStateManager._disableBlend(); + RenderSystem.disableBlend(); } public static void enableCull() { - GlStateManager._enableCull(); + RenderSystem.enableCull(); } public static void disableCull() { - GlStateManager._disableCull(); + RenderSystem.disableCull(); } public static void enableLineSmooth() { @@ -181,8 +185,8 @@ public static void bindTexture(Identifier id) { } public static void bindTexture(int i, int slot) { - GlStateManager._activeTexture(GL_TEXTURE0 + slot); - GlStateManager._bindTexture(i); + RenderSystem.activeTexture(GL_TEXTURE0 + slot); + RenderSystem.bindTexture(i); } public static void bindTexture(int i) { @@ -190,14 +194,10 @@ public static void bindTexture(int i) { } public static void resetTextureSlot() { - GlStateManager._activeTexture(GL_TEXTURE0); + RenderSystem.activeTexture(GL_TEXTURE0); } public static void generateMipmap(int target) { glGenerateMipmap(target); } - - public static void textureParam(int target, int pname, float param) { - GlStateManager._texParameter(target, pname, param); - } } diff --git a/src/main/java/cn/pupperclient/shader/impl/Kawaseblur.java b/src/main/java/cn/pupperclient/shader/impl/Kawaseblur.java index dffeb86..13a1bf3 100644 --- a/src/main/java/cn/pupperclient/shader/impl/Kawaseblur.java +++ b/src/main/java/cn/pupperclient/shader/impl/Kawaseblur.java @@ -3,7 +3,7 @@ import cn.pupperclient.management.mod.impl.settings.SystemSettings; import cn.pupperclient.shader.*; -import cn.pupperclient.utils.TimerUtils; +import cn.pupperclient.utils.time.TimerUtils; import it.unimi.dsi.fastutil.ints.IntDoubleImmutablePair; import net.minecraft.client.MinecraftClient; diff --git a/src/main/java/cn/pupperclient/skia/Skia.java b/src/main/java/cn/pupperclient/skia/Skia.java index 223c2f3..f42765e 100644 --- a/src/main/java/cn/pupperclient/skia/Skia.java +++ b/src/main/java/cn/pupperclient/skia/Skia.java @@ -28,25 +28,26 @@ public class Skia { private static final ImageHelper imageHelper = new ImageHelper(); + private static final Paint SHARED_PAINT = new Paint(); public static void drawRect(float x, float y, float width, float height, Color color) { - getCanvas().drawRect(Rect.makeXYWH(x, y, width, height), getPaint(color)); + getCanvas().drawRect(Rect.makeXYWH(x, y, width, height), setupPaint(color)); } public static void drawCircle(float x, float y, float radius, Color color) { - Paint paint = getPaint(color); - getCanvas().drawCircle(x, y, radius, paint); + getCanvas().drawCircle(x, y, radius, setupPaint(color)); } public static void drawCircle(float x, float y, float radius, float strokeWidth, Color color) { - Paint paint = getPaint(color); + Paint paint = setupPaint(color); paint.setMode(PaintMode.STROKE); paint.setStrokeWidth(strokeWidth); getCanvas().drawCircle(x, y, radius, paint); + paint.setMode(PaintMode.FILL); // Reset } public static void drawRoundedRect(float x, float y, float width, float height, float radius, Color color) { - getCanvas().drawRRect(RRect.makeXYWH(x, y, width, height, radius), getPaint(color)); + getCanvas().drawRRect(RRect.makeXYWH(x, y, width, height, radius), setupPaint(color)); } public static void drawRoundedRectVarying(float x, float y, float width, float height, float topLeft, @@ -55,7 +56,7 @@ public static void drawRoundedRectVarying(float x, float y, float width, float h float[] corners = new float[] { topLeft, topLeft, topRight, topRight, bottomRight, bottomRight, bottomLeft, bottomLeft }; - getCanvas().drawRRect(RRect.makeComplexXYWH(x, y, width, height, corners), getPaint(color)); + getCanvas().drawRRect(RRect.makeComplexXYWH(x, y, width, height, corners), setupPaint(color)); } public static void drawBlur(float x, float y, float width, float height) { @@ -63,13 +64,13 @@ public static void drawBlur(float x, float y, float width, float height) { if (HUDModSettings.getInstance().getBlurSetting().isEnabled()) { Window window = MinecraftClient.getInstance().getWindow(); - Path path = Path.makeRect(Rect.makeXYWH(x, y, width, height)); - - save(); - getCanvas().clipPath(path, ClipMode.INTERSECT, true); - drawImage(Kawaseblur.INGAME_BLUR.getTexture(), 0, 0, window.getScaledWidth(), window.getScaledHeight(), 1F, - SurfaceOrigin.BOTTOM_LEFT); - restore(); + try (Path path = Path.makeRect(Rect.makeXYWH(x, y, width, height))) { + save(); + getCanvas().clipPath(path, ClipMode.INTERSECT, true); + drawImage(Kawaseblur.INGAME_BLUR.getTexture(), 0, 0, window.getScaledWidth(), window.getScaledHeight(), 1F, + SurfaceOrigin.BOTTOM_LEFT); + restore(); + } } } @@ -78,26 +79,29 @@ public static void drawRoundedBlur(float x, float y, float width, float height, if (HUDModSettings.getInstance().getBlurSetting().isEnabled()) { Window window = MinecraftClient.getInstance().getWindow(); - Path path = Path.makeRRect(RRect.makeXYWH(x, y, width, height, radius)); - - save(); - getCanvas().clipPath(path, ClipMode.INTERSECT, true); - drawImage(Kawaseblur.INGAME_BLUR.getTexture(), 0, 0, window.getScaledWidth(), window.getScaledHeight(), 1F, - SurfaceOrigin.BOTTOM_LEFT); - restore(); + try (Path path = Path.makeRRect(RRect.makeXYWH(x, y, width, height, radius))) { + save(); + getCanvas().clipPath(path, ClipMode.INTERSECT, true); + drawImage(Kawaseblur.INGAME_BLUR.getTexture(), 0, 0, window.getScaledWidth(), window.getScaledHeight(), 1F, + SurfaceOrigin.BOTTOM_LEFT); + restore(); + } } } public static void drawShadow(float x, float y, float width, float height, float radius) { - Paint paint = getPaint(new Color(0, 0, 0, 120)); - - paint.setImageFilter(ImageFilter.makeBlur(2.5F, 2.5F, FilterTileMode.DECAL)); + try (Paint paint = new Paint(); + ImageFilter blur = ImageFilter.makeBlur(2.5F, 2.5F, FilterTileMode.DECAL)) { + + paint.setARGB(120, 0, 0, 0); + paint.setImageFilter(blur); - save(); - clip(x, y, width, height, radius, ClipMode.DIFFERENCE); - getCanvas().drawRRect(RRect.makeXYWH(x, y, width, height, radius), paint); - restore(); + save(); + clip(x, y, width, height, radius, ClipMode.DIFFERENCE); + getCanvas().drawRRect(RRect.makeXYWH(x, y, width, height, radius), paint); + restore(); + } } public static void drawOutline(float x, float y, float width, float height, float radius, float strokeWidth, @@ -105,14 +109,16 @@ public static void drawOutline(float x, float y, float width, float height, floa float halfStroke = strokeWidth / 2; - Path path = Path.makeRRect(RRect.makeXYWH(x + halfStroke, y + halfStroke, width - strokeWidth, height - strokeWidth, + try (Path path = Path.makeRRect(RRect.makeXYWH(x + halfStroke, y + halfStroke, width - strokeWidth, height - strokeWidth, radius - halfStroke)); + Paint paint = new Paint()) { - Paint paint = getPaint(color); - paint.setStrokeWidth(strokeWidth); - paint.setMode(PaintMode.STROKE); + paint.setARGB(color.getAlpha(), color.getRed(), color.getGreen(), color.getBlue()); + paint.setStrokeWidth(strokeWidth); + paint.setMode(PaintMode.STROKE); - getCanvas().drawPath(path, paint); + getCanvas().drawPath(path, paint); + } } public static void drawImage(String path, float x, float y, float width, float height) { @@ -128,9 +134,10 @@ public static void drawImage(int textureId, float x, float y, float width, float SurfaceOrigin origin) { if (imageHelper.load(textureId, width, height, origin)) { - Paint paint = new Paint(); - paint.setAlpha((int) (255 * alpha)); - getCanvas().drawImageRect(imageHelper.get(textureId), Rect.makeXYWH(x, y, width, height), paint); + try (Paint paint = new Paint()) { + paint.setAlpha((int) (255 * alpha)); + getCanvas().drawImageRect(imageHelper.get(textureId), Rect.makeXYWH(x, y, width, height), paint); + } } } @@ -157,42 +164,42 @@ public static void drawImage(int textureId, float x, float y, float width, float public static void drawRoundedImage(int textureId, float x, float y, float width, float height, float radius) { - Path path = Path.makeRRect(RRect.makeXYWH(x, y, width, height, radius)); - - save(); - getCanvas().clipPath(path, ClipMode.INTERSECT, true); - drawImage(textureId, x, y, width, height); - restore(); + try (Path path = Path.makeRRect(RRect.makeXYWH(x, y, width, height, radius))) { + save(); + getCanvas().clipPath(path, ClipMode.INTERSECT, true); + drawImage(textureId, x, y, width, height); + restore(); + } } public static void drawRoundedImage(String filePath, float x, float y, float width, float height, float radius) { - Path path = Path.makeRRect(RRect.makeXYWH(x, y, width, height, radius)); - - save(); - getCanvas().clipPath(path, ClipMode.INTERSECT, true); - drawImage(filePath, x, y, width, height); - restore(); + try (Path path = Path.makeRRect(RRect.makeXYWH(x, y, width, height, radius))) { + save(); + getCanvas().clipPath(path, ClipMode.INTERSECT, true); + drawImage(filePath, x, y, width, height); + restore(); + } } public static void drawRoundedImage(File file, float x, float y, float width, float height, float radius) { - Path path = Path.makeRRect(RRect.makeXYWH(x, y, width, height, radius)); - - save(); - getCanvas().clipPath(path, ClipMode.INTERSECT, true); - drawImage(file, x, y, width, height); - restore(); + try (Path path = Path.makeRRect(RRect.makeXYWH(x, y, width, height, radius))) { + save(); + getCanvas().clipPath(path, ClipMode.INTERSECT, true); + drawImage(file, x, y, width, height); + restore(); + } } public static void drawRoundedImage(int textureId, float x, float y, float width, float height, float radius, float alpha, SurfaceOrigin origin) { - Path path = Path.makeRRect(RRect.makeXYWH(x, y, width, height, radius)); - - save(); - getCanvas().clipPath(path, ClipMode.INTERSECT, true); - drawImage(textureId, x, y, width, height, alpha, origin); - restore(); + try (Path path = Path.makeRRect(RRect.makeXYWH(x, y, width, height, radius))) { + save(); + getCanvas().clipPath(path, ClipMode.INTERSECT, true); + drawImage(textureId, x, y, width, height, alpha, origin); + restore(); + } } public static void drawRoundedImage(int textureId, float x, float y, float width, float height, float radius, @@ -203,17 +210,17 @@ public static void drawRoundedImage(int textureId, float x, float y, float width public static void drawPlayerHead(File file, float x, float y, float width, float height, float radius) { if (imageHelper.load(file)) { - Path path = Path.makeRRect(RRect.makeXYWH(x, y, width, height, radius)); + try (Path path = Path.makeRRect(RRect.makeXYWH(x, y, width, height, radius))) { + Rect srcRect = Rect.makeXYWH(8, 8, 8, 8); + Rect srcRect1 = Rect.makeXYWH(40, 8, 8, 8); + Rect dstRect = Rect.makeXYWH(x, y, width, height); - Rect srcRect = Rect.makeXYWH(8, 8, 8, 8); - Rect srcRect1 = Rect.makeXYWH(40, 8, 8, 8); - Rect dstRect = Rect.makeXYWH(x, y, width, height); - - save(); - getCanvas().clipPath(path, ClipMode.INTERSECT, true); - getCanvas().drawImageRect(imageHelper.get(file.getName()), srcRect, dstRect, null, false); - getCanvas().drawImageRect(imageHelper.get(file.getName()), srcRect1, dstRect, null, false); - restore(); + save(); + getCanvas().clipPath(path, ClipMode.INTERSECT, true); + getCanvas().drawImageRect(imageHelper.get(file.getName()), srcRect, dstRect, null, false); + getCanvas().drawImageRect(imageHelper.get(file.getName()), srcRect1, dstRect, null, false); + restore(); + } } } @@ -290,22 +297,24 @@ public static void drawMinecraftImage(String path, float x, float y, float width public static void drawArc(float x, float y, float radius, float startAngle, float endAngle, float strokeWidth, Color color) { - Paint paint = getPaint(color); + Paint paint = setupPaint(color); paint.setStrokeWidth(strokeWidth); paint.setMode(PaintMode.STROKE); getCanvas().drawArc(x - radius, y - radius, x + radius, y + radius, startAngle - 90, endAngle, false, paint); + paint.setMode(PaintMode.FILL); // Reset } public static void drawLine(float x, float y, float endX, float endY, float width, Color color) { - Paint paint = getPaint(color); + Paint paint = setupPaint(color); paint.setStroke(true); paint.setStrokeWidth(width); paint.setAntiAlias(true); getCanvas().drawLine(x, y, endX, endY, paint); + paint.setStroke(false); // Reset } public static void drawGradientRoundedRect(float x, float y, float width, float height, float radius, Color color1, @@ -316,28 +325,29 @@ public static void drawGradientRoundedRect(float x, float y, float width, float double tick = (currentTime * speed) % (2 * Math.PI); float max = Math.max(width, height); - Path path = Path.makeRRect(RRect.makeXYWH(x, y, width, height, radius)); - - float startX = x + width / 2 - (max / 2) * (float) Math.cos(tick); - float startY = y + height / 2 - (max / 2) * (float) Math.sin(tick); - float endX = x + width / 2 + (max / 2) * (float) Math.cos(tick); - float endY = y + height / 2 + (max / 2) * (float) Math.sin(tick); - - int skColor1 = io.github.humbleui.skija.Color.makeARGB(color1.getAlpha(), color1.getRed(), color1.getGreen(), - color1.getBlue()); - int skColor2 = io.github.humbleui.skija.Color.makeARGB(color2.getAlpha(), color2.getRed(), color2.getGreen(), - color2.getBlue()); + try (Path path = Path.makeRRect(RRect.makeXYWH(x, y, width, height, radius))) { + float startX = x + width / 2 - (max / 2) * (float) Math.cos(tick); + float startY = y + height / 2 - (max / 2) * (float) Math.sin(tick); + float endX = x + width / 2 + (max / 2) * (float) Math.cos(tick); + float endY = y + height / 2 + (max / 2) * (float) Math.sin(tick); - int skColorMid = io.github.humbleui.skija.Color.makeARGB(color1.getAlpha(), - (color1.getRed() + color2.getRed()) / 2, (color1.getGreen() + color2.getGreen()) / 2, - (color1.getBlue() + color2.getBlue()) / 2); + int skColor1 = io.github.humbleui.skija.Color.makeARGB(color1.getAlpha(), color1.getRed(), color1.getGreen(), + color1.getBlue()); + int skColor2 = io.github.humbleui.skija.Color.makeARGB(color2.getAlpha(), color2.getRed(), color2.getGreen(), + color2.getBlue()); - Paint paint = new Paint(); + int skColorMid = io.github.humbleui.skija.Color.makeARGB(color1.getAlpha(), + (color1.getRed() + color2.getRed()) / 2, (color1.getGreen() + color2.getGreen()) / 2, + (color1.getBlue() + color2.getBlue()) / 2); - paint.setShader(Shader.makeLinearGradient(new Point(startX, startY), new Point(endX, endY), - new int[] { skColor1, skColorMid, skColor2 }, new float[] { 0, 0.5f, 1 })); + try (Paint paint = new Paint(); + Shader shader = Shader.makeLinearGradient(new Point(startX, startY), new Point(endX, endY), + new int[] { skColor1, skColorMid, skColor2 }, new float[] { 0, 0.5f, 1 })) { - getCanvas().drawPath(path, paint); + paint.setShader(shader); + getCanvas().drawPath(path, paint); + } + } } public static void clipPath(Path path, ClipMode mode, boolean arg) { @@ -350,8 +360,9 @@ public static void clipPath(Path path) { public static void clip(float x, float y, float width, float height, float radius, ClipMode mode) { - Path path = Path.makeRRect(RRect.makeXYWH(x, y, width, height, radius)); - clipPath(path, mode, true); + try (Path path = Path.makeRRect(RRect.makeXYWH(x, y, width, height, radius))) { + clipPath(path, mode, true); + } } public static void clip(float x, float y, float width, float height, float topLeft, float topRight, @@ -360,8 +371,9 @@ public static void clip(float x, float y, float width, float height, float topLe float[] corners = new float[] { topLeft, topLeft, topRight, topRight, bottomRight, bottomRight, bottomLeft, bottomLeft }; - Path path = Path.makeRRect(RRect.makeComplexXYWH(x, y, width, height, corners)); - clipPath(path, ClipMode.INTERSECT, true); + try (Path path = Path.makeRRect(RRect.makeComplexXYWH(x, y, width, height, corners))) { + clipPath(path, ClipMode.INTERSECT, true); + } } public static void clip(float x, float y, float width, float height, float radius) { @@ -370,13 +382,13 @@ public static void clip(float x, float y, float width, float height, float radiu public static void drawText(String text, float x, float y, Color color, Font font) { Rect bounds = font.measureText(text); - getCanvas().drawString(text, x - bounds.getLeft(), y - bounds.getTop(), font, getPaint(color)); + getCanvas().drawString(text, x - bounds.getLeft(), y - bounds.getTop(), font, setupPaint(color)); } public static void drawCenteredText(String text, float x, float y, Color color, Font font) { Rect bounds = font.measureText(text); getCanvas().drawString(text, x - bounds.getLeft() - (bounds.getWidth() / 2), y - bounds.getTop(), font, - getPaint(color)); + setupPaint(color)); } public static void drawHeightCenteredText(String text, float x, float y, Color color, Font font) { @@ -386,7 +398,7 @@ public static void drawHeightCenteredText(String text, float x, float y, Color c float textCenterY = y + (metrics.getAscent() - metrics.getDescent()) / 2 - metrics.getAscent(); - getCanvas().drawString(text, x - bounds.getLeft(), textCenterY, font, getPaint(color)); + getCanvas().drawString(text, x - bounds.getLeft(), textCenterY, font, setupPaint(color)); } public static void drawFullCenteredText(String text, float x, float y, Color color, Font font) { @@ -398,7 +410,7 @@ public static void drawFullCenteredText(String text, float x, float y, Color col float textCenterX = x - bounds.getLeft() - (bounds.getWidth() / 2); float textCenterY = y + (metrics.getAscent() - metrics.getDescent()) / 2 - metrics.getAscent(); - getCanvas().drawString(text, textCenterX, textCenterY, font, getPaint(color)); + getCanvas().drawString(text, textCenterX, textCenterY, font, setupPaint(color)); } public static Rect getTextBounds(String text, Font font) { @@ -423,10 +435,9 @@ public static String getLimitText(String text, Font font, float width) { return text + (isRemoved ? "..." : ""); } - public static Paint getPaint(Color color) { - Paint paint = new Paint(); - paint.setARGB(color.getAlpha(), color.getRed(), color.getGreen(), color.getBlue()); - return paint; + public static Paint setupPaint(Color color) { + SHARED_PAINT.setARGB(color.getAlpha(), color.getRed(), color.getGreen(), color.getBlue()); + return SHARED_PAINT; } public static void save() { @@ -472,11 +483,10 @@ public static void rotate(float x, float y, float width, float height, float rot } public static void setAlpha(int alpha) { - - Paint paint = new Paint(); - paint.setAlpha(alpha); - - getCanvas().saveLayer(null, paint); + try (Paint paint = new Paint()) { + paint.setAlpha(alpha); + getCanvas().saveLayer(null, paint); + } } public static Canvas getCanvas() { diff --git a/src/main/java/cn/pupperclient/skia/font/FontHelper.java b/src/main/java/cn/pupperclient/skia/font/FontHelper.java index 227a9ac..bf24642 100644 --- a/src/main/java/cn/pupperclient/skia/font/FontHelper.java +++ b/src/main/java/cn/pupperclient/skia/font/FontHelper.java @@ -40,6 +40,7 @@ private static FontType getFontType(String font) { } public static void clearCache() { + typefaceCache.values().forEach(Typeface::close); typefaceCache.clear(); } diff --git a/src/main/java/cn/pupperclient/skia/image/ImageHelper.java b/src/main/java/cn/pupperclient/skia/image/ImageHelper.java index 3ea6054..579fb35 100644 --- a/src/main/java/cn/pupperclient/skia/image/ImageHelper.java +++ b/src/main/java/cn/pupperclient/skia/image/ImageHelper.java @@ -55,10 +55,10 @@ public boolean load(Identifier identifier) { images.put(identifier.getPath(), image); return true; } catch (IOException e) { - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("ImageHelper", "Failed to read identifier bytes", e); } } catch (FileNotFoundException e) { - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("ImageHelper", "Identifier resource not found", e); } @@ -88,7 +88,7 @@ public boolean load(File file) { images.put(file.getName(), Image.makeDeferredFromEncodedBytes(encoded)); return true; } catch (IOException e) { - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("ImageHelper", "Failed to load image from file: " + file.getName(), e); return false; } } @@ -113,4 +113,11 @@ public Image get(int texture) { return null; } + + public void clear() { + images.values().forEach(Image::close); + images.clear(); + textures.values().forEach(Image::close); + textures.clear(); + } } diff --git a/src/main/java/cn/pupperclient/ui/component/api/PressAnimation.java b/src/main/java/cn/pupperclient/ui/component/api/PressAnimation.java index 2a3a071..a7e6318 100644 --- a/src/main/java/cn/pupperclient/ui/component/api/PressAnimation.java +++ b/src/main/java/cn/pupperclient/ui/component/api/PressAnimation.java @@ -7,8 +7,8 @@ import cn.pupperclient.animation.cubicbezier.impl.EaseEmphasizedDecelerate; import cn.pupperclient.animation.other.DummyAnimation; import cn.pupperclient.skia.Skia; -import cn.pupperclient.utils.ColorUtils; -import cn.pupperclient.utils.MathUtils; +import cn.pupperclient.utils.color.ColorUtils; +import cn.pupperclient.utils.math.MathUtils; public class PressAnimation { diff --git a/src/main/java/cn/pupperclient/ui/component/impl/ComboButton.java b/src/main/java/cn/pupperclient/ui/component/impl/ComboButton.java index 6eb084b..b1e250a 100644 --- a/src/main/java/cn/pupperclient/ui/component/impl/ComboButton.java +++ b/src/main/java/cn/pupperclient/ui/component/impl/ComboButton.java @@ -15,7 +15,7 @@ import cn.pupperclient.ui.component.Component; import cn.pupperclient.ui.component.api.PressAnimation; import cn.pupperclient.ui.component.handler.impl.ComboButtonHandler; -import cn.pupperclient.utils.ColorUtils; +import cn.pupperclient.utils.color.ColorUtils; import cn.pupperclient.utils.language.I18n; import cn.pupperclient.utils.mouse.MouseUtils; diff --git a/src/main/java/cn/pupperclient/ui/component/impl/FileSelector.java b/src/main/java/cn/pupperclient/ui/component/impl/FileSelector.java index 186a632..0fe0cc1 100644 --- a/src/main/java/cn/pupperclient/ui/component/impl/FileSelector.java +++ b/src/main/java/cn/pupperclient/ui/component/impl/FileSelector.java @@ -11,8 +11,8 @@ import cn.pupperclient.ui.component.Component; import cn.pupperclient.ui.component.api.PressAnimation; import cn.pupperclient.ui.component.handler.impl.FileSelectorHandler; -import cn.pupperclient.utils.Multithreading; -import cn.pupperclient.utils.file.dialog.SoarFileDialog; +import cn.pupperclient.utils.thread.Multithreading; +import cn.pupperclient.utils.file.FileDialog; import cn.pupperclient.utils.language.I18n; import cn.pupperclient.utils.mouse.MouseUtils; @@ -55,7 +55,7 @@ public void mousePressed(double mouseX, double mouseY, int button) { pressAnimation.onPressed(mouseX, mouseY, x, y); Multithreading.runAsync(() -> { - ObjectObjectImmutablePair p = SoarFileDialog.chooseFile(I18n.get("text.selectfile"), extensions); + ObjectObjectImmutablePair p = FileDialog.chooseFile(I18n.get("text.selectfile"), extensions); if (p.left()) { file = p.right(); diff --git a/src/main/java/cn/pupperclient/ui/component/impl/IconButton.java b/src/main/java/cn/pupperclient/ui/component/impl/IconButton.java index ae99394..ca556f8 100644 --- a/src/main/java/cn/pupperclient/ui/component/impl/IconButton.java +++ b/src/main/java/cn/pupperclient/ui/component/impl/IconButton.java @@ -10,7 +10,7 @@ import cn.pupperclient.ui.component.Component; import cn.pupperclient.ui.component.api.PressAnimation; import cn.pupperclient.ui.component.handler.impl.ButtonHandler; -import cn.pupperclient.utils.ColorUtils; +import cn.pupperclient.utils.color.ColorUtils; import cn.pupperclient.utils.mouse.MouseUtils; public class IconButton extends Component { diff --git a/src/main/java/cn/pupperclient/ui/component/impl/Slider.java b/src/main/java/cn/pupperclient/ui/component/impl/Slider.java index 395f283..23eb8bb 100644 --- a/src/main/java/cn/pupperclient/ui/component/impl/Slider.java +++ b/src/main/java/cn/pupperclient/ui/component/impl/Slider.java @@ -7,8 +7,8 @@ import cn.pupperclient.skia.font.Fonts; import cn.pupperclient.ui.component.Component; import cn.pupperclient.ui.component.handler.impl.SliderHandler; -import cn.pupperclient.utils.ColorUtils; -import cn.pupperclient.utils.MathUtils; +import cn.pupperclient.utils.color.ColorUtils; +import cn.pupperclient.utils.math.MathUtils; import cn.pupperclient.utils.mouse.MouseUtils; public class Slider extends Component { diff --git a/src/main/java/cn/pupperclient/ui/component/impl/Switch.java b/src/main/java/cn/pupperclient/ui/component/impl/Switch.java index 2e4e40c..c8bec74 100644 --- a/src/main/java/cn/pupperclient/ui/component/impl/Switch.java +++ b/src/main/java/cn/pupperclient/ui/component/impl/Switch.java @@ -10,7 +10,7 @@ import cn.pupperclient.skia.Skia; import cn.pupperclient.ui.component.Component; import cn.pupperclient.ui.component.handler.impl.SwitchHandler; -import cn.pupperclient.utils.ColorUtils; +import cn.pupperclient.utils.color.ColorUtils; import cn.pupperclient.utils.mouse.MouseUtils; public class Switch extends Component { diff --git a/src/main/java/cn/pupperclient/ui/component/impl/text/SearchBar.java b/src/main/java/cn/pupperclient/ui/component/impl/text/SearchBar.java index ab10381..1656c05 100644 --- a/src/main/java/cn/pupperclient/ui/component/impl/text/SearchBar.java +++ b/src/main/java/cn/pupperclient/ui/component/impl/text/SearchBar.java @@ -13,7 +13,7 @@ import cn.pupperclient.skia.font.Fonts; import cn.pupperclient.skia.font.Icon; import cn.pupperclient.ui.component.Component; -import cn.pupperclient.utils.ColorUtils; +import cn.pupperclient.utils.color.ColorUtils; import cn.pupperclient.utils.language.I18n; import cn.pupperclient.utils.mouse.MouseUtils; diff --git a/src/main/java/cn/pupperclient/ui/component/impl/text/TextField.java b/src/main/java/cn/pupperclient/ui/component/impl/text/TextField.java index 7891f0d..9cb09e0 100644 --- a/src/main/java/cn/pupperclient/ui/component/impl/text/TextField.java +++ b/src/main/java/cn/pupperclient/ui/component/impl/text/TextField.java @@ -13,7 +13,7 @@ import cn.pupperclient.skia.font.Fonts; import cn.pupperclient.ui.component.Component; import cn.pupperclient.ui.component.handler.impl.TextHandler; -import cn.pupperclient.utils.ColorUtils; +import cn.pupperclient.utils.color.ColorUtils; import cn.pupperclient.utils.mouse.MouseUtils; public class TextField extends Component { diff --git a/src/main/java/cn/pupperclient/ui/component/impl/text/TextInputHelper.java b/src/main/java/cn/pupperclient/ui/component/impl/text/TextInputHelper.java index 24b05ce..411ecde 100644 --- a/src/main/java/cn/pupperclient/ui/component/impl/text/TextInputHelper.java +++ b/src/main/java/cn/pupperclient/ui/component/impl/text/TextInputHelper.java @@ -2,7 +2,7 @@ import org.lwjgl.glfw.GLFW; -import cn.pupperclient.utils.MathUtils; +import cn.pupperclient.utils.math.MathUtils; import net.minecraft.client.MinecraftClient; import net.minecraft.util.StringHelper; diff --git a/src/main/java/cn/pupperclient/utils/ColorUtils.java b/src/main/java/cn/pupperclient/utils/ColorUtils.java deleted file mode 100644 index f94f8c9..0000000 --- a/src/main/java/cn/pupperclient/utils/ColorUtils.java +++ /dev/null @@ -1,72 +0,0 @@ -package cn.pupperclient.utils; - -import java.awt.Color; -import java.util.regex.Pattern; - -public class ColorUtils { - - public static Color getColorFromInt(int color) { - - float r = (float) (color >> 16 & 255) / 255.0F; - float g = (float) (color >> 8 & 255) / 255.0F; - float b = (float) (color & 255) / 255.0F; - float a = (float) (color >> 24 & 255) / 255.0F; - - return new Color(r, g, b, a); - } - - public static Color blend(Color color1, Color color2, double ratio) { - float r = (float) ratio; - float ir = 1.0f - r; - float[] rgb1 = new float[3]; - float[] rgb2 = new float[3]; - color1.getColorComponents(rgb1); - color2.getColorComponents(rgb2); - return new Color(rgb1[0] * r + rgb2[0] * ir, rgb1[1] * r + rgb2[1] * ir, rgb1[2] * r + rgb2[2] * ir); - } - - public static String removeColorCode(String text) { - return Pattern.compile("\\u00a7[0-9a-fklmnor]").matcher(text).replaceAll(""); - } - - public static Color applyAlpha(Color color, int alpha) { - - int red = color.getRed(); - int green = color.getGreen(); - int blue = color.getBlue(); - - return new Color(red, green, blue, MathUtils.clamp(alpha, 0, 255)); - } - - public static Color applyAlpha(Color color, float alpha) { - return applyAlpha(color, (int) (alpha * 255)); - } - - public static Color interpolateColors(int speed, int index, Color start, Color end) { - - int angle = (int) (((System.currentTimeMillis()) / speed + index) % 360); - angle = (angle >= 180 ? 360 - angle : angle) * 2; - - return ColorUtils.interpolateColorHue(start, end, angle / 360f); - } - - private static Color interpolateColorHue(Color color1, Color color2, float amount) { - - amount = Math.min(1, Math.max(0, amount)); - - float[] color1HSB = Color.RGBtoHSB(color1.getRed(), color1.getGreen(), color1.getBlue(), null); - float[] color2HSB = Color.RGBtoHSB(color2.getRed(), color2.getGreen(), color2.getBlue(), null); - - Color resultColor = Color.getHSBColor(MathUtils.interpolateFloat(color1HSB[0], color2HSB[0], amount), MathUtils.interpolateFloat(color1HSB[1], color2HSB[1], amount), MathUtils.interpolateFloat(color1HSB[2], color2HSB[2], amount)); - - return new Color(resultColor.getRed(), resultColor.getGreen(), resultColor.getBlue(), MathUtils.interpolateInt(color1.getAlpha(), color2.getAlpha(), amount)); - } - - public static Color interpolateColor(Color surfaceContainer, Color surfaceContainerHigh, float hoverValue) { - return ColorUtils.interpolateColors(200, 0, surfaceContainer, surfaceContainerHigh); - } - - public static Color withAlpha(Color surfaceVariant, float v) { - return ColorUtils.applyAlpha(surfaceVariant, v); - } -} diff --git a/src/main/java/cn/pupperclient/utils/RandomUtils.java b/src/main/java/cn/pupperclient/utils/RandomUtils.java deleted file mode 100644 index 4febc22..0000000 --- a/src/main/java/cn/pupperclient/utils/RandomUtils.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.pupperclient.utils; - -import java.util.concurrent.ThreadLocalRandom; - -public class RandomUtils { - - public static int getRandomInt(int min, int max) { - return ThreadLocalRandom.current().nextInt(min, max + 1); - } - - public static long getRandomLong(int min, int max) { - return ThreadLocalRandom.current().nextLong(min, max + 1); - } -} diff --git a/src/main/java/cn/pupperclient/utils/ScreenInfo.java b/src/main/java/cn/pupperclient/utils/ScreenInfo.java deleted file mode 100644 index 1099622..0000000 --- a/src/main/java/cn/pupperclient/utils/ScreenInfo.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.pupperclient.utils; - -import java.awt.Dimension; -import java.awt.Toolkit; - -public class ScreenInfo { - private static final Toolkit toolkit = Toolkit.getDefaultToolkit(); - private static final Dimension screenSize = toolkit.getScreenSize(); - private static final int screenWidth = screenSize.width; - private static final int screenHeight = screenSize.height; - private static final int screenResolution = toolkit.getScreenResolution(); - - public static int getScreenWidth() { - return screenWidth; - } - - public static int getScreenHeight() { - return screenHeight; - } - - public static int getScreenResolution() { - return screenResolution; - } -} diff --git a/src/main/java/cn/pupperclient/utils/ChatUtils.java b/src/main/java/cn/pupperclient/utils/chat/ChatUtils.java similarity index 98% rename from src/main/java/cn/pupperclient/utils/ChatUtils.java rename to src/main/java/cn/pupperclient/utils/chat/ChatUtils.java index 0f904f4..c55ac1a 100644 --- a/src/main/java/cn/pupperclient/utils/ChatUtils.java +++ b/src/main/java/cn/pupperclient/utils/chat/ChatUtils.java @@ -1,4 +1,4 @@ -package cn.pupperclient.utils; +package cn.pupperclient.utils.chat; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.hud.ChatHud; diff --git a/src/main/java/cn/pupperclient/utils/color/ColorUtils.java b/src/main/java/cn/pupperclient/utils/color/ColorUtils.java new file mode 100644 index 0000000..3adc46a --- /dev/null +++ b/src/main/java/cn/pupperclient/utils/color/ColorUtils.java @@ -0,0 +1,77 @@ +package cn.pupperclient.utils.color; + +import cn.pupperclient.utils.math.MathUtils; + +import java.awt.Color; +import java.util.regex.Pattern; + +public class ColorUtils { + + public static Color getColorFromInt(int color) { + + float r = (float) (color >> 16 & 255) / 255.0F; + float g = (float) (color >> 8 & 255) / 255.0F; + float b = (float) (color & 255) / 255.0F; + float a = (float) (color >> 24 & 255) / 255.0F; + + return new Color(r, g, b, a); + } + + public static Color blend(Color color1, Color color2, double ratio) { + float r = (float) ratio; + float ir = 1.0f - r; + float[] rgb1 = new float[3]; + float[] rgb2 = new float[3]; + color1.getColorComponents(rgb1); + color2.getColorComponents(rgb2); + return new Color(rgb1[0] * r + rgb2[0] * ir, rgb1[1] * r + rgb2[1] * ir, rgb1[2] * r + rgb2[2] * ir); + } + + public static String removeColorCode(String text) { + return Pattern.compile("\\u00a7[0-9a-fklmnor]").matcher(text).replaceAll(""); + } + + public static Color applyAlpha(Color color, int alpha) { + + int red = color.getRed(); + int green = color.getGreen(); + int blue = color.getBlue(); + + return new Color(red, green, blue, MathUtils.clamp(alpha, 0, 255)); + } + + public static Color applyAlpha(Color color, float alpha) { + return applyAlpha(color, (int) (alpha * 255)); + } + + public static Color interpolate(Color start, Color end, float amount) { + amount = MathUtils.clamp(amount, 0, 1); + + float[] startHSB = Color.RGBtoHSB(start.getRed(), start.getGreen(), start.getBlue(), null); + float[] endHSB = Color.RGBtoHSB(end.getRed(), end.getGreen(), end.getBlue(), null); + + Color resultColor = Color.getHSBColor( + MathUtils.interpolateFloat(startHSB[0], endHSB[0], amount), + MathUtils.interpolateFloat(startHSB[1], endHSB[1], amount), + MathUtils.interpolateFloat(startHSB[2], endHSB[2], amount) + ); + + return new Color( + resultColor.getRed(), + resultColor.getGreen(), + resultColor.getBlue(), + MathUtils.interpolateInt(start.getAlpha(), end.getAlpha(), amount) + ); + } + + public static Color rainbow(int speed, int index) { + int angle = (int) (((System.currentTimeMillis()) / speed + index) % 360); + return Color.getHSBColor(angle / 360f, 0.6f, 1f); + } + + public static Color oscillate(Color start, Color end, int speed, int index) { + int angle = (int) (((System.currentTimeMillis()) / speed + index) % 360); + float amount = (angle >= 180 ? 360 - angle : angle) / 180f; + return interpolate(start, end, amount); + } +} diff --git a/src/main/java/cn/pupperclient/utils/file/dialog/SoarFileDialog.java b/src/main/java/cn/pupperclient/utils/file/FileDialog.java similarity index 94% rename from src/main/java/cn/pupperclient/utils/file/dialog/SoarFileDialog.java rename to src/main/java/cn/pupperclient/utils/file/FileDialog.java index a8765f7..8cb9299 100644 --- a/src/main/java/cn/pupperclient/utils/file/dialog/SoarFileDialog.java +++ b/src/main/java/cn/pupperclient/utils/file/FileDialog.java @@ -1,4 +1,4 @@ -package cn.pupperclient.utils.file.dialog; +package cn.pupperclient.utils.file; import java.io.File; import java.nio.ByteBuffer; @@ -11,7 +11,7 @@ import it.unimi.dsi.fastutil.objects.ObjectObjectImmutablePair; -public class SoarFileDialog { +public class FileDialog { public static ObjectObjectImmutablePair chooseFile(String name, String... extensions) { diff --git a/src/main/java/cn/pupperclient/utils/file/FileUtils.java b/src/main/java/cn/pupperclient/utils/file/FileUtils.java index 5cddb56..85116f6 100644 --- a/src/main/java/cn/pupperclient/utils/file/FileUtils.java +++ b/src/main/java/cn/pupperclient/utils/file/FileUtils.java @@ -19,6 +19,7 @@ public class FileUtils { public static void deleteDirectory(Path directory) throws IOException { + if (!Files.exists(directory)) return; Files.walkFileTree(directory, new SimpleFileVisitor() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { @@ -28,9 +29,7 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { - if (!dir.equals(directory)) { - Files.delete(dir); - } + Files.delete(dir); return FileVisitResult.CONTINUE; } }); @@ -107,40 +106,40 @@ private static File newFile(File destinationDir, ZipEntry zipEntry) throws IOExc } public static String getMd5Checksum(File file) throws IOException, NoSuchAlgorithmException { - MessageDigest md = MessageDigest.getInstance("MD5"); - FileInputStream fis = new FileInputStream(file); - DigestInputStream dis = new DigestInputStream(fis, md); - - byte[] buffer = new byte[8192]; - int bytesRead; - - while ((bytesRead = dis.read(buffer)) != -1) { - md.update(buffer, 0, bytesRead); - } + try (FileInputStream fis = new FileInputStream(file); + DigestInputStream dis = new DigestInputStream(fis, md)) { - byte[] digest = md.digest(); + byte[] buffer = new byte[8192]; + while (dis.read(buffer) != -1) { + // md is updated by DigestInputStream + } - StringBuilder result = new StringBuilder(); - for (byte b : digest) { - result.append(String.format("%02x", b)); + byte[] digest = md.digest(); + StringBuilder result = new StringBuilder(); + for (byte b : digest) { + result.append(String.format("%02x", b)); + } + return result.toString(); } - - dis.close(); - fis.close(); - - return result.toString(); } public static void createFile(File file) { try { - file.createNewFile(); + if (file.getParentFile() != null && !file.getParentFile().exists()) { + file.getParentFile().mkdirs(); + } + if (!file.exists()) { + file.createNewFile(); + } } catch (IOException e) { - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("FileUtils", "Failed to create file: " + file.getAbsolutePath(), e); } } public static void createDir(File file) { - file.mkdir(); + if (!file.exists()) { + file.mkdirs(); + } } } diff --git a/src/main/java/cn/pupperclient/utils/HttpUtils.java b/src/main/java/cn/pupperclient/utils/http/HttpUtils.java similarity index 98% rename from src/main/java/cn/pupperclient/utils/HttpUtils.java rename to src/main/java/cn/pupperclient/utils/http/HttpUtils.java index c85b89f..6921447 100644 --- a/src/main/java/cn/pupperclient/utils/HttpUtils.java +++ b/src/main/java/cn/pupperclient/utils/http/HttpUtils.java @@ -1,4 +1,4 @@ -package cn.pupperclient.utils; +package cn.pupperclient.utils.http; import java.io.BufferedReader; import java.io.IOException; diff --git a/src/main/java/cn/pupperclient/utils/language/I18n.java b/src/main/java/cn/pupperclient/utils/language/I18n.java index f135112..ff30db5 100644 --- a/src/main/java/cn/pupperclient/utils/language/I18n.java +++ b/src/main/java/cn/pupperclient/utils/language/I18n.java @@ -10,6 +10,7 @@ public final class I18n { private static final Map translateMap = new HashMap<>(); + private static final Map fallbackMap = new HashMap<>(); private static Language currentLanguage; private I18n() { @@ -17,27 +18,32 @@ private I18n() { public static void setLanguage(Language language) { currentLanguage = language; - load(language); + load(language, translateMap); + if (language != Language.ENGLISH) { + load(Language.ENGLISH, fallbackMap); + } else { + fallbackMap.clear(); + } } - private static void load(Language language) { + private static void load(Language language, Map map) { String resourcePath = String.format("assets/pupper/languages/%s.lang", language.getId()); - translateMap.clear(); + map.clear(); try (BufferedReader reader = new BufferedReader(new InputStreamReader( Objects.requireNonNull(I18n.class.getClassLoader().getResourceAsStream(resourcePath), "Language file not found: " + resourcePath), StandardCharsets.UTF_8))) { reader.lines().filter(line -> !line.isEmpty() && !line.startsWith("#")).map(line -> line.split("=", 2)) .filter(parts -> parts.length == 2) - .forEach(parts -> translateMap.put(parts[0].trim(), parts[1].trim())); + .forEach(parts -> map.put(parts[0].trim(), parts[1].trim())); } catch (Exception e) { - e.printStackTrace(); + cn.pupperclient.PupperLogger.error("I18n", "Failed to load language: " + language.getId(), e); } } public static String get(String key) { - return translateMap.getOrDefault(key, "null"); + return translateMap.getOrDefault(key, fallbackMap.getOrDefault(key, key)); } public static Language getCurrentLanguage() { diff --git a/src/main/java/cn/pupperclient/utils/MathUtils.java b/src/main/java/cn/pupperclient/utils/math/MathUtils.java similarity index 61% rename from src/main/java/cn/pupperclient/utils/MathUtils.java rename to src/main/java/cn/pupperclient/utils/math/MathUtils.java index 37ba33f..c821b4b 100644 --- a/src/main/java/cn/pupperclient/utils/MathUtils.java +++ b/src/main/java/cn/pupperclient/utils/math/MathUtils.java @@ -1,14 +1,12 @@ -package cn.pupperclient.utils; +package cn.pupperclient.utils.math; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; public class MathUtils { - public static final Random random = new Random(); public static float roundToPlace(double value, int places) { - if (places < 0) { throw new IllegalArgumentException(); } @@ -35,14 +33,22 @@ public static Double interpolate(double oldValue, double newValue, double interp } public static float interpolateFloat(float oldValue, float newValue, double interpolationValue){ - return interpolate(oldValue, newValue, (float) interpolationValue).floatValue(); + return interpolate(oldValue, newValue, interpolationValue).floatValue(); } public static int interpolateInt(int oldValue, int newValue, double interpolationValue){ - return interpolate(oldValue, newValue, (float) interpolationValue).intValue(); + return interpolate(oldValue, newValue, interpolationValue).intValue(); + } + + public static double getRandomDouble(double min, double max) { + return min >= max ? min : ThreadLocalRandom.current().nextDouble(min, max); + } + + public static int getRandomInt(int min, int max) { + return min >= max ? min : ThreadLocalRandom.current().nextInt(min, max + 1); } - public static double getRandomDoubleInRange(double minDouble, double maxDouble) { - return minDouble >= maxDouble ? minDouble : random.nextDouble() * (maxDouble - minDouble) + minDouble; + public static long getRandomLong(long min, long max) { + return min >= max ? min : ThreadLocalRandom.current().nextLong(min, max + 1); } } diff --git a/src/main/java/cn/pupperclient/utils/IMinecraft.java b/src/main/java/cn/pupperclient/utils/minecraft/interfaces/IMinecraft.java similarity index 72% rename from src/main/java/cn/pupperclient/utils/IMinecraft.java rename to src/main/java/cn/pupperclient/utils/minecraft/interfaces/IMinecraft.java index 52da1b5..c61e00c 100644 --- a/src/main/java/cn/pupperclient/utils/IMinecraft.java +++ b/src/main/java/cn/pupperclient/utils/minecraft/interfaces/IMinecraft.java @@ -1,4 +1,4 @@ -package cn.pupperclient.utils; +package cn.pupperclient.utils.minecraft.interfaces; import net.minecraft.client.MinecraftClient; diff --git a/src/main/java/cn/pupperclient/utils/HealthUtils.java b/src/main/java/cn/pupperclient/utils/minecraft/player/HealthUtils.java similarity index 96% rename from src/main/java/cn/pupperclient/utils/HealthUtils.java rename to src/main/java/cn/pupperclient/utils/minecraft/player/HealthUtils.java index e001d1d..9bff7ce 100644 --- a/src/main/java/cn/pupperclient/utils/HealthUtils.java +++ b/src/main/java/cn/pupperclient/utils/minecraft/player/HealthUtils.java @@ -1,8 +1,7 @@ -package cn.pupperclient.utils; +package cn.pupperclient.utils.minecraft.player; import net.minecraft.client.MinecraftClient; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.scoreboard.Scoreboard; import net.minecraft.scoreboard.ScoreboardDisplaySlot; import net.minecraft.scoreboard.ScoreboardObjective; diff --git a/src/main/java/cn/pupperclient/utils/SkinUtils.java b/src/main/java/cn/pupperclient/utils/minecraft/player/SkinUtils.java similarity index 91% rename from src/main/java/cn/pupperclient/utils/SkinUtils.java rename to src/main/java/cn/pupperclient/utils/minecraft/player/SkinUtils.java index 3883c38..15e43d9 100644 --- a/src/main/java/cn/pupperclient/utils/SkinUtils.java +++ b/src/main/java/cn/pupperclient/utils/minecraft/player/SkinUtils.java @@ -1,4 +1,4 @@ -package cn.pupperclient.utils; +package cn.pupperclient.utils.minecraft.player; import java.io.File; diff --git a/src/main/java/cn/pupperclient/utils/JsonUtils.java b/src/main/java/cn/pupperclient/utils/misc/JsonUtils.java similarity index 98% rename from src/main/java/cn/pupperclient/utils/JsonUtils.java rename to src/main/java/cn/pupperclient/utils/misc/JsonUtils.java index 8f409f3..cca9604 100644 --- a/src/main/java/cn/pupperclient/utils/JsonUtils.java +++ b/src/main/java/cn/pupperclient/utils/misc/JsonUtils.java @@ -1,4 +1,4 @@ -package cn.pupperclient.utils; +package cn.pupperclient.utils.misc; import java.util.regex.Pattern; diff --git a/src/main/java/cn/pupperclient/utils/RomanConverter.java b/src/main/java/cn/pupperclient/utils/misc/RomanConverter.java similarity index 94% rename from src/main/java/cn/pupperclient/utils/RomanConverter.java rename to src/main/java/cn/pupperclient/utils/misc/RomanConverter.java index 7d25d80..5ec5871 100644 --- a/src/main/java/cn/pupperclient/utils/RomanConverter.java +++ b/src/main/java/cn/pupperclient/utils/misc/RomanConverter.java @@ -1,4 +1,4 @@ -package cn.pupperclient.utils; +package cn.pupperclient.utils.misc; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/cn/pupperclient/utils/SearchUtils.java b/src/main/java/cn/pupperclient/utils/misc/SearchUtils.java similarity index 97% rename from src/main/java/cn/pupperclient/utils/SearchUtils.java rename to src/main/java/cn/pupperclient/utils/misc/SearchUtils.java index 68d60b9..55fb996 100644 --- a/src/main/java/cn/pupperclient/utils/SearchUtils.java +++ b/src/main/java/cn/pupperclient/utils/misc/SearchUtils.java @@ -1,4 +1,4 @@ -package cn.pupperclient.utils; +package cn.pupperclient.utils.misc; import java.util.Locale; diff --git a/src/main/java/cn/pupperclient/utils/SoundEventHelper.java b/src/main/java/cn/pupperclient/utils/misc/SoundEventHelper.java similarity index 93% rename from src/main/java/cn/pupperclient/utils/SoundEventHelper.java rename to src/main/java/cn/pupperclient/utils/misc/SoundEventHelper.java index 177695d..c59eb3d 100644 --- a/src/main/java/cn/pupperclient/utils/SoundEventHelper.java +++ b/src/main/java/cn/pupperclient/utils/misc/SoundEventHelper.java @@ -1,4 +1,4 @@ -package cn.pupperclient.utils; +package cn.pupperclient.utils.misc; import net.minecraft.entity.Entity; import net.minecraft.sound.SoundEvent; diff --git a/src/main/java/cn/pupperclient/utils/ImageUtils.java b/src/main/java/cn/pupperclient/utils/render/ImageUtils.java similarity index 96% rename from src/main/java/cn/pupperclient/utils/ImageUtils.java rename to src/main/java/cn/pupperclient/utils/render/ImageUtils.java index cda9733..e90e330 100644 --- a/src/main/java/cn/pupperclient/utils/ImageUtils.java +++ b/src/main/java/cn/pupperclient/utils/render/ImageUtils.java @@ -1,4 +1,4 @@ -package cn.pupperclient.utils; +package cn.pupperclient.utils.render; import java.awt.Color; import java.awt.image.BufferedImage; diff --git a/src/main/java/cn/pupperclient/utils/RippleEffect.java b/src/main/java/cn/pupperclient/utils/render/RippleEffect.java similarity index 97% rename from src/main/java/cn/pupperclient/utils/RippleEffect.java rename to src/main/java/cn/pupperclient/utils/render/RippleEffect.java index 240b88e..c78b141 100644 --- a/src/main/java/cn/pupperclient/utils/RippleEffect.java +++ b/src/main/java/cn/pupperclient/utils/render/RippleEffect.java @@ -1,4 +1,4 @@ -package cn.pupperclient.utils; +package cn.pupperclient.utils.render; public class RippleEffect { diff --git a/src/main/java/cn/pupperclient/utils/ExternalToolManager.java b/src/main/java/cn/pupperclient/utils/system/ExternalToolManager.java similarity index 99% rename from src/main/java/cn/pupperclient/utils/ExternalToolManager.java rename to src/main/java/cn/pupperclient/utils/system/ExternalToolManager.java index 683be33..60eee91 100644 --- a/src/main/java/cn/pupperclient/utils/ExternalToolManager.java +++ b/src/main/java/cn/pupperclient/utils/system/ExternalToolManager.java @@ -1,4 +1,4 @@ -package cn.pupperclient.utils; +package cn.pupperclient.utils.system; import cn.pupperclient.PupperClient; @@ -494,7 +494,7 @@ public boolean verify(String hostname, SSLSession session) { } }); } catch (Exception e) { - e.printStackTrace(); + PupperClient.LOGGER.error("Failed to disable SSL certificate checking: {}", e.getMessage(), e); } } } diff --git a/src/main/java/cn/pupperclient/utils/JNAWindowChecker.java b/src/main/java/cn/pupperclient/utils/system/JNAWindowChecker.java similarity index 98% rename from src/main/java/cn/pupperclient/utils/JNAWindowChecker.java rename to src/main/java/cn/pupperclient/utils/system/JNAWindowChecker.java index 6e6da40..a9031fc 100644 --- a/src/main/java/cn/pupperclient/utils/JNAWindowChecker.java +++ b/src/main/java/cn/pupperclient/utils/system/JNAWindowChecker.java @@ -1,4 +1,4 @@ -package cn.pupperclient.utils; +package cn.pupperclient.utils.system; import com.sun.jna.Native; import com.sun.jna.platform.win32.User32; diff --git a/src/main/java/cn/pupperclient/utils/OS.java b/src/main/java/cn/pupperclient/utils/system/OS.java similarity index 96% rename from src/main/java/cn/pupperclient/utils/OS.java rename to src/main/java/cn/pupperclient/utils/system/OS.java index 262d380..7972f9c 100644 --- a/src/main/java/cn/pupperclient/utils/OS.java +++ b/src/main/java/cn/pupperclient/utils/system/OS.java @@ -1,4 +1,4 @@ -package cn.pupperclient.utils; +package cn.pupperclient.utils.system; public enum OS { WINDOWS("win"), diff --git a/src/main/java/cn/pupperclient/utils/ToolInstallCallback.java b/src/main/java/cn/pupperclient/utils/system/ToolInstallCallback.java similarity index 84% rename from src/main/java/cn/pupperclient/utils/ToolInstallCallback.java rename to src/main/java/cn/pupperclient/utils/system/ToolInstallCallback.java index daffc36..08c9ea7 100644 --- a/src/main/java/cn/pupperclient/utils/ToolInstallCallback.java +++ b/src/main/java/cn/pupperclient/utils/system/ToolInstallCallback.java @@ -1,4 +1,4 @@ -package cn.pupperclient.utils; +package cn.pupperclient.utils.system; import cn.pupperclient.PupperClient; diff --git a/src/main/java/cn/pupperclient/utils/Multithreading.java b/src/main/java/cn/pupperclient/utils/thread/Multithreading.java similarity index 96% rename from src/main/java/cn/pupperclient/utils/Multithreading.java rename to src/main/java/cn/pupperclient/utils/thread/Multithreading.java index 0ff8d8f..3661ba3 100644 --- a/src/main/java/cn/pupperclient/utils/Multithreading.java +++ b/src/main/java/cn/pupperclient/utils/thread/Multithreading.java @@ -1,7 +1,7 @@ -package cn.pupperclient.utils; +package cn.pupperclient.utils.thread; import java.util.concurrent.*; -import java.util.concurrent.atomic.AtomicInteger; + import com.google.common.util.concurrent.ThreadFactoryBuilder; import net.minecraft.client.MinecraftClient; diff --git a/src/main/java/cn/pupperclient/utils/TimerUtils.java b/src/main/java/cn/pupperclient/utils/time/TimerUtils.java similarity index 95% rename from src/main/java/cn/pupperclient/utils/TimerUtils.java rename to src/main/java/cn/pupperclient/utils/time/TimerUtils.java index 6aa38ec..a0f563a 100644 --- a/src/main/java/cn/pupperclient/utils/TimerUtils.java +++ b/src/main/java/cn/pupperclient/utils/time/TimerUtils.java @@ -1,4 +1,4 @@ -package cn.pupperclient.utils; +package cn.pupperclient.utils.time; public class TimerUtils { diff --git a/src/main/java/cn/pupperclient/utils/translate/Translator.java b/src/main/java/cn/pupperclient/utils/translate/Translator.java deleted file mode 100644 index f630d9c..0000000 --- a/src/main/java/cn/pupperclient/utils/translate/Translator.java +++ /dev/null @@ -1,102 +0,0 @@ -package cn.pupperclient.utils.translate; - -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.net.HttpURLConnection; -import java.net.URI; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.StringJoiner; - -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import cn.pupperclient.utils.TimerUtils; - -public class Translator { - - private static String authCache; - private static TimerUtils timer; - - public static final String AUTO_DETECT = ""; - public static final String ENGLISH = "en"; - public static final String JAPANESE = "ja"; - public static final String CHINESE_SIMPLIFIED = "zh-Hans"; - public static final String CHINESE_TRADITIONAL = "zh-Hant"; - public static final String POLISH = "pl"; - - private static String auth() throws Exception { - - if (timer == null) { - timer = new TimerUtils(); - } - - if (timer.delay(300 * 1000) || authCache == null) { - - URL url = new URI("https://edge.microsoft.com/translate/auth").toURL(); - HttpURLConnection con = (HttpURLConnection) url.openConnection(); - con.setRequestMethod("GET"); - - BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); - String inputLine; - StringBuffer content = new StringBuffer(); - - while ((inputLine = in.readLine()) != null) { - content.append(inputLine); - } - - in.close(); - - authCache = content.toString(); - return authCache; - } - - return authCache; - } - - public static String translate(String text, String from, String to) throws Exception { - - URL url = new URI("https://api.cognitive.microsofttranslator.com/translate?from=" + from + "&to=" + to - + "&api-version=3.0&includeSentenceLength=true").toURL(); - HttpURLConnection con = (HttpURLConnection) url.openConnection(); - con.setRequestMethod("POST"); - con.setRequestProperty("Content-Type", "application/json"); - con.setRequestProperty("authorization", "Bearer " + auth()); - - StringJoiner sj = new StringJoiner(",", "[", "]"); - sj.add("{\"Text\":\"" + text + "\"}"); - - String jsonInputString = sj.toString(); - - con.setDoOutput(true); - OutputStream os = con.getOutputStream(); - byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8); - os.write(input, 0, input.length); - - BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), StandardCharsets.UTF_8)); - String responseLine; - StringBuilder responseContent = new StringBuilder(); - while ((responseLine = br.readLine()) != null) { - responseContent.append(responseLine.trim()); - } - br.close(); - - Gson gson = new Gson(); - JsonArray jsonArray = gson.fromJson(responseContent.toString(), JsonArray.class); - - StringBuilder sb = new StringBuilder(); - for (JsonElement json : jsonArray) { - JsonObject jsonObject = json.getAsJsonObject(); - JsonArray translations = jsonObject.getAsJsonArray("translations"); - for (JsonElement trans : translations) { - JsonObject translation = trans.getAsJsonObject(); - sb.append(translation.get("text").getAsString()); - sb.append(","); - } - } - - return sb.toString().replaceAll(",$", ""); - } -} diff --git a/src/main/resources/pupper.mixins.json b/src/main/resources/pupper.mixins.json index 33624a3..7953246 100644 --- a/src/main/resources/pupper.mixins.json +++ b/src/main/resources/pupper.mixins.json @@ -29,7 +29,6 @@ "minecraft.client.sound.MixinSoundSystem", "minecraft.client.util.MixinWindow", "minecraft.entity.MixinAbstractClientPlayerEntity", - "minecraft.entity.MixinClientPlayerEntity", "minecraft.entity.MixinEntity", "minecraft.entity.MixinLivingEntity", "minecraft.entity.MixinPlayerEntity", @@ -42,9 +41,5 @@ ], "injectors": { "defaultRequire": 1 - }, - "mixins": [ - "minecraft.network.MixinClientPlayerInteractionManager", - "minecraft.world.MixinItem" - ] + } }