From abd080437bed30d6dd7e3df19e61548afe6ae5af Mon Sep 17 00:00:00 2001 From: Zacharias Date: Mon, 26 Jun 2023 22:11:23 +0200 Subject: [PATCH] Added who is the author. Added visual speedometer Added configruble location --- .../java/me/zacharias/speedometer/Config.java | 138 +++++- .../me/zacharias/speedometer/SpeedTypes.java | 21 +- .../me/zacharias/speedometer/Speedometer.java | 430 +++++++++++++----- .../assets/speedometer/lang/en_us.json | 36 +- .../assets/speedometer/meter/meter.png | Bin 0 -> 316 bytes .../zacharias/speedometer/fabric/Config.java | 3 + .../speedometer/fabric/SpeedometerFabric.java | 6 - fabric/src/main/resources/fabric.mod.json | 2 +- fabric/src/main/resources/icon.png | Bin 453 -> 2624 bytes fabric/src/main/resources/pack.mcmeta | 6 + forge/src/main/resources/META-INF/mods.toml | 2 +- forge/src/main/resources/icon.png | Bin 453 -> 2624 bytes .../src/main/resources/pack.mcmeta | 0 gradle.properties | 8 +- 14 files changed, 498 insertions(+), 154 deletions(-) create mode 100644 common/src/main/resources/assets/speedometer/meter/meter.png create mode 100644 fabric/src/main/resources/pack.mcmeta rename {common => forge}/src/main/resources/pack.mcmeta (100%) diff --git a/common/src/main/java/me/zacharias/speedometer/Config.java b/common/src/main/java/me/zacharias/speedometer/Config.java index 8e6a42c..07583a6 100644 --- a/common/src/main/java/me/zacharias/speedometer/Config.java +++ b/common/src/main/java/me/zacharias/speedometer/Config.java @@ -1,11 +1,8 @@ package me.zacharias.speedometer; import dev.architectury.platform.Platform; -import net.minecraft.world.phys.Vec3; -import org.joml.Vector3i; import org.json.JSONObject; -import javax.swing.plaf.ColorUIResource; import java.io.*; import me.shedaniel.math.Color; @@ -14,6 +11,7 @@ import static me.zacharias.speedometer.Speedometer.MOD_ID; public class Config { private static JSONObject Config; + public static final int configVersion = 2; public static void initialize(){ if(Config != null) throw new RuntimeException("Already Initialized"); @@ -27,30 +25,79 @@ public class Config { } Config = new JSONObject(); - - Config.put("speed", SpeedTypes.BlockPS); - Config.put("useKnot", false); - Config.put("color", new JSONObject() - .put("r", 16) - .put("g", 146) - .put("b", 158) - ); - Config.put("debug", false); + defualt(); }else { try { BufferedReader in = new BufferedReader(new FileReader(config)); - String tmp = ""; + String tmp; StringBuilder builder = new StringBuilder(); while((tmp = in.readLine()) != null){ builder.append(tmp); } Config = new JSONObject(builder.toString()); + if(Config.has("version")){ + if(Config.getInt("version")!=configVersion){ + if(Config.getInt("version") > configVersion){ + defualt(); + + save(); + }else if(Config.getInt("version") < configVersion){ + Config = new JSONObject(); + + defualt(); + save(); + } + } + }else{ + Config = new JSONObject(); + defualt(); + save(); + } } catch (IOException e) { throw new RuntimeException(e); } } } + private static void defualt() { + if(!Config.has("speed")) { + Config.put("speed", SpeedTypes.BlockPS); + } + if(!Config.has("useKnot")) { + Config.put("useKnot", false); + } + if(!Config.has("color")) { + Config.put("color", new JSONObject() + .put("r", 16) + .put("g", 146) + .put("b", 158) + ); + } + if(!Config.has("visualSpeedometer")) { + Config.put("visualSpeedometer", false); + } + if(!Config.has("xPositionVisual")) { + Config.put("xPositionVisual", "W-23"); + } + if(!Config.has("yPositionVisual")) { + Config.put("yPositionVisual", "H-23"); + } + if(!Config.has("xPositionText")) { + Config.put("xPositionText", "W-70"); + } + if(!Config.has("yPositionText")) { + Config.put("yPositionText", "H-15"); + } + + if(!Config.has("debug")) { + Config.put("debug", false); + } + + if(!Config.has("version")) { + Config.put("version", configVersion); + } + } + public static void save(){ File config = new File(Platform.getConfigFolder().toString()+"/"+MOD_ID+"/config.json"); if(!config.exists()){ @@ -100,7 +147,7 @@ public class Config { } } - public static boolean getIsDebug() { + public static boolean isDebug() { if(Config.has("debug")){ return Config.getBoolean("debug"); }else{ @@ -108,6 +155,45 @@ public class Config { } } + public static boolean getVisualSpeedometer(){ + if(Config.has("visualSpeedometer")){ + return Config.getBoolean("visualSpeedometer"); + }else { + return false; + } + } + + public static String getXPositionVisual(){ + if(Config.has("xPositionVisual")) { + return Config.getString("xPositionVisual"); + }else{ + return "W-23"; + } + } + + public static String getYPositionVisual() { + if (Config.has("yPositionVisual")) { + return Config.getString("yPositionVisual"); + } else { + return "H-23"; + } + } + public static String getXPositionText(){ + if(Config.has("xPositionText")) { + return Config.getString("xPositionText"); + }else{ + return "W-70"; + } + } + + public static String getYPositionText(){ + if(Config.has("yPositionText")) { + return Config.getString("yPositionText"); + }else{ + return "H-15"; + } + } + public static void setColor(Color color){ Config.put("color", new JSONObject() .put("r", color.getRed()) @@ -123,4 +209,28 @@ public class Config { public static void setSpeedType(SpeedTypes speedType) { Config.put("speed", speedType); } + + public static void setVisualSpeedometer(boolean visualSpeedometer){ + Config.put("visualSpeedometer", visualSpeedometer); + } + + public static void setXPositionVisual(String xPositionVisual){ + Config.put("xPositionVisual", xPositionVisual); + } + + public static void setYPositionVisual(String yPositionVisual){ + Config.put("yPositionVisual", yPositionVisual); + } + + public static void setXPositionText(String xPositionText){ + Config.put("xPositionText", xPositionText); + } + + public static void setYPositionText(String yPositionText){ + Config.put("yPositionText", yPositionText); + } + + public static void setDebug(boolean debug){ + Config.put("debug", debug); + } } diff --git a/common/src/main/java/me/zacharias/speedometer/SpeedTypes.java b/common/src/main/java/me/zacharias/speedometer/SpeedTypes.java index 5128e84..a3dd55d 100644 --- a/common/src/main/java/me/zacharias/speedometer/SpeedTypes.java +++ b/common/src/main/java/me/zacharias/speedometer/SpeedTypes.java @@ -3,11 +3,17 @@ package me.zacharias.speedometer; import net.minecraft.network.chat.Component; public enum SpeedTypes { - MPH, - KMPH, - MPS, - BlockPS, - KNOT; + MPH(20), + KMPH(200), + MPS(10), + BlockPS(10), + KNOT(20); + + private final int maxVisual; + + SpeedTypes(int maxVisual){ + this.maxVisual = maxVisual; + } public static Component getName(Enum anEnum) { if(anEnum instanceof SpeedTypes speedType) { @@ -17,10 +23,13 @@ public enum SpeedTypes { case KMPH -> "kmph"; case BlockPS -> "bps"; case KNOT -> "knot"; - default -> "error"; }); }else { return Component.translatable("speedometer.speed.error"); } } + + public int gatMaxVisual() { + return maxVisual; + } } \ No newline at end of file diff --git a/common/src/main/java/me/zacharias/speedometer/Speedometer.java b/common/src/main/java/me/zacharias/speedometer/Speedometer.java index 78dc46a..4e0dee9 100644 --- a/common/src/main/java/me/zacharias/speedometer/Speedometer.java +++ b/common/src/main/java/me/zacharias/speedometer/Speedometer.java @@ -1,68 +1,61 @@ package me.zacharias.speedometer; -import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; -import com.mojang.authlib.minecraft.client.MinecraftClient; import com.mojang.blaze3d.platform.InputConstants; + import dev.architectury.event.events.client.ClientGuiEvent; import dev.architectury.event.events.client.ClientTickEvent; -import dev.architectury.injectables.targets.ArchitecturyTarget; import dev.architectury.platform.Platform; import dev.architectury.registry.client.keymappings.KeyMappingRegistry; -import dev.architectury.registry.registries.RegistrarManager; -import dev.architectury.event.EventHandler; import dev.architectury.utils.Env; -import dev.architectury.utils.EnvExecutor; + 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.Font; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.font.FontSet; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.vehicle.Boat; -import net.minecraft.world.level.Level; +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.swing.plaf.ColorUIResource; +import javax.imageio.ImageIO; import java.awt.*; -import java.io.File; +import java.awt.image.BufferedImage; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.UUID; -import java.util.function.Function; +import java.util.*; public class Speedometer { public static final String MOD_ID = "speedometer"; - public static final Supplier MANAGER = Suppliers.memoize(() -> RegistrarManager.get(MOD_ID)); public static final Logger LOGGER = LogManager.getLogger(MOD_ID); public static final KeyMapping CONFIG_KEY = new KeyMapping( - "speedometer.key.configkey", + "speedometer.key.configKey", InputConstants.Type.KEYSYM, InputConstants.KEY_O, - "speedometer.key.catagory" + "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() { - if(Platform.isForge()){ - LOGGER.info("Hello, Forge! from Architectury"); - }else if(Platform.isFabric()){ - LOGGER.info("Hello, Fabric! from Architectury"); - }else{ - LOGGER.info("Hello! from Architectury"); - } + LOGGER.info("Loading speedometer by Allen"); if(Platform.getEnvironment() != Env.CLIENT) return; @@ -73,168 +66,277 @@ public class Speedometer } }); + KeyMappingRegistry.register(DEBUG_KEY); + ClientTickEvent.CLIENT_POST.register(minecraft -> { + if(DEBUG_KEY.consumeClick()){ + Config.setDebug(!Config.isDebug()); + } + }); + Config.initialize(); Config.save(); - // TODO add cloth config for abstract config system + ClientGuiEvent.RENDER_HUD.register(Speedometer::render); - ArrayList speeds = new ArrayList<>(); + try { + img = ImageIO.read(Objects.requireNonNull(Speedometer.class.getResourceAsStream("/assets/speedometer/meter/meter.png"))); + }catch (NullPointerException | IOException e){ + LOGGER.warn("Can't load speedometer icon. speedometer visual display is disabled"); + speedometerVisualDisplayFailed = true; + } - ClientGuiEvent.RENDER_HUD.register((graphics, tick) -> { - if(Minecraft.getInstance().player == null) return; - Entity entity = Minecraft.getInstance().player.getRootVehicle(); + LOGGER.info("Finished loading speedometer"); + } - Level world = entity.level(); - double x = entity.position().x; - double y = entity.position().y; - double z = entity.position().z; + private static void render(GuiGraphics graphics, float tick) { + if(Minecraft.getInstance().player == null) return; + Entity entity = Minecraft.getInstance().player.getRootVehicle(); - Vec3 vec = entity.getDeltaMovement(); + Vec3 vec = entity.getDeltaMovement(); - double yOffset = 0.0784000015258789D; - double xOffset = 0D; - double zOffset = 0D; - double vOffset = 0D; + 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; - } - } else if (entity instanceof Boat) { + if (entity instanceof Player e) { + if (!e.onGround() && e.isCreative()) { + yOffset = 0; + } else if (e.isInWater()) { yOffset = 0; } + } else if (entity instanceof Boat || entity instanceof Minecart) { + 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 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(); + if (speeds.size() >= 30) { + speeds.remove(0); + } + speeds.add(speed); + speed = 0; + for (Double aDouble : speeds) { + speed += aDouble; + } + speed = speed / speeds.size(); - SpeedTypes speedType = Config.getSpeedType(); - if (speedType == SpeedTypes.KNOT || (entity instanceof Boat && Config.getUseKnot())) { - speed = speed * 1.94384449; - }else if (speedType == SpeedTypes.KMPH) { - speed = speed * 3.6; - } else if (speedType == SpeedTypes.MPH) { - speed = speed * 2.23693629; + 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(); + + int x3 = (int) Math.round(7*Math.cos(Math.toRadians(i+90)))+(img.getWidth()/2); + int y3 = (int) Math.round(7*Math.sin(Math.toRadians(i+90)))+(img.getWidth()/2); + + BufferedImage img = new BufferedImage(Speedometer.img.getWidth(), Speedometer.img.getHeight(), Speedometer.img.getType()); + Graphics2D g2d = img.createGraphics(); + for(int x1 = 0; x1 < img.getWidth(); x1++) { + for (int y1 = 0; y1 < img.getHeight(); y1++) { + g2d.setColor(new Color(Speedometer.img.getRGB(x1,y1))); + g2d.fillRect(x1,y1,1,1); + } } - String format = String.format("%.2f", speed); + g2d.setColor(new Color(138, 0, 0)); + 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; + int y2 = y1 + yPos; + + 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), + yPos+6, + 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, - format+" "+SpeedTypes.getName(speedType).getString(), - getPos(graphics, "W-70", 0, false), - getPos(graphics, "H-17", 1, true), - Config.getColor().getColor()); - }); + 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) { - ArrayList paserdPos = new ArrayList(); + 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 || @@ -260,10 +362,102 @@ public class Speedometer category.addEntry(entryBuilder.startColorField(Component.translatable("speedometer.config.color"), me.zacharias.speedometer.Config.getColor()) .setSaveConsumer2(me.zacharias.speedometer.Config::setColor) - .build()); + .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() + ); + + 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() ); diff --git a/common/src/main/resources/assets/speedometer/lang/en_us.json b/common/src/main/resources/assets/speedometer/lang/en_us.json index 5b4241c..165a89c 100644 --- a/common/src/main/resources/assets/speedometer/lang/en_us.json +++ b/common/src/main/resources/assets/speedometer/lang/en_us.json @@ -3,15 +3,43 @@ "speedometer.config.category.name": "Speedometer Config Category", "speedometer.config.speed": "Speed Type", "speedometer.config.color": "Color", - "speedometer.config.knot": "Use knot in boats", + "speedometer.config.knot": "Use Knot in Boats", + "speedometer.config.visualSpeedometer": "Visual Speedometer Display", + "speedometer.config.xPosition.visual": "X Position for Visual Meter", + "speedometer.config.yPosition.visual": "Y Position for Visual Meter", + "speedometer.config.xPosition.text": "X Position for Text Meter", + "speedometer.config.yPosition.text": "Y Position for Text Meter", + "speedometer.config.debug": "Debug", - "speedometer.key.configkey": "Config Key", - "speedometer.key.catagory": "Speedometer", + "speedometer.key.configKey": "Config Key", + "speedometer.key.debugKey": "Debug Key", + "speedometer.key.category": "Speedometer", "speedometer.speed.mph": "MPH", "speedometer.speed.mps": "Meters/s", "speedometer.speed.kmph": "Km/h", "speedometer.speed.bps": "Blocks/s", "speedometer.speed.knot": "Knot", - "speedometer.speed.error": "Unknown Speed Type" + "speedometer.speed.error": "Unknown Speed Type", + + "speedometer.visualSpeedometer.true": "Visual", + "speedometer.visualSpeedometer.false": "Text", + + "speedometer.useKnot.true": "Yes", + "speedometer.useKnot.false": "No", + + "speedometer.debug.true": "\u00A74Yes", + "speedometer.debug.false": "\u00A74No", + + "speedometer.config.tooltip.xPosition.line1": "W = the width of the screen", + "speedometer.config.tooltip.xPosition.line2": "w = half the width of the screen", + "speedometer.config.tooltip.xPosition.line3": "s = the width of the text or image", + + "speedometer.config.tooltip.yPosition.line1": "H = the height of the screen", + "speedometer.config.tooltip.yPosition.line2": "h = half the height of the screen", + "speedometer.config.tooltip.yPosition.line3": "s = the height of the text or image", + + "speedometer.config.tooltip.debug": "Debug Information", + + "speedometer.invalid": "Invalid String" } \ No newline at end of file diff --git a/common/src/main/resources/assets/speedometer/meter/meter.png b/common/src/main/resources/assets/speedometer/meter/meter.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e7d4f64da0420c11bf41454c9dd0d26ba06a40 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0y~yU=Rjj4mJh`hN1woGYkxj%$_ceAr*0Jr<~<&HsEPB zW@9&VSaD~^fmS1*>nnB``~qd~5VwtKq}5^m&K4#HZ*31=e@E z4PHvml+$Z?xXXX_NzO{9+YFD(mu#QfbWd-3hJW%z^$oHHWrq^DcLfJ=tq5}ac&h8$ znisj#s?*c$71WQo+B+oN+&}Zu@%@?yGO~CMe=swBFyD{YbmfQtm1%4L6<)GqJUIVE VnVQKrMFs{222WQ%mvv4FO#oR}g=PQ% literal 0 HcmV?d00001 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 4c66fe6..5112dbf 100644 --- a/fabric/src/main/java/me/zacharias/speedometer/fabric/Config.java +++ b/fabric/src/main/java/me/zacharias/speedometer/fabric/Config.java @@ -7,8 +7,11 @@ 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; + public class Config implements ModMenuApi { @Override public ConfigScreenFactory getModConfigScreenFactory() { diff --git a/fabric/src/main/java/me/zacharias/speedometer/fabric/SpeedometerFabric.java b/fabric/src/main/java/me/zacharias/speedometer/fabric/SpeedometerFabric.java index 7ee7bbb..15ec746 100644 --- a/fabric/src/main/java/me/zacharias/speedometer/fabric/SpeedometerFabric.java +++ b/fabric/src/main/java/me/zacharias/speedometer/fabric/SpeedometerFabric.java @@ -1,17 +1,11 @@ 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.zacharias.speedometer.Speedometer; import net.fabricmc.api.ModInitializer; -import net.minecraft.client.Minecraft; -import net.minecraft.network.chat.Component; public class SpeedometerFabric implements ModInitializer { @Override public void onInitialize() { Speedometer.init(); - } } \ No newline at end of file diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index ffd7c99..155c194 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -5,7 +5,7 @@ "name": "speedometer", "description": "just displaying your speed", - "authors": [], + "authors": ["Allen"], "contact": {}, "license": "All Rights Reserved", diff --git a/fabric/src/main/resources/icon.png b/fabric/src/main/resources/icon.png index 047b91f2347de5cf95f23284476fddbe21ba23fe..92779a5116ace6119f911f79a61fb999d95fd470 100644 GIT binary patch literal 2624 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 delta 439 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 delta 439 zcmX>ga+G<3L_H%j0|Ud)51%_27#P?Bd_r6q7#RNl|G)I+{JRVcj8&d4jv*e$uU_7m z8)L}BmcYfO6n-stfoRY!u6&XH0%;FNvB~BaIdmd9e#O4nTRlndni=_k@>D%Q_^YT~?4Cm^ogH{sOl zRHo>2!Y0u#4l##ltMD*p_mbb2Y!yP>4Rp;YKH$63!aLhKt3MJ{q_n6Uo9Qf7vn1I#TtbNCH} zHns5OGkkEb4VoWU!4OpMzMT1$|6&&thM87OQZu(Pnr)cD@MJ<=fQ*8}p&4I~@M~Ro zoY?=JA&<4X!DxYtxj=e_;=IP-2!-FQr?_5;tte|OV@_+_*FPaoL2p91Mh$ZG_I?4mb8cvu%dm3$hZnh0T4v|IH