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 0000000..d2e7d4f Binary files /dev/null and b/common/src/main/resources/assets/speedometer/meter/meter.png differ 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 047b91f..92779a5 100644 Binary files a/fabric/src/main/resources/icon.png and b/fabric/src/main/resources/icon.png differ diff --git a/fabric/src/main/resources/pack.mcmeta b/fabric/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..6493c61 --- /dev/null +++ b/fabric/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "pack_format": 15, + "description": "speedometer resources" + } +} \ No newline at end of file diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index eb25e29..1a06d6d 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -31,7 +31,7 @@ logoFile="icon.png" #optional # A text field displayed in the mod UI #credits="Thanks for this example mod goes to Java" #optional # A text field displayed in the mod UI -authors="Zacharias" #optional +authors="Allen" #optional # Display Test controls the display for your mod in the server connection screen # MATCH_VERSION means that your mod will cause a red X if the versions on client and server differ. This is the default behaviour and should be what you choose if you have server and client elements to your mod. # IGNORE_SERVER_VERSION means that your mod will not cause a red X if it's present on the server but not on the client. This is what you should use if you're a server only mod. diff --git a/forge/src/main/resources/icon.png b/forge/src/main/resources/icon.png index 047b91f..92779a5 100644 Binary files a/forge/src/main/resources/icon.png and b/forge/src/main/resources/icon.png differ diff --git a/common/src/main/resources/pack.mcmeta b/forge/src/main/resources/pack.mcmeta similarity index 100% rename from common/src/main/resources/pack.mcmeta rename to forge/src/main/resources/pack.mcmeta diff --git a/gradle.properties b/gradle.properties index 3089067..c00f8da 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,14 +1,14 @@ org.gradle.jvmargs=-Xmx1G -minecraft_version=1.20 +minecraft_version=1.20.1 archives_base_name=speedometer -mod_version=1.0 +mod_version=2.0 maven_group=me.zacharias architectury_version=9.0.8 fabric_loader_version=0.14.21 -fabric_api_version=0.83.0+1.20 +fabric_api_version=0.84.0+1.20.1 -forge_version=1.20-46.0.14 +forge_version=1.20.1-47.0.19