From e86477003b0958b98dd415773967610331a549cd Mon Sep 17 00:00:00 2001 From: Zacharias Date: Sat, 15 Jul 2023 12:49:55 +0200 Subject: [PATCH] Moved Client code to Client.java Moved Config screen code to ConfigMenu.java Made a correct check for if the mod is run on a server or a client to not crash server due to invalid DIST Removed unused imports Updated to minor 3.2 --- .../java/me/zacharias/speedometer/Client.java | 347 +++++++++++++ .../me/zacharias/speedometer/ConfigMenu.java | 140 +++++ .../me/zacharias/speedometer/MeterImages.java | 1 - .../me/zacharias/speedometer/Speedometer.java | 486 +----------------- .../zacharias/speedometer/fabric/Config.java | 11 +- gradle.properties | 2 +- 6 files changed, 507 insertions(+), 480 deletions(-) create mode 100644 common/src/main/java/me/zacharias/speedometer/Client.java create mode 100644 common/src/main/java/me/zacharias/speedometer/ConfigMenu.java diff --git a/common/src/main/java/me/zacharias/speedometer/Client.java b/common/src/main/java/me/zacharias/speedometer/Client.java new file mode 100644 index 0000000..bc948d0 --- /dev/null +++ b/common/src/main/java/me/zacharias/speedometer/Client.java @@ -0,0 +1,347 @@ +package me.zacharias.speedometer; + +import com.mojang.blaze3d.platform.InputConstants; +import dev.architectury.event.events.client.ClientGuiEvent; +import dev.architectury.event.events.client.ClientTickEvent; +import dev.architectury.platform.Platform; +import dev.architectury.registry.client.keymappings.KeyMappingRegistry; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.animal.Pig; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.entity.vehicle.Minecart; +import net.minecraft.world.phys.Vec3; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Objects; + +import static me.zacharias.speedometer.Speedometer.LOGGER; + +public class Client { + public static final KeyMapping CONFIG_KEY = new KeyMapping( + "speedometer.key.configKey", + InputConstants.Type.KEYSYM, + InputConstants.KEY_O, + "speedometer.key.category" + ); + public static final KeyMapping DEBUG_KEY = new KeyMapping( + "speedometer.key.debugKey", + InputConstants.Type.KEYSYM, + InputConstants.KEY_F6, + "speedometer.key.category" + ); + + private static final ArrayList speeds = new ArrayList<>(); + private static boolean speedometerVisualDisplayFailed = false; + public static BufferedImage img = null; + + public static void init(){ + KeyMappingRegistry.register(CONFIG_KEY); + ClientTickEvent.CLIENT_POST.register(minecraft -> { + if(CONFIG_KEY.consumeClick()){ + Minecraft.getInstance().setScreen(ConfigMenu.getConfig(Minecraft.getInstance().screen).build()); + } + }); + + KeyMappingRegistry.register(DEBUG_KEY); + ClientTickEvent.CLIENT_POST.register(minecraft -> { + if(DEBUG_KEY.consumeClick()){ + Config.setDebug(!Config.isDebug()); + } + }); + + Config.initialize(); + Config.save(); + + ClientGuiEvent.RENDER_HUD.register(Client::render); + + try { + img = ImageIO.read(Objects.requireNonNull(Speedometer.class.getResourceAsStream("/assets/speedometer/meter/meter-19.png"))); + }catch (NullPointerException | IOException e){ + LOGGER.warn("Can't load speedometer icon. speedometer visual display is disabled"); + speedometerVisualDisplayFailed = true; + } + + if(img == null){ + speedometerVisualDisplayFailed = true; + } + + LOGGER.info("Finished loading speedometer"); + } + + private static void render(GuiGraphics graphics, float tick) { + if(Minecraft.getInstance().player == null) return; + Entity entity = Minecraft.getInstance().player.getRootVehicle(); + + Vec3 vec = entity.getDeltaMovement(); + + double yOffset = 0.0784000015258789D; + double xOffset = 0D; + double zOffset = 0D; + double vOffset = 0D; + + if (entity instanceof Player e) { + if (!e.onGround() && e.isCreative()) { + yOffset = 0; + } else if (e.isInWater()) { + yOffset = 0.005; + } + } else if (entity instanceof Boat || entity instanceof Minecart || entity instanceof Pig) { + yOffset = 0; + } + + double speed = (Math.sqrt(Math.pow(vec.x + xOffset, 2) + Math.pow(vec.y + yOffset, 2) + Math.pow(vec.z + zOffset, 2)) * 20)+vOffset; + double lSpeed = speed; + + if (speeds.size() >= 30) { + speeds.remove(0); + } + speeds.add(speed); + speed = 0; + for (Double aDouble : speeds) { + speed += aDouble; + } + speed = speed / speeds.size(); + + double speedTypeSpeed = 0D; + + SpeedTypes speedType = Config.getSpeedType(); + if (speedType == SpeedTypes.KNOT || (entity instanceof Boat && Config.getUseKnot())) { + speedTypeSpeed = speed * 1.94384449; + }else if (speedType == SpeedTypes.KMPH) { + speedTypeSpeed = speed * 3.6; + } else if (speedType == SpeedTypes.MPH) { + speedTypeSpeed = speed * 2.23693629; + }else { + speedTypeSpeed = speed; + } + + String format = String.format("%.2f", speedTypeSpeed); + + //double v = (Math.pow(1.0233435, speedTypeSpeed)-1)/100; + double v = switch (speedType){ + case KMPH -> Math.pow(speedTypeSpeed,0.87)-1; + case BlockPS, MPS -> Math.pow(speedTypeSpeed,1.25); + case MPH -> speedTypeSpeed; + case KNOT -> Math.pow(speedTypeSpeed,1.05); + }/100; + double i = (v *(316-45))+45; + + if(Config.getVisualSpeedometer() && !speedometerVisualDisplayFailed){ + + //double v = speedTypeSpeed / speedType.gatMaxVisual(); + + MeterImages meterImage = null; + int minDiff = 10000; + + for(MeterImages meterImage1 : MeterImages.values()){ + int diff = Math.abs(meterImage1.getSize()-Config.getImageSize()); + if(minDiff > diff && meterImage1.getImage() != null){ + minDiff = diff; + meterImage = meterImage1; + } + } + + img = meterImage.getImage(); + + int radius = Config.getImageSize()/2-4; + + int x3 = (int) Math.round(radius*Math.cos(Math.toRadians(i+90)))+(Config.getImageSize()/2); + int y3 = (int) Math.round(radius*Math.sin(Math.toRadians(i+90)))+(Config.getImageSize()/2); + + BufferedImage img = ImageHandler.scale(Client.img, Config.getImageSize(), Config.getImageSize()); + Graphics2D g2d = img.createGraphics(); + + g2d.setColor(new Color(138, 0, 0)); + + g2d.setStroke(new BasicStroke(2)); + + g2d.drawLine(x3,y3,img.getWidth()/2,img.getHeight()/2); + + int xPos = getPos(graphics, Config.getXPositionVisual(), 0, false, img.getWidth()); + int yPos = getPos(graphics, Config.getYPositionVisual(), 1, true, img.getHeight()); + + for(int x1 = 0; x1 < img.getWidth(); x1++){ + for(int y1 = 0; y1 < img.getHeight(); y1++){ + int x2 = x1 + xPos - img.getWidth(); + int y2 = y1 + yPos - img.getHeight(); + + int rgb = img.getRGB(x1, y1); + + if(new Color(rgb).equals(Color.black)) continue; + + graphics.fill(x2, y2, x2+1, y2+1, rgb); + } + } + + if(i >= 360+45){ + String string = "x" + (int)Math.floor(i/(365+45)); + graphics.drawString( + Minecraft.getInstance().font, + string, + xPos-Minecraft.getInstance().font.width(string), + (int)(yPos-4.5-(Config.getImageSize()/2)), + new Color(138, 0, 0).getRGB() + ); + } + + }else { + // i -> x + // j -> y + // k -> color RGB int + String speedString = format + " " + SpeedTypes.getName(speedType).getString(); + graphics.drawString( + Minecraft.getInstance().font, + speedString, + getPos(graphics, Config.getXPositionText(), 0, false, Minecraft.getInstance().font.width(speedString)), + getPos(graphics, Config.getYPositionText(), 1, true, Minecraft.getInstance().font.lineHeight), + Config.getColor().getColor() + ); + } + + if(Config.isDebug()){ + String debugData = "Velocity raw:" + "\n" + + " X: " + vec.x + "\n" + + " Y: " + vec.y + "\n" + + " Z: " + vec.z + "\n" + + "Offsets:" + "\n" + + " X: " + xOffset + "\n" + + " Y: " + yOffset + "\n" + + " Z: " + zOffset + "\n" + + " Total: " + vOffset + "\n" + + "Velocity modified:" + "\n" + + " X: " + (vec.x + xOffset) + "\n" + + " Y: " + (vec.y + yOffset) + "\n" + + " Z: " + (vec.z + zOffset) + "\n" + + " Total: " + lSpeed + "\n" + + "Velocity total average: " + speed + "\n" + + "Velocity total in " + speedType.name() + ": " + speedTypeSpeed + "\n" + + "Percentage point of visual speedometer: " + v + "\n" + + "Degree end point: " + (i+45); + + Color color = new Color(255, 255, 255); + + int y = 0; + for(String s : debugData.split("\n")){ + drawString(graphics,0, y, s, color.getRGB()); + y+=Minecraft.getInstance().font.lineHeight+1; + } + } + } + + private static void drawString(GuiGraphics graphics, int x, int y, String text, int colorRGB){ + graphics.drawString( + Minecraft.getInstance().font, + text, + x, + y, + colorRGB + ); + } + + static boolean flag = true; + + private static int getPos(GuiGraphics event, String input, int type, boolean changeFlag, int Size) { + ArrayList passerPose = new ArrayList<>(); + final char[] s = input.toCharArray(); + try{ + for(int i = 0; i passerPose) { + if(type == 0){ + passerPose.add(String.valueOf(event.guiWidth())); + passerPose.add("-"); + passerPose.add("70"); + }else if(type == 1){ + passerPose.add(String.valueOf(event.guiHeight())); + passerPose.add("-"); + passerPose.add("15"); + } + } + + private static boolean testIfInt(char c) { + int i = Integer.parseInt(Character.toString(c)); + return (i == 0 || i == 1 || i == 2 || + i == 3 || i == 4 || i == 5 || + i == 6 || i == 7 || i == 8 || + i == 9); + } +} diff --git a/common/src/main/java/me/zacharias/speedometer/ConfigMenu.java b/common/src/main/java/me/zacharias/speedometer/ConfigMenu.java new file mode 100644 index 0000000..ddec930 --- /dev/null +++ b/common/src/main/java/me/zacharias/speedometer/ConfigMenu.java @@ -0,0 +1,140 @@ +package me.zacharias.speedometer; + +import me.shedaniel.clothconfig2.api.ConfigBuilder; +import me.shedaniel.clothconfig2.api.ConfigCategory; +import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; + +import java.util.Optional; + +public class ConfigMenu { + public static ConfigBuilder getConfig(Screen parent) { + ConfigBuilder builder = ConfigBuilder.create() + .setParentScreen(parent) + .setTitle(Component.translatable("speedometer.config.name")); + + ConfigCategory category = builder.getOrCreateCategory(Component.translatable("speedometer.config.category.name")); + + ConfigEntryBuilder entryBuilder = builder.entryBuilder(); + + category.addEntry(entryBuilder.startEnumSelector(Component.translatable("speedometer.config.speed"), SpeedTypes.class, me.zacharias.speedometer.Config.getSpeedType()) + .setEnumNameProvider(SpeedTypes::getName) + .setSaveConsumer(me.zacharias.speedometer.Config::setSpeedType) + .build() + ); + + category.addEntry(entryBuilder.startColorField(Component.translatable("speedometer.config.color"), me.zacharias.speedometer.Config.getColor()) + .setSaveConsumer2(me.zacharias.speedometer.Config::setColor) + .build() + ); + + category.addEntry(entryBuilder.startBooleanToggle(Component.translatable("speedometer.config.knot"), me.zacharias.speedometer.Config.getUseKnot()) + .setSaveConsumer(me.zacharias.speedometer.Config::setUseKnot) + .setYesNoTextSupplier(useKnot -> Component.translatable("speedometer.useKnot."+useKnot)) + .build() + ); + + category.addEntry(entryBuilder.startBooleanToggle(Component.translatable("speedometer.config.visualSpeedometer"), me.zacharias.speedometer.Config.getVisualSpeedometer()) + .setSaveConsumer(me.zacharias.speedometer.Config::setVisualSpeedometer) + .setYesNoTextSupplier((visualSpeedometer -> Component.translatable("speedometer.visualSpeedometer."+visualSpeedometer))) + .build() + ); + + // Regex + + String xRegex = "W*w*S*s*\\+*-*\\**/*[0-9]*"; + String yRegex = "H*h*S*s*\\+*-*\\**/*[0-9]*"; + + // Text Placement + + category.addEntry(entryBuilder.startStringDropdownMenu(Component.translatable("speedometer.config.xPosition.text"), Config.getXPositionText()) + .setSaveConsumer(Config::setXPositionText) + .setErrorSupplier(xPosition -> { + if(xPosition.matches(xRegex)){ + return Optional.empty(); + }else{ + return Optional.of(Component.translatable("speedometer.invalid")); + } + }) + .setTooltip( + Component.translatable("speedometer.config.tooltip.xPosition.line1"), + Component.translatable("speedometer.config.tooltip.xPosition.line2"), + Component.translatable("speedometer.config.tooltip.xPosition.line3") + ) + .build() + ); + + category.addEntry(entryBuilder.startStringDropdownMenu(Component.translatable("speedometer.config.yPosition.text"), Config.getYPositionText()) + .setSaveConsumer(Config::setYPositionText) + .setErrorSupplier(yPosition -> { + if(yPosition.matches(yRegex)){ + return Optional.empty(); + }else{ + return Optional.of(Component.translatable("speedometer.invalid")); + } + }) + .setTooltip( + Component.translatable("speedometer.config.tooltip.yPosition.line1"), + Component.translatable("speedometer.config.tooltip.yPosition.line2"), + Component.translatable("speedometer.config.tooltip.yPosition.line3") + ) + .build() + ); + + // Visual location + + category.addEntry(entryBuilder.startStringDropdownMenu(Component.translatable("speedometer.config.xPosition.visual"), Config.getXPositionVisual()) + .setSaveConsumer(Config::setXPositionVisual) + .setErrorSupplier(xPosition -> { + if(xPosition.matches(xRegex)){ + return Optional.empty(); + }else{ + return Optional.of(Component.translatable("speedometer.invalid")); + } + }) + .setTooltip( + Component.translatable("speedometer.config.tooltip.xPosition.line1"), + Component.translatable("speedometer.config.tooltip.xPosition.line2"), + Component.translatable("speedometer.config.tooltip.xPosition.line3") + ) + .build() + ); + + category.addEntry(entryBuilder.startStringDropdownMenu(Component.translatable("speedometer.config.yPosition.visual"), Config.getYPositionVisual()) + .setSaveConsumer(Config::setYPositionVisual) + .setErrorSupplier(yPosition -> { + if(yPosition.matches(yRegex)){ + return Optional.empty(); + }else{ + return Optional.of(Component.translatable("speedometer.invalid")); + } + }) + .setTooltip( + Component.translatable("speedometer.config.tooltip.yPosition.line1"), + Component.translatable("speedometer.config.tooltip.yPosition.line2"), + Component.translatable("speedometer.config.tooltip.yPosition.line3") + ) + .build() + ); + + // Size of visual image + + category.addEntry(entryBuilder.startIntField(Component.translatable("speedometer.config.imageSize"), Config.getImageSize()) + .setSaveConsumer(Config::setImageSize) + .setTooltip(Component.translatable("speedometer.config.tooltip.imageSize")) + .build() + ); + + category.addEntry(entryBuilder.startBooleanToggle(Component.translatable("speedometer.config.debug"),Config.isDebug()) + .setSaveConsumer(Config::setDebug) + .setYesNoTextSupplier(isDebug -> Component.translatable("speedometer.debug."+isDebug)) + .setTooltip(Component.translatable("speedometer.config.tooltip.debug")) + .build() + ); + + builder.setSavingRunnable(me.zacharias.speedometer.Config::save); + + return builder; + } +} diff --git a/common/src/main/java/me/zacharias/speedometer/MeterImages.java b/common/src/main/java/me/zacharias/speedometer/MeterImages.java index a035002..ab70340 100644 --- a/common/src/main/java/me/zacharias/speedometer/MeterImages.java +++ b/common/src/main/java/me/zacharias/speedometer/MeterImages.java @@ -4,7 +4,6 @@ import net.minecraft.network.chat.Component; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; -import java.io.IOException; import java.util.Objects; public enum MeterImages { diff --git a/common/src/main/java/me/zacharias/speedometer/Speedometer.java b/common/src/main/java/me/zacharias/speedometer/Speedometer.java index ce50e29..5fc8f94 100644 --- a/common/src/main/java/me/zacharias/speedometer/Speedometer.java +++ b/common/src/main/java/me/zacharias/speedometer/Speedometer.java @@ -1,492 +1,40 @@ package me.zacharias.speedometer; -import com.mojang.blaze3d.platform.InputConstants; - -import dev.architectury.event.events.client.ClientGuiEvent; -import dev.architectury.event.events.client.ClientTickEvent; import dev.architectury.platform.Platform; -import dev.architectury.registry.client.keymappings.KeyMappingRegistry; import dev.architectury.utils.Env; -import me.shedaniel.clothconfig2.api.ConfigBuilder; -import me.shedaniel.clothconfig2.api.ConfigCategory; -import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; - -import net.minecraft.client.KeyMapping; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.animal.Pig; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.vehicle.Boat; -import net.minecraft.world.entity.vehicle.Minecart; -import net.minecraft.world.phys.Vec3; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.util.*; +import java.io.File; +import java.util.Objects; public class Speedometer { public static final String MOD_ID = "speedometer"; public static final Logger LOGGER = LogManager.getLogger(MOD_ID); - - public static final KeyMapping CONFIG_KEY = new KeyMapping( - "speedometer.key.configKey", - InputConstants.Type.KEYSYM, - InputConstants.KEY_O, - "speedometer.key.category" - ); - public static final KeyMapping DEBUG_KEY = new KeyMapping( - "speedometer.key.debugKey", - InputConstants.Type.KEYSYM, - InputConstants.KEY_F6, - "speedometer.key.category" - ); - - private static final ArrayList speeds = new ArrayList<>(); - private static boolean speedometerVisualDisplayFailed = false; - public static BufferedImage img = null; + public static final String VERSION = "3.2"; public static void init() { LOGGER.info("Loading speedometer by Allen"); - if(Platform.getEnvironment() != Env.CLIENT) return; - - KeyMappingRegistry.register(CONFIG_KEY); - ClientTickEvent.CLIENT_POST.register(minecraft -> { - if(CONFIG_KEY.consumeClick()){ - Minecraft.getInstance().setScreen(getConfig(Minecraft.getInstance().screen).build()); - } - }); - - KeyMappingRegistry.register(DEBUG_KEY); - ClientTickEvent.CLIENT_POST.register(minecraft -> { - if(DEBUG_KEY.consumeClick()){ - Config.setDebug(!Config.isDebug()); - } - }); - - Config.initialize(); - Config.save(); - - ClientGuiEvent.RENDER_HUD.register(Speedometer::render); - - try { - img = ImageIO.read(Objects.requireNonNull(Speedometer.class.getResourceAsStream("/assets/speedometer/meter/meter-19.png"))); - }catch (NullPointerException | IOException e){ - LOGGER.warn("Can't load speedometer icon. speedometer visual display is disabled"); - speedometerVisualDisplayFailed = true; - } - - if(img == null){ - speedometerVisualDisplayFailed = true; - } - - LOGGER.info("Finished loading speedometer"); - } - - private static void render(GuiGraphics graphics, float tick) { - if(Minecraft.getInstance().player == null) return; - Entity entity = Minecraft.getInstance().player.getRootVehicle(); - - Vec3 vec = entity.getDeltaMovement(); - - double yOffset = 0.0784000015258789D; - double xOffset = 0D; - double zOffset = 0D; - double vOffset = 0D; - - if (entity instanceof Player e) { - if (!e.onGround() && e.isCreative()) { - yOffset = 0; - } else if (e.isInWater()) { - yOffset = 0.005; - } - } else if (entity instanceof Boat || entity instanceof Minecart || entity instanceof Pig) { - yOffset = 0; - } - - double speed = (Math.sqrt(Math.pow(vec.x + xOffset, 2) + Math.pow(vec.y + yOffset, 2) + Math.pow(vec.z + zOffset, 2)) * 20)+vOffset; - double lSpeed = speed; - - if (speeds.size() >= 30) { - speeds.remove(0); - } - speeds.add(speed); - speed = 0; - for (Double aDouble : speeds) { - speed += aDouble; - } - speed = speed / speeds.size(); - - double speedTypeSpeed = 0D; - - SpeedTypes speedType = Config.getSpeedType(); - if (speedType == SpeedTypes.KNOT || (entity instanceof Boat && Config.getUseKnot())) { - speedTypeSpeed = speed * 1.94384449; - }else if (speedType == SpeedTypes.KMPH) { - speedTypeSpeed = speed * 3.6; - } else if (speedType == SpeedTypes.MPH) { - speedTypeSpeed = speed * 2.23693629; - }else { - speedTypeSpeed = speed; - } - - String format = String.format("%.2f", speedTypeSpeed); - - //double v = (Math.pow(1.0233435, speedTypeSpeed)-1)/100; - double v = switch (speedType){ - case KMPH -> Math.pow(speedTypeSpeed,0.87)-1; - case BlockPS, MPS -> Math.pow(speedTypeSpeed,1.25); - case MPH -> speedTypeSpeed; - case KNOT -> Math.pow(speedTypeSpeed,1.05); - }/100; - double i = (v *(316-45))+45; - - if(Config.getVisualSpeedometer() && !speedometerVisualDisplayFailed){ - - //double v = speedTypeSpeed / speedType.gatMaxVisual(); - - MeterImages meterImage = null; - int minDiff = 10000; - - for(MeterImages meterImage1 : MeterImages.values()){ - int diff = Math.abs(meterImage1.getSize()-Config.getImageSize()); - if(minDiff > diff && meterImage1.getImage() != null){ - minDiff = diff; - meterImage = meterImage1; + if(Platform.getEnvironment() != Env.CLIENT) { + LOGGER.error("You're running speedometer on somthing other then a client, this is not supported"); + try { + for (File f : Objects.requireNonNull(Platform.getModsFolder().toFile().listFiles())) { + if (f.getName().startsWith("speedometer")) { + if(f.renameTo(new File(f.getParent(), "speedometer-" + VERSION + ".jar.dis"))){ + LOGGER.warn("Unsuccesful in renaming mod jar"); + } + } } + }catch (NullPointerException e){ + LOGGER.warn("Can't disable the mod"); } - - img = meterImage.getImage(); - - int radius = Config.getImageSize()/2-4; - - int x3 = (int) Math.round(radius*Math.cos(Math.toRadians(i+90)))+(Config.getImageSize()/2); - int y3 = (int) Math.round(radius*Math.sin(Math.toRadians(i+90)))+(Config.getImageSize()/2); - - BufferedImage img = ImageHandler.scale(Speedometer.img, Config.getImageSize(), Config.getImageSize()); - Graphics2D g2d = img.createGraphics(); - - g2d.setColor(new Color(138, 0, 0)); - - g2d.setStroke(new BasicStroke(2)); - - g2d.drawLine(x3,y3,img.getWidth()/2,img.getHeight()/2); - - int xPos = getPos(graphics, Config.getXPositionVisual(), 0, false, img.getWidth()); - int yPos = getPos(graphics, Config.getYPositionVisual(), 1, true, img.getHeight()); - - for(int x1 = 0; x1 < img.getWidth(); x1++){ - for(int y1 = 0; y1 < img.getHeight(); y1++){ - int x2 = x1 + xPos - img.getWidth(); - int y2 = y1 + yPos - img.getHeight(); - - int rgb = img.getRGB(x1, y1); - - if(new Color(rgb).equals(Color.black)) continue; - - graphics.fill(x2, y2, x2+1, y2+1, rgb); - } - } - - if(i >= 360+45){ - String string = "x" + (int)Math.floor(i/(365+45)); - graphics.drawString( - Minecraft.getInstance().font, - string, - xPos-Minecraft.getInstance().font.width(string), - (int)(yPos-4.5-(Config.getImageSize()/2)), - new Color(138, 0, 0).getRGB() - ); - } - - }else { - // i -> x - // j -> y - // k -> color RGB int - String speedString = format + " " + SpeedTypes.getName(speedType).getString(); - graphics.drawString( - Minecraft.getInstance().font, - speedString, - getPos(graphics, Config.getXPositionText(), 0, false, Minecraft.getInstance().font.width(speedString)), - getPos(graphics, Config.getYPositionText(), 1, true, Minecraft.getInstance().font.lineHeight), - Config.getColor().getColor() - ); + LOGGER.warn("You should remove the mod from "+Platform.getModsFolder().toString()+" to no longer receive this message"); + return; } - if(Config.isDebug()){ - String debugData = "Velocity raw:" + "\n" + - " X: " + vec.x + "\n" + - " Y: " + vec.y + "\n" + - " Z: " + vec.z + "\n" + - "Offsets:" + "\n" + - " X: " + xOffset + "\n" + - " Y: " + yOffset + "\n" + - " Z: " + zOffset + "\n" + - " Total: " + vOffset + "\n" + - "Velocity modified:" + "\n" + - " X: " + (vec.x + xOffset) + "\n" + - " Y: " + (vec.y + yOffset) + "\n" + - " Z: " + (vec.z + zOffset) + "\n" + - " Total: " + lSpeed + "\n" + - "Velocity total average: " + speed + "\n" + - "Velocity total in " + speedType.name() + ": " + speedTypeSpeed + "\n" + - "Percentage point of visual speedometer: " + v + "\n" + - "Degree end point: " + (i+45); - - Color color = new Color(255, 255, 255); - - int y = 0; - for(String s : debugData.split("\n")){ - drawString(graphics,0, y, s, color.getRGB()); - y+=Minecraft.getInstance().font.lineHeight+1; - } - } - } - - private static void drawString(GuiGraphics graphics, int x, int y, String text, int colorRGB){ - graphics.drawString( - Minecraft.getInstance().font, - text, - x, - y, - colorRGB - ); - } - - static boolean flag = true; - - private static int getPos(GuiGraphics event, String input, int type, boolean changeFlag, int Size) { - ArrayList passerPose = new ArrayList<>(); - final char[] s = input.toCharArray(); - try{ - for(int i = 0; i passerPose) { - if(type == 0){ - passerPose.add(String.valueOf(event.guiWidth())); - passerPose.add("-"); - passerPose.add("70"); - }else if(type == 1){ - passerPose.add(String.valueOf(event.guiHeight())); - passerPose.add("-"); - passerPose.add("15"); - } - } - - private static boolean testIfInt(char c) { - int i = Integer.parseInt(Character.toString(c)); - return (i == 0 || i == 1 || i == 2 || - i == 3 || i == 4 || i == 5 || - i == 6 || i == 7 || i == 8 || - i == 9); - } - - public static ConfigBuilder getConfig(Screen parent) { - ConfigBuilder builder = ConfigBuilder.create() - .setParentScreen(parent) - .setTitle(Component.translatable("speedometer.config.name")); - - ConfigCategory category = builder.getOrCreateCategory(Component.translatable("speedometer.config.category.name")); - - ConfigEntryBuilder entryBuilder = builder.entryBuilder(); - - category.addEntry(entryBuilder.startEnumSelector(Component.translatable("speedometer.config.speed"), SpeedTypes.class, me.zacharias.speedometer.Config.getSpeedType()) - .setEnumNameProvider(SpeedTypes::getName) - .setSaveConsumer(me.zacharias.speedometer.Config::setSpeedType) - .build() - ); - - category.addEntry(entryBuilder.startColorField(Component.translatable("speedometer.config.color"), me.zacharias.speedometer.Config.getColor()) - .setSaveConsumer2(me.zacharias.speedometer.Config::setColor) - .build() - ); - - category.addEntry(entryBuilder.startBooleanToggle(Component.translatable("speedometer.config.knot"), me.zacharias.speedometer.Config.getUseKnot()) - .setSaveConsumer(me.zacharias.speedometer.Config::setUseKnot) - .setYesNoTextSupplier(useKnot -> Component.translatable("speedometer.useKnot."+useKnot)) - .build() - ); - - category.addEntry(entryBuilder.startBooleanToggle(Component.translatable("speedometer.config.visualSpeedometer"), me.zacharias.speedometer.Config.getVisualSpeedometer()) - .setSaveConsumer(me.zacharias.speedometer.Config::setVisualSpeedometer) - .setYesNoTextSupplier((visualSpeedometer -> Component.translatable("speedometer.visualSpeedometer."+visualSpeedometer))) - .build() - ); - - // Regex - - String xRegex = "W*w*S*s*\\+*-*\\**/*[0-9]*"; - String yRegex = "H*h*S*s*\\+*-*\\**/*[0-9]*"; - - // Text Placement - - category.addEntry(entryBuilder.startStringDropdownMenu(Component.translatable("speedometer.config.xPosition.text"), Config.getXPositionText()) - .setSaveConsumer(Config::setXPositionText) - .setErrorSupplier(xPosition -> { - if(xPosition.matches(xRegex)){ - return Optional.empty(); - }else{ - return Optional.of(Component.translatable("speedometer.invalid")); - } - }) - .setTooltip( - Component.translatable("speedometer.config.tooltip.xPosition.line1"), - Component.translatable("speedometer.config.tooltip.xPosition.line2"), - Component.translatable("speedometer.config.tooltip.xPosition.line3") - ) - .build() - ); - - category.addEntry(entryBuilder.startStringDropdownMenu(Component.translatable("speedometer.config.yPosition.text"), Config.getYPositionText()) - .setSaveConsumer(Config::setYPositionText) - .setErrorSupplier(yPosition -> { - if(yPosition.matches(yRegex)){ - return Optional.empty(); - }else{ - return Optional.of(Component.translatable("speedometer.invalid")); - } - }) - .setTooltip( - Component.translatable("speedometer.config.tooltip.yPosition.line1"), - Component.translatable("speedometer.config.tooltip.yPosition.line2"), - Component.translatable("speedometer.config.tooltip.yPosition.line3") - ) - .build() - ); - - // Visual location - - category.addEntry(entryBuilder.startStringDropdownMenu(Component.translatable("speedometer.config.xPosition.visual"), Config.getXPositionVisual()) - .setSaveConsumer(Config::setXPositionVisual) - .setErrorSupplier(xPosition -> { - if(xPosition.matches(xRegex)){ - return Optional.empty(); - }else{ - return Optional.of(Component.translatable("speedometer.invalid")); - } - }) - .setTooltip( - Component.translatable("speedometer.config.tooltip.xPosition.line1"), - Component.translatable("speedometer.config.tooltip.xPosition.line2"), - Component.translatable("speedometer.config.tooltip.xPosition.line3") - ) - .build() - ); - - category.addEntry(entryBuilder.startStringDropdownMenu(Component.translatable("speedometer.config.yPosition.visual"), Config.getYPositionVisual()) - .setSaveConsumer(Config::setYPositionVisual) - .setErrorSupplier(yPosition -> { - if(yPosition.matches(yRegex)){ - return Optional.empty(); - }else{ - return Optional.of(Component.translatable("speedometer.invalid")); - } - }) - .setTooltip( - Component.translatable("speedometer.config.tooltip.yPosition.line1"), - Component.translatable("speedometer.config.tooltip.yPosition.line2"), - Component.translatable("speedometer.config.tooltip.yPosition.line3") - ) - .build() - ); - - // Size of visual image - - category.addEntry(entryBuilder.startIntField(Component.translatable("speedometer.config.imageSize"), Config.getImageSize()) - .setSaveConsumer(Config::setImageSize) - .setTooltip(Component.translatable("speedometer.config.tooltip.imageSize")) - .build() - ); - - category.addEntry(entryBuilder.startBooleanToggle(Component.translatable("speedometer.config.debug"),Config.isDebug()) - .setSaveConsumer(Config::setDebug) - .setYesNoTextSupplier(isDebug -> Component.translatable("speedometer.debug."+isDebug)) - .setTooltip(Component.translatable("speedometer.config.tooltip.debug")) - .build() - ); - - builder.setSavingRunnable(me.zacharias.speedometer.Config::save); - - return builder; + Client.init(); } } diff --git a/fabric/src/main/java/me/zacharias/speedometer/fabric/Config.java b/fabric/src/main/java/me/zacharias/speedometer/fabric/Config.java index 4e597f3..8f5a7f3 100644 --- a/fabric/src/main/java/me/zacharias/speedometer/fabric/Config.java +++ b/fabric/src/main/java/me/zacharias/speedometer/fabric/Config.java @@ -3,20 +3,13 @@ package me.zacharias.speedometer.fabric; import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; import me.shedaniel.clothconfig2.api.ConfigBuilder; -import me.shedaniel.clothconfig2.api.ConfigCategory; -import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; -import me.zacharias.speedometer.SpeedTypes; -import me.zacharias.speedometer.Speedometer; -import net.minecraft.client.Minecraft; -import net.minecraft.network.chat.Component; - -import static me.zacharias.speedometer.Speedometer.LOGGER; +import me.zacharias.speedometer.ConfigMenu; public class Config implements ModMenuApi { @Override public ConfigScreenFactory getModConfigScreenFactory() { return parent -> { - ConfigBuilder builder = Speedometer.getConfig(parent); + ConfigBuilder builder = ConfigMenu.getConfig(parent); return builder.build(); }; } diff --git a/gradle.properties b/gradle.properties index 8613d3a..63ba221 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx8G minecraft_version=1.20.1 archives_base_name=speedometer -mod_version=3.1 +mod_version=3.2 maven_group=me.zacharias architectury_version=9.0.8